feat(partition): add element click, over, out events#578
feat(partition): add element click, over, out events#578markov00 merged 9 commits intoelastic:masterfrom
Conversation
This commit adds the element click event to the Partition chart, returning a groupByRollup value for each configured chart layer and the associated value
Codecov Report
@@ Coverage Diff @@
## master #578 +/- ##
=========================================
Coverage ? 70.59%
=========================================
Files ? 220
Lines ? 6376
Branches ? 1226
=========================================
Hits ? 4501
Misses ? 1856
Partials ? 19
Continue to review full report at Codecov.
|
rshen91
left a comment
There was a problem hiding this comment.
LGTM! I like the naming changes (getPickdedShapes and pickedShapes) and the new story is great. I especially like the use of storybook actions 👍
rshen91
left a comment
There was a problem hiding this comment.
These new cleanup changes LGTM
nickofthyme
left a comment
There was a problem hiding this comment.
LGTM, Tested locally. The API changes look great, just one idea on the API.
| } | ||
|
|
||
| export type XYChartElementEvent = [GeometryValue, XYChartSeriesIdentifier]; | ||
| export type PartitionElementEvent = [Array<LayerValue>, SeriesIdentifier]; |
There was a problem hiding this comment.
Is the order of the LayerValue[] always hierarchical? If not it should be and would be good to note that.
A similar thought is what if this was recursive instead of an object? Something like...
export interface LayerValue {
groupByRollup: PrimitiveValue;
value: number;
child?: LayerValue;
}Just a thought, not saying to change it. 🤔
There was a problem hiding this comment.
It's hierarchical but I'd configured them in the same way you are configuring the hierarchy in the <Partition /> layers prop
| if (selector === null && state.chartType === ChartTypes.Partition) { | ||
| selector = createCachedSelector( | ||
| [getPieSpecOrNull, getPickedShapesLayerValues, getSettingsSpecSelector], | ||
| (pieSpec, nextPickedShapes, settings): void => { | ||
| if (!pieSpec) { | ||
| return; | ||
| } | ||
| if (!settings.onElementOver) { | ||
| return; | ||
| } | ||
|
|
||
| if (isOverElement(prevPickedShapes, nextPickedShapes)) { | ||
| const elements = nextPickedShapes.map<[Array<LayerValue>, SeriesIdentifier]>((values) => [ | ||
| values, | ||
| { | ||
| specId: pieSpec.id, | ||
| key: `spec{${pieSpec.id}}`, | ||
| }, | ||
| ]); | ||
| settings.onElementOver(elements); | ||
| } | ||
| prevPickedShapes = nextPickedShapes; | ||
| }, | ||
| )({ | ||
| keySelector: getChartIdSelector, | ||
| }); | ||
| } | ||
| if (selector) { | ||
| selector(state); | ||
| } | ||
| }; |
There was a problem hiding this comment.
Looks like there is some common logic between these event listers might be good to provide a factory function at some point. Looks fine for now.
There was a problem hiding this comment.
You are perfectly fine, I will I've already cleaned up a bit this code, I will clean up more in a future PR
| export const PartitionLayout = Object.freeze({ | ||
| sunburst: 'sunburst', | ||
| treemap: 'treemap', | ||
| sunburst: 'sunburst' as 'sunburst', |
# [18.0.0](v17.1.1...v18.0.0) (2020-03-17) ### Code Refactoring * clean up TS types ([#554](#554)) ([22f7635](22f7635)), closes [#547](#547) [#547](#547) * decouple tooltip from XY chart ([#553](#553)) ([e70792e](e70792e)), closes [#246](#246) ### Features * cleaner color API on SeriesSpec ([#571](#571)) ([f769f7c](f769f7c)) * **legend:** allow color picker component render prop ([#545](#545)) ([90f4b95](90f4b95)) * **partition:** add element click, over and out events ([#578](#578)) ([103df02](103df02)) * **partition:** add tooltip ([#544](#544)) ([6bf9a69](6bf9a69)), closes [#246](#246) * percentage display in partitioning charts ([#558](#558)) ([d6aa8d7](d6aa8d7)) * specify series name with a function on SeriesSpec ([#539](#539)) ([358455a](358455a)) * xAccessor can be a function accessor ([#574](#574)) ([bcc3d63](bcc3d63)) ### BREAKING CHANGES * The `getSpecId`, `getGroupId`, `getAxisId` and `getAnnotationId` are no longer available. Use a simple `string` instead. * `customSeriesColors` prop on `SeriesSpec` is now `color`. The `CustomSeriesColors` type is replaced with `SeriesColorAccessor`. * Remove `customSubSeriesName` prop on series specs in favor of cleaner api using just the `name` prop on `SeriesSpec`. The types `SeriesStringPredicate`, `SubSeriesStringPredicate` have been removed. * the `SeriesIdentifier` type is generalized into a simplified object with two values in common: `specId` and `key`. A specialized `XYChartSeriesIdentifier` extends now the base `SeriesIdentifier`. The `SettingsSpec` prop `showLegendDisplayValue` is renamed to `showLegendExtra` and its default value is now `false` hiding the current/last value on the legend by default.
|
🎉 This PR is included in version 18.0.0 🎉 The release is available on: Your semantic-release bot 📦🚀 |
# [18.0.0](elastic/elastic-charts@v17.1.1...v18.0.0) (2020-03-17) ### Code Refactoring * clean up TS types ([opensearch-project#554](elastic/elastic-charts#554)) ([6ce56fa](elastic/elastic-charts@6ce56fa)), closes [opensearch-project#547](elastic/elastic-charts#547) [opensearch-project#547](elastic/elastic-charts#547) * decouple tooltip from XY chart ([opensearch-project#553](elastic/elastic-charts#553)) ([cb02cd0](elastic/elastic-charts@cb02cd0)), closes [opensearch-project#246](elastic/elastic-charts#246) ### Features * cleaner color API on SeriesSpec ([opensearch-project#571](elastic/elastic-charts#571)) ([6a78c4e](elastic/elastic-charts@6a78c4e)) * **legend:** allow color picker component render prop ([opensearch-project#545](elastic/elastic-charts#545)) ([22ef1e6](elastic/elastic-charts@22ef1e6)) * **partition:** add element click, over and out events ([opensearch-project#578](elastic/elastic-charts#578)) ([4189573](elastic/elastic-charts@4189573)) * **partition:** add tooltip ([opensearch-project#544](elastic/elastic-charts#544)) ([0cffed4](elastic/elastic-charts@0cffed4)), closes [opensearch-project#246](elastic/elastic-charts#246) * percentage display in partitioning charts ([opensearch-project#558](elastic/elastic-charts#558)) ([993a448](elastic/elastic-charts@993a448)) * specify series name with a function on SeriesSpec ([opensearch-project#539](elastic/elastic-charts#539)) ([fc6430b](elastic/elastic-charts@fc6430b)) * xAccessor can be a function accessor ([opensearch-project#574](elastic/elastic-charts#574)) ([f702e2c](elastic/elastic-charts@f702e2c)) ### BREAKING CHANGES * The `getSpecId`, `getGroupId`, `getAxisId` and `getAnnotationId` are no longer available. Use a simple `string` instead. * `customSeriesColors` prop on `SeriesSpec` is now `color`. The `CustomSeriesColors` type is replaced with `SeriesColorAccessor`. * Remove `customSubSeriesName` prop on series specs in favor of cleaner api using just the `name` prop on `SeriesSpec`. The types `SeriesStringPredicate`, `SubSeriesStringPredicate` have been removed. * the `SeriesIdentifier` type is generalized into a simplified object with two values in common: `specId` and `key`. A specialized `XYChartSeriesIdentifier` extends now the base `SeriesIdentifier`. The `SettingsSpec` prop `showLegendDisplayValue` is renamed to `showLegendExtra` and its default value is now `false` hiding the current/last value on the legend by default.
Summary
This commit adds the element click event to the Partition chart, returning a groupByRollup value for each configured chart layer and the associated value.
The
ElementClickListeneris now defined with two possible types, one for each chart type:nothing change for the XYChart, but I've added a new type specific for the Partition chart.
This type is composed by the
SeriesIdentifiersof the Pie/Sunburst and a set ofLayerValues on per each defined layer in thelayersprops of aPartitioncomponent.A layer value is an object defined as the following:
The
groupByRollupproperty returns group by value relative to the slice of the specific layer.The
valueinstead returns the numeric value used to represent percentage as a whole of that specific slice.In this example, clicking on the first slice on the top/right (
source: CN 33from the parent layerdest: US 77) the object passed to the listener is:Checklist
Use
strikethroughsto remove checklist items you don't feel are applicable to this PR.src/index.ts(and stories only import from../srcexcept for test data & storybook)