From cfc1710d6d9a6958247d32cc7286649ec1b7bef7 Mon Sep 17 00:00:00 2001 From: Maxime Janton <127086@supinfo.com> Date: Thu, 12 Oct 2017 11:13:24 +0200 Subject: [PATCH] feat(core): InstantSearch hot remove/add widgets (#2384) * chore(devnovel): add unmount widgets example * feat(connectors): implement dispose() API * feat(widgets): pass `unmountFn` to connectors * feat(InstantSearch): add `removeWidget()` method * fix(connectHierarchicalMenu): dont mutate state directly * feat(dispose): better error message * refactor(dispose): provide helper state directly * refactor(widgets): inline disposer fn * feat(removeWidget): accept array of widgets * refactor(removeWidget): have two distinct methods * chore(dev): add `re-mount` button for testing purpose * feat(addWidget): allow mount widgets after started * feat(addWidgets): allow mount multiple widgets at once * test(InstantSearch): removeWidget * test(instantsearch): removeWidgets() * test(instantsearch): add widgets after start * fix(menuSelect): use preact instead of React (#2460) * fix(test): correctly reset the wired dependency (#2461) * fix(addWidgets): update helper state before call `init()` * feat(InstantSearch): add `dispose()` method to remove all widgets * doc(InstantSearch): add jsdoc for new methods * doc(custom-widget): add notes about dispose() * feat(url-sync): implement dispose strategy * fix(InstantSearch.dispose): dispose urlSyncWidget first --- dev/app/index.js | 4 + dev/app/init-unmount-widgets.js | 319 ++++++++++++++++++ docgen/src/guides/custom-widget.md | 18 +- src/connectors/clear-all/connectClearAll.js | 7 +- .../connectCurrentRefinedValues.js | 7 +- .../connectHierarchicalMenu.js | 19 +- .../hits-per-page/connectHitsPerPage.js | 7 +- src/connectors/hits/connectHits.js | 7 +- .../infinite-hits/connectInfiniteHits.js | 7 +- src/connectors/menu/connectMenu.js | 13 +- .../connectNumericRefinementList.js | 8 +- .../connectNumericSelector.js | 8 +- .../pagination/connectPagination.js | 7 +- .../price-ranges/connectPriceRanges.js | 13 +- src/connectors/range/connectRange.js | 13 +- .../refinement-list/connectRefinementList.js | 19 +- src/connectors/search-box/connectSearchBox.js | 8 +- .../sort-by-selector/connectSortBySelector.js | 9 +- .../star-rating/connectStarRating.js | 13 +- src/connectors/stats/connectStats.js | 7 +- src/connectors/toggle/connectToggle.js | 13 +- src/lib/InstantSearch.js | 122 ++++++- src/lib/__tests__/InstantSearch-test.js | 257 ++++++++++++++ src/lib/url-sync.js | 22 +- src/widgets/clear-all/clear-all.js | 6 +- .../current-refined-values.js | 5 +- .../hierarchical-menu/hierarchical-menu.js | 7 +- .../hits-per-page-selector.js | 7 +- src/widgets/hits/hits.js | 6 +- src/widgets/infinite-hits/infinite-hits.js | 6 +- src/widgets/menu/menu.js | 6 +- .../numeric-refinement-list.js | 5 +- .../numeric-selector/numeric-selector.js | 7 +- src/widgets/pagination/pagination.js | 6 +- src/widgets/price-ranges/price-ranges.js | 6 +- src/widgets/range-slider/range-slider.js | 6 +- .../refinement-list/refinement-list.js | 6 +- src/widgets/search-box/search-box.js | 11 +- .../sort-by-selector/sort-by-selector.js | 6 +- src/widgets/star-rating/star-rating.js | 6 +- src/widgets/stats/stats.js | 6 +- src/widgets/toggle/toggle.js | 6 +- 42 files changed, 977 insertions(+), 64 deletions(-) create mode 100644 dev/app/init-unmount-widgets.js diff --git a/dev/app/index.js b/dev/app/index.js index d2e1d0a621..991f647356 100644 --- a/dev/app/index.js +++ b/dev/app/index.js @@ -2,6 +2,7 @@ import { registerDisposer, start } from 'dev-novel'; import initBuiltInWidgets from './builtin/init-stories'; import initJqueryWidgets from './jquery/init-stories'; import initVanillaWidgets from './vanilla/init-stories'; +import initUnmountWidgets from './init-unmount-widgets.js'; import '../style.css'; import '../../src/css/instantsearch.scss'; @@ -21,6 +22,9 @@ switch (true) { case q.includes('widgets=jquery'): initJqueryWidgets(); break; + case q.includes('widgets=unmount'): + initUnmountWidgets(); + break; default: initBuiltInWidgets(); } diff --git a/dev/app/init-unmount-widgets.js b/dev/app/init-unmount-widgets.js new file mode 100644 index 0000000000..169503de45 --- /dev/null +++ b/dev/app/init-unmount-widgets.js @@ -0,0 +1,319 @@ +/* eslint-disable import/default */ +import { storiesOf } from 'dev-novel'; +import instantsearch from '../../index.js'; + +import wrapWithHits from './utils/wrap-with-hits.js'; + +function wrapWithUnmount(getWidget, params) { + return wrapWithHits(container => { + container.innerHTML = ` +
+
+
+
+
+