Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[table] Perf improvements with selections #2005

Merged
merged 13 commits into from
Nov 2, 2018

Conversation

mcintyret
Copy link
Contributor

Improvements to table performance, particularly when in controlled mode (wrt selections).

Selection changes passed through props trigger componentWillReceiveProps(). Previously this would always result in new columnWidths and rowHeights set on state, even when there were no material changes, which would mean shouldComponentUpdate() always returned true, and we had a big rerender. This should be fixed now.

@mcintyret
Copy link
Contributor Author

I don't understand the compile errors here :-(

@adidahiya adidahiya changed the title Feature/table perf improvements [table] Perf improvements with selections Jan 16, 2018
@adidahiya adidahiya self-assigned this Jan 16, 2018
Copy link
Contributor

@giladgray giladgray left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@mcintyret can you share some data on performance improvements as a result of this change?

@@ -681,28 +681,36 @@ export class Table extends AbstractComponent<ITableProps, ITableState> {
selectionModes,
} = nextProps;

const newChildArray = React.Children.toArray(children) as Array<React.ReactElement<IColumnProps>>;
const hasNewChildren = this.props.children !== nextProps.children;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if i'm not mistaken, this will be true every time as children is a new object reference every time (never ===)?
perhaps add a console.log(hasNewChildren) locally to debug if it's ever false?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

children may be memoized

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: hasNewChildren sort of implies to me that there are additional children. maybe call this didChildrenChange.

Also, RE: "may be": do you mean the children will be memoized only if a developer does so explicitly?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes exactly - it needs to be explicitly done by the developer. Memoizing props is a standard part of getting better perf in react so seems reasonable?

@@ -211,6 +211,7 @@ export interface IMutableTableState {
scrollToRegionType?: RegionCardinality;
scrollToRowIndex?: number;
selectedFocusStyle?: FocusStyle;
selectedRegions: IRegion[];
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this should be optional. i think that's the source of compiler errors.

but also you have lint failures.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thanks

export class Cell extends React.Component<ICellProps, {}> {
public static defaultProps = {
truncated: true,
wrapText: false,
};

public shouldComponentUpdate(nextProps: ICellProps) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is a concerning deletion. input from @themadcreator @cmslewis on the impact here?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm I suppose it is inconsistent with my comment above where I claim that children can be memoized, so the shallow compare would be useful. Might be better to revert to the old code and add a comment making clear that the shallow compare will fail on children unless they are memoized.

newColumnWidths = Utils.arrayOfLength(newColumnWidths, numCols, defaultColumnWidth);
newColumnWidths = Utils.assignSparseValues(newColumnWidths, previousColumnWidths);
newColumnWidths = Utils.assignSparseValues(newColumnWidths, columnWidths);
if (defaultColumnWidth !== this.props.defaultColumnWidth || columnWidths !== this.props.columnWidths || (hasNewChildren && !this.areChildrenSameShape(newChildArray))) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

columnWidths !== this.props.columnWidths is problematic as array is likely to be a new instance?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess my assumption here is that clients who are performance-sensitive will take care to memoize these arrays where possible, which is standard practice to get the benefits of pure-render semantics in react.

@mcintyret
Copy link
Contributor Author

@giladgray I don't have numbers, but using the React plugin in chrome dev tools and clicking 'highlight updates' you can see that before this change selecting a cell would rerender every cell in the table, and after the change there is no unnecessary rerendering. I can look into some benchmarks tomorrow.

@giladgray
Copy link
Contributor

@mcintyret neato! a GIF of the chrome tools would be sweet.

@mcintyret
Copy link
Contributor Author

Reverted the changes to cell.tsx because the shallow comparison of children does work when children are primitive, which is probably a common case.

@mcintyret
Copy link
Contributor Author

Before:
before

After:
after

Notes:

  1. The benefits seen here are all because of the conditional grid invalidation in Table.componentWillReceiveProps(). Table.shouldComponentUpdate() still always returns true because several props are not memoized - e.g. loadingOptions={this.getEnabledLoadingOptions()} and selectionModes={this.getEnabledSelectionModes()}. More thorough optimizations would memoize these, which would lead to no table re-renders at all. This would prevent the row and column header re-renders that are seen in the 'after' video (although it should be possible to remove them anyway). The fact that the grid instance doesn't get invalidated means that same instance is passed to TableBodyCells, where the shallow comparison indicates that it doesn't need to re-render.
  2. There is still one re-render in the after video. This is an artifact of how RenderMode.BATCH_ON_UPDATE is implemented - via this.getNormalizedRenderMode(). Using any other RenderMode would have prevented this extra update, although the demo app seems to be broken and won't allow selection in the dropdown.
  3. To show the re-renders in the dev-tools React plugin I had to wrap the random strings in the <Cell/> elements in a <span/>. This forces the shallow comparison of children in Cell.shouldComponentUpdate() to fail, so Cell always re-renders. This doesn't mean that the efficiency gains here only apply when children are non-primitive - the 'before' version also includes calling mutableTable.renderCell() and Cell.shouldComponentUpdate() once for each cell regardless of whether the cell ends up re-rendering, while this is all skipped in the 'after' version.

@mcintyret
Copy link
Contributor Author

Hmm now I'm having second thoughts about this. The absence of renders means that if you want to render a cell differently depending on whether it's selected or not, you can't now. But I do think having this efficiency would be useful in many cases.

Maybe have a forceRerenderOnSelectionChange flag that defaults to false to accommodate this use case?

Copy link
Contributor

@cmslewis cmslewis left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @mcintyret, I'm good with the change in spirit - just want to add some unit tests (1) to make sure there are no obvious oversights, and (2) to show how this patch of code handles various update cases. Can you write a few in tableTests.tsx?

@@ -681,28 +681,36 @@ export class Table extends AbstractComponent<ITableProps, ITableState> {
selectionModes,
} = nextProps;

const newChildArray = React.Children.toArray(children) as Array<React.ReactElement<IColumnProps>>;
const hasNewChildren = this.props.children !== nextProps.children;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: hasNewChildren sort of implies to me that there are additional children. maybe call this didChildrenChange.

Also, RE: "may be": do you mean the children will be memoized only if a developer does so explicitly?

packages/table/src/table.tsx Outdated Show resolved Hide resolved
packages/table/src/table.tsx Outdated Show resolved Hide resolved
packages/table/src/table.tsx Outdated Show resolved Hide resolved
packages/table/src/table.tsx Outdated Show resolved Hide resolved
packages/table/src/table.tsx Outdated Show resolved Hide resolved
packages/table/src/table.tsx Outdated Show resolved Hide resolved
Copy link
Contributor

@cmslewis cmslewis left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

// @tmcintyre Wowww, I wrote this comment months ago and never clicked "Submit review." Sorry about that!

* state changes. Rerendering will still occur if any other relevant props change.
* @default true
*/
forceRerenderOnSelectionChange?: boolean;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@themadcreator @giladgray @adidahiya - what do you all think about this?

The table's data-agnosticism leads to an inherent tradeoff: since the data is not passed in explicitly via props, changing the data returned from a callback for an index currently in view will not lead to a re-render, so data could get stale. To solve for this, the table aggressively invalidates the current view and re-renders all cells in the viewport whenever any other prop changes - e.g. selectedRegions.

This prop keeps that behavior by default, but also allows users to disable it if they know their data won't change, leading to better performance overall.

p.s. @mcintyret all the table boolean props just moved to an enable____ naming scheme. So if we move forward with this, what's a good name?

  1. enableRerenderOnSelectedRegionsChange
  2. enableRerenderOnSelectionChange
  3. enableAggressiveRerendering
  4. enablePessimisticRerendering
  5. enableForcedRerenderingOnSelectionChange
  6. enableForcedRerenderOnSelectionChange
    (etc.)

@giladgray giladgray merged commit dcad422 into palantir:develop Nov 2, 2018
crispamares added a commit to graphext/blueprint that referenced this pull request Nov 23, 2018
* [DateInput] Add support for datepicker clearButtonText and todayButtonText props. (palantir#3020)

* [DateInput] Add datepicker clearButtonText and todayButtonText props support.

* [DateInput] Add unit test for clearButtonText and todayButtonText props.

* include integrity hashes in yarn lock (palantir#3035)

* Publish

 - @blueprintjs/docs-theme@3.0.2

* Publish

 - @blueprintjs/docs-theme@3.0.3
 - @blueprintjs/karma-build-scripts@0.9.0
 - @blueprintjs/node-build-scripts@0.8.0
 - @blueprintjs/webpack-build-scripts@0.7.0

* Fix reset of active item when query hasn't changed (palantir#3072)

* Fix reset active item when query hasn't changed

* Address comments

* [DateInput] close on tab key press (palantir#3038)

* Publish

 - @blueprintjs/datetime@3.3.1
 - @blueprintjs/select@3.2.1

* Correct Table reference to HTMLTable (palantir#3075)

Also correct link to html-table page.

* 🔧 fix dependencies (palantir#3078)

* node-gyp resolution

* * dep for build-scripts packages

* yarn.lock

* preview script won't fail build without GH_AUTH_TOKEN

* update yarn min version in readme

* fix icons alignment (palantir#3102)

* [Breadcrumb] Add current prop (palantir#3104)

* Render breadcrumb children (palantir#3105)

* fix checkbox indicator display (palantir#3113)

* Only set default font-family on body selector (palantir#3115)

* [FormGroup] add contentClassName and style props (palantir#3120)

* add contentClassName prop

* add style prop

* [Portal] add container prop (palantir#3045)

* [Portal] add container prop

* [Overlay] add container prop

* [Popover] add container prop

* [Tooltip] add container prop

* [Dialog] add container prop

* [Alert] add container prop

* fix test failed

* [portal] avoid possible crash on componentDidMount

* rename container to portalContainer for overlay components

* chore: remove useless code

* add isotest for className prop (palantir#3119)

* four args become two. add className isotest.

refactor generateIsomorphicTests() to use config object in mapped type

* refactor isotest suites to new config object

* [Tag] fix line-height for centering (palantir#3117)

* fix lint error

* set tag line-height to icon size

* $tag-line-height(-large) vars

* fix label documentation example (palantir#3087)

* fix label documentation example

* Use class constants

* remove first id

* Label B

* added new icon (palantir#3052)

* [table] Perf improvements with selections (palantir#2005)

* table performance improvements - reducing rerendering where possible

* reinstate enum strings

* fix compile errors

* fix lint errors

* fix test

* cell: revert changes

* code review suggestions; add forceRerenderOnSelectionChange flag

* lint

* default to false

* remove unused logo styles from navbar (palantir#3123)

* [Breadcrumbs] Add new component (palantir#3106)

* Add breadcrumbs component

* Use lambda syntax

* Add overflow list props

* Disable overflow menu items

* Add missing prop docs

* Document new Breadcrumb special case

* Add Breadcrumbs prop docs

* Use ul tag

* Add test to OverflowList

* Add tests to Breadcrumb

* Add tests for Breadcrumbs

* Fix docstring

Co-Authored-By: invliD <mail@invlid.com>

* Improve docstring

Co-Authored-By: invliD <mail@invlid.com>

* Fix Breadcrumb docs

* Fix linebreak

* Default breadcrumbRenderer

* Explain why the menu is reversed

* Add link to OL

* Add code example

* Re-use breadcrumbs example using different name

* docs edits

* Publish

 - @blueprintjs/core@3.8.0
 - @blueprintjs/icons@3.3.0
 - @blueprintjs/table@3.3.0

* fix disappearing caret on focus of HTMLSelect in ControlGroup (fixes palantir#3003) (palantir#3150)

* Single Month Only Prop in DateRangePicker (palantir#3142)

* allow singleMonthlyOnly in DateRangePicker

* updated docs comment

* added singleMonthOnly props in DateRangeInput

* added DateRangeInput test to ensure prop is passed

* updated documentation and example labels

* Allow users to browse omnibar options without query (palantir#3130)

* Using tagName JSX variable for MenuItem (palantir#3061)

* Using tagName JSX variable for MenuItem

* Fixed minnor default issues as per the requests on PR

* [Overlay] add portalClassName to IOverlayableProps (palantir#3148)

* add portalClassName to IOverlayableProps

* fix overlay test

* unmount dialog test

* fix HTML_TABLE_CONDENSED name (reverts 3.x break) (palantir#3147)

* Don't clear TagInput inputValue state if controlled (palantir#3137)

* Don't clear TagInput inputValue state if controlled

Fixes palantir#3134

* Address PR comments

* Revert fixes

* remove margin on heading-only callouts (palantir#3157)

* PopoverPosition = Position + auto values (palantir#3156)

* [Select] Flag to optionally scroll to active item for select components (palantir#3096)

* Flag to optionally scroll to active item for select components

* Respect click and keyboard interactions

* Change docs

* edit prop docs

* add uncontrolled note

* docs edits (palantir#3161)

* [tslint] blueprint-html-components fixer! (palantir#3162)

* enable strict mode in tslint-config

* sort imports before adding

* blueprint-html-components fixes imports

* refactors

* replaceTagName util

* test formatting

* add test for all imports

* h2/h5

* ts-lint --fix (palantir#3159)

* relaxed typings for optional JSX.Elements (palantir#3118)

* export type OptionalElement = JSX.Element | boolean | null | undefined;

use it in `icon` props

* more uses of OptionalElement

* Icons docs uses props

* MaybeElement, false

* [Popover] add boundary prop for easier modifiers (palantir#3149)

* Popover add boundariesElement prop for easier modifiers

* rename to boundary

* rename type to PopperBoundary

* fix examples

* Publish

 - @blueprintjs/core@3.9.0
 - @blueprintjs/datetime@3.4.0
 - @blueprintjs/select@3.3.0
 - @blueprintjs/tslint-config@1.7.0
NachoJusticia pushed a commit to graphext/blueprint that referenced this pull request Apr 12, 2019
* [DateInput] Add support for datepicker clearButtonText and todayButtonText props. (palantir#3020)

* [DateInput] Add datepicker clearButtonText and todayButtonText props support.

* [DateInput] Add unit test for clearButtonText and todayButtonText props.

* include integrity hashes in yarn lock (palantir#3035)

* Publish

 - @blueprintjs/docs-theme@3.0.2

* Publish

 - @blueprintjs/docs-theme@3.0.3
 - @blueprintjs/karma-build-scripts@0.9.0
 - @blueprintjs/node-build-scripts@0.8.0
 - @blueprintjs/webpack-build-scripts@0.7.0

* Fix reset of active item when query hasn't changed (palantir#3072)

* Fix reset active item when query hasn't changed

* Address comments

* [DateInput] close on tab key press (palantir#3038)

* Publish

 - @blueprintjs/datetime@3.3.1
 - @blueprintjs/select@3.2.1

* Correct Table reference to HTMLTable (palantir#3075)

Also correct link to html-table page.

* 🔧 fix dependencies (palantir#3078)

* node-gyp resolution

* * dep for build-scripts packages

* yarn.lock

* preview script won't fail build without GH_AUTH_TOKEN

* update yarn min version in readme

* fix icons alignment (palantir#3102)

* [Breadcrumb] Add current prop (palantir#3104)

* Render breadcrumb children (palantir#3105)

* fix checkbox indicator display (palantir#3113)

* Only set default font-family on body selector (palantir#3115)

* [FormGroup] add contentClassName and style props (palantir#3120)

* add contentClassName prop

* add style prop

* [Portal] add container prop (palantir#3045)

* [Portal] add container prop

* [Overlay] add container prop

* [Popover] add container prop

* [Tooltip] add container prop

* [Dialog] add container prop

* [Alert] add container prop

* fix test failed

* [portal] avoid possible crash on componentDidMount

* rename container to portalContainer for overlay components

* chore: remove useless code

* add isotest for className prop (palantir#3119)

* four args become two. add className isotest.

refactor generateIsomorphicTests() to use config object in mapped type

* refactor isotest suites to new config object

* [Tag] fix line-height for centering (palantir#3117)

* fix lint error

* set tag line-height to icon size

* $tag-line-height(-large) vars

* fix label documentation example (palantir#3087)

* fix label documentation example

* Use class constants

* remove first id

* Label B

* added new icon (palantir#3052)

* [table] Perf improvements with selections (palantir#2005)

* table performance improvements - reducing rerendering where possible

* reinstate enum strings

* fix compile errors

* fix lint errors

* fix test

* cell: revert changes

* code review suggestions; add forceRerenderOnSelectionChange flag

* lint

* default to false

* remove unused logo styles from navbar (palantir#3123)

* [Breadcrumbs] Add new component (palantir#3106)

* Add breadcrumbs component

* Use lambda syntax

* Add overflow list props

* Disable overflow menu items

* Add missing prop docs

* Document new Breadcrumb special case

* Add Breadcrumbs prop docs

* Use ul tag

* Add test to OverflowList

* Add tests to Breadcrumb

* Add tests for Breadcrumbs

* Fix docstring

Co-Authored-By: invliD <mail@invlid.com>

* Improve docstring

Co-Authored-By: invliD <mail@invlid.com>

* Fix Breadcrumb docs

* Fix linebreak

* Default breadcrumbRenderer

* Explain why the menu is reversed

* Add link to OL

* Add code example

* Re-use breadcrumbs example using different name

* docs edits

* Publish

 - @blueprintjs/core@3.8.0
 - @blueprintjs/icons@3.3.0
 - @blueprintjs/table@3.3.0

* fix disappearing caret on focus of HTMLSelect in ControlGroup (fixes palantir#3003) (palantir#3150)

* Single Month Only Prop in DateRangePicker (palantir#3142)

* allow singleMonthlyOnly in DateRangePicker

* updated docs comment

* added singleMonthOnly props in DateRangeInput

* added DateRangeInput test to ensure prop is passed

* updated documentation and example labels

* Allow users to browse omnibar options without query (palantir#3130)

* Using tagName JSX variable for MenuItem (palantir#3061)

* Using tagName JSX variable for MenuItem

* Fixed minnor default issues as per the requests on PR

* [Overlay] add portalClassName to IOverlayableProps (palantir#3148)

* add portalClassName to IOverlayableProps

* fix overlay test

* unmount dialog test

* fix HTML_TABLE_CONDENSED name (reverts 3.x break) (palantir#3147)

* Don't clear TagInput inputValue state if controlled (palantir#3137)

* Don't clear TagInput inputValue state if controlled

Fixes palantir#3134

* Address PR comments

* Revert fixes

* remove margin on heading-only callouts (palantir#3157)

* PopoverPosition = Position + auto values (palantir#3156)

* [Select] Flag to optionally scroll to active item for select components (palantir#3096)

* Flag to optionally scroll to active item for select components

* Respect click and keyboard interactions

* Change docs

* edit prop docs

* add uncontrolled note

* docs edits (palantir#3161)

* [tslint] blueprint-html-components fixer! (palantir#3162)

* enable strict mode in tslint-config

* sort imports before adding

* blueprint-html-components fixes imports

* refactors

* replaceTagName util

* test formatting

* add test for all imports

* h2/h5

* ts-lint --fix (palantir#3159)

* relaxed typings for optional JSX.Elements (palantir#3118)

* export type OptionalElement = JSX.Element | boolean | null | undefined;

use it in `icon` props

* more uses of OptionalElement

* Icons docs uses props

* MaybeElement, false

* [Popover] add boundary prop for easier modifiers (palantir#3149)

* Popover add boundariesElement prop for easier modifiers

* rename to boundary

* rename type to PopperBoundary

* fix examples

* Publish

 - @blueprintjs/core@3.9.0
 - @blueprintjs/datetime@3.4.0
 - @blueprintjs/select@3.3.0
 - @blueprintjs/tslint-config@1.7.0

* Fixed bug where new timeout prop passed to toastr update was ignored (palantir#3164)

* Fix change activeItem when query changes on props for QueryList (palantir#3180)

* Fix change activeItem when query changes on props for QueryList

* move willRecieveProps to componentDidUpdate

* put back

* fix import. VSCode - I ahte you

* Replace calendar months const enum with enum (palantir#3182)

* Include "enable preview comments" in PR templates (palantir#3201)

* [select] fix inputprops docs (palantir#3167)

* [HTMLTable] fix html props type (palantir#3170)

* Add elevation variables in docs (palantir#3202)

* FIXED: @HotkeyTarget -> @HotkeysTarget typo (palantir#3208)

* [Popover/DateInput] fix tabIndex & inputRef support (palantir#3200)

* fix Popover openOnTargetFocus tabIndex logic

* refactor DateInput inputRef logic & add tests

* fix import path

* add corresponding InputGroup tests

* update sandbox URL (palantir#3206)

* [NumericInput] ❤️  (palantir#3204)

* ref type | null

* remove <T> on react events

optional type!!

* Keys.isKeyboardClick

it's like a method on a java enum!

* total render refactor

- FIX: css class is applied when buttons=none
- renderButtons() and renderInput()
- conditionals to place buttons before or after input
- remove special-casing for buttons=none

* generate button event handlers, fix key holding

one little function to cache handler objects.
fix holding enter/space to continuously change value.

* onKeyUp handler is obsolete

Button handles enter/space click logic.
onKeyDown is actually enough - quite elegant.

* remove isButtonGroupFocused state

set but never read

* move shouldSelectAfterUpdate to state so it triggers updates

for the selection logic in cmpDidUpdate

* required state, missed a <T>

* update and refactor tests

not much needed here

* pull pure methods out to utils file

* fix tabs usage

* little things: public state, {value}

* orgainze

* missed a reset

* fix return type of Icon.render() (palantir#3190)

* [DateRangePicker] Remove unused styling in daterangepicker.scss (palantir#3199)

* Remove unused styling in daterangepicker.scss

* Configure CircleCI previews

* [Tree] add node mouseenter and mouseleave events (palantir#3211)

* [Popover] add targetProps (palantir#3213)

* add safeInvokeMember util

* add Popover targetProps, using new util for overridden events

* tests

* only one spread

* add note about ref

* add notes about types

* Circle bot logs artifact URLs if auth token is missing (palantir#3209)

* upgrade circle-github-bot

* refactor script so it logs artifact URLs if auth token is missing

* Add htmlTitle prop to Icon (palantir#3216)

* add htmlTitle prop to Icon

* try to kick circleci?

* comment update & backticks

* add "on hover"

* Added new icons (palantir#3222)

* update contributing notes: DO NOT enable Circle for forks. (palantir#3217)

* update contributing notes: DO NOT enable Circle for forks.

* finish the sentence

* [Popover/Tooltip] add public reposition() method to schedule popper update (palantir#3215)

* [Popover] public reposition method to schedule popper update

* add tooltip.reposition()

* [DateRangePicker] Fix caption behavior in contiguous month mode (palantir#3198)

* Add failing tests

* Use two DayPickers for contiguous months

This is so that we can customize the behavior for captions, so the left
caption changes the start month/year and the right caption changes the
end.

* Add additional rendering tests

* Lint

* Configure CircleCI previews

* Add enforcement for contiguousMonth toggling

* Publish

 - @blueprintjs/core@3.10.0
 - @blueprintjs/datetime@3.5.0
 - @blueprintjs/icons@3.4.0
 - @blueprintjs/select@3.4.0

* Update hotkeys.md (palantir#3227)

* Added EditableText input type field (palantir#3235)

* Fix setState calls using updater functions (palantir#3247)

React does not guarantee that the state changes are applied immediately. It is best practice to use an updater function if the new state relies on the current state.

* Add menu item classnames (palantir#3251)

* Add menu item label classname

* Add text classname prop

* Alphabetize props & improve docs

* docs: tag-input: fix garbled unescaped html appearing due to hard line breaking in md source (palantir#3266)

* Fix dialog css docs (palantir#3271)

* Added esnext as a build target. (palantir#3230)

* [docs] Suggest using `ContextMenuTarget` as a HOC (palantir#3259)

Instead of falling back to the imperative API, suggest using `ContextMenuTarget`, where decorators are not an option.

* [docs] show optional isDarkTheme parameter in ContextMenu API docs (palantir#3273)

To make it more obvious that you can manually create a dark context menu, as raised in palantir#3229

* [ResizeSensor] try/catch findDOMNode to handle possible error state (palantir#3236)

*  🔧 upgrade to webpack 4 (palantir#3252)

* upgrade to webpack 4

* migrate webpack config

* add cssnano, though it doesn't seem to work

* fix cssnano in docs-app

* small config refactors

* upgrade karma deps

* migrate karma webpack usage.

use webpack alias for enzyme adapter instead of template string

* upgrade sinon

* skip borked table tests that rely on now-impossible sinon spy behavior.

sinonjs/sinon#1711

* fix lint

* Use cjs modules for karma testing

* Forgot to enable cjs for table

* Popover docs: inline -> usePortal={false} (palantir#3277)

I _think_ inline is outdated b/c I don't see docs on that prop above. I'm pretty sure this section means to reference `usePortal={false}` instead.

* [docs] fix CDN usage & bundle externals (palantir#3276)

* update webpack externals

* update CDN guide in getting started

* push CDN section to the bottom (to avoid distraction)

* remove repeated install notes

* remove jquery

* Publish

 - @blueprintjs/core@3.11.0
 - @blueprintjs/datetime@3.6.0
 - @blueprintjs/icons@3.5.0
 - @blueprintjs/select@3.5.0
 - @blueprintjs/table@3.4.0
 - @blueprintjs/timezone@3.2.0

* refactor toast timeout update logic to be more obvious (palantir#3275)

always clear timeout when starting to cancel any previous now-outdated active timer.

* [OverflowList] Always re-render items (palantir#3278)

* Allow overriding of heading typography in Sass (palantir#3283)

* [TimezonePicker] Support a custom target via <children> (palantir#3287)

* Export getTimezoneMetadata(), add default value for date parameter

* Support one custom child in <TimezonePicker>

* Update example

* Update tests

* (nit) Rename to CustomTimezonePickerTarget

* Add more docs about possibly ignored props

* Update docs

* Respond to @giladgray CR

* Create CHANGELOG.md

* Suggest query remains when closed if nothing is selected. (palantir#3289)

* Allow shortcuts to change time in Date Range Picker (palantir#3223)

* Allow date range shortcuts to change time

* Address PR comments

* lint

* [Suggest] add `disabled` and `resetOnClose` props (palantir#3292)

* add Suggest resetOnClose prop a la Select

* add Suggest disabled prop

* add resetOnClose switch to example

* docs note

* [QueryList] Initialize activeItem state correctly based on prop. (palantir#3290)

* Initialize QueryList's activeItem state correctly based on prop.

* Fix comment typo

* Code cleanup

* [PanelStack] Allow any prop type for initial panels (palantir#3295)

* [Tooltip] allow HOVER interactions (palantir#3291)

* [Tag] fill & [TagInput] intent props (palantir#3237)

* add Tag fill prop

* add TagInput intent prop

* add tag fill styles & example switch

* docs: Fix link to Popover (palantir#3300)

* Add directory details to packages/*/package.json (palantir#3301)

Specifying the directory as part of the `repository` field in a `package.json`
allows third party tools to provide better support when working with monorepos.
For example, it allows them to correctly construct a commit diff for a specific
package.

This format was accepted by npm in
[npm/rfcs#19](npm/rfcs#19).

* Add directory to repository details in package.json files (palantir#3299)

Specifying the directory as part of the `repository` field in a `package.json`
allows third party tools to provide better support when working with monorepos.
For example, it allows them to correctly construct a commit diff for a specific
package.

This format was accepted by npm in npm/rfcs#19.

* [select] Add optional "itemsEqual" comparator prop to QueryList and related components (palantir#3285)

* Improve QueryList and related components to support optional
equality test implementation for non-primitive item types.

* Revert change to use undefined for representing no selection

* Finish revert change to use undefined for representing no selection

* Remove TODO

* Remove unnecessary param documentation

* Rename "areValuesEqual" prop to "itemsEqual"

* Improve "itemsEqual" prop to also support a property name.

* Documentation typos

* Documentation improvements

* Update copyright year in new file

* Rename new unit test file

* [DRP] Shortcuts support changing time & docs (palantir#3293)

* shortcut shouldChangeTime => includeTime

* revert unnecessary test changes

* add Shortcuts docs to DRP

* Publish

 - @blueprintjs/core@3.12.0
 - @blueprintjs/datetime@3.7.0
 - @blueprintjs/docs-theme@3.0.4
 - @blueprintjs/icons@3.5.1
 - @blueprintjs/karma-build-scripts@0.9.1
 - @blueprintjs/labs@0.16.3
 - @blueprintjs/node-build-scripts@0.8.1
 - @blueprintjs/select@3.6.0
 - @blueprintjs/table@3.4.1
 - @blueprintjs/test-commons@0.8.1
 - @blueprintjs/timezone@3.3.0
 - @blueprintjs/tslint-config@1.7.1
 - @blueprintjs/webpack-build-scripts@0.7.1

* [select] consistency refactors (palantir#3305)

* code consistency across `select` components:

- public state = ... (not inconstructor)
- non-optional refs
- safeInvokeMember to reduce destructuring

* fix tests, explicit null check

* dedupe shortcuts prop types (palantir#3311)

* [NumericInput] allows min === max (palantir#3296)

* NumericInput allows min === max

* add test

* [NumericInput] new rightElement prop (palantir#3314)

* Update select-component.md (palantir#3319)

* Fixing typo (palantir#3318)

Missing "and"

* Added new inbox icons (palantir#3335)

* [docs] click to download sketch files from Resources page (palantir#3334)

* click to download sketch files from Resources page

* lint

* use /raw/ url to download actual file

* rename resource files so they download correctly

* add "Missing fonts?" callout

* minor style polish

* Add internal text to switch component (palantir#3327)

* switch text v0

* font size a bit smaller

* add an example of internal text property

* test

* cleanup

* lint fixes

* review comments

* remove whitespace in tests

* more review comments

* even more review changes

* remove errant property

* restore comment

* update prop docs

* additional tests

* remove unnecessary checks

* [Spinner] SIZE_SMALL = 20 (palantir#3342)

* Spinner.SIZE_SMALL = 20

* fix isotest

* [NumericInput] countDecimalPlaces for number type (palantir#3337)

Fixes palantir#3336

* New Drawer component (palantir#2957)

* add files

* fixed styling

* dark theme added

* Added vertical orientation

* changed viewport units

* Added small and large sizes

* Standardized sizing

* backdrop fixed

* add tests

* small/large => one size prop

* update size constants

* add hasBackdrop switch to example

* use Drawer for API browser

* size prop docs

* fix isotest

* add size+vertical tests, actually run suite

* [DatePicker] fix onChange on month change after initial day selection (palantir#3343)

* fix onChange doesn't fire on month change after initial day selection
Fixes palantir#3340

* change !== to != operator

* add test onChange fired when month is changed for uncontrolled datepicker

* Publish

 - @blueprintjs/core@3.13.0
 - @blueprintjs/datetime@3.7.1
 - @blueprintjs/icons@3.6.0
 - @blueprintjs/select@3.6.1

* Corrected the type of Popover's onInteraction prop (palantir#3348)

* ButtonGroup supports "fill" prop when Buttons are wrapped in Popovers (palantir#3347)

* 🔧 upgrade tslint (palantir#3315)

* Fix shortcuts.tsx react import typings (palantir#3356)

* [Tabs] add panelClassName prop (palantir#3351)

* Fix lint (palantir#3374)

* [Core] Fixed not applying intent color for icon inside tree node (palantir#3355)

* [Core] Add option to make tree node disabled (palantir#3354)

* Drawer default prop warning fix (palantir#3382)

* [Select] Create-able Select components (palantir#3381)

* Upgrade dev dependencies and types (palantir#3370)

* Publish

 - @blueprintjs/core@3.14.0
 - @blueprintjs/docs-app@3.14.0
 - @blueprintjs/select@3.7.0

* [Core] Overlay: fix transitionDuration documentation (palantir#3391)

* [Core] Fix react types regression (palantir#3390)

* Publish

 - @blueprintjs/core@3.14.1
 - @blueprintjs/docs-app@3.14.1

* Publish

 - @blueprintjs/datetime@3.7.2

* [Core] Checkbox: fix indeterminate state update (palantir#3409)

Fixes palantir#3408

* Minor README updates

* [Core] Docs: fix small typo (palantir#3411)

"accomodate" to "accommodate"

* [Docs] Overlay Example: add option to test scrolling behavior (palantir#3406)

* Update Bug_report.md

* [datetime] docs: fix react-day-picker API hyperlink (palantir#3435)

* [core] TagInput: use undefined instead of null to hide clearButton (palantir#3436)

* [Select] hide QueryList item list when menuContent and createItemView are both null (palantir#3426)

* [MultiSelect] Enable pasting of multiple values (same as TagInput) (palantir#3428)

* [Core] Add z-index to panel stack header (palantir#3414)

* [Core] Add option to grow text area with input (palantir#3398)

* [Core] TextArea: fix style object regression (palantir#3440)

* [Core] Add position prop to Drawer component, deprecate vertical prop (palantir#3386)

* [Table] Fix resizable props documentation (palantir#3400)

* Switch to standard Apache-2.0 license (palantir#3457)

* [table] Fix documentation to use the right css file name (palantir#3452)

* Prepare release v3.15.0 (palantir#3458)

* Publish

 - @blueprintjs/core@3.15.0
 - @blueprintjs/datetime@3.8.0
 - @blueprintjs/docs-app@3.15.0
 - @blueprintjs/docs-theme@3.1.0
 - @blueprintjs/icons@3.7.0
 - @blueprintjs/karma-build-scripts@0.10.0
 - @blueprintjs/node-build-scripts@0.9.0
 - @blueprintjs/select@3.8.0
 - @blueprintjs/table@3.5.0
 - @blueprintjs/test-commons@0.9.0
 - @blueprintjs/timezone@3.4.0
 - @blueprintjs/tslint-config@1.8.0
 - @blueprintjs/webpack-build-scripts@0.8.0

* [Core] File input text styling for active selections (palantir#3375)

* Fix root package.json file that had duplicated resolutions

* Add yarn lock from upstream

* Update graphext packages versions
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants