From 5798f6141bd8010fbb2d7db7c01fa4b13a3fe1d7 Mon Sep 17 00:00:00 2001 From: Jesse Yang Date: Wed, 1 Dec 2021 15:03:36 -0800 Subject: [PATCH 1/3] chore: clean up legacy-plugin-chart-time-table --- .../Stories.tsx | 74 ---- .../legacy-plugin-chart-time-table/data.ts | 230 ------------ .../CHANGELOG.md | 43 --- .../legacy-plugin-chart-time-table/README.md | 52 --- .../package.json | 45 --- .../src/FormattedNumber.tsx | 34 -- .../src/TimeTable.tsx | 330 ------------------ .../src/TimeTableChartPlugin.ts | 39 --- .../src/controlPanel.ts | 68 ---- .../src/images/thumbnail.png | Bin 12797 -> 0 bytes .../src/images/thumbnailLarge.png | Bin 23986 -> 0 bytes .../src/index.ts | 52 --- .../tsconfig.json | 25 -- .../types/external.d.ts | 23 -- .../TimeTable/SparklineCell.jsx | 203 ----------- .../TimeTable}/SparklineCell.tsx | 0 ...ChartPlugin.js => TimeTableChartPlugin.ts} | 0 .../TimeTable/transformProps.js | 62 ---- .../TimeTable}/transformProps.ts | 9 +- .../superset-ui/.eslintrc.js | 1 - 20 files changed, 3 insertions(+), 1287 deletions(-) delete mode 100644 superset-frontend/packages/superset-ui-demo/storybook/stories/plugins/legacy-plugin-chart-time-table/Stories.tsx delete mode 100644 superset-frontend/packages/superset-ui-demo/storybook/stories/plugins/legacy-plugin-chart-time-table/data.ts delete mode 100644 superset-frontend/plugins/legacy-plugin-chart-time-table/CHANGELOG.md delete mode 100644 superset-frontend/plugins/legacy-plugin-chart-time-table/README.md delete mode 100644 superset-frontend/plugins/legacy-plugin-chart-time-table/package.json delete mode 100644 superset-frontend/plugins/legacy-plugin-chart-time-table/src/FormattedNumber.tsx delete mode 100644 superset-frontend/plugins/legacy-plugin-chart-time-table/src/TimeTable.tsx delete mode 100644 superset-frontend/plugins/legacy-plugin-chart-time-table/src/TimeTableChartPlugin.ts delete mode 100644 superset-frontend/plugins/legacy-plugin-chart-time-table/src/controlPanel.ts delete mode 100644 superset-frontend/plugins/legacy-plugin-chart-time-table/src/images/thumbnail.png delete mode 100644 superset-frontend/plugins/legacy-plugin-chart-time-table/src/images/thumbnailLarge.png delete mode 100644 superset-frontend/plugins/legacy-plugin-chart-time-table/src/index.ts delete mode 100644 superset-frontend/plugins/legacy-plugin-chart-time-table/tsconfig.json delete mode 100644 superset-frontend/plugins/legacy-plugin-chart-time-table/types/external.d.ts delete mode 100644 superset-frontend/src/visualizations/TimeTable/SparklineCell.jsx rename superset-frontend/{plugins/legacy-plugin-chart-time-table/src => src/visualizations/TimeTable}/SparklineCell.tsx (100%) rename superset-frontend/src/visualizations/TimeTable/{TimeTableChartPlugin.js => TimeTableChartPlugin.ts} (100%) delete mode 100644 superset-frontend/src/visualizations/TimeTable/transformProps.js rename superset-frontend/{plugins/legacy-plugin-chart-time-table/src => src/visualizations/TimeTable}/transformProps.ts (92%) diff --git a/superset-frontend/packages/superset-ui-demo/storybook/stories/plugins/legacy-plugin-chart-time-table/Stories.tsx b/superset-frontend/packages/superset-ui-demo/storybook/stories/plugins/legacy-plugin-chart-time-table/Stories.tsx deleted file mode 100644 index 73b19eadf152f..0000000000000 --- a/superset-frontend/packages/superset-ui-demo/storybook/stories/plugins/legacy-plugin-chart-time-table/Stories.tsx +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -/* eslint-disable no-magic-numbers */ -import React from 'react'; -import { SuperChart } from '@superset-ui/core'; -import TimeTableChartPlugin from '@superset-ui/legacy-plugin-chart-time-table'; -import data from './data'; - -new TimeTableChartPlugin().configure({ key: 'time-table' }).register(); - -export default { - title: 'Legacy Chart Plugins/legacy-plugin-chart-time-table', -}; - -export const basic = () => ( - -); diff --git a/superset-frontend/packages/superset-ui-demo/storybook/stories/plugins/legacy-plugin-chart-time-table/data.ts b/superset-frontend/packages/superset-ui-demo/storybook/stories/plugins/legacy-plugin-chart-time-table/data.ts deleted file mode 100644 index b9990d59255ce..0000000000000 --- a/superset-frontend/packages/superset-ui-demo/storybook/stories/plugins/legacy-plugin-chart-time-table/data.ts +++ /dev/null @@ -1,230 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -export default { - '1980-01-01 00:00:00': { - 'East Asia & Pacific': 99, - 'Latin America & Caribbean': 99, - 'Middle East & North Africa': 88, - 'Sub-Saharan Africa': 92, - }, - '1981-01-01 00:00:00': { - 'East Asia & Pacific': 99, - 'Latin America & Caribbean': 98, - 'Middle East & North Africa': 80, - 'Sub-Saharan Africa': 96, - }, - '1982-01-01 00:00:00': { - 'East Asia & Pacific': 99, - 'Latin America & Caribbean': 99, - 'Middle East & North Africa': 89, - 'Sub-Saharan Africa': 94, - }, - '1983-01-01 00:00:00': { - 'East Asia & Pacific': 99, - 'Latin America & Caribbean': 99, - 'Middle East & North Africa': 88, - 'Sub-Saharan Africa': 98, - }, - '1984-01-01 00:00:00': { - 'East Asia & Pacific': 97, - 'Latin America & Caribbean': 99, - 'Middle East & North Africa': 91, - 'Sub-Saharan Africa': 98, - }, - '1985-01-01 00:00:00': { - 'East Asia & Pacific': 99, - 'Latin America & Caribbean': 99, - 'Middle East & North Africa': 94, - 'Sub-Saharan Africa': 97, - }, - '1986-01-01 00:00:00': { - 'East Asia & Pacific': 99, - 'Latin America & Caribbean': 99, - 'Middle East & North Africa': 98, - 'Sub-Saharan Africa': 99, - }, - '1987-01-01 00:00:00': { - 'East Asia & Pacific': 98, - 'Latin America & Caribbean': 98, - 'Middle East & North Africa': 99, - 'Sub-Saharan Africa': 99, - }, - '1988-01-01 00:00:00': { - 'East Asia & Pacific': 99, - 'Latin America & Caribbean': 99, - 'Middle East & North Africa': 98, - 'Sub-Saharan Africa': 99, - }, - '1989-01-01 00:00:00': { - 'East Asia & Pacific': 99, - 'Latin America & Caribbean': 99, - 'Middle East & North Africa': 98, - 'Sub-Saharan Africa': 99, - }, - '1990-01-01 00:00:00': { - 'East Asia & Pacific': 99, - 'Latin America & Caribbean': 99, - 'Middle East & North Africa': 99, - 'Sub-Saharan Africa': 99, - }, - '1991-01-01 00:00:00': { - 'East Asia & Pacific': 99, - 'Latin America & Caribbean': 99, - 'Middle East & North Africa': 98, - 'Sub-Saharan Africa': 99, - }, - '1992-01-01 00:00:00': { - 'East Asia & Pacific': 99, - 'Latin America & Caribbean': 99, - 'Middle East & North Africa': 99, - 'Sub-Saharan Africa': 99, - }, - '1993-01-01 00:00:00': { - 'East Asia & Pacific': 99, - 'Latin America & Caribbean': 99, - 'Middle East & North Africa': 99, - 'Sub-Saharan Africa': 99, - }, - '1994-01-01 00:00:00': { - 'East Asia & Pacific': 99, - 'Latin America & Caribbean': 99, - 'Middle East & North Africa': 99, - 'Sub-Saharan Africa': 99, - }, - '1995-01-01 00:00:00': { - 'East Asia & Pacific': 99, - 'Latin America & Caribbean': 99, - 'Middle East & North Africa': 99, - 'Sub-Saharan Africa': 99, - }, - '1996-01-01 00:00:00': { - 'East Asia & Pacific': 99, - 'Latin America & Caribbean': 99, - 'Middle East & North Africa': 98, - 'Sub-Saharan Africa': 99, - }, - '1997-01-01 00:00:00': { - 'East Asia & Pacific': 99, - 'Latin America & Caribbean': 99, - 'Middle East & North Africa': 99, - 'Sub-Saharan Africa': 99, - }, - '1998-01-01 00:00:00': { - 'East Asia & Pacific': 99, - 'Latin America & Caribbean': 99, - 'Middle East & North Africa': 99, - 'Sub-Saharan Africa': 99, - }, - '1999-01-01 00:00:00': { - 'East Asia & Pacific': 99, - 'Latin America & Caribbean': 99, - 'Middle East & North Africa': 99, - 'Sub-Saharan Africa': 99, - }, - '2000-01-01 00:00:00': { - 'East Asia & Pacific': 99, - 'Latin America & Caribbean': 99, - 'Middle East & North Africa': 99, - 'Sub-Saharan Africa': 99, - }, - '2001-01-01 00:00:00': { - 'East Asia & Pacific': 99, - 'Latin America & Caribbean': 99, - 'Middle East & North Africa': 99, - 'Sub-Saharan Africa': 99, - }, - '2002-01-01 00:00:00': { - 'East Asia & Pacific': 99, - 'Latin America & Caribbean': 99, - 'Middle East & North Africa': 99, - 'Sub-Saharan Africa': 99, - }, - '2003-01-01 00:00:00': { - 'East Asia & Pacific': 99, - 'Latin America & Caribbean': 99, - 'Middle East & North Africa': 99, - 'Sub-Saharan Africa': 99, - }, - '2004-01-01 00:00:00': { - 'East Asia & Pacific': 99, - 'Latin America & Caribbean': 99, - 'Middle East & North Africa': 99, - 'Sub-Saharan Africa': 99, - }, - '2005-01-01 00:00:00': { - 'East Asia & Pacific': 99, - 'Latin America & Caribbean': 99, - 'Middle East & North Africa': 99, - 'Sub-Saharan Africa': 99, - }, - '2006-01-01 00:00:00': { - 'East Asia & Pacific': 99, - 'Latin America & Caribbean': 99, - 'Middle East & North Africa': 99, - 'Sub-Saharan Africa': 99, - }, - '2007-01-01 00:00:00': { - 'East Asia & Pacific': 99, - 'Latin America & Caribbean': 99, - 'Middle East & North Africa': 99, - 'Sub-Saharan Africa': 99, - }, - '2008-01-01 00:00:00': { - 'East Asia & Pacific': 99, - 'Latin America & Caribbean': 99, - 'Middle East & North Africa': 99, - 'Sub-Saharan Africa': 99, - }, - '2009-01-01 00:00:00': { - 'East Asia & Pacific': 99, - 'Latin America & Caribbean': 99, - 'Middle East & North Africa': 99, - 'Sub-Saharan Africa': 99, - }, - '2010-01-01 00:00:00': { - 'East Asia & Pacific': 99, - 'Latin America & Caribbean': 99, - 'Middle East & North Africa': 99, - 'Sub-Saharan Africa': 99, - }, - '2011-01-01 00:00:00': { - 'East Asia & Pacific': 99, - 'Latin America & Caribbean': 99, - 'Middle East & North Africa': 99, - 'Sub-Saharan Africa': 99, - }, - '2012-01-01 00:00:00': { - 'East Asia & Pacific': 99, - 'Latin America & Caribbean': 99, - 'Middle East & North Africa': 99, - 'Sub-Saharan Africa': 99, - }, - '2013-01-01 00:00:00': { - 'East Asia & Pacific': 99, - 'Latin America & Caribbean': 99, - 'Middle East & North Africa': 99, - 'Sub-Saharan Africa': 99, - }, - '2014-01-01 00:00:00': { - 'East Asia & Pacific': 99, - 'Latin America & Caribbean': 99, - 'Middle East & North Africa': 99, - 'Sub-Saharan Africa': 99, - }, -}; diff --git a/superset-frontend/plugins/legacy-plugin-chart-time-table/CHANGELOG.md b/superset-frontend/plugins/legacy-plugin-chart-time-table/CHANGELOG.md deleted file mode 100644 index 2cb283c0a4146..0000000000000 --- a/superset-frontend/plugins/legacy-plugin-chart-time-table/CHANGELOG.md +++ /dev/null @@ -1,43 +0,0 @@ - - -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. - -# [0.18.0](https://github.com/apache-superset/superset-ui/compare/v0.17.87...v0.18.0) (2021-08-30) - -**Note:** Version bump only for package @superset-ui/legacy-plugin-chart-time-table - - - - - -## [0.17.63](https://github.com/apache-superset/superset-ui/compare/v0.17.62...v0.17.63) (2021-07-02) - -**Note:** Version bump only for package @superset-ui/legacy-plugin-chart-time-table - - - - - -## [0.17.61](https://github.com/apache-superset/superset-ui/compare/v0.17.60...v0.17.61) (2021-07-02) - -**Note:** Version bump only for package @superset-ui/legacy-plugin-chart-time-table diff --git a/superset-frontend/plugins/legacy-plugin-chart-time-table/README.md b/superset-frontend/plugins/legacy-plugin-chart-time-table/README.md deleted file mode 100644 index 5b3a95dd0a0ca..0000000000000 --- a/superset-frontend/plugins/legacy-plugin-chart-time-table/README.md +++ /dev/null @@ -1,52 +0,0 @@ - - -## @superset-ui/plugin-chart-time-table - -[![Version](https://img.shields.io/npm/v/@superset-ui/plugin-time-table.svg?style=flat-square)](https://www.npmjs.com/package/@superset-ui/plugin-chart-time-table) -[![David (path)](https://img.shields.io/david/apache-superset/superset-ui-plugins.svg?path=packages%2Fsuperset-ui-plugin-chart-time-table&style=flat-square)](https://david-dm.org/apache-superset/superset-ui-plugins?path=packages/superset-ui-plugin-chart-time-table) - -This plugin provides Time Table 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 TimeTableChartPlugin from '@superset-ui/legacy-plugin-chart-time-table'; - -new TimeTableChartPlugin().configure({ key: 'time-table' }).register(); -``` - -Then use it via `SuperChart`. See -[storybook](https://apache-superset.github.io/superset-ui-plugins/?selectedKind=plugin-chart-time-table) -for more details. - -```js - -``` diff --git a/superset-frontend/plugins/legacy-plugin-chart-time-table/package.json b/superset-frontend/plugins/legacy-plugin-chart-time-table/package.json deleted file mode 100644 index 635f1b8865c64..0000000000000 --- a/superset-frontend/plugins/legacy-plugin-chart-time-table/package.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "name": "@superset-ui/legacy-plugin-chart-time-table", - "version": "0.18.25", - "description": "Superset Chart Plugin - Time Table", - "sideEffects": [ - "*.css" - ], - "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": { - "@data-ui/sparkline": "^0.0.84", - "@superset-ui/chart-controls": "0.18.25", - "@superset-ui/core": "0.18.25", - "@types/d3-scale": "^2.0.2", - "d3-scale": "^3.2.1", - "moment": "^2.26.0", - "mustache": "^4.0.1", - "prop-types": "^15.7.2", - "reactable-arc": "^0.15.0" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.3.1" - } -} diff --git a/superset-frontend/plugins/legacy-plugin-chart-time-table/src/FormattedNumber.tsx b/superset-frontend/plugins/legacy-plugin-chart-time-table/src/FormattedNumber.tsx deleted file mode 100644 index 249aa28508e00..0000000000000 --- a/superset-frontend/plugins/legacy-plugin-chart-time-table/src/FormattedNumber.tsx +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -import React from 'react'; -import { formatNumber } from '@superset-ui/core'; - -interface Props { - format: string; - num: number; -} - -function FormattedNumber({ num = 0, format = '' }: Props) { - if (format) { - return {formatNumber(format, num)}; - } - return {num}; -} - -export default FormattedNumber; diff --git a/superset-frontend/plugins/legacy-plugin-chart-time-table/src/TimeTable.tsx b/superset-frontend/plugins/legacy-plugin-chart-time-table/src/TimeTable.tsx deleted file mode 100644 index 20076e1268da5..0000000000000 --- a/superset-frontend/plugins/legacy-plugin-chart-time-table/src/TimeTable.tsx +++ /dev/null @@ -1,330 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -import React from 'react'; -import Mustache from 'mustache'; -import { scaleLinear } from 'd3-scale'; -import { Table, Thead, Th, Tr, Td } from 'reactable-arc'; -import { formatNumber, formatTime, styled } from '@superset-ui/core'; -import { - InfoTooltipWithTrigger, - MetricOption, -} from '@superset-ui/chart-controls'; -import moment from 'moment'; - -import FormattedNumber from './FormattedNumber'; -import SparklineCell from './SparklineCell'; - -const ACCESSIBLE_COLOR_BOUNDS = ['#ca0020', '#0571b0']; -interface ColorFromBoundProps { - value: number; - bounds: Array; - colorBounds: Array; -} -function colorFromBounds( - value: number, - bounds: number[], - colorBounds = ACCESSIBLE_COLOR_BOUNDS, -): ColorFromBoundProps | null { - if (bounds) { - const [min, max] = bounds; - const [minColor, maxColor] = colorBounds; - if (min !== null && max !== null) { - const colorScale = scaleLinear() - .domain([min, (max + min) / 2, max]) - // @ts-ignore - .range([minColor, 'grey', maxColor]); - - // @ts-ignore - return colorScale(value); - } - if (min !== null) { - // @ts-ignore - return value >= min ? maxColor : minColor; - } - if (max !== null) { - // @ts-ignore - return value < max ? maxColor : minColor; - } - } - return null; -} - -interface ColumnConfigProps { - colType: string; - comparisonType: string; - d3format: string; - key: string; - label: string; - timeLag: number; - tooltip: any; - bounds: number[]; - dateFormat: string; - width: string; - height: string; - yAxisBounds: number[]; - showYAxis: boolean; - timeRatio: number; -} - -interface RowData { - label: string; - // eslint-disable-next-line camelcase - metric_name: string; -} - -interface ChartProps { - className: string | undefined; - columnConfigs: Array; - data: object; - height: number; - rows: Array; - rowType: string; - url: string; - row: Array; -} -interface Entry { - [key: string]: number; -} - -class TimeTable extends React.PureComponent { - renderLeftCell(row: RowData) { - const { rowType, url } = this.props; - const context = { metric: row }; - const fullUrl = url ? Mustache.render(url, context) : null; - - if (rowType === 'column') { - const column = row; - if (fullUrl) { - return ( - - {column.label} - - ); - } - return column.label; - } - - return ( - - ); - } - - // eslint-disable-next-line class-methods-use-this - renderSparklineCell( - valueField: string, - column: ColumnConfigProps, - entries: Entry[], - ) { - let sparkData: number[]; - if (column.timeRatio) { - // Period ratio sparkline - sparkData = []; - for (let i = column.timeRatio; i < entries.length; i += 1) { - const prevData = entries[i - column.timeRatio][valueField]; - if (prevData && prevData !== 0) { - sparkData.push(entries[i][valueField] / prevData); - } else { - // @ts-ignore - sparkData.push(null); - } - } - } else { - sparkData = entries.map(d => d[valueField]); - } - - return ( - - ( -
- {formatNumber(column.d3format, sparkData[index])} -
- {formatTime( - column.dateFormat, - moment.utc(entries[index].time).toDate(), - )} -
-
- )} - /> - - ); - } - - // eslint-disable-next-line class-methods-use-this - renderValueCell( - valueField: string, - column: ColumnConfigProps, - reversedEntries: Entry[], - ) { - const recent = reversedEntries[0][valueField]; - let v = 0; - let errorMsg; - if (column.colType === 'time') { - // Time lag ratio - const timeLag = column.timeLag || 0; - const totalLag = Object.keys(reversedEntries).length; - if (timeLag >= totalLag) { - errorMsg = `The time lag set at ${timeLag} is too large for the length of data at ${reversedEntries.length}. No data available.`; - } else { - v = reversedEntries[timeLag][valueField]; - } - if (column.comparisonType === 'diff') { - v = recent - v; - } else if (column.comparisonType === 'perc') { - v = recent / v; - } else if (column.comparisonType === 'perc_change') { - v = recent / v - 1; - } - v = v || 0; - } else if (column.colType === 'contrib') { - // contribution to column total - v = - recent / - Object.keys(reversedEntries[0]) - .map(k => (k === 'time' ? 0 : reversedEntries[0][k])) - .reduce((a, b) => a + b); - } else if (column.colType === 'avg') { - // Average over the last {timeLag} - v = - reversedEntries - .map((k: Entry, i: number) => - i < column.timeLag ? k[valueField] : 0, - ) - .reduce((a: number, b: number) => a + b) / column.timeLag; - } - - const color = colorFromBounds(v, column.bounds); - - return ( - - {errorMsg ? ( -
{errorMsg}
- ) : ( - // @ts-ignore -
- -
- )} - - ); - } - - renderRow(row: RowData, entries: Entry[], reversedEntries: Entry[]) { - const { columnConfigs } = this.props; - const valueField: string = row.label || row.metric_name; - const leftCell = this.renderLeftCell(row); - return ( - - - {leftCell} - - {columnConfigs.map(c => - c.colType === 'spark' - ? this.renderSparklineCell(valueField, c, entries) - : this.renderValueCell(valueField, c, reversedEntries), - )} - - ); - } - - render() { - const { className, height, data, columnConfigs, rowType, rows } = - this.props; - const entries = Object.keys(data) - .sort() - // @ts-ignore - // eslint-disable-next-line @typescript-eslint/no-unsafe-return - .map(time => ({ ...data[time], time })); - - const reversedEntries = entries.concat().reverse(); - - const defaultSort = - rowType === 'column' && columnConfigs.length > 0 - ? { - column: columnConfigs[0].key, - direction: 'desc', - } - : false; - - return ( -
- c.key)} - > - - - {columnConfigs.map((c, i) => ( - - ))} - - {rows.map(row => this.renderRow(row, entries, reversedEntries))} -
Metric - {c?.label}{' '} - {c?.tooltip && ( - - )} -
-
- ); - } -} - -export default styled(TimeTable)` - .time-table { - overflow: auto; - } -`; diff --git a/superset-frontend/plugins/legacy-plugin-chart-time-table/src/TimeTableChartPlugin.ts b/superset-frontend/plugins/legacy-plugin-chart-time-table/src/TimeTableChartPlugin.ts deleted file mode 100644 index ef1933bfcda95..0000000000000 --- a/superset-frontend/plugins/legacy-plugin-chart-time-table/src/TimeTableChartPlugin.ts +++ /dev/null @@ -1,39 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -import { t, ChartMetadata, ChartPlugin } from '@superset-ui/core'; -import transformProps from './transformProps'; -import thumbnail from './images/thumbnail.png'; - -const metadata = new ChartMetadata({ - name: t('Time-series Table'), - description: '', - thumbnail, - useLegacyApi: true, -}); - -export default class TimeTableChartPlugin extends ChartPlugin { - constructor() { - super({ - metadata, - // @ts-ignore - transformProps, - loadChart: () => import('./TimeTable'), - }); - } -} diff --git a/superset-frontend/plugins/legacy-plugin-chart-time-table/src/controlPanel.ts b/superset-frontend/plugins/legacy-plugin-chart-time-table/src/controlPanel.ts deleted file mode 100644 index 941bd1fe0dcc1..0000000000000 --- a/superset-frontend/plugins/legacy-plugin-chart-time-table/src/controlPanel.ts +++ /dev/null @@ -1,68 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -import { t, validateNonEmpty } from '@superset-ui/core'; -import { ControlPanelConfig, sections } from '@superset-ui/chart-controls'; - -const config: ControlPanelConfig = { - controlPanelSections: [ - sections.legacyTimeseriesTime, - { - label: t('Query'), - expanded: true, - controlSetRows: [ - ['metrics'], - ['adhoc_filters'], - ['groupby'], - ['limit'], - [ - { - name: 'column_collection', - config: { - type: 'CollectionControl', - label: t('Time Series Columns'), - validators: [validateNonEmpty], - controlName: 'TimeSeriesColumnControl', - }, - }, - ], - [ - { - name: 'url', - config: { - type: 'TextControl', - label: t('URL'), - description: t( - "Templated link, it's possible to include {{ metric }} " + - 'or other values coming from the controls.', - ), - default: '', - }, - }, - ], - ], - }, - ], - controlOverrides: { - groupby: { - multiple: false, - }, - }, -}; - -export default config; diff --git a/superset-frontend/plugins/legacy-plugin-chart-time-table/src/images/thumbnail.png b/superset-frontend/plugins/legacy-plugin-chart-time-table/src/images/thumbnail.png deleted file mode 100644 index 22c2ee2904390de3759b80239e6d0c19026ef795..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12797 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 DsC|t` diff --git a/superset-frontend/plugins/legacy-plugin-chart-time-table/src/images/thumbnailLarge.png b/superset-frontend/plugins/legacy-plugin-chart-time-table/src/images/thumbnailLarge.png deleted file mode 100644 index 4dd4b925c7c1b1b0c604761fb5345e26718f251e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23986 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 Nxn+E_TnG8|KLBYICBpy! diff --git a/superset-frontend/plugins/legacy-plugin-chart-time-table/src/index.ts b/superset-frontend/plugins/legacy-plugin-chart-time-table/src/index.ts deleted file mode 100644 index 586524f506a99..0000000000000 --- a/superset-frontend/plugins/legacy-plugin-chart-time-table/src/index.ts +++ /dev/null @@ -1,52 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -import { t, ChartMetadata, ChartPlugin } from '@superset-ui/core'; -import transformProps from './transformProps'; -import thumbnail from './images/thumbnail.png'; -import controlPanel from './controlPanel'; - -const metadata = new ChartMetadata({ - category: t('Table'), - name: t('Time-series Table'), - description: t( - 'Compare multiple time series charts (as sparklines) and related metrics quickly. ', - ), - tags: [ - t('Multi-Variables'), - t('Comparison'), - t('Legacy'), - t('Percentages'), - t('Tabular'), - t('Description'), - t('Trend'), - ], - thumbnail, - useLegacyApi: true, -}); -export default class TimeTableChartPlugin extends ChartPlugin { - constructor() { - super({ - loadChart: () => import('./TimeTable'), - metadata, - // @ts-ignore - transformProps, - controlPanel, - }); - } -} diff --git a/superset-frontend/plugins/legacy-plugin-chart-time-table/tsconfig.json b/superset-frontend/plugins/legacy-plugin-chart-time-table/tsconfig.json deleted file mode 100644 index b6bfaa2d98446..0000000000000 --- a/superset-frontend/plugins/legacy-plugin-chart-time-table/tsconfig.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "compilerOptions": { - "declarationDir": "lib", - "outDir": "lib", - "rootDir": "src" - }, - "exclude": [ - "lib", - "test" - ], - "extends": "../../tsconfig.json", - "include": [ - "src/**/*", - "types/**/*", - "../../types/**/*" - ], - "references": [ - { - "path": "../../packages/superset-ui-chart-controls" - }, - { - "path": "../../packages/superset-ui-core" - } - ] -} diff --git a/superset-frontend/plugins/legacy-plugin-chart-time-table/types/external.d.ts b/superset-frontend/plugins/legacy-plugin-chart-time-table/types/external.d.ts deleted file mode 100644 index a9c7ec89cef8b..0000000000000 --- a/superset-frontend/plugins/legacy-plugin-chart-time-table/types/external.d.ts +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -declare module '*.png'; -declare module '@data-ui/sparkline'; -declare module 'reactable-arc'; -declare module 'mustache'; diff --git a/superset-frontend/src/visualizations/TimeTable/SparklineCell.jsx b/superset-frontend/src/visualizations/TimeTable/SparklineCell.jsx deleted file mode 100644 index fc1e0077ee9c2..0000000000000 --- a/superset-frontend/src/visualizations/TimeTable/SparklineCell.jsx +++ /dev/null @@ -1,203 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -import React from 'react'; -import PropTypes from 'prop-types'; -import { - Sparkline, - LineSeries, - PointSeries, - HorizontalReferenceLine, - VerticalReferenceLine, - WithTooltip, -} from '@data-ui/sparkline'; -import { getTextDimension, formatNumber } from '@superset-ui/core'; - -const propTypes = { - className: PropTypes.string, - width: PropTypes.number, - height: PropTypes.number, - data: PropTypes.array.isRequired, - ariaLabel: PropTypes.string, - numberFormat: PropTypes.string, - yAxisBounds: PropTypes.array, - showYAxis: PropTypes.bool, - renderTooltip: PropTypes.func, -}; -const defaultProps = { - className: '', - width: 300, - height: 50, - ariaLabel: '', - numberFormat: undefined, - yAxisBounds: [null, null], - showYAxis: false, - renderTooltip() { - return
; - }, -}; - -const MARGIN = { - top: 8, - right: 8, - bottom: 8, - left: 8, -}; -const tooltipProps = { - style: { - opacity: 0.8, - }, - offsetTop: 0, -}; - -function getSparklineTextWidth(text) { - return ( - getTextDimension({ - text, - style: { - fontSize: '12px', - fontWeight: 200, - letterSpacing: 0.4, - }, - }).width + 5 - ); -} - -function isValidBoundValue(value) { - return ( - value !== null && - value !== undefined && - value !== '' && - !Number.isNaN(value) - ); -} - -class SparklineCell extends React.Component { - renderHorizontalReferenceLine(value, label) { - return ( - label} - stroke="#bbb" - strokeDasharray="3 3" - strokeWidth={1} - /> - ); - } - - render() { - const { - width, - height, - data, - ariaLabel, - numberFormat, - yAxisBounds, - showYAxis, - renderTooltip, - } = this.props; - - const yScale = {}; - let hasMinBound = false; - let hasMaxBound = false; - - if (yAxisBounds) { - const [minBound, maxBound] = yAxisBounds; - hasMinBound = isValidBoundValue(minBound); - if (hasMinBound) { - yScale.min = minBound; - } - hasMaxBound = isValidBoundValue(maxBound); - if (hasMaxBound) { - yScale.max = maxBound; - } - } - - let min; - let max; - let minLabel; - let maxLabel; - let labelLength = 0; - if (showYAxis) { - const [minBound, maxBound] = yAxisBounds; - min = hasMinBound - ? minBound - : data.reduce((acc, current) => Math.min(acc, current), data[0]); - max = hasMaxBound - ? maxBound - : data.reduce((acc, current) => Math.max(acc, current), data[0]); - - minLabel = formatNumber(numberFormat, min); - maxLabel = formatNumber(numberFormat, max); - labelLength = Math.max( - getSparklineTextWidth(minLabel), - getSparklineTextWidth(maxLabel), - ); - } - - const margin = { - ...MARGIN, - right: MARGIN.right + labelLength, - }; - - return ( - - {({ onMouseLeave, onMouseMove, tooltipData }) => ( - - {showYAxis && this.renderHorizontalReferenceLine(min, minLabel)} - {showYAxis && this.renderHorizontalReferenceLine(max, maxLabel)} - - {tooltipData && ( - - )} - {tooltipData && ( - - )} - - )} - - ); - } -} - -SparklineCell.propTypes = propTypes; -SparklineCell.defaultProps = defaultProps; - -export default SparklineCell; diff --git a/superset-frontend/plugins/legacy-plugin-chart-time-table/src/SparklineCell.tsx b/superset-frontend/src/visualizations/TimeTable/SparklineCell.tsx similarity index 100% rename from superset-frontend/plugins/legacy-plugin-chart-time-table/src/SparklineCell.tsx rename to superset-frontend/src/visualizations/TimeTable/SparklineCell.tsx diff --git a/superset-frontend/src/visualizations/TimeTable/TimeTableChartPlugin.js b/superset-frontend/src/visualizations/TimeTable/TimeTableChartPlugin.ts similarity index 100% rename from superset-frontend/src/visualizations/TimeTable/TimeTableChartPlugin.js rename to superset-frontend/src/visualizations/TimeTable/TimeTableChartPlugin.ts diff --git a/superset-frontend/src/visualizations/TimeTable/transformProps.js b/superset-frontend/src/visualizations/TimeTable/transformProps.js deleted file mode 100644 index 93e0e7df70aa8..0000000000000 --- a/superset-frontend/src/visualizations/TimeTable/transformProps.js +++ /dev/null @@ -1,62 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -export default function transformProps(chartProps) { - const { height, datasource, formData, queriesData } = chartProps; - const { columnCollection = [], groupby, metrics, url } = formData; - const { records, columns } = queriesData[0].data; - const isGroupBy = groupby?.length > 0; - - // When there is a "group by", - // each row in the table is a database column - // Otherwise, - // each row in the table is a metric - let rows; - if (isGroupBy) { - rows = columns.map(column => - typeof column === 'object' ? column : { label: column }, - ); - } else { - const metricMap = datasource.metrics.reduce((acc, current) => { - const map = acc; - map[current.metric_name] = current; - return map; - }, {}); - - rows = metrics.map(metric => - typeof metric === 'object' ? metric : metricMap[metric], - ); - } - - // TODO: Better parse this from controls instead of mutative value here. - columnCollection.forEach(column => { - const c = column; - if (c.timeLag !== undefined && c.timeLag !== null && c.timeLag !== '') { - c.timeLag = parseInt(c.timeLag, 10); - } - }); - - return { - height, - data: records, - columnConfigs: columnCollection, - rows, - rowType: isGroupBy ? 'column' : 'metric', - url, - }; -} diff --git a/superset-frontend/plugins/legacy-plugin-chart-time-table/src/transformProps.ts b/superset-frontend/src/visualizations/TimeTable/transformProps.ts similarity index 92% rename from superset-frontend/plugins/legacy-plugin-chart-time-table/src/transformProps.ts rename to superset-frontend/src/visualizations/TimeTable/transformProps.ts index 3db4362ed7f0c..f408cc21869da 100644 --- a/superset-frontend/plugins/legacy-plugin-chart-time-table/src/transformProps.ts +++ b/superset-frontend/src/visualizations/TimeTable/transformProps.ts @@ -42,14 +42,13 @@ interface ColumnData { } export default function transformProps(chartProps: TableChartProps) { const { height, datasource, formData, queriesData } = chartProps; - const { columnCollection, groupby, metrics, url } = formData; + const { columnCollection = [], groupby, metrics, url } = formData; const { records, columns } = queriesData[0].data; const isGroupBy = groupby?.length > 0; // When there is a "group by", // each row in the table is a database column - // Otherwise,`` - // each row in the table is a metric + // Otherwise each row in the table is a metric let rows; if (isGroupBy) { rows = columns.map(column => @@ -58,9 +57,7 @@ export default function transformProps(chartProps: TableChartProps) { } else { const metricMap = datasource.metrics.reduce((acc, current) => { const map = acc; - if (current.metric_name) { - map[current.metric_name] = current; - } + map[current.metric_name] = current; return map; }, {} as Record); rows = metrics.map(metric => diff --git a/superset-frontend/temporary_superset_ui/superset-ui/.eslintrc.js b/superset-frontend/temporary_superset_ui/superset-ui/.eslintrc.js index 5a0a248331768..0ad67c24e17ee 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/.eslintrc.js +++ b/superset-frontend/temporary_superset_ui/superset-ui/.eslintrc.js @@ -61,7 +61,6 @@ module.exports = { '@superset-ui/legacy-plugin-chart-sankey', '@superset-ui/legacy-plugin-chart-sankey-loop', '@superset-ui/legacy-plugin-chart-sunburst', - '@superset-ui/legacy-plugin-chart-time-table', '@superset-ui/legacy-plugin-chart-treemap', '@superset-ui/legacy-plugin-chart-world-map', '@superset-ui/legacy-preset-chart-big-number', From ad34c4191ec585907eb0e0137ab8ad12d9980de5 Mon Sep 17 00:00:00 2001 From: Jesse Yang Date: Wed, 1 Dec 2021 15:56:11 -0800 Subject: [PATCH 2/3] add sparkline type --- superset-frontend/src/visualizations/TimeTable/types.d.ts | 1 + 1 file changed, 1 insertion(+) create mode 100644 superset-frontend/src/visualizations/TimeTable/types.d.ts diff --git a/superset-frontend/src/visualizations/TimeTable/types.d.ts b/superset-frontend/src/visualizations/TimeTable/types.d.ts new file mode 100644 index 0000000000000..da78b66351fac --- /dev/null +++ b/superset-frontend/src/visualizations/TimeTable/types.d.ts @@ -0,0 +1 @@ +declare module '@data-ui/sparkline'; From 40639cde5742a8fc340234c38ae3c5daed2cc5f9 Mon Sep 17 00:00:00 2001 From: Jesse Yang Date: Wed, 1 Dec 2021 21:18:19 -0800 Subject: [PATCH 3/3] Fix license check --- .../src/visualizations/TimeTable/types.d.ts | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/superset-frontend/src/visualizations/TimeTable/types.d.ts b/superset-frontend/src/visualizations/TimeTable/types.d.ts index da78b66351fac..71ee4453d29a6 100644 --- a/superset-frontend/src/visualizations/TimeTable/types.d.ts +++ b/superset-frontend/src/visualizations/TimeTable/types.d.ts @@ -1 +1,19 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ declare module '@data-ui/sparkline';