diff --git a/src-docs/src/routes.js b/src-docs/src/routes.js index fb98310210..7d19640ea6 100644 --- a/src-docs/src/routes.js +++ b/src-docs/src/routes.js @@ -231,18 +231,6 @@ import { I18nTokens } from './views/package/i18n_tokens'; import { SuperSelectExample } from './views/super_select/super_select_example'; -/** Elastic Charts */ - -import { ElasticChartsThemingExample } from './views/elastic_charts/theming_example'; - -import { ElasticChartsTimeExample } from './views/elastic_charts/time_example'; - -import { ElasticChartsCategoryExample } from './views/elastic_charts/category_example'; - -import { ElasticChartsSparklinesExample } from './views/elastic_charts/sparklines_example'; - -import { ElasticChartsPieExample } from './views/elastic_charts/pie_example'; - const createExample = (example, customTitle) => { if (!example) { throw new Error( @@ -450,16 +438,6 @@ const navigation = [ CodeExample, ].map((example) => createExample(example)), }, - { - name: 'Elastic Charts', - items: [ - ElasticChartsThemingExample, - ElasticChartsSparklinesExample, - ElasticChartsTimeExample, - ElasticChartsCategoryExample, - ElasticChartsPieExample, - ].map((example) => createExample(example)), - }, { name: 'Utilities', items: [ diff --git a/src-docs/src/views/elastic_charts/category_chart.js b/src-docs/src/views/elastic_charts/category_chart.js deleted file mode 100644 index fbb764ff88..0000000000 --- a/src-docs/src/views/elastic_charts/category_chart.js +++ /dev/null @@ -1,228 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * - * The OpenSearch Contributors require contributions made to - * this file be licensed under the Apache-2.0 license or a - * compatible open source license. - * - * Modifications Copyright OpenSearch Contributors. See - * GitHub history for details. - */ - -import React, { useState, Fragment, useContext } from 'react'; -import orderBy from 'lodash/orderBy'; -import round from 'lodash/round'; - -import { ThemeContext } from '../../components'; -import { Chart, Settings, Axis } from '@elastic/charts'; - -import { - OUI_CHARTS_THEME_DARK, - OUI_CHARTS_THEME_LIGHT, -} from '../../../../src/themes/charts/themes'; - -import { - OuiSwitch, - OuiSpacer, - OuiTitle, - OuiFlexGrid, - OuiFlexItem, - OuiCode, - OuiCopy, - OuiButton, -} from '../../../../src/components'; - -import { SIMPLE_GITHUB_DATASET, GITHUB_DATASET } from './data'; -import { - ChartTypeCard, - MultiChartCard, - CHART_COMPONENTS, - ChartCard, -} from './shared'; - -export const CategoryChart = () => { - const themeContext = useContext(ThemeContext); - - const [multi, setMulti] = useState(false); - const [stacked, setStacked] = useState(false); - const [rotated, setRotated] = useState(true); - const [ordered, setOrdered] = useState(true); - const [formatted, setFormatted] = useState(false); - const [chartType, setChartType] = useState('BarSeries'); - - const onMultiChange = (multiObject) => { - const { multi, stacked } = multiObject; - setMulti(multi); - setStacked(stacked); - }; - - const onRotatedChange = (e) => { - setRotated(e.target.checked); - }; - - const onOrderedChange = (e) => { - setOrdered(e.target.checked); - }; - - const onFormatChange = (e) => { - setFormatted(e.target.checked); - }; - - const onChartTypeChange = (chartType) => { - setChartType(chartType); - }; - - const isDarkTheme = themeContext.theme.includes('dark'); - const theme = isDarkTheme - ? OUI_CHARTS_THEME_DARK.theme - : OUI_CHARTS_THEME_LIGHT.theme; - - const ChartType = CHART_COMPONENTS[chartType]; - - const DATASET = multi ? GITHUB_DATASET : SIMPLE_GITHUB_DATASET; - - return ( - - -

- Number of GitHub issues per visualization type - {multi && ' by type of issue'} -

-
- - - - - - - - `${round(Number(d) / 1000, 2)}k` : undefined - } - /> - - - - - - - - - - - - - - - - - - - - 1000 ⇢ 1k   20000 ⇢ 20k - - - - - - - - - - - - - - - - -
- - - <${chartType} - id="issues" - name="Issues" - data={${ - ordered - ? "orderBy([{vizType: 'Data Table', count: 24, issueType: 'Bug'},{vizType: 'Heatmap',count: 12, issueType: 'Other'}], ['count'], ['desc'])" - : "orderBy([{vizType: 'Data Table', count: 24, issueType: 'Bug'},{vizType: 'Heatmap',count: 12, issueType: 'Other'}], ['vizType'], ['asc'])" - }} - xAccessor="vizType" - yAccessors={['count']} - ${multi ? "splitSeriesAccessors={['issueType']}" : ''} - ${stacked ? "stackAccessors={['issueType']}" : ''} - /> - - `${round(Number(d) / 1000, 2)}k`}' : ''} - /> -`}> - {(copy) => ( - - Copy code of current configuration - - )} - -
-
- ); -}; diff --git a/src-docs/src/views/elastic_charts/category_example.js b/src-docs/src/views/elastic_charts/category_example.js deleted file mode 100644 index 2a1cb86e68..0000000000 --- a/src-docs/src/views/elastic_charts/category_example.js +++ /dev/null @@ -1,65 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * - * The OpenSearch Contributors require contributions made to - * this file be licensed under the Apache-2.0 license or a - * compatible open source license. - * - * Modifications Copyright OpenSearch Contributors. See - * GitHub history for details. - */ - -import React, { Fragment } from 'react'; -import { ExternalBadge } from './shared'; -import { CategoryChart } from './category_chart'; - -import { OuiCode } from '../../../../src/components'; - -export const ElasticChartsCategoryExample = { - title: 'Categorical', - intro: ( - - - - ), - sections: [ - { - text: ( - -

- Categorical charts compare data between multiple distinct - categories. Avoid using a line chart because it might create - confusion with a time series chart. Use a bar chart instead. -

- -

- Key configurations -

- - -
- ), - demo: , - }, - ], -}; diff --git a/src-docs/src/views/elastic_charts/data.js b/src-docs/src/views/elastic_charts/data.js deleted file mode 100644 index 9d4b8862a6..0000000000 --- a/src-docs/src/views/elastic_charts/data.js +++ /dev/null @@ -1,526 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * - * The OpenSearch Contributors require contributions made to - * this file be licensed under the Apache-2.0 license or a - * compatible open source license. - * - * Modifications Copyright OpenSearch Contributors. See - * GitHub history for details. - */ - -export const TIME_DATA_SMALL = [ - [1551438630000, 8.515625], - [1551438660000, 10.796875], - [1551438690000, 11.125], - [1551438720000, 21.40625], - [1551438750000, 17.921875], - [1551438780000, 26.640625], - [1551438810000, 31.390625], - [1551438840000, 23.953125], -]; - -export const TIME_DATA = [ - [1551438000000, 8.3203125], - [1551438030000, 7.9140625], - [1551438060000, 7.8671875], - [1551438090000, 7.125], - [1551438120000, 8.765625], - [1551438150000, 11.546875], - [1551438180000, 12.984375], - [1551438210000, 13.546875], - [1551438240000, 13.390625], - [1551438270000, 11.5625], - [1551438300000, 11.5859375], - [1551438330000, 10.0546875], - [1551438360000, 9.921875], - [1551438390000, 9.4921875], - [1551438420000, 9.78125], - [1551438450000, 10.046875], - [1551438480000, 14.0546875], - [1551438510000, 10.640625], - [1551438540000, 8.2421875], - [1551438570000, 8.5], - [1551438600000, 7.2578125], - [1551438630000, 8.515625], - [1551438660000, 10.796875], - [1551438690000, 11.125], - [1551438720000, 21.40625], - [1551438750000, 17.921875], - [1551438780000, 26.640625], - [1551438810000, 31.390625], - [1551438840000, 23.953125], -]; - -export const TIME_DATA_2 = [ - [1551438000000, 9.984375], - [1551438030000, 9.71875], - [1551438060000, 9.28125], - [1551438090000, 9.078125], - [1551438120000, 8.9921875], - [1551438150000, 9.640625], - [1551438180000, 10.171875], - [1551438210000, 10.421875], - [1551438240000, 10.625], - [1551438270000, 10.390625], - [1551438300000, 10.4296875], - [1551438330000, 10.1328125], - [1551438360000, 9.984375], - [1551438390000, 9.8203125], - [1551438420000, 9.8125], - [1551438450000, 9.78125], - [1551438480000, 10.625], - [1551438510000, 10.09375], - [1551438540000, 9.5546875], - [1551438570000, 9.390625], - [1551438600000, 9.015625], - [1551438630000, 8.8828125], - [1551438660000, 9.359375], - [1551438690000, 9.53125], - [1551438720000, 11.9453125], - [1551438750000, 11.828125], - [1551438780000, 14.4609375], - [1551438810000, 16.421875], - [1551438840000, 15.6875], -]; - -export const SIMPLE_GITHUB_DATASET = [ - { - authorAssociation: 'Team Member', - vizType: 'Data Table', - issueType: 'Bug', - count: 24000, - }, - { - authorAssociation: 'Team Member', - vizType: 'Heatmap', - issueType: 'Bug', - count: 12000, - }, - { - authorAssociation: 'Team Member', - vizType: 'Markdown', - issueType: 'Bug', - count: 6000, - }, - { - authorAssociation: 'Team Member', - vizType: 'MetricVis', - issueType: 'Bug', - count: 16000, - }, - { - authorAssociation: 'Team Member', - vizType: 'Pie Chart', - issueType: 'Bug', - count: 7000, - }, - { - authorAssociation: 'Team Member', - vizType: 'Tagcloud', - issueType: 'Bug', - count: 19000, - }, - { - authorAssociation: 'Team Member', - vizType: 'TSVB', - issueType: 'Bug', - count: 86000, - }, - { - authorAssociation: 'Team Member', - vizType: 'Timelion', - issueType: 'Bug', - count: 58000, - }, - { - authorAssociation: 'Team Member', - vizType: 'Vega vis', - issueType: 'Bug', - count: 11000, - }, - { - authorAssociation: 'Team Member', - vizType: 'Point Series', - issueType: 'Bug', - count: 1000, - }, - { - authorAssociation: 'Team Member', - vizType: 'Inspector', - issueType: 'Bug', - count: 15000, - }, -]; - -export const GITHUB_DATASET = [ - { - authorAssociation: 'Team Member', - vizType: 'Data Table', - issueType: 'Bug', - count: 24000, - }, - { - authorAssociation: 'Team Member', - vizType: 'Data Table', - issueType: 'Other', - count: 22000, - }, - { - authorAssociation: 'Team Member', - vizType: 'Heatmap', - issueType: 'Bug', - count: 12000, - }, - { - authorAssociation: 'Team Member', - vizType: 'Heatmap', - issueType: 'Other', - count: 6000, - }, - { - authorAssociation: 'Team Member', - vizType: 'Markdown', - issueType: 'Bug', - count: 6000, - }, - { - authorAssociation: 'Team Member', - vizType: 'Markdown', - issueType: 'Other', - count: 11000, - }, - { - authorAssociation: 'Team Member', - vizType: 'MetricVis', - issueType: 'Bug', - count: 16000, - }, - { - authorAssociation: 'Team Member', - vizType: 'MetricVis', - issueType: 'Other', - count: 8000, - }, - { - authorAssociation: 'Team Member', - vizType: 'Pie Chart', - issueType: 'Bug', - count: 7000, - }, - { - authorAssociation: 'Team Member', - vizType: 'Pie Chart', - issueType: 'Other', - count: 4000, - }, - { - authorAssociation: 'Team Member', - vizType: 'Tagcloud', - issueType: 'Bug', - count: 19000, - }, - { - authorAssociation: 'Team Member', - vizType: 'Tagcloud', - issueType: 'Other', - count: 13000, - }, - { - authorAssociation: 'Team Member', - vizType: 'TSVB', - issueType: 'Bug', - count: 86000, - }, - { - authorAssociation: 'Team Member', - vizType: 'TSVB', - issueType: 'Other', - count: 123000, - }, - { - authorAssociation: 'Team Member', - vizType: 'Timelion', - issueType: 'Bug', - count: 58000, - }, - { - authorAssociation: 'Team Member', - vizType: 'Timelion', - issueType: 'Other', - count: 93000, - }, - { - authorAssociation: 'Team Member', - vizType: 'Vega vis', - issueType: 'Bug', - count: 11000, - }, - { - authorAssociation: 'Team Member', - vizType: 'Vega vis', - issueType: 'Other', - count: 38000, - }, - { - authorAssociation: 'Team Member', - vizType: 'Point Series', - issueType: 'Bug', - count: 1000, - }, - { - authorAssociation: 'Team Member', - vizType: 'Point Series', - issueType: 'Other', - count: 1000, - }, - { - authorAssociation: 'Team Member', - vizType: 'Inspector', - issueType: 'Bug', - count: 15000, - }, - { - authorAssociation: 'Team Member', - vizType: 'Inspector', - issueType: 'Other', - count: 11000, - }, -]; - -export const GITHUB_DATASET_MOD = [ - { - total: 'Total', - vizType: 'Data Table', - issueType: 'Bug', - count: 24, - }, - { - total: 'Total', - vizType: 'Data Table', - issueType: 'Request', - count: 22, - }, - { - total: 'Total', - vizType: 'Tagcloud', - issueType: 'Bug', - count: 19, - }, - { - total: 'Total', - vizType: 'Tagcloud', - issueType: 'Request', - count: 13, - }, - { - total: 'Total', - vizType: 'TSVB', - issueType: 'Bug', - count: 86, - }, - { - total: 'Total', - vizType: 'TSVB', - issueType: 'Request', - count: 123, - }, - { - total: 'Total', - vizType: 'Timelion', - issueType: 'Bug', - count: 58, - }, - { - total: 'Total', - vizType: 'Timelion', - issueType: 'Request', - count: 93, - }, - { - total: 'Total', - vizType: 'Vega vis', - issueType: 'Bug', - count: 11, - }, - { - total: 'Total', - vizType: 'Vega vis', - issueType: 'Request', - count: 38, - }, - { - total: 'Total', - vizType: 'Other', - issueType: 'Bug', - count: 10, - }, - { - total: 'Total', - vizType: 'Other', - issueType: 'Request', - count: 18, - }, -]; - -export const BROWSER_DATA_2019 = [ - { - browser: 'Chrome', - percent: 61.72, - }, - { - browser: 'Safari', - percent: 15.23, - }, - { - browser: 'Firefox', - percent: 4.66, - }, - { - browser: 'Samsung Internet', - percent: '3.64', - }, - { - browser: 'UC Browser', - percent: '3.83', - }, - { - browser: 'Opera', - percent: '2.91', - }, - { - browser: 'IE', - percent: '2.7', - }, - { - browser: 'Edge Legacy', - percent: '2.13', - }, - { - browser: 'Android', - percent: '1.15', - }, - { - browser: 'KaiOS', - percent: '0.54', - }, - { - browser: 'Yandex Browser', - percent: '0.24', - }, - { - browser: 'QQ Browser', - percent: '0.22', - }, - { - browser: 'Puffin', - percent: '0.12', - }, - { - browser: 'Coc Coc', - percent: '0.09', - }, - { - browser: 'IEMobile', - percent: '0.1', - }, - { - browser: 'Chromium', - percent: '0.08', - }, - { - browser: 'Whale Browser', - percent: '0.01', - }, - { - browser: 'Sogou Explorer', - percent: '0.08', - }, - { - browser: 'Sony PS4', - percent: '0.06', - }, - { - browser: 'mCent', - percent: '0.21', - }, - { - browser: 'Maxthon', - percent: '0.04', - }, - { - browser: 'Mozilla', - percent: '0.03', - }, - { - browser: 'Vivaldi', - percent: '0.02', - }, - { - browser: '360 Safe Browser', - percent: '0.03', - }, - { - browser: 'Unknown', - percent: '0.03', - }, - { - browser: 'BlackBerry', - percent: '0.02', - }, - { - browser: 'Nokia', - percent: '0.03', - }, - { - browser: 'Pale Moon', - percent: '0.01', - }, - { - browser: 'Other', - percent: '0.06', - }, -]; - -export const DAYS_OF_RAIN = [ - { - season: 'Spring', - days: 68, - precipitation: 'rain', - }, - { - season: 'Summer', - days: 46, - precipitation: 'rain', - }, - { - season: 'Fall', - days: 72, - precipitation: 'rain', - }, - { - season: 'Winter', - days: 24, - precipitation: 'rain', - }, - { - season: 'Spring', - days: 22, - precipitation: 'none', - }, - { - season: 'Summer', - days: 44, - precipitation: 'none', - }, - { - season: 'Fall', - days: 18, - precipitation: 'none', - }, - { - season: 'Winter', - days: 66, - precipitation: 'none', - }, -]; diff --git a/src-docs/src/views/elastic_charts/pie.js b/src-docs/src/views/elastic_charts/pie.js deleted file mode 100644 index 1af16d7057..0000000000 --- a/src-docs/src/views/elastic_charts/pie.js +++ /dev/null @@ -1,121 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * - * The OpenSearch Contributors require contributions made to - * this file be licensed under the Apache-2.0 license or a - * compatible open source license. - * - * Modifications Copyright OpenSearch Contributors. See - * GitHub history for details. - */ - -import React, { useContext } from 'react'; -import { ThemeContext } from '../../components'; -import { Chart, Partition } from '@elastic/charts'; - -import { - OUI_CHARTS_THEME_DARK, - OUI_CHARTS_THEME_LIGHT, -} from '../../../../src/themes/charts/themes'; -import { - OuiFlexGrid, - OuiFlexItem, - OuiTitle, - OuiSpacer, -} from '../../../../src/components'; - -export default () => { - const themeContext = useContext(ThemeContext); - - /** - * Setup theme based on current light/dark theme - */ - const isDarkTheme = themeContext.theme.includes('dark'); - const ouiChartTheme = isDarkTheme - ? OUI_CHARTS_THEME_DARK - : OUI_CHARTS_THEME_LIGHT; - const ouiPartitionConfig = ouiChartTheme.partition; - - return ( -
- - - -

Year to date PR count by status

-
- - - d.count} - layers={[ - { - groupByRollup: (d) => d.status, - shape: { - fillColor: (d) => - ouiChartTheme.theme.colors.vizColors[d.sortIndex], - }, - }, - ]} - config={{ - ...ouiPartitionConfig, - clockwiseSectors: false, - }} - /> - -
- - -

Code languages

-
- - - Number(d.percent)} - valueFormatter={() => ''} - layers={[ - { - groupByRollup: (d) => d.language, - shape: { - fillColor: (d) => - ouiChartTheme.theme.colors.vizColors[d.sortIndex], - }, - }, - ]} - config={{ - ...ouiPartitionConfig, - emptySizeRatio: 0.4, - clockwiseSectors: false, - }} - /> - -
-
-
- ); -}; diff --git a/src-docs/src/views/elastic_charts/pie_alts.js b/src-docs/src/views/elastic_charts/pie_alts.js deleted file mode 100644 index 9253864f21..0000000000 --- a/src-docs/src/views/elastic_charts/pie_alts.js +++ /dev/null @@ -1,337 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * - * The OpenSearch Contributors require contributions made to - * this file be licensed under the Apache-2.0 license or a - * compatible open source license. - * - * Modifications Copyright OpenSearch Contributors. See - * GitHub history for details. - */ - -/* eslint-disable no-nested-ternary */ -import React, { useState, Fragment, useContext } from 'react'; -import groupBy from 'lodash/groupBy'; -import mapValues from 'lodash/mapValues'; -import orderBy from 'lodash/orderBy'; -import sortBy from 'lodash/sortBy'; -import sumBy from 'lodash/sumBy'; - -import { ThemeContext } from '../../components'; -import { Chart, Settings, Axis, BarSeries } from '@elastic/charts'; - -import { - OUI_CHARTS_THEME_DARK, - OUI_CHARTS_THEME_LIGHT, -} from '../../../../src/themes/charts/themes'; - -import { - OuiSwitch, - OuiSpacer, - OuiTitle, - OuiFlexGrid, - OuiFlexItem, - OuiCopy, - OuiButton, -} from '../../../../src/components'; - -import { GITHUB_DATASET, GITHUB_DATASET_MOD, DAYS_OF_RAIN } from './data'; -import { ChartCard } from './shared'; -import { - ouiPaletteForTemperature, - ouiPaletteColorBlind, - ouiPaletteGray, -} from '../../../../src/services'; - -export default () => { - const themeContext = useContext(ThemeContext); - - const [stacked, setStacked] = useState(true); - const [rotated, setRotated] = useState(true); - const [ordered, setOrdered] = useState(true); - const [formatted, setFormatted] = useState(false); - const [formattedData, setFormattedData] = useState(false); - const [grouped, setGrouped] = useState(false); - - const isDarkTheme = themeContext.theme.includes('dark'); - const theme = isDarkTheme - ? OUI_CHARTS_THEME_DARK.theme - : OUI_CHARTS_THEME_LIGHT.theme; - - let color = ouiPaletteColorBlind({ rotations: 2, order: 'group' }).slice( - 18, - 20 - ); - if (formatted) { - color = [ - ouiPaletteForTemperature()[0], - ouiPaletteGray(5)[isDarkTheme ? 4 : 0], - ]; - } - - let data; - let usesRainData; - if (formatted && formattedData) { - data = ordered - ? orderBy(DAYS_OF_RAIN, ['precipitation', 'days'], ['desc', 'asc']) - : DAYS_OF_RAIN; - usesRainData = true; - color = ouiPaletteForTemperature(3); - } else { - const DATASET = grouped ? GITHUB_DATASET_MOD : GITHUB_DATASET; - data = orderBy(DATASET, 'issueType', 'asc'); - - if (ordered) { - const totals = mapValues(groupBy(DATASET, 'vizType'), (groups) => - sumBy(groups, 'count') - ); - - data = orderBy(DATASET, 'issueType', 'desc'); - const sortedData = sortBy(data, [ - ({ vizType }) => totals[vizType], - ]).reverse(); - data = sortedData; - } - } - - const tickFormat = (tick) => { - if (formatted) { - return `${Number(tick * 100).toFixed(0)}%`; - } else if (!grouped && String(tick).length > 1) { - return String(tick).substring(0, String(tick).length - 3); - } else { - return tick; - } - }; - - let isMisleadingChart = false; - let isBadChart = false; - let description = - 'This chart is a good alternative to the standard multi-tier pie (or sunburst) chart. It clearly represents the actual values while maintaining visual comparison.'; - let title = 'Good alternative'; - - if (formatted && !stacked) { - isBadChart = true; - title = 'Bad chart'; - description = 'This means nothing.'; - } else if (formatted) { - if (formattedData) { - description = - 'With every category having the same total (usually already percentages), the chart is accurately representative of the data.'; - } else { - isMisleadingChart = true; - title = 'Misleading chart'; - description = ( - - Showing percentages while the{' '} - totals for each category are not the same can - misrepresent the relative values. Use the toggle to see a better data - set. - - ); - } - } else if (grouped) { - description = - 'Grouping "Other" is still valid to concentrate on the top values while still including all possible values to completely represent the whole.'; - } - - return ( - - {usesRainData ? ( - <> - -

Percentage of rainfall per season

-
- - - - - - - - - - - ) : ( - <> - -

- {formatted ? 'Percentage' : 'Number'} of GitHub issues per - visualization type -

-
- - - - - - - - - - - )} - - - - - - - {formatted && stacked && ( - setFormattedData(e.target.checked)} - /> - )} - - - - - - setStacked(e.target.checked)} - /> - - setGrouped(e.target.checked)} - /> - - setFormatted(e.target.checked)} - /> - - - - - - setOrdered(e.target.checked)} - /> - - setRotated(e.target.checked)} - /> - - - - - - -
- - - - - `${Number(tick * 100).toFixed(0)}%`}' - : '' - } - /> -`}> - {(copy) => ( - - {isBadChart || isMisleadingChart - ? isMisleadingChart - ? 'This chart is misleading' - : "Bad chart, don't copy" - : 'Copy code of current configuration'} - - )} - -
-
- ); -}; diff --git a/src-docs/src/views/elastic_charts/pie_example.js b/src-docs/src/views/elastic_charts/pie_example.js deleted file mode 100644 index 0fb6f0ceeb..0000000000 --- a/src-docs/src/views/elastic_charts/pie_example.js +++ /dev/null @@ -1,380 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * - * The OpenSearch Contributors require contributions made to - * this file be licensed under the Apache-2.0 license or a - * compatible open source license. - * - * Modifications Copyright OpenSearch Contributors. See - * GitHub history for details. - */ - -import React, { Fragment } from 'react'; -import { renderToHtml } from '../../services'; -import { GuideSectionTypes } from '../../components'; - -import { ExternalBadge } from './shared'; -import pieSliceOrderImg from '../../images/pie_slice_order.png'; - -import { - OuiSpacer, - OuiCard, - OuiIcon, - OuiFlexGroup, - OuiFlexItem, - OuiLink, - OuiIconTip, - OuiToolTip, - OuiCallOut, - OuiCode, - OuiImage, -} from '../../../../src/components'; - -import PieChart from './pie'; -const pieSource = require('!!raw-loader!./pie'); -const pieHtml = renderToHtml(PieChart); - -import PieSlices from './pie_slices'; - -import Treemaps from './treemap'; -const treemapsSource = require('!!raw-loader!./treemap'); -const treemapsHtml = renderToHtml(Treemaps); - -import PieAlts from './pie_alts'; - -const introCards = [ - { - title: 'Use', - iconType: 'checkInCircleFilled', - iconColor: 'success', - description: ( - <> - When categorical data is being compared to a whole{' '} - (usually 100%). - - ), - }, - { - title: "Don't use", - iconType: 'crossInACircleFilled', - iconColor: 'danger', - description: ( - <> - With relational data or when needing to compare categories to{' '} - each other. - - ), - }, - { - title: 'Tip', - iconType: 'help', - iconColor: 'primary', - description: ( - <> - Each subdivision or category must be mutually exclusive{' '} - and sum up to a meaningful whole. - - ), - }, - { - title: 'Be careful', - iconType: 'alert', - iconColor: 'warning', - description: ( - <> - Don't leave out sub-sections as this would render - the whole as artificial. - - ), - }, -]; - -const unsupportedTooltip = ( - -); - -const orderingTooltip = ( - - Wong, Donna M.{' '} - - The Wall Street Journal Guide to Information Graphics: The Dos and - Don'ts of Presenting Data, Facts, and Figures. - {' '} - W. W. Norton & Company, 2013. - - } - /> - } - iconProps={{ - className: 'oui-alignTop', - }} - /> -); - -export const ElasticChartsPieExample = { - title: 'Part to whole comparisons', - intro: ( - - - - - {introCards.map((card) => ( - - - - - - {card.title} - - } - titleElement="h2" - description={card.description} - /> - - ))} - - - ), - sections: [ - { - title: 'Pie and donut charts', - source: [ - { - type: GuideSectionTypes.JS, - code: pieSource, - }, - { - type: GuideSectionTypes.HTML, - code: pieHtml, - }, - ], - text: ( - <> -

- A common argument is made that pie charts are not usually the best - representation for understanding data. However there are situations - where pie charts are useful. Like when: -

-
    -
  • There are a maximum of 6 slices (divisions)
  • -
  • The values are around 25%, 50% or 75%
  • -
  • One of the categories is much bigger than the others
  • -
-

- The guidelines for{' '} - - It was originally thought that comparing the angles of the - center vertices of the slices were how viewers read pie - charts. However, certain research shows that it is the arc and - area that are the crucial parts to understanding giving donut - charts a firm foothold in the circular graph category. -
-
- Click the link to read more on the study. - - }> - - donut charts - -
{' '} - are the same for pie charts. The empty center of donut charts can - provide a place to display additional/related information - - . -

- - Elastic Charts'{' '} - - partition charts do not currently support theming - {' '} - through the {''} component. - - }> -

- {' '} - OUI provides a separate key for use with - - {'Partition.config={{...OUI_CHARTS_THEME_LIGHT.partition}}'} - - . The chart colors also need to be passed a different way via{' '} - - {'Partition.layers.shape.fillColor'} - - . See the snippet for full details. -

-
- - ), - demo: , - snippet: `import { OUI_CHARTS_THEME_DARK, OUI_CHARTS_THEME_LIGHT } from '@opensearch-project/oui/dist/oui_charts_theme'; - -const ouiChartTheme = isDarkTheme ? OUI_CHARTS_THEME_DARK : OUI_CHARTS_THEME_LIGHT; -const ouiPartitionConfig = ouiChartTheme.partition; - - - Number(d.percent)} - valueFormatter={() => ''} // Hide the slice value if data values are already in percentages - layers={[ - { - groupByRollup: d => d.category, - shape: { - fillColor: d => ouiChartTheme.theme.colors.vizColors[d.sortIndex], - }, - }, - ]} - config={{ - ...ouiPartitionConfig, - emptySizeRatio: 0.4, // To create a donut chart - clockwiseSectors: false, // For correct slice order - }} - /> -`, - }, - { - title: 'Slices and labelling', - text: ( - <> -

- Try to keep the labels within the slices (or just - outside) - {' '} - and consider appending their values. However, if there are many - small slices or long labels, use a legend, especially one that - displays the values in a table format with right aligned values. -

-

Other slices

-

- Again, pie charts should have no more than six slices. However, it - can be beneficial to group smaller/overflow slices{' '} - into a single “Other” category. Careful consideration should be - given when doing so as this could end up being the largest category - and therefore obscuring the meaning of the chart. -

-

Slice order

-

- The order of the slices should always{' '} - start from the 12 o’clock position, showing the - largest slice in the clockwise position then the rest ordering - counterclockwise in descending order.{orderingTooltip} However, - categories that have a natural order, should follow this natural - order, be it low to high or good to bad.{unsupportedTooltip} -

- - ), - demo: , - }, - { - title: 'Sunbursts and treemaps', - source: [ - { - type: GuideSectionTypes.JS, - code: treemapsSource, - }, - { - type: GuideSectionTypes.HTML, - code: treemapsHtml, - }, - ], - text: ( - <> -

- Multi-level pie charts (also known as sunbursts) and treemaps are - great for visualizing hierarchical relationships and for quickly - referencing the overall data comparison. However, they’re not meant - to represent trends or explicit/detailed value comparison. -

-

- Below are some basic examples and how OUI supports them with - theming. However, this site will not document the best uses of these - chart types. For more guidance, go to the{' '} - - Elastic Charts documentation - - . -

- - ), - demo: , - }, - { - title: 'Alternatives', - text: ( - <> -

- Most pie/donut/sunburst chart data can be better{' '} - explained using bar charts with different configurations. You should - definitely not use pie charts when: -

-
    -
  • - You want users to compare the size of slices -
  • -
  • You have more than 6 slices
  • -
  • - You need multiple pie charts to compare multiple data sets, use - part-to-whole bar charts with percentages -
  • -
  • You have negative values
  • -
-

- And under no circumstances should you enlarge or explode slices. - This leads to{' '} - - errors in understanding - - . -

- - ), - demo: , - }, - ], -}; diff --git a/src-docs/src/views/elastic_charts/pie_slices.js b/src-docs/src/views/elastic_charts/pie_slices.js deleted file mode 100644 index 17babe278d..0000000000 --- a/src-docs/src/views/elastic_charts/pie_slices.js +++ /dev/null @@ -1,338 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * - * The OpenSearch Contributors require contributions made to - * this file be licensed under the Apache-2.0 license or a - * compatible open source license. - * - * Modifications Copyright OpenSearch Contributors. See - * GitHub history for details. - */ - -/* eslint-disable no-nested-ternary */ -import React, { Fragment, useState, useContext } from 'react'; -import { Chart, Partition, Settings } from '@elastic/charts'; -import { ThemeContext } from '../../components'; - -import { - OUI_CHARTS_THEME_DARK, - OUI_CHARTS_THEME_LIGHT, -} from '../../../../src/themes/charts/themes'; - -import { - OuiSpacer, - OuiFlexGrid, - OuiFlexItem, - OuiFormRow, - OuiRange, - OuiCopy, - OuiSwitch, - OuiButton, - OuiRadioGroup, - OuiTextAlign, - OuiTitle, - OuiCode, - OuiButtonGroup, - OuiText, -} from '../../../../src/components'; - -import { ChartCard } from './shared'; -import { BROWSER_DATA_2019 } from './data'; - -export default () => { - const themeContext = useContext(ThemeContext); - const isDarkTheme = themeContext.theme.includes('dark'); - const ouiChartTheme = isDarkTheme - ? OUI_CHARTS_THEME_DARK - : OUI_CHARTS_THEME_LIGHT; - const ouiPartitionConfig = ouiChartTheme.partition; - - const sliceOrderRadiosIdPrefix = 'colorType'; - const sliceOrderRadios = [ - { - id: `${sliceOrderRadiosIdPrefix}0`, - label: 'Counterclockwise and special', - }, - { - id: `${sliceOrderRadiosIdPrefix}2`, - label: 'Clockwise and descending', - }, - { - id: `${sliceOrderRadiosIdPrefix}3`, - label: 'By natural order (unsupported)', - disabled: true, - }, - ]; - - const pieTypeRadios = [ - { - id: 'pieTypePie', - label: 'Pie chart', - }, - { - id: 'pieTypeDonut', - label: 'Donut chart', - }, - ]; - - const [sliceOrderIdSelected, setSliceOrderIdSelected] = useState( - sliceOrderRadios[0].id - ); - const [sliceOrderConfig, setSliceOrderConfig] = useState({ - clockwiseSectors: false, - }); - const [sliceOrderConfigText, setSliceOrderConfigText] = useState( - 'clockwiseSectors: false,' - ); - - const [pieTypeIdSelected, setPieTypeIdSelected] = useState( - pieTypeRadios[0].id - ); - - const [numSlices, setNumSlices] = useState('3'); - - const [grouped, setGrouped] = useState(true); - const [showLegend, setShowLegend] = useState(false); - const [showValues, setShowValues] = useState(true); - - const onNumChartsChange = (e) => { - setNumSlices(e.target.value); - }; - - const onSliceOrderChange = (optionId) => { - const sliceOrderLabel = sliceOrderRadios.find(({ id }) => id === optionId) - .label; - if (sliceOrderLabel.includes('Counter')) { - setSliceOrderConfig({ clockwiseSectors: false }); - setSliceOrderConfigText('clockwiseSectors: false,'); - } else if (sliceOrderLabel.includes('Clockwise')) { - setSliceOrderConfig({ specialFirstInnermostSector: false }); - setSliceOrderConfigText('specialFirstInnermostSector: false,'); - } else if (sliceOrderLabel.includes('natural')) { - setSliceOrderConfig({}); - setSliceOrderConfigText(''); - } else { - console.warn("Couldn't find the right slice order type"); - } - setSliceOrderIdSelected(optionId); - }; - - const onGroupChange = (e) => { - setGrouped(e.target.checked); - }; - - const isBadChart = numSlices > 5 && !grouped; - const isComplicatedChart = false; - - const customTitle = ( - - -

Distribution of the top {numSlices} browsers from 2019

-
- -
- ); - - const pieData = () => { - const dataByNumSlices = BROWSER_DATA_2019.slice(0, numSlices); - if (grouped && numSlices > 5) { - const theOthers = dataByNumSlices.slice(5, numSlices); - const total = theOthers.reduce((newVar2, item) => { - return Number(newVar2 + Number(item.percent)); - }, 0); - const firstFive = dataByNumSlices.slice(0, 5); - firstFive.push({ - browser: 'Other', - percent: total, - }); - return firstFive; - } else { - return dataByNumSlices; - } - }; - - return ( - - {customTitle} -
- - - Number(d.percent)} - valueFormatter={showValues ? undefined : () => ''} - valueGetter={showValues ? 'percent' : undefined} - layers={[ - { - groupByRollup: (d) => d.browser, - shape: { - fillColor: (d) => - ouiChartTheme.theme.colors.vizColors[d.sortIndex], - }, - }, - ]} - config={{ - ...ouiPartitionConfig, - emptySizeRatio: pieTypeIdSelected.includes('Donut') && 0.4, - ...sliceOrderConfig, - }} - /> - -
- - - - - - - { - setPieTypeIdSelected(id); - }} - buttonSize="compressed" - isFullWidth - /> - - -

- Show and format the values of the slices when they are not - percentages. -

-
- - setShowValues(e.target.checked)} - /> - - setShowLegend(e.target.checked)} - /> -
-
- - - - Recommended number of series is 5 or less. - - }> - - - - - - - - - - Partition supports the specialized slice order with{' '} - - specialFirstInnermostSector - - . - - }> - - - -
- - -
- -

Distribution of the top ${numSlices} browsers from 2019

- - - ${showLegend ? '' : ''} - 5 - ? `{ - browser: 'Other', - percent: totalOfOtherSlices - }` - : '' - } - ]} - valueAccessor={d => Number(d.percent)} - ${showValues ? '' : "valueFormatter={() => ''}"} - ${showValues ? '' : 'valueGetter="percent"'} - layers={[ - { - groupByRollup: d => d.browser, - shape: { - fillColor: d => ouiChartTheme.theme.colors.vizColors[d.sortIndex], - }, - }, - ]} - config={{ - ...ouiPartitionConfig, - ${pieTypeIdSelected.includes('Donut') ? 'emptySizeRatio: 0.4,' : ''} - ${sliceOrderConfigText} - }} - /> -`}> - {(copy) => ( - - {isBadChart || isComplicatedChart - ? isComplicatedChart - ? "It's complicated" - : "Bad chart, don't copy" - : 'Copy code of current configuration'} - - )} -
-
-
- ); -}; diff --git a/src-docs/src/views/elastic_charts/shared.js b/src-docs/src/views/elastic_charts/shared.js deleted file mode 100644 index eb8392faa2..0000000000 --- a/src-docs/src/views/elastic_charts/shared.js +++ /dev/null @@ -1,172 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * - * The OpenSearch Contributors require contributions made to - * this file be licensed under the Apache-2.0 license or a - * compatible open source license. - * - * Modifications Copyright OpenSearch Contributors. See - * GitHub history for details. - */ - -import React, { useState } from 'react'; -import PropTypes from 'prop-types'; -import { - OuiBadge, - OuiRadioGroup, - OuiSpacer, - OuiSwitch, - OuiPanel, - OuiText, - OuiTitle, -} from '../../../../src/components'; -import { BarSeries, LineSeries, AreaSeries } from '@elastic/charts'; -import { devDependencies } from '../../../../package'; - -const chartsVersion = devDependencies['@elastic/charts'].match( - /\d+\.\d+\.\d+/ -)[0]; - -export const CHART_COMPONENTS = { - BarSeries: BarSeries, - LineSeries: LineSeries, - AreaSeries: AreaSeries, -}; - -export const ExternalBadge = () => { - return ( - - window.open( - `https://github.com/elastic/elastic-charts/tree/v${chartsVersion}` - ) - }> - External library: @elastic/charts v{chartsVersion} - - ); -}; - -export const ChartCard = ({ title, description, children }) => { - return ( - - - {title} - - - -

{description}

-
- - {children} -
- ); -}; - -export const ChartTypeCard = (props) => { - const idPrefix = 'chartType'; - - const toggleButtonsIcons = [ - { - id: `${idPrefix}0`, - label: 'BarSeries', - }, - { - id: `${idPrefix}1`, - label: 'LineSeries', - }, - { - id: `${idPrefix}2`, - label: 'AreaSeries', - }, - ]; - - const [toggleIdSelected, setToggleIdSelectd] = useState(`${idPrefix}0`); - - const onChartTypeChange = (optionId) => { - setToggleIdSelectd(optionId); - - const chartType = toggleButtonsIcons.find(({ id }) => id === optionId) - .label; - props.onChange(chartType); - }; - - if (props.mixed) { - toggleButtonsIcons[3] = { - id: `${idPrefix}3`, - label: 'Mixed', - disabled: props.mixed === 'disabled', - }; - } - - return ( - - - - ); -}; - -ChartTypeCard.propTypes = { - onChange: PropTypes.func.isRequired, - mixed: PropTypes.oneOf(['enabled', 'disabled', true, false]), - disabled: PropTypes.bool, -}; - -export const MultiChartCard = (props) => { - const [multi, setMulti] = useState(false); - const [stacked, setStacked] = useState(false); - - const onMultiChange = (e) => { - const isStacked = e.target.checked ? stacked : false; - - setMulti(e.target.checked); - setStacked(isStacked); - - props.onChange({ - multi: e.target.checked, - stacked, - }); - }; - - const onStackedChange = (e) => { - setStacked(e.target.checked); - - props.onChange({ multi: multi, stacked: e.target.checked }); - }; - return ( - - - - - - ); -}; - -MultiChartCard.propTypes = { - /** - * Returns (multi:boolean, stacked:boolean) - */ - onChange: PropTypes.func.isRequired, -}; diff --git a/src-docs/src/views/elastic_charts/sizes.js b/src-docs/src/views/elastic_charts/sizes.js deleted file mode 100644 index 9dd7710fd7..0000000000 --- a/src-docs/src/views/elastic_charts/sizes.js +++ /dev/null @@ -1,374 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * - * The OpenSearch Contributors require contributions made to - * this file be licensed under the Apache-2.0 license or a - * compatible open source license. - * - * Modifications Copyright OpenSearch Contributors. See - * GitHub history for details. - */ - -import React, { Component, Fragment } from 'react'; -import moment from 'moment'; -import { ThemeContext } from '../../components'; -import { - Chart, - Settings, - Axis, - timeFormatter, - niceTimeFormatByDay, - LineAnnotation, - BarSeries, -} from '@elastic/charts'; - -import { - OUI_CHARTS_THEME_DARK, - OUI_CHARTS_THEME_LIGHT, -} from '../../../../src/themes/charts/themes'; - -import { - OuiSpacer, - OuiTitle, - OuiFlexGrid, - OuiFlexItem, - OuiPageContent, - OuiFormRow, - OuiRange, - OuiPage, - OuiButton, - OuiCopy, -} from '../../../../src/components'; - -import { formatDate, dateFormatAliases } from '../../../../src/services'; - -import { MultiChartCard, ChartCard } from './shared'; - -import { TIME_DATA, TIME_DATA_2 } from './data'; - -export class Sizes extends Component { - constructor(props) { - super(props); - - this.mediumSize = 50; - this.smallSize = 40; - this.xsmallSize = 33; - - this.state = { - multi: false, - stacked: false, - width: 100, - data1: TIME_DATA, - data2: TIME_DATA_2, - }; - } - - componentDidMount = () => { - this.changePropsBasedOnWidth(100); - }; - - onStackedChange = (e) => { - this.setState({ - stacked: e.target.checked, - }); - }; - - onMultiChange = (multiObject) => { - this.setState({ - ...multiObject, - }); - }; - - onChartTypeChange = (optionId) => { - this.setState({ - toggleIdSelected: optionId, - }); - }; - - onWidthChartsChange = (e) => { - this.setState({ - width: e.target.value, - }); - - this.changePropsBasedOnWidth(e.target.value); - }; - - changePropsBasedOnWidth = (width) => { - const data1 = TIME_DATA.slice(); - const data2 = TIME_DATA_2.slice(); - let tooltipProps; - let legendPosition = 'right'; - const xAxisFormatter = timeFormatter(niceTimeFormatByDay(1)); - let xAxisTitle = `${formatDate(data1[0][0], dateFormatAliases.date)}`; - let xAxisStyle; - let yAxisStyle; - let changeDescription = - 'At full width, you should be able to display all the details you need; axes, tick labels and titles, and legends.'; - - if (width < 55) { - legendPosition = 'bottom'; - } - - if (width < this.mediumSize) { - const headerFormatter = (tooltipData) => { - return `${formatDate( - tooltipData.value, - dateFormatAliases.shortDateTime - )}`; - }; - - tooltipProps = { - headerFormatter, - }; - - xAxisTitle = `${formatDate(data1[0][0], dateFormatAliases.date)} ${moment( - data1[0][0] - ).format('H:mm')} - ${moment(data1[data1.length - 1][0]).format('H:mm')}`; - - xAxisStyle = { tickLabel: { visible: false } }; - - changeDescription = - 'When the panel becomes narrower that the axes tick labels begin to get clustered, consider moving the axes range to the axes title.'; - } - - if (width < this.smallSize && data1.length > 20) { - for (let i = 0; i < data1.length; i++) { - data1.splice(i + 1, 1); - } - for (let i = 0; i < data2.length; i++) { - data2.splice(i + 1, 1); - } - - changeDescription = - 'If the points also start becoming to clustured, consider reducing your bin count. For line charts with dots, remove the dots.'; - } - - if (width < this.xsmallSize) { - yAxisStyle = { tickLabel: { visible: false } }; - - changeDescription = - 'At severely narrow panels, consider the key indicators of your data and call these out with annotations instead of displaying all values of all axes.'; - } - - this.setState({ - data1, - data2, - legendPosition, - tooltipProps, - xAxisTitle, - xAxisFormatter, - xAxisStyle, - yAxisStyle, - changeDescription, - }); - }; - - render() { - const { - multi, - stacked, - width, - tooltipProps, - data1, - data2, - legendPosition, - xAxisTitle, - xAxisFormatter, - xAxisStyle, - yAxisStyle, - changeDescription, - } = this.state; - - const isDarkTheme = this.context.theme.includes('dark'); - const theme = isDarkTheme - ? OUI_CHARTS_THEME_DARK.theme - : OUI_CHARTS_THEME_LIGHT.theme; - const lineAnnotationStyle = isDarkTheme - ? OUI_CHARTS_THEME_DARK.lineAnnotation - : OUI_CHARTS_THEME_LIGHT.lineAnnotation; - - let annotation; - if (width < this.xsmallSize) { - annotation = ( - - ); - } - - return ( - - - - -

Chart title {multi && ' by type'}

-
- - - - - - - {multi && ( - - )} - {annotation} - - - -
-
- - - - - - - - - - - - - - - - - - - - - - -
- -

Chart title ${multi && ' by type'}

- - - - - - { - return \`\${formatDate( - tooltipData.value, - dateFormatAliases.shortDateTime - )}\`; - }}} - /> - - ${ - multi - ? `` - : '' - } - ${ - annotation - ? `` - : '' - } - - -`}> - {(copy) => ( - - {false - ? "Bad chart, don't copy" - : 'Copy code of current configuration'} - - )} -
-
-
- ); - } -} - -Sizes.contextType = ThemeContext; diff --git a/src-docs/src/views/elastic_charts/sparklines.js b/src-docs/src/views/elastic_charts/sparklines.js deleted file mode 100644 index f57c0d0580..0000000000 --- a/src-docs/src/views/elastic_charts/sparklines.js +++ /dev/null @@ -1,174 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * - * The OpenSearch Contributors require contributions made to - * this file be licensed under the Apache-2.0 license or a - * compatible open source license. - * - * Modifications Copyright OpenSearch Contributors. See - * GitHub history for details. - */ - -import React, { useContext, Fragment } from 'react'; -import cloneDeep from 'lodash/cloneDeep'; -import { ThemeContext } from '../../components'; -import { - Chart, - BarSeries, - Settings, - LineSeries, - AreaSeries, -} from '@elastic/charts'; - -import { - OUI_CHARTS_THEME_DARK, - OUI_CHARTS_THEME_LIGHT, - OUI_SPARKLINE_THEME_PARTIAL, -} from '../../../../src/themes/charts/themes'; - -import { - OuiPanel, - OuiStat, - OuiFlexGrid, - OuiFlexItem, - OuiIcon, - OuiSpacer, - OuiText, -} from '../../../../src/components'; - -import { TIME_DATA_SMALL } from './data'; -import { - ouiPaletteForDarkBackground, - ouiPaletteForLightBackground, -} from '../../../../src/services'; - -export const Sparklines = () => { - const themeContext = useContext(ThemeContext); - const isDarkTheme = themeContext.theme.includes('dark'); - - const theme = [ - OUI_SPARKLINE_THEME_PARTIAL, - isDarkTheme ? OUI_CHARTS_THEME_DARK.theme : OUI_CHARTS_THEME_LIGHT.theme, - ]; - - const TIME_DATA_SMALL_REVERSE = cloneDeep(TIME_DATA_SMALL).reverse(); - const TIME_DATA_SMALL_REVERSE_MAJOR = cloneDeep(TIME_DATA_SMALL_REVERSE); - TIME_DATA_SMALL_REVERSE_MAJOR[ - TIME_DATA_SMALL_REVERSE_MAJOR.length - 1 - ][1] = -100; - - return ( - - - - - - - - - - - - - - - - - - - - - - - - 15% - - - - - - - - 15% - - } - description="Major decrease over time" - titleColor="danger" - textAlign="right"> - - - - - - - - - - - - - - - - - - - - 15 points since last Tuesday - - - - - - - ); -}; diff --git a/src-docs/src/views/elastic_charts/sparklines_example.js b/src-docs/src/views/elastic_charts/sparklines_example.js deleted file mode 100644 index 5e50458670..0000000000 --- a/src-docs/src/views/elastic_charts/sparklines_example.js +++ /dev/null @@ -1,95 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * - * The OpenSearch Contributors require contributions made to - * this file be licensed under the Apache-2.0 license or a - * compatible open source license. - * - * Modifications Copyright OpenSearch Contributors. See - * GitHub history for details. - */ - -import React, { Fragment } from 'react'; -import { renderToHtml } from '../../services'; -import { GuideSectionTypes } from '../../components'; - -import { ExternalBadge } from './shared'; -import { Sizes } from './sizes'; -import { Sparklines } from './sparklines'; -const sparklinesSource = require('!!raw-loader!./sparklines'); -const sparklinesHtml = renderToHtml(Sparklines); - -import { OuiCode, OuiCodeBlock } from '../../../../src/components'; - -export const ElasticChartsSparklinesExample = { - title: 'Sizing', - intro: ( - - - - ), - sections: [ - { - text: ( - -

- When placing charts into smaller containers or panels, you must - re-evaluate your data to provide a more simplified version. This - could be as simple as shifting legend positions from the right side - to the bottom or adding annotations to give context and describe the - key points in your data. -

-
- ), - demo: , - }, - { - title: 'Sparklines', - source: [ - { - type: GuideSectionTypes.JS, - code: sparklinesSource, - }, - { - type: GuideSectionTypes.HTML, - code: sparklinesHtml, - }, - ], - text: ( - -

- Sparklines are quick visual summaries of data where actual values - are not important. They should be only a single series and not - contain more than 12 values. Be sure to remove all extraneous - markings like ticks, labels, tooltips and grid. The surrounding - content should give context to the sparkline. -

-

- OUI also provides a quick theme alteration object that you can merge - with the correct dark or light theme to properly style your - sparklines. -

- - {`import { OUI_CHARTS_THEME_DARK, OUI_CHARTS_THEME_LIGHT, OUI_SPARKLINE_THEME_PARTIAL } from \'@opensearch-project/oui/dist/oui_charts_theme\'; -const ouiTheme = isDarkTheme ? OUI_CHARTS_THEME_DARK.theme : OUI_CHARTS_THEME_LIGHT.theme; -`} - -

- Other key configurations -

-
    -
  • - Settings.showLegend = false -
  • -
  • - - Settings.tooltip = "none" - -
  • -
-
- ), - demo: , - }, - ], -}; diff --git a/src-docs/src/views/elastic_charts/theming.js b/src-docs/src/views/elastic_charts/theming.js deleted file mode 100644 index 4a4c9c50a3..0000000000 --- a/src-docs/src/views/elastic_charts/theming.js +++ /dev/null @@ -1,147 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * - * The OpenSearch Contributors require contributions made to - * this file be licensed under the Apache-2.0 license or a - * compatible open source license. - * - * Modifications Copyright OpenSearch Contributors. See - * GitHub history for details. - */ - -import React, { useState, Fragment, useContext } from 'react'; -import { ThemeContext } from '../../components'; -import { - Chart, - Settings, - Axis, - LineSeries, - BarSeries, - DataGenerator, -} from '@elastic/charts'; - -import { - OuiSpacer, - OuiFlexGroup, - OuiFlexItem, - OuiColorPalettePicker, -} from '../../../../src/components'; - -import { - OUI_CHARTS_THEME_DARK, - OUI_CHARTS_THEME_LIGHT, -} from '../../../../src/themes/charts/themes'; - -import { - ouiPaletteColorBlind, - ouiPaletteComplimentary, - ouiPaletteForStatus, - ouiPaletteForTemperature, - ouiPaletteCool, - ouiPaletteWarm, - ouiPaletteNegative, - ouiPalettePositive, - ouiPaletteGray, -} from '../../../../src/services'; - -const paletteData = { - ouiPaletteColorBlind, - ouiPaletteForStatus, - ouiPaletteForTemperature, - ouiPaletteComplimentary, - ouiPaletteNegative, - ouiPalettePositive, - ouiPaletteCool, - ouiPaletteWarm, - ouiPaletteGray, -}; - -const paletteNames = Object.keys(paletteData); - -export const Theming = () => { - const themeContext = useContext(ThemeContext); - - const palettes = paletteNames.map((paletteName, index) => { - const options = - index > 0 - ? 10 - : { - sortBy: 'natural', - }; - - return { - value: paletteName, - title: paletteName, - palette: paletteData[paletteNames[index]](options), - type: 'fixed', - }; - }); - - const [barPalette, setBarPalette] = useState('ouiPaletteColorBlind'); - - /** - * Create data - */ - const dg = new DataGenerator(); - const data1 = dg.generateGroupedSeries(20, 1); - const data2 = dg.generateGroupedSeries(20, 5); - - /** - * Setup theme based on current light/dark theme - */ - const isDarkTheme = themeContext.theme.includes('dark'); - const theme = isDarkTheme - ? OUI_CHARTS_THEME_DARK.theme - : OUI_CHARTS_THEME_LIGHT.theme; - - const barPaletteIndex = paletteNames.findIndex((item) => item === barPalette); - - const customTheme = - barPaletteIndex > 0 - ? [ - { - colors: { - vizColors: paletteData[paletteNames[barPaletteIndex]](5), - }, - }, - theme, - ] - : theme; - - return ( - - - - - - - - - - - - - - - - ); -}; diff --git a/src-docs/src/views/elastic_charts/theming_categorical.js b/src-docs/src/views/elastic_charts/theming_categorical.js deleted file mode 100644 index fa241156b6..0000000000 --- a/src-docs/src/views/elastic_charts/theming_categorical.js +++ /dev/null @@ -1,463 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * - * The OpenSearch Contributors require contributions made to - * this file be licensed under the Apache-2.0 license or a - * compatible open source license. - * - * Modifications Copyright OpenSearch Contributors. See - * GitHub history for details. - */ - -/* eslint-disable no-nested-ternary */ -import React, { Fragment, useState, useEffect, useContext } from 'react'; -import { Chart, Settings, Axis, DataGenerator } from '@elastic/charts'; -import { ThemeContext } from '../../components'; - -import { - OUI_CHARTS_THEME_DARK, - OUI_CHARTS_THEME_LIGHT, -} from '../../../../src/themes/charts/themes'; - -import { - OuiSpacer, - OuiFlexGrid, - OuiFlexItem, - OuiFormRow, - OuiRange, - OuiCopy, - OuiSwitch, - OuiButton, - OuiRadioGroup, - OuiIcon, - OuiTitle, -} from '../../../../src/components'; - -import { CHART_COMPONENTS, ChartCard } from './shared'; -import { - ouiPaletteColorBlind, - ouiPalettePositive, - ouiPaletteForStatus, - ouiPaletteGray, -} from '../../../../src/services'; - -export const Categorical = () => { - const themeContext = useContext(ThemeContext); - const highlightColor = ouiPaletteColorBlind()[2]; - - const idPrefix = 'colorType'; - - const colorTypeRadios = [ - { - id: `${idPrefix}3`, - label: 'Categorical', - }, - { - id: `${idPrefix}0`, - label: 'Sequential', - }, - { - id: `${idPrefix}1`, - label: 'Diverging', - }, - { - id: `${idPrefix}2`, - label: 'Highlight', - }, - ]; - - const [grouped, setGrouped] = useState(false); - const [colorTypeIdSelected, setColorTypeIdSelected] = useState( - colorTypeRadios[0].id - ); - const [colorType, setColorType] = useState(colorTypeRadios[0].label); - const [numCharts, setNumCharts] = useState('3'); - const [data, setData] = useState([]); - const [dataString, setDataString] = useState('[{x: 1, y: 5.5, g: 0}]'); - const [vizColors, setVizColors] = useState(); - const [vizColorsString, setVizColorsString] = useState(); - const [chartType, setChartType] = useState('LineSeries'); - - useEffect(() => { - createCategoryChart(3); - }, []); - - const isDarkTheme = themeContext.theme.includes('dark'); - const theme = isDarkTheme - ? OUI_CHARTS_THEME_DARK.theme - : OUI_CHARTS_THEME_LIGHT.theme; - - const onNumChartsChange = (e) => { - updateCorrectChart(Number(e.target.value), colorType); - setNumCharts(e.target.value); - }; - - const onColorTypeChange = (optionId) => { - const colorType = colorTypeRadios.find(({ id }) => id === optionId).label; - updateCorrectChart(Number(numCharts), colorType); - setColorType(colorType); - setColorTypeIdSelected(optionId); - }; - - const onGroupChange = (e) => { - const colorType = e.target.checked - ? 'Grouped' - : colorTypeRadios.find(({ id }) => id === colorTypeIdSelected).label; - updateCorrectChart(Number(numCharts), colorType); - setGrouped(e.target.checked); - setColorType(colorType); - }; - - const updateCorrectChart = (numCharts, chartType) => { - switch (chartType) { - case 'Categorical': - createCategoryChart(numCharts); - break; - case 'Sequential': - createQuantityChart(numCharts); - break; - case 'Diverging': - createTrendChart(numCharts); - break; - case 'Highlight': - createHighlightChart(numCharts); - break; - case 'Grouped': - setDataString("[{x: 1, y: 5.5, g: 'Series 1'}]"); - setChartType('LineSeries'); - break; - default: - console.warn("Couldn't find the right chart type"); - break; - } - }; - - const createCategoryChart = (numCharts) => { - const dg = new DataGenerator(); - const data = dg.generateGroupedSeries(20, numCharts).map((item) => { - item.g = `Categorical ${item.g.toUpperCase()}`; - return item; - }); - - setData(data); - setDataString("[{x: 1, y: 5.5, g: 'Categorical 1'}]"); - setVizColors(undefined); - setVizColorsString(undefined); - setChartType('LineSeries'); - }; - - const createQuantityChart = (numCharts) => { - const vizColors = ouiPalettePositive(numCharts); - - // convert series labels to percentages - const dg = new DataGenerator(); - const data = dg.generateGroupedSeries(20, numCharts).map((item) => { - const increment = 100 / numCharts; - const index = item.g.charCodeAt(0) - 97; - const lower = Math.floor(increment * index); - const higher = - index + 1 === numCharts - ? Math.ceil(increment * (index + 1)) - : Math.floor(increment * (index + 1)); - item.g = `${lower} - ${higher}%`; - return item; - }); - - setData(data); - setDataString("[{x: 1, y: 5.5, g: '0 - 100%'}]"); - setVizColors(vizColors); - setVizColorsString(`ouiPaletteCool(${numCharts})`); - setChartType('BarSeries'); - }; - - const createTrendChart = (numCharts) => { - const vizColors = ouiPaletteForStatus(numCharts); - - // convert series labels to better/worse - const oddSeries = numCharts % 2; - const numOfHalf = Math.floor(numCharts / 2); - - const dg = new DataGenerator(); - const data = dg.generateGroupedSeries(20, numCharts).map((item) => { - const index = item.g.charCodeAt(0) - 97; - let howManyErs; - if (oddSeries && index === numOfHalf) { - item.g = 'Meh'; - } else if (index < numOfHalf) { - howManyErs = numOfHalf - (index + 1); - item.g = `Better${'er'.repeat(howManyErs)}`; - } else if (index >= numOfHalf) { - howManyErs = index - numOfHalf; - if (oddSeries) { - howManyErs -= 1; - } - item.g = `Wors${!howManyErs ? 'e' : ''}${'er'.repeat( - howManyErs > 0 ? howManyErs : 0 - )}`; - } - return item; - }); - - setData(data); - setDataString("[{x: 1, y: 5.5, g: 'Better'}]"); - setVizColors(vizColors); - setVizColorsString(`ouiPaletteForStatus(${numCharts})`); - setChartType('BarSeries'); - }; - - const createHighlightChart = (numCharts) => { - const vizColors = ouiPaletteGray(numCharts); - vizColors[vizColors.length - 1] = highlightColor; - - const dg = new DataGenerator(); - const data = dg.generateGroupedSeries(20, numCharts); - - setData(data); - setDataString("[{x: 1, y: 5.5, g: '0'}]"); - setVizColors(numCharts < 2 ? [highlightColor] : vizColors); - setVizColorsString( - `ouiPaletteGray(${numCharts})[length - 1] = highlightColor` - ); - setChartType('LineSeries'); - }; - - if (data.length === 0) { - return null; - } - - const dg = new DataGenerator(); - - let ChartType = CHART_COMPONENTS[chartType]; - - const isBadChart = !grouped && numCharts > 5; - const isComplicatedChart = grouped; - - const customTitle = - colorType === 'Highlight' ? ( - -

- My number of issues - compared to others -

-
- ) : undefined; - - const customTheme = vizColors - ? [ - { - colors: { vizColors }, - }, - theme, - ] - : theme; - const customColorsString = vizColors - ? `[ - { colors: { vizColors: ${vizColorsString} }}, - isDarkTheme ? OUI_CHARTS_THEME_DARK.theme : OUI_CHARTS_THEME_LIGHT.theme -]` - : 'isDarkTheme ? OUI_CHARTS_THEME_DARK.theme : OUI_CHARTS_THEME_LIGHT.theme'; - - const charts = []; - let customLegend; - - if (!grouped) { - charts.push( - - ); - } else { - ChartType = CHART_COMPONENTS.LineSeries; - - for (let index = 0; index < 4; index++) { - const data = dg.generateGroupedSeries(20, 1).map((item) => { - item.y += index * 5; - return item; - }); - - const isOdd = index % 2; - - const chart = ( - - ); - - charts.push(chart); - } - - customLegend = ( -
- - Actual -
-
- - Projected -
- ); - } - - let showLegend = numCharts > 1 || colorType === 'Grouped'; - if (colorType === 'Highlight') showLegend = false; - - return ( - - {customTitle} -
- - - {charts} - - - - {customLegend} -
- - - - - - - - - - - - - - Recommended number of series is 5 or less. - - }> - - - - - - - - - - - - - -
- -

- My number of issues - compared to others -

-` - : '' - } - - - <${chartType} - id="bars" - name="0" - data={${dataString}} - xAccessor={'x'} - yAccessors={['y']} - splitSeriesAccessors={['g']} - ${chartType === 'BarSeries' ? "stackAccessors={['g']}" : ''} - /> - - -`}> - {(copy) => ( - - {isBadChart || isComplicatedChart - ? isComplicatedChart - ? "It's complicated" - : "Bad chart, don't copy" - : 'Copy code of current configuration'} - - )} -
-
-
- ); -}; diff --git a/src-docs/src/views/elastic_charts/theming_example.js b/src-docs/src/views/elastic_charts/theming_example.js deleted file mode 100644 index 03c3b39ea7..0000000000 --- a/src-docs/src/views/elastic_charts/theming_example.js +++ /dev/null @@ -1,165 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * - * The OpenSearch Contributors require contributions made to - * this file be licensed under the Apache-2.0 license or a - * compatible open source license. - * - * Modifications Copyright OpenSearch Contributors. See - * GitHub history for details. - */ - -/* eslint-disable @typescript-eslint/no-var-requires */ -import React, { Fragment } from 'react'; -import { Link } from 'react-router-dom'; -import { renderToHtml } from '../../services'; -import { GuideSectionTypes } from '../../components'; - -import { ExternalBadge } from './shared'; - -import { Theming } from './theming'; -const themingSource = require('!!raw-loader!./theming'); -const themingHtml = renderToHtml(Theming); - -import { Categorical } from './theming_categorical'; - -import { - OuiSpacer, - OuiText, - OuiCodeBlock, - OuiLink, - OuiCallOut, -} from '../../../../src/components'; - -export const ElasticChartsThemingExample = { - title: 'Creating charts', - intro: ( - - - - -

- OUI provides utilities and documentation for working with{' '} - - Elastic Charts - - , an open source charting library also created and maintained by - Elastic. -

-
-
- ), - sections: [ - { - title: 'Theming via OUI', - source: [ - { - type: GuideSectionTypes.JS, - code: themingSource, - }, - { - type: GuideSectionTypes.HTML, - code: themingHtml, - }, - ], - text: ( - -

- OUI provides both light and dark theme files to use in tandem with - Elastic Charts. Simply import these objects from the themes folder - and pass the correct one to the Settings.theme property. -

- - {`import { OUI_CHARTS_THEME_DARK, OUI_CHARTS_THEME_LIGHT } from '@opensearch-project/oui/dist/oui_charts_theme'; - -const ouiTheme = isDarkTheme ? OUI_CHARTS_THEME_DARK.theme : OUI_CHARTS_THEME_LIGHT.theme; - -`} - - -

- OUI provides a plugin utility for ease of pulling in the correct - theme object depending on the current Kibana theme. Learn more - from this{' '} - - readme - - . -

-
- -

- OUI also provides some basic{' '} - - color palettes and functions - {' '} - if you would like to change the default color blind safe scheme to - another palette. You can import these from the services folder. - Create a new partial theme object with your chosen colors and - prepend it to the list of themes supplied to Settings. -

- - - {`import { ouiPalettePositive } from '../../../../src/services'; - -const customColors = { - colors: { - vizColors: ouiPalettePositive(5), - }, -}; - -`} - -

You'll find an example of these in the demo below.

-
- ), - demo: , - }, - { - title: 'Coloring charts', - text: ( - -

- - Use color to distinguish categories, represent quantity/density, - and highlight data. When using color in this way, be aware that - too many colors in a single chart can create noise and hinder - quick comprehension. - -

-

- When creating a multi-series chart where each series shows{' '} - contrasting data, use the color blind safe palette - of contrasting colors. This will also avoid implying levels of - magnitude. -

-

- Think about the data you are delivering and if there is a way to{' '} - highlight key indicators. If you can combine the - series into logical groups, use contrasting shapes and styles, but - keep the same color for within groups. -

-

Quantity vs trends

-

- When coloring for sequential series data (not categorical), rely on - conventions. If the data signifies quantities, use - a single color that spans from light colors for low amounts to dark - colors for high amounts. If the data signifies{' '} - trends, use a two-color divergent scheme, with the - darkest colors at the extremes. Remember that red means bad/negative - and green is good/positive. -

-

- Whan signifying quantities, group values into intervals instead of a - continuous gradient scale. -

-
- ), - demo: , - }, - ], -}; diff --git a/src-docs/src/views/elastic_charts/time_chart.js b/src-docs/src/views/elastic_charts/time_chart.js deleted file mode 100644 index a9ed939af7..0000000000 --- a/src-docs/src/views/elastic_charts/time_chart.js +++ /dev/null @@ -1,211 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * - * The OpenSearch Contributors require contributions made to - * this file be licensed under the Apache-2.0 license or a - * compatible open source license. - * - * Modifications Copyright OpenSearch Contributors. See - * GitHub history for details. - */ - -import React, { useState, useContext, Fragment } from 'react'; -import { ThemeContext } from '../../components'; -import { - Chart, - BarSeries, - Settings, - Axis, - timeFormatter, - niceTimeFormatByDay, - LineSeries, -} from '@elastic/charts'; - -import { - OUI_CHARTS_THEME_DARK, - OUI_CHARTS_THEME_LIGHT, -} from '../../../../src/themes/charts/themes'; - -import { - OuiSpacer, - OuiTitle, - OuiFlexGrid, - OuiFlexItem, - OuiCopy, - OuiButton, -} from '../../../../src/components'; - -import { formatDate, dateFormatAliases } from '../../../../src/services'; - -import { TIME_DATA, TIME_DATA_2 } from './data'; -import { - ChartTypeCard, - CHART_COMPONENTS, - MultiChartCard, - ChartCard, -} from './shared'; - -export const TimeChart = () => { - const themeContext = useContext(ThemeContext); - - const [multi, setMulti] = useState(false); - const [stacked, setStacked] = useState(false); - const [chartType, setChartType] = useState('BarSeries'); - - const onMultiChange = (multiObject) => { - const { multi, stacked } = multiObject; - setMulti(multi); - setStacked(stacked); - }; - - const onChartTypeChange = (chartType) => { - setChartType(chartType); - }; - - const isDarkTheme = themeContext.theme.includes('dark'); - const theme = isDarkTheme - ? OUI_CHARTS_THEME_DARK.theme - : OUI_CHARTS_THEME_LIGHT.theme; - - let ChartType = CHART_COMPONENTS[chartType]; - let ChartType2 = CHART_COMPONENTS[chartType]; - if (chartType === 'Mixed') { - ChartType = BarSeries; - ChartType2 = LineSeries; - } - - const isBadChart = chartType === 'LineSeries' && stacked; - - return ( - - -

- Number of {!multi && 'financial '}robo-calls - {multi && ' by type'} -

-
- - - - - - - {multi && ( - - )} - - - - - - - - - - - - - - - - - - - - - - -
- - - <${chartType === 'Mixed' ? 'BarSeries' : chartType} - id="financial" - name="Financial" - data={[[0,1],[1,2]]} - xScaleType="time" - xAccessor={0} - yAccessors={[1]} - ${stacked ? 'stackAccessors={[0]}' : ''} - /> - ${ - multi - ? `<${chartType === 'Mixed' ? 'LineSeries' : chartType} - id="tech" - name="Tech support" - data={[[0,1],[1,2]]} - xScaleType="time" - xAccessor={0} - yAccessors={[1]} - ${stacked ? 'stackAccessors={[0]}' : ''} - />` - : '' - } - - -`}> - {(copy) => ( - - {isBadChart - ? "Bad chart, don't copy" - : 'Copy code of current configuration'} - - )} - -
-
- ); -}; diff --git a/src-docs/src/views/elastic_charts/time_example.js b/src-docs/src/views/elastic_charts/time_example.js deleted file mode 100644 index 75d8466cc4..0000000000 --- a/src-docs/src/views/elastic_charts/time_example.js +++ /dev/null @@ -1,56 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * - * The OpenSearch Contributors require contributions made to - * this file be licensed under the Apache-2.0 license or a - * compatible open source license. - * - * Modifications Copyright OpenSearch Contributors. See - * GitHub history for details. - */ - -import React, { Fragment } from 'react'; - -import { ExternalBadge } from './shared'; -import { TimeChart } from './time_chart'; - -import { OuiCode } from '../../../../src/components'; - -export const ElasticChartsTimeExample = { - title: 'Time series', - intro: ( - - - - ), - sections: [ - { - text: ( - -

- Time series charts show data over a period of time, such as trends - or comparisons across multiple categories. When smaller changes - exist, it’s better to use line charts rather than bar charts. -

- -

- Key configurations -

-
    -
  • - - BarSeries.xScaleType = "time" - -
  • -
  • - - tickFormat = timeFormatter(niceTimeFormatByDay(1)); - -
  • -
-
- ), - demo: , - }, - ], -}; diff --git a/src-docs/src/views/elastic_charts/treemap.js b/src-docs/src/views/elastic_charts/treemap.js deleted file mode 100644 index 32c48545a6..0000000000 --- a/src-docs/src/views/elastic_charts/treemap.js +++ /dev/null @@ -1,139 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * - * The OpenSearch Contributors require contributions made to - * this file be licensed under the Apache-2.0 license or a - * compatible open source license. - * - * Modifications Copyright OpenSearch Contributors. See - * GitHub history for details. - */ - -import React, { useContext } from 'react'; -import { ThemeContext } from '../../components'; -import { Chart, Partition, Settings, PartitionLayout } from '@elastic/charts'; -import { GITHUB_DATASET_MOD } from './data'; -import { ouiPaletteColorBlind } from '../../../../src/services'; - -import { - OUI_CHARTS_THEME_DARK, - OUI_CHARTS_THEME_LIGHT, -} from '../../../../src/themes/charts/themes'; -import { - OuiFlexGrid, - OuiFlexItem, - OuiTitle, - OuiSpacer, -} from '../../../../src/components'; - -export default () => { - const themeContext = useContext(ThemeContext); - - /** - * Setup theme based on current light/dark theme - */ - const isDarkTheme = themeContext.theme.includes('dark'); - - /** - * Create a 3 rotation palette (one for each level) - */ - const groupedPalette = ouiPaletteColorBlind({ - rotations: 3, - order: 'group', - sortBy: 'natural', - }); - - return ( -
- -

Github issues by label

-
- - - - - - d.count} - layers={[ - { - groupByRollup: (d) => d.total, - shape: { - fillColor: isDarkTheme - ? OUI_CHARTS_THEME_DARK.partition.sectorLineStroke - : OUI_CHARTS_THEME_LIGHT.partition.sectorLineStroke, - }, - hideInLegend: true, - }, - { - groupByRollup: (d) => d.vizType, - shape: { - fillColor: (d) => groupedPalette[d.sortIndex * 3], - }, - }, - { - groupByRollup: (d) => d.issueType, - shape: { - fillColor: (d) => - groupedPalette[d.parent.sortIndex * 3 + d.sortIndex + 1], - }, - }, - ]} - config={{ - ...(isDarkTheme - ? OUI_CHARTS_THEME_DARK.partition - : OUI_CHARTS_THEME_LIGHT.partition), - clockwiseSectors: false, - fillLabel: { - ...(isDarkTheme - ? OUI_CHARTS_THEME_DARK.partition.fillLabel - : OUI_CHARTS_THEME_LIGHT.partition.fillLabel), - textInvertible: true, - }, - }} - /> - - - - - - d.count} - valueGetter="percent" - topGroove={0} - layers={[ - { - groupByRollup: (d) => d.vizType, - shape: { - fillColor: (d) => groupedPalette[d.sortIndex * 3], - }, - fillLabel: { - valueFormatter: () => '', - textColor: 'rgba(0,0,0,0)', // Keeps the label in the legend, but hides it from view - }, - }, - { - groupByRollup: (d) => d.issueType, - shape: { - fillColor: (d) => - groupedPalette[d.parent.sortIndex * 3 + d.sortIndex], - }, - }, - ]} - config={{ - partitionLayout: PartitionLayout.treemap, - ...(isDarkTheme - ? OUI_CHARTS_THEME_DARK.partition - : OUI_CHARTS_THEME_LIGHT.partition), - }} - /> - - - -
- ); -};