vue-instantsearch 4.4.2 → 4.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/package.json +5 -5
  3. package/src/__tests__/index.js +1 -0
  4. package/src/components/Breadcrumb.vue +1 -3
  5. package/src/components/ClearRefinements.vue +1 -3
  6. package/src/components/CurrentRefinements.vue +1 -4
  7. package/src/components/HierarchicalMenu.vue +3 -11
  8. package/src/components/HierarchicalMenuList.vue +4 -1
  9. package/src/components/HitsPerPage.vue +2 -3
  10. package/src/components/InstantSearch.js +5 -0
  11. package/src/components/Menu.vue +1 -3
  12. package/src/components/MenuSelect.vue +1 -3
  13. package/src/components/NumericMenu.vue +3 -8
  14. package/src/components/Pagination.vue +1 -3
  15. package/src/components/RangeInput.vue +3 -11
  16. package/src/components/RatingMenu.vue +2 -3
  17. package/src/components/RefinementList.vue +1 -3
  18. package/src/components/SortBy.vue +2 -3
  19. package/src/components/StateResults.vue +55 -12
  20. package/src/components/ToggleRefinement.vue +3 -10
  21. package/src/components/__tests__/Breadcrumb.js +0 -25
  22. package/src/components/__tests__/ClearRefinements.js +0 -23
  23. package/src/components/__tests__/CurrentRefinements.js +0 -17
  24. package/src/components/__tests__/HierarchicalMenu.js +3 -19
  25. package/src/components/__tests__/HitsPerPage.js +0 -26
  26. package/src/components/__tests__/Menu.js +0 -22
  27. package/src/components/__tests__/MenuSelect.js +0 -23
  28. package/src/components/__tests__/NumericMenu.js +3 -25
  29. package/src/components/__tests__/Pagination.js +0 -21
  30. package/src/components/__tests__/RangeInput.js +1 -34
  31. package/src/components/__tests__/RatingMenu.js +0 -23
  32. package/src/components/__tests__/RefinementList.js +0 -23
  33. package/src/components/__tests__/SortBy.js +1 -23
  34. package/src/components/__tests__/StateResults.js +6 -0
  35. package/src/components/__tests__/ToggleRefinement.js +4 -33
  36. package/src/components/__tests__/__snapshots__/HierarchicalMenu.js.snap +2 -2
  37. package/src/components/__tests__/__snapshots__/StateResults.js.snap +6 -0
  38. package/src/mixins/__mocks__/panel.js +1 -5
  39. package/src/mixins/__mocks__/widget.js +10 -0
  40. package/src/mixins/__tests__/panel.test.js +18 -40
  41. package/src/mixins/panel.js +3 -1
  42. package/src/util/createInstantSearchComponent.js +7 -0
  43. package/src/util/createServerRootMixin.js +10 -1
  44. package/vue2/cjs/index.js +1 -1
  45. package/vue2/cjs/index.js.map +1 -1
  46. package/vue2/es/package.json.js +1 -1
  47. package/vue2/es/src/components/Breadcrumb.vue.js +1 -1
  48. package/vue2/es/src/components/Breadcrumb.vue.js.map +1 -1
  49. package/vue2/es/src/components/ClearRefinements.vue.js +1 -1
  50. package/vue2/es/src/components/ClearRefinements.vue.js.map +1 -1
  51. package/vue2/es/src/components/CurrentRefinements.vue.js +1 -1
  52. package/vue2/es/src/components/CurrentRefinements.vue.js.map +1 -1
  53. package/vue2/es/src/components/HierarchicalMenu.vue.js +1 -1
  54. package/vue2/es/src/components/HierarchicalMenu.vue.js.map +1 -1
  55. package/vue2/es/src/components/HierarchicalMenuList.vue.js +1 -1
  56. package/vue2/es/src/components/HierarchicalMenuList.vue.js.map +1 -1
  57. package/vue2/es/src/components/HitsPerPage.vue.js +1 -1
  58. package/vue2/es/src/components/HitsPerPage.vue.js.map +1 -1
  59. package/vue2/es/src/components/InstantSearch.js +1 -1
  60. package/vue2/es/src/components/InstantSearch.js.map +1 -1
  61. package/vue2/es/src/components/Menu.vue.js +1 -1
  62. package/vue2/es/src/components/Menu.vue.js.map +1 -1
  63. package/vue2/es/src/components/MenuSelect.vue.js +1 -1
  64. package/vue2/es/src/components/MenuSelect.vue.js.map +1 -1
  65. package/vue2/es/src/components/NumericMenu.vue.js +1 -1
  66. package/vue2/es/src/components/NumericMenu.vue.js.map +1 -1
  67. package/vue2/es/src/components/Pagination.vue.js +1 -1
  68. package/vue2/es/src/components/Pagination.vue.js.map +1 -1
  69. package/vue2/es/src/components/RangeInput.vue.js +1 -1
  70. package/vue2/es/src/components/RangeInput.vue.js.map +1 -1
  71. package/vue2/es/src/components/RatingMenu.vue.js +1 -1
  72. package/vue2/es/src/components/RatingMenu.vue.js.map +1 -1
  73. package/vue2/es/src/components/RefinementList.vue.js +1 -1
  74. package/vue2/es/src/components/RefinementList.vue.js.map +1 -1
  75. package/vue2/es/src/components/SortBy.vue.js +1 -1
  76. package/vue2/es/src/components/SortBy.vue.js.map +1 -1
  77. package/vue2/es/src/components/StateResults.vue.js +1 -1
  78. package/vue2/es/src/components/StateResults.vue.js.map +1 -1
  79. package/vue2/es/src/components/ToggleRefinement.vue.js +1 -1
  80. package/vue2/es/src/components/ToggleRefinement.vue.js.map +1 -1
  81. package/vue2/es/src/mixins/panel.js +1 -1
  82. package/vue2/es/src/mixins/panel.js.map +1 -1
  83. package/vue2/es/src/util/createInstantSearchComponent.js +1 -1
  84. package/vue2/es/src/util/createInstantSearchComponent.js.map +1 -1
  85. package/vue2/es/src/util/createServerRootMixin.js +1 -1
  86. package/vue2/es/src/util/createServerRootMixin.js.map +1 -1
  87. package/vue2/umd/index.js +1 -1
  88. package/vue2/umd/index.js.map +1 -1
  89. package/vue3/cjs/index.js +1 -1
  90. package/vue3/cjs/index.js.map +1 -1
  91. package/vue3/es/package.json.js +1 -1
  92. package/vue3/es/src/components/Breadcrumb.vue_vue&type=script&lang.js +1 -1
  93. package/vue3/es/src/components/Breadcrumb.vue_vue&type=script&lang.js.map +1 -1
  94. package/vue3/es/src/components/Breadcrumb.vue_vue&type=template&id=6f46de9a&lang.js.map +1 -1
  95. package/vue3/es/src/components/ClearRefinements.vue_vue&type=script&lang.js +1 -1
  96. package/vue3/es/src/components/ClearRefinements.vue_vue&type=script&lang.js.map +1 -1
  97. package/vue3/es/src/components/ClearRefinements.vue_vue&type=template&id=410a3aaa&lang.js.map +1 -1
  98. package/vue3/es/src/components/CurrentRefinements.vue_vue&type=script&lang.js +1 -1
  99. package/vue3/es/src/components/CurrentRefinements.vue_vue&type=script&lang.js.map +1 -1
  100. package/vue3/es/src/components/CurrentRefinements.vue_vue&type=template&id=4f1917ff&lang.js.map +1 -1
  101. package/vue3/es/src/components/HierarchicalMenu.vue_vue&type=script&lang.js +1 -1
  102. package/vue3/es/src/components/HierarchicalMenu.vue_vue&type=script&lang.js.map +1 -1
  103. package/vue3/es/src/components/HierarchicalMenu.vue_vue&type=template&id=4361a0b8&lang.js +1 -1
  104. package/vue3/es/src/components/HierarchicalMenu.vue_vue&type=template&id=4361a0b8&lang.js.map +1 -1
  105. package/vue3/es/src/components/HierarchicalMenuList.vue_vue&type=script&lang.js.map +1 -1
  106. package/vue3/es/src/components/HierarchicalMenuList.vue_vue&type=template&id=0435b314&lang.js +1 -1
  107. package/vue3/es/src/components/HierarchicalMenuList.vue_vue&type=template&id=0435b314&lang.js.map +1 -1
  108. package/vue3/es/src/components/HitsPerPage.vue_vue&type=script&lang.js +1 -1
  109. package/vue3/es/src/components/HitsPerPage.vue_vue&type=script&lang.js.map +1 -1
  110. package/vue3/es/src/components/HitsPerPage.vue_vue&type=template&id=74f3ac28&lang.js +1 -1
  111. package/vue3/es/src/components/HitsPerPage.vue_vue&type=template&id=74f3ac28&lang.js.map +1 -1
  112. package/vue3/es/src/components/InstantSearch.js +1 -1
  113. package/vue3/es/src/components/InstantSearch.js.map +1 -1
  114. package/vue3/es/src/components/Menu.vue_vue&type=script&lang.js +1 -1
  115. package/vue3/es/src/components/Menu.vue_vue&type=script&lang.js.map +1 -1
  116. package/vue3/es/src/components/Menu.vue_vue&type=template&id=9bcc0be2&lang.js.map +1 -1
  117. package/vue3/es/src/components/MenuSelect.vue_vue&type=script&lang.js +1 -1
  118. package/vue3/es/src/components/MenuSelect.vue_vue&type=script&lang.js.map +1 -1
  119. package/vue3/es/src/components/MenuSelect.vue_vue&type=template&id=694477eb&lang.js.map +1 -1
  120. package/vue3/es/src/components/NumericMenu.vue_vue&type=script&lang.js +1 -1
  121. package/vue3/es/src/components/NumericMenu.vue_vue&type=script&lang.js.map +1 -1
  122. package/vue3/es/src/components/NumericMenu.vue_vue&type=template&id=160fae0c&lang.js +1 -1
  123. package/vue3/es/src/components/NumericMenu.vue_vue&type=template&id=160fae0c&lang.js.map +1 -1
  124. package/vue3/es/src/components/Pagination.vue_vue&type=script&lang.js +1 -1
  125. package/vue3/es/src/components/Pagination.vue_vue&type=script&lang.js.map +1 -1
  126. package/vue3/es/src/components/Pagination.vue_vue&type=template&id=849a166c&lang.js.map +1 -1
  127. package/vue3/es/src/components/RangeInput.vue_vue&type=script&lang.js +1 -1
  128. package/vue3/es/src/components/RangeInput.vue_vue&type=script&lang.js.map +1 -1
  129. package/vue3/es/src/components/RangeInput.vue_vue&type=template&id=1e17783d&lang.js +1 -1
  130. package/vue3/es/src/components/RangeInput.vue_vue&type=template&id=1e17783d&lang.js.map +1 -1
  131. package/vue3/es/src/components/RatingMenu.vue_vue&type=script&lang.js +1 -1
  132. package/vue3/es/src/components/RatingMenu.vue_vue&type=script&lang.js.map +1 -1
  133. package/vue3/es/src/components/RatingMenu.vue_vue&type=template&id=9254de68&lang.js +1 -1
  134. package/vue3/es/src/components/RatingMenu.vue_vue&type=template&id=9254de68&lang.js.map +1 -1
  135. package/vue3/es/src/components/RefinementList.vue_vue&type=script&lang.js +1 -1
  136. package/vue3/es/src/components/RefinementList.vue_vue&type=script&lang.js.map +1 -1
  137. package/vue3/es/src/components/RefinementList.vue_vue&type=template&id=28927239&lang.js.map +1 -1
  138. package/vue3/es/src/components/SortBy.vue_vue&type=script&lang.js +1 -1
  139. package/vue3/es/src/components/SortBy.vue_vue&type=script&lang.js.map +1 -1
  140. package/vue3/es/src/components/SortBy.vue_vue&type=template&id=b69b3b76&lang.js +1 -1
  141. package/vue3/es/src/components/SortBy.vue_vue&type=template&id=b69b3b76&lang.js.map +1 -1
  142. package/vue3/es/src/components/StateResults.vue_vue&type=script&lang.js +1 -1
  143. package/vue3/es/src/components/StateResults.vue_vue&type=script&lang.js.map +1 -1
  144. package/vue3/es/src/components/StateResults.vue_vue&type=template&id=5992f3d5&lang.js +1 -1
  145. package/vue3/es/src/components/StateResults.vue_vue&type=template&id=5992f3d5&lang.js.map +1 -1
  146. package/vue3/es/src/components/ToggleRefinement.vue_vue&type=script&lang.js +1 -1
  147. package/vue3/es/src/components/ToggleRefinement.vue_vue&type=script&lang.js.map +1 -1
  148. package/vue3/es/src/components/ToggleRefinement.vue_vue&type=template&id=14e4586f&lang.js +1 -1
  149. package/vue3/es/src/components/ToggleRefinement.vue_vue&type=template&id=14e4586f&lang.js.map +1 -1
  150. package/vue3/es/src/mixins/panel.js +1 -1
  151. package/vue3/es/src/mixins/panel.js.map +1 -1
  152. package/vue3/es/src/util/createInstantSearchComponent.js +1 -1
  153. package/vue3/es/src/util/createInstantSearchComponent.js.map +1 -1
  154. package/vue3/es/src/util/createServerRootMixin.js +1 -1
  155. package/vue3/es/src/util/createServerRootMixin.js.map +1 -1
  156. package/vue3/umd/index.js +1 -1
  157. package/vue3/umd/index.js.map +1 -1
  158. package/vue2/es/src/connectors/connectStateResults.js +0 -2
  159. package/vue2/es/src/connectors/connectStateResults.js.map +0 -1
  160. package/vue3/es/src/connectors/connectStateResults.js +0 -2
  161. package/vue3/es/src/connectors/connectStateResults.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,3 +1,28 @@
1
+ # [4.6.0](https://github.com/algolia/vue-instantsearch/compare/v4.5.0...v4.6.0) (2022-10-04)
2
+
3
+
4
+ ### Features
5
+
6
+ * **ais-hierarchical-menu:** add css class for link of selected menu item ([#1150](https://github.com/algolia/vue-instantsearch/issues/1150)) ([93dfdc1](https://github.com/algolia/vue-instantsearch/commit/93dfdc159d54fe8f3a5e31721e8533c7c0b6ca81))
7
+ * **InstantSearch:** support onStateChange ([#1149](https://github.com/algolia/vue-instantsearch/issues/1149)) ([badf815](https://github.com/algolia/vue-instantsearch/commit/badf8154f0869ea6449091ac97738e1eb491412b)), closes [#1148](https://github.com/algolia/vue-instantsearch/issues/1148)
8
+ * **StateResults:** give access to status and error ([#1151](https://github.com/algolia/vue-instantsearch/issues/1151)) ([03dea3a](https://github.com/algolia/vue-instantsearch/commit/03dea3a2c540ae05202e269dfa1b92cb7583af9b))
9
+
10
+
11
+
12
+ # [4.5.0](https://github.com/algolia/vue-instantsearch/compare/v4.4.2...v4.5.0) (2022-09-07)
13
+
14
+
15
+ ### Bug Fixes
16
+
17
+ * **nuxt:** only write $nuxt if it's writable ([#1117](https://github.com/algolia/vue-instantsearch/issues/1117)) ([bdecca9](https://github.com/algolia/vue-instantsearch/commit/bdecca9334322e9405ca21e6c6d51735d3ec042f)), closes [/github.com/algolia/vue-instantsearch/commit/acda29326475bd1b73f12b058a0c02df00b8b239#commitcomment-67430759](https://github.com//github.com/algolia/vue-instantsearch/commit/acda29326475bd1b73f12b058a0c02df00b8b239/issues/commitcomment-67430759)
18
+
19
+
20
+ ### Features
21
+
22
+ * **can-refine:** provide `canRefine` for multiple widget slots ([#1141](https://github.com/algolia/vue-instantsearch/issues/1141)) ([424316d](https://github.com/algolia/vue-instantsearch/commit/424316d8c6e23d4573c0d6a63c56ef919da864e1))
23
+
24
+
25
+
1
26
  ## [4.4.2](https://github.com/algolia/vue-instantsearch/compare/v4.4.1...v4.4.2) (2022-07-25)
2
27
 
3
28
 
package/package.json CHANGED
@@ -16,7 +16,7 @@
16
16
  "autocomplete"
17
17
  ],
18
18
  "license": "MIT",
19
- "version": "4.4.2",
19
+ "version": "4.6.0",
20
20
  "files": [
21
21
  "vue2",
22
22
  "vue3",
@@ -46,7 +46,7 @@
46
46
  "release": "shipjs prepare"
47
47
  },
48
48
  "dependencies": {
49
- "instantsearch.js": "^4.43.0",
49
+ "instantsearch.js": "^4.47.0",
50
50
  "mitt": "^2.1.0"
51
51
  },
52
52
  "peerDependencies": {
@@ -81,7 +81,7 @@
81
81
  "@wdio/spec-reporter": "^5.11.7",
82
82
  "@wdio/static-server-service": "^5.11.0",
83
83
  "algoliasearch": "4.0.1",
84
- "algoliasearch-helper": "3.10.0",
84
+ "algoliasearch-helper": "^3.10.0",
85
85
  "babel-eslint": "10.0.1",
86
86
  "babel-jest": "23.6.0",
87
87
  "babel-preset-es2015": "6.24.1",
@@ -133,11 +133,11 @@
133
133
  "bundlesize": [
134
134
  {
135
135
  "path": "./vue2/umd/index.js",
136
- "maxSize": "56.50 kB"
136
+ "maxSize": "57.25 kB"
137
137
  },
138
138
  {
139
139
  "path": "./vue3/umd/index.js",
140
- "maxSize": "57.75 kB"
140
+ "maxSize": "58.25 kB"
141
141
  },
142
142
  {
143
143
  "path": "./vue2/cjs/index.js",
@@ -16,6 +16,7 @@ const nonWidgetComponents = [
16
16
  'AisSnippet',
17
17
  'AisPanel',
18
18
  'AisPoweredBy',
19
+ 'AisStateResults',
19
20
  ];
20
21
 
21
22
  function getAllComponents() {
@@ -64,9 +64,7 @@ export default {
64
64
  $$widgetType: 'ais.breadcrumb',
65
65
  }
66
66
  ),
67
- createPanelConsumerMixin({
68
- mapStateToCanRefine: state => Boolean(state.canRefine),
69
- }),
67
+ createPanelConsumerMixin(),
70
68
  createSuitMixin({ name: 'Breadcrumb' }),
71
69
  ],
72
70
  props: {
@@ -37,9 +37,7 @@ export default {
37
37
  $$widgetType: 'ais.clearRefinements',
38
38
  }
39
39
  ),
40
- createPanelConsumerMixin({
41
- mapStateToCanRefine: state => Boolean(state.hasRefinements),
42
- }),
40
+ createPanelConsumerMixin(),
43
41
  createSuitMixin({ name: 'ClearRefinements' }),
44
42
  ],
45
43
  props: {
@@ -71,10 +71,7 @@ export default {
71
71
  $$widgetType: 'ais.currentRefinements',
72
72
  }
73
73
  ),
74
- createPanelConsumerMixin({
75
- mapStateToCanRefine: state =>
76
- Boolean(state.items) && state.items.length > 0,
77
- }),
74
+ createPanelConsumerMixin(),
78
75
  ],
79
76
  props: {
80
77
  includedAttributes: {
@@ -1,11 +1,11 @@
1
1
  <template>
2
2
  <div
3
3
  v-if="state"
4
- :class="[suit(), !canRefine && suit('', 'noRefinement')]"
4
+ :class="[suit(), !state.canRefine && suit('', 'noRefinement')]"
5
5
  >
6
6
  <slot
7
7
  :items="state.items"
8
- :can-refine="canRefine"
8
+ :can-refine="state.canRefine"
9
9
  :can-toggle-show-more="state.canToggleShowMore"
10
10
  :is-showing-more="state.isShowingMore"
11
11
  :refine="state.refine"
@@ -46,9 +46,6 @@ import { createPanelConsumerMixin } from '../mixins/panel';
46
46
  import HierarchicalMenuList from './HierarchicalMenuList.vue';
47
47
  import { createSuitMixin } from '../mixins/suit';
48
48
 
49
- const mapStateToCanRefine = state =>
50
- Boolean(state.items) && state.items.length > 0;
51
-
52
49
  export default {
53
50
  name: 'AisHierarchicalMenu',
54
51
  mixins: [
@@ -61,9 +58,7 @@ export default {
61
58
  $$widgetType: 'ais.hierarchicalMenu',
62
59
  }
63
60
  ),
64
- createPanelConsumerMixin({
65
- mapStateToCanRefine,
66
- }),
61
+ createPanelConsumerMixin(),
67
62
  ],
68
63
  components: {
69
64
  HierarchicalMenuList,
@@ -120,9 +115,6 @@ export default {
120
115
  transformItems: this.transformItems,
121
116
  };
122
117
  },
123
- canRefine() {
124
- return mapStateToCanRefine(this.state);
125
- },
126
118
  },
127
119
  };
128
120
  </script>
@@ -17,7 +17,10 @@
17
17
  >
18
18
  <a
19
19
  :href="createURL(item.value)"
20
- :class="suit('link')"
20
+ :class="[
21
+ suit('link'),
22
+ item.isRefined && suit('link', 'selected')
23
+ ]"
21
24
  @click.prevent="refine(item.value)"
22
25
  >
23
26
  <span :class="suit('label')">{{ item.label }}</span>
@@ -7,6 +7,7 @@
7
7
  :items="state.items"
8
8
  :refine="state.refine"
9
9
  :hasNoResults="state.hasNoResults"
10
+ :canRefine="state.canRefine"
10
11
  >
11
12
  <select
12
13
  :class="suit('select')"
@@ -42,9 +43,7 @@ export default {
42
43
  $$widgetType: 'ais.hitsPerPage',
43
44
  }
44
45
  ),
45
- createPanelConsumerMixin({
46
- mapStateToCanRefine: state => state.hasNoResults === false,
47
- }),
46
+ createPanelConsumerMixin(),
48
47
  ],
49
48
  props: {
50
49
  items: {
@@ -46,6 +46,10 @@ export default createInstantSearchComponent({
46
46
  type: Function,
47
47
  default: undefined,
48
48
  },
49
+ onStateChange: {
50
+ type: Function,
51
+ default: undefined,
52
+ },
49
53
  initialUiState: {
50
54
  type: Object,
51
55
  default: undefined,
@@ -84,6 +88,7 @@ export default createInstantSearchComponent({
84
88
  routing: this.routing,
85
89
  stalledSearchDelay: this.stalledSearchDelay,
86
90
  searchFunction: this.searchFunction,
91
+ onStateChange: this.onStateChange,
87
92
  initialUiState: this.initialUiState,
88
93
  }),
89
94
  };
@@ -61,9 +61,7 @@ export default {
61
61
  $$widgetType: 'ais.menu',
62
62
  }
63
63
  ),
64
- createPanelConsumerMixin({
65
- mapStateToCanRefine: state => Boolean(state.canRefine),
66
- }),
64
+ createPanelConsumerMixin(),
67
65
  ],
68
66
  props: {
69
67
  attribute: {
@@ -53,9 +53,7 @@ export default {
53
53
  $$widgetType: 'ais.menuSelect',
54
54
  }
55
55
  ),
56
- createPanelConsumerMixin({
57
- mapStateToCanRefine: state => Boolean(state.canRefine),
58
- }),
56
+ createPanelConsumerMixin(),
59
57
  ],
60
58
  props: {
61
59
  attribute: {
@@ -1,11 +1,11 @@
1
1
  <template>
2
2
  <div
3
3
  v-if="state"
4
- :class="[suit(), !canRefine && suit('', 'noRefinement')]"
4
+ :class="[suit(), !state.canRefine && suit('', 'noRefinement')]"
5
5
  >
6
6
  <slot
7
7
  :items="state.items"
8
- :can-refine="canRefine"
8
+ :can-refine="state.canRefine"
9
9
  :refine="state.refine"
10
10
  :createURL="state.createURL"
11
11
  :send-event="state.sendEvent"
@@ -51,9 +51,7 @@ export default {
51
51
  }
52
52
  ),
53
53
  createSuitMixin({ name: 'NumericMenu' }),
54
- createPanelConsumerMixin({
55
- mapStateToCanRefine: state => state.hasNoResults === false,
56
- }),
54
+ createPanelConsumerMixin(),
57
55
  ],
58
56
  props: {
59
57
  attribute: {
@@ -77,9 +75,6 @@ export default {
77
75
  items: this.items,
78
76
  };
79
77
  },
80
- canRefine() {
81
- return !this.state.hasNoResults;
82
- },
83
78
  },
84
79
  };
85
80
  </script>
@@ -183,9 +183,7 @@ export default {
183
183
  $$widgetType: 'ais.pagination',
184
184
  }
185
185
  ),
186
- createPanelConsumerMixin({
187
- mapStateToCanRefine: state => state.nbPages > 1,
188
- }),
186
+ createPanelConsumerMixin(),
189
187
  ],
190
188
  props: {
191
189
  padding: {
@@ -1,12 +1,12 @@
1
1
  <template>
2
2
  <div
3
3
  v-if="state"
4
- :class="[suit(), !canRefine && suit('', 'noRefinement')]"
4
+ :class="[suit(), !state.canRefine && suit('', 'noRefinement')]"
5
5
  >
6
6
  <slot
7
7
  :current-refinement="values"
8
8
  :refine="refine"
9
- :can-refine="canRefine"
9
+ :can-refine="state.canRefine"
10
10
  :range="state.range"
11
11
  :send-event="state.sendEvent"
12
12
  >
@@ -60,9 +60,6 @@ import { createWidgetMixin } from '../mixins/widget';
60
60
  import { createPanelConsumerMixin } from '../mixins/panel';
61
61
  import { createSuitMixin } from '../mixins/suit';
62
62
 
63
- const mapStateToCanRefine = state =>
64
- state && Boolean(state.range) && state.range.min !== state.range.max;
65
-
66
63
  export default {
67
64
  name: 'AisRangeInput',
68
65
  mixins: [
@@ -75,9 +72,7 @@ export default {
75
72
  $$widgetType: 'ais.rangeInput',
76
73
  }
77
74
  ),
78
- createPanelConsumerMixin({
79
- mapStateToCanRefine,
80
- }),
75
+ createPanelConsumerMixin(),
81
76
  ],
82
77
  props: {
83
78
  attribute: {
@@ -119,9 +114,6 @@ export default {
119
114
  precision: this.precision,
120
115
  };
121
116
  },
122
- canRefine() {
123
- return mapStateToCanRefine(this.state);
124
- },
125
117
  step() {
126
118
  return 1 / Math.pow(10, this.precision);
127
119
  },
@@ -8,6 +8,7 @@
8
8
  :refine="state.refine"
9
9
  :createURL="state.createURL"
10
10
  :send-event="state.sendEvent"
11
+ :can-refine="state.canRefine"
11
12
  >
12
13
  <svg
13
14
  xmlns="http://www.w3.org/2000/svg"
@@ -95,9 +96,7 @@ export default {
95
96
  $$widgetType: 'ais.ratingMenu',
96
97
  }
97
98
  ),
98
- createPanelConsumerMixin({
99
- mapStateToCanRefine: state => state.hasNoResults === false,
100
- }),
99
+ createPanelConsumerMixin(),
101
100
  ],
102
101
  props: {
103
102
  attribute: {
@@ -118,9 +118,7 @@ export default {
118
118
  $$widgetType: 'ais.refinementList',
119
119
  }
120
120
  ),
121
- createPanelConsumerMixin({
122
- mapStateToCanRefine: state => Boolean(state.canRefine),
123
- }),
121
+ createPanelConsumerMixin(),
124
122
  ],
125
123
  props: {
126
124
  attribute: {
@@ -8,6 +8,7 @@
8
8
  :has-no-results="state.hasNoResults"
9
9
  :refine="state.refine"
10
10
  :current-refinement="state.currentRefinement"
11
+ :can-refine="state.canRefine"
11
12
  >
12
13
  <select
13
14
  :class="suit('select')"
@@ -42,9 +43,7 @@ export default {
42
43
  }
43
44
  ),
44
45
 
45
- createPanelConsumerMixin({
46
- mapStateToCanRefine: state => state.hasNoResults === false,
47
- }),
46
+ createPanelConsumerMixin(),
48
47
  ],
49
48
  props: {
50
49
  items: {
@@ -12,34 +12,77 @@
12
12
  </p>
13
13
  <pre>results: {{ Object.keys(state.results) }}</pre>
14
14
  <pre>state: {{ Object.keys(state.state) }}</pre>
15
+ <pre>status: {{ state.status }}</pre>
16
+ <pre>error: {{ state.error }}</pre>
15
17
  </slot>
16
18
  </div>
17
19
  </template>
18
20
 
19
21
  <script>
22
+ import { isVue3 } from '../util/vue-compat';
20
23
  import { createSuitMixin } from '../mixins/suit';
21
24
  import { createWidgetMixin } from '../mixins/widget';
22
25
  import { _objectSpread } from '../util/polyfills';
23
- import connectStateResults from '../connectors/connectStateResults';
24
26
 
25
27
  export default {
26
28
  name: 'AisStateResults',
27
29
  mixins: [
28
- createWidgetMixin(
29
- {
30
- connector: connectStateResults,
31
- },
32
- {
33
- $$widgetType: 'ais.stateResults',
34
- }
35
- ),
30
+ createWidgetMixin({ connector: true }),
36
31
  createSuitMixin({ name: 'StateResults' }),
37
32
  ],
33
+ props: {
34
+ catchError: {
35
+ type: Boolean,
36
+ default: false,
37
+ },
38
+ },
39
+ data() {
40
+ return {
41
+ renderFn: () => {
42
+ const { status, error } = this.instantSearchInstance;
43
+ const results = this.getParentIndex().getResults();
44
+ const helper = this.getParentIndex().getHelper();
45
+ const state = helper ? helper.state : null;
46
+
47
+ // @MAJOR no longer spread this inside `results`
48
+ this.state = {
49
+ results,
50
+ state,
51
+ status,
52
+ error,
53
+ };
54
+ },
55
+ };
56
+ },
57
+ created() {
58
+ this.instantSearchInstance.addListener('render', this.renderFn);
59
+ },
60
+ [isVue3 ? 'beforeUnmount' : 'beforeDestroy']() {
61
+ if (this.widget) {
62
+ this.instantSearchInstance.removeListener('render', this.renderFn);
63
+ if (this.errorFn) {
64
+ this.instantSearchInstance.removeListener('error', this.errorFn);
65
+ }
66
+ }
67
+ },
68
+ watch: {
69
+ catchError: {
70
+ immediate: true,
71
+ handler(catchError) {
72
+ if (catchError) {
73
+ this.errorFn = () => {};
74
+ this.instantSearchInstance.addListener('error', this.errorFn);
75
+ } else if (this.errorFn) {
76
+ this.instantSearchInstance.removeListener('error', this.errorFn);
77
+ this.errorFn = undefined;
78
+ }
79
+ },
80
+ },
81
+ },
38
82
  computed: {
39
83
  stateResults() {
40
- // @MAJOR: replace v-bind="stateResults" with :state="state.state" :results="state.results"
41
- const { state, results } = this.state;
42
- return _objectSpread({}, results, { results, state });
84
+ const { results, state, status, error } = this.state;
85
+ return _objectSpread({}, results, { results, state, status, error });
43
86
  },
44
87
  },
45
88
  };
@@ -1,11 +1,11 @@
1
1
  <template>
2
2
  <div
3
3
  v-if="state"
4
- :class="[suit(), !canRefine && suit('', 'noRefinement')]"
4
+ :class="[suit(), !state.canRefine && suit('', 'noRefinement')]"
5
5
  >
6
6
  <slot
7
7
  :value="state.value"
8
- :can-refine="canRefine"
8
+ :can-refine="state.canRefine"
9
9
  :refine="state.refine"
10
10
  :createURL="state.createURL"
11
11
  :send-event="state.sendEvent"
@@ -35,8 +35,6 @@ import { createWidgetMixin } from '../mixins/widget';
35
35
  import { createPanelConsumerMixin } from '../mixins/panel';
36
36
  import { createSuitMixin } from '../mixins/suit';
37
37
 
38
- const mapStateToCanRefine = state => Boolean(state.value && state.value.count);
39
-
40
38
  export default {
41
39
  name: 'AisToggleRefinement',
42
40
  mixins: [
@@ -49,9 +47,7 @@ export default {
49
47
  $$widgetType: 'ais.toggleRefinement',
50
48
  }
51
49
  ),
52
- createPanelConsumerMixin({
53
- mapStateToCanRefine,
54
- }),
50
+ createPanelConsumerMixin(),
55
51
  ],
56
52
  props: {
57
53
  attribute: {
@@ -82,9 +78,6 @@ export default {
82
78
  off: this.off,
83
79
  };
84
80
  },
85
- canRefine() {
86
- return mapStateToCanRefine(this.state);
87
- },
88
81
  },
89
82
  };
90
83
  </script>
@@ -182,31 +182,6 @@ describe('default render', () => {
182
182
  });
183
183
  });
184
184
 
185
- describe('panel', () => {
186
- it('calls the Panel mixin with `canRefine`', async () => {
187
- __setState({ ...defaultState });
188
-
189
- const wrapper = mount(Breadcrumb, {
190
- propsData: defaultProps,
191
- });
192
-
193
- const mapStateToCanRefine = () =>
194
- wrapper.vm.mapStateToCanRefine(wrapper.vm.state);
195
-
196
- expect(mapStateToCanRefine()).toBe(true);
197
-
198
- await wrapper.setData({
199
- state: {
200
- canRefine: false,
201
- },
202
- });
203
-
204
- expect(mapStateToCanRefine()).toBe(false);
205
-
206
- expect(wrapper.vm.mapStateToCanRefine({})).toBe(false);
207
- });
208
- });
209
-
210
185
  describe('custom default render', () => {
211
186
  const defaultSlot = `
212
187
  <template v-slot="{ items, canRefine, refine, createURL }">
@@ -187,26 +187,3 @@ describe('custom resetLabel render', () => {
187
187
  expect(wrapper.html()).toMatchSnapshot();
188
188
  });
189
189
  });
190
-
191
- it('calls the Panel mixin with `hasRefinement`', async () => {
192
- __setState({
193
- hasRefinements: true,
194
- });
195
-
196
- const wrapper = mount(ClearRefinements);
197
-
198
- const mapStateToCanRefine = () =>
199
- wrapper.vm.mapStateToCanRefine(wrapper.vm.state);
200
-
201
- expect(mapStateToCanRefine()).toBe(true);
202
-
203
- await wrapper.setData({
204
- state: {
205
- hasRefinements: false,
206
- },
207
- });
208
-
209
- expect(mapStateToCanRefine()).toBe(false);
210
-
211
- expect(wrapper.vm.mapStateToCanRefine({})).toBe(false);
212
- });
@@ -167,23 +167,6 @@ describe.each([
167
167
  });
168
168
  });
169
169
 
170
- it('calls the Panel mixin with `canRefine`', async () => {
171
- __setState({ items: [{}] });
172
-
173
- const wrapper = mount(CurrentRefinements);
174
-
175
- const mapStateToCanRefine = () =>
176
- wrapper.vm.mapStateToCanRefine(wrapper.vm.state);
177
-
178
- expect(mapStateToCanRefine()).toBe(true);
179
-
180
- await wrapper.setData({ state: { items: [] } });
181
-
182
- expect(mapStateToCanRefine()).toBe(false);
183
-
184
- expect(wrapper.vm.mapStateToCanRefine({})).toBe(false);
185
- });
186
-
187
170
  it('calls `refine` with a refinement', async () => {
188
171
  const spies = [jest.fn(), jest.fn()];
189
172
 
@@ -116,6 +116,7 @@ const defaultState = {
116
116
  createURL: () => {},
117
117
  isShowingMore: false,
118
118
  canToggleShowMore: true,
119
+ canRefine: true,
119
120
  toggleShowMore: () => {},
120
121
  sendEvent: () => {},
121
122
  };
@@ -266,6 +267,7 @@ describe('default render', () => {
266
267
  __setState({
267
268
  ...defaultState,
268
269
  items: [],
270
+ canRefine: false,
269
271
  });
270
272
 
271
273
  const wrapper = mount(HierarchicalMenu, {
@@ -466,25 +468,6 @@ describe('default render', () => {
466
468
  });
467
469
  });
468
470
 
469
- it('calls the Panel mixin with `items.length`', async () => {
470
- __setState({ ...defaultState });
471
-
472
- const wrapper = mount(HierarchicalMenu, {
473
- propsData: defaultProps,
474
- });
475
-
476
- const mapStateToCanRefine = () =>
477
- wrapper.vm.mapStateToCanRefine(wrapper.vm.state);
478
-
479
- expect(mapStateToCanRefine()).toBe(true);
480
-
481
- await wrapper.setData({ state: { items: [] } });
482
-
483
- expect(mapStateToCanRefine()).toBe(false);
484
-
485
- expect(wrapper.vm.mapStateToCanRefine({})).toBe(false);
486
- });
487
-
488
471
  it('exposes send-event method for insights middleware', async () => {
489
472
  const sendEvent = jest.fn();
490
473
  __setState({
@@ -574,6 +557,7 @@ describe('custom default render', () => {
574
557
  __setState({
575
558
  ...defaultState,
576
559
  items: [],
560
+ canRefine: false,
577
561
  });
578
562
 
579
563
  const wrapper = mount({
@@ -76,29 +76,3 @@ it('calls `refine` with the `value` on `change`', async () => {
76
76
 
77
77
  expect(wrapper.vm.state.refine).toHaveBeenLastCalledWith(20);
78
78
  });
79
-
80
- it('calls the Panel mixin with `hasNoResults`', async () => {
81
- __setState({
82
- ...defaultState,
83
- hasNoResults: false,
84
- });
85
-
86
- const wrapper = mount(HitsPerPage, {
87
- propsData: defaultProps,
88
- });
89
-
90
- const mapStateToCanRefine = () =>
91
- wrapper.vm.mapStateToCanRefine(wrapper.vm.state);
92
-
93
- expect(mapStateToCanRefine()).toBe(true);
94
-
95
- await wrapper.setData({
96
- state: {
97
- hasNoResults: true,
98
- },
99
- });
100
-
101
- expect(mapStateToCanRefine()).toBe(false);
102
-
103
- expect(wrapper.vm.mapStateToCanRefine({})).toBe(false);
104
- });