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 = `
+
+
+
+
+
+