vue-instantsearch 4.4.0 → 4.5.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 (149) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/package.json +4 -4
  3. package/src/components/Breadcrumb.vue +1 -3
  4. package/src/components/ClearRefinements.vue +1 -3
  5. package/src/components/CurrentRefinements.vue +1 -4
  6. package/src/components/HierarchicalMenu.vue +3 -11
  7. package/src/components/HitsPerPage.vue +2 -3
  8. package/src/components/Menu.vue +1 -3
  9. package/src/components/MenuSelect.vue +1 -3
  10. package/src/components/NumericMenu.vue +3 -8
  11. package/src/components/Pagination.vue +1 -3
  12. package/src/components/RangeInput.vue +3 -11
  13. package/src/components/RatingMenu.vue +2 -3
  14. package/src/components/RefinementList.vue +1 -3
  15. package/src/components/SearchBox.vue +18 -0
  16. package/src/components/SearchInput.vue +3 -0
  17. package/src/components/SortBy.vue +2 -3
  18. package/src/components/ToggleRefinement.vue +3 -10
  19. package/src/components/VoiceSearch.vue +10 -0
  20. package/src/components/__tests__/Breadcrumb.js +0 -25
  21. package/src/components/__tests__/ClearRefinements.js +0 -23
  22. package/src/components/__tests__/CurrentRefinements.js +0 -17
  23. package/src/components/__tests__/HierarchicalMenu.js +3 -19
  24. package/src/components/__tests__/HitsPerPage.js +0 -26
  25. package/src/components/__tests__/Menu.js +0 -22
  26. package/src/components/__tests__/MenuSelect.js +0 -23
  27. package/src/components/__tests__/NumericMenu.js +3 -25
  28. package/src/components/__tests__/Pagination.js +0 -21
  29. package/src/components/__tests__/RangeInput.js +1 -34
  30. package/src/components/__tests__/RatingMenu.js +0 -23
  31. package/src/components/__tests__/RefinementList.js +0 -23
  32. package/src/components/__tests__/SearchBox.js +15 -0
  33. package/src/components/__tests__/SortBy.js +1 -23
  34. package/src/components/__tests__/ToggleRefinement.js +4 -33
  35. package/src/mixins/__mocks__/panel.js +1 -5
  36. package/src/mixins/__tests__/panel.test.js +18 -40
  37. package/src/mixins/panel.js +3 -1
  38. package/src/util/createServerRootMixin.js +10 -1
  39. package/vue2/cjs/index.js +1 -1
  40. package/vue2/cjs/index.js.map +1 -1
  41. package/vue2/es/package.json.js +1 -1
  42. package/vue2/es/src/components/Breadcrumb.vue.js +1 -1
  43. package/vue2/es/src/components/Breadcrumb.vue.js.map +1 -1
  44. package/vue2/es/src/components/ClearRefinements.vue.js +1 -1
  45. package/vue2/es/src/components/ClearRefinements.vue.js.map +1 -1
  46. package/vue2/es/src/components/CurrentRefinements.vue.js +1 -1
  47. package/vue2/es/src/components/CurrentRefinements.vue.js.map +1 -1
  48. package/vue2/es/src/components/HierarchicalMenu.vue.js +1 -1
  49. package/vue2/es/src/components/HierarchicalMenu.vue.js.map +1 -1
  50. package/vue2/es/src/components/HitsPerPage.vue.js +1 -1
  51. package/vue2/es/src/components/HitsPerPage.vue.js.map +1 -1
  52. package/vue2/es/src/components/Menu.vue.js +1 -1
  53. package/vue2/es/src/components/Menu.vue.js.map +1 -1
  54. package/vue2/es/src/components/MenuSelect.vue.js +1 -1
  55. package/vue2/es/src/components/MenuSelect.vue.js.map +1 -1
  56. package/vue2/es/src/components/NumericMenu.vue.js +1 -1
  57. package/vue2/es/src/components/NumericMenu.vue.js.map +1 -1
  58. package/vue2/es/src/components/Pagination.vue.js +1 -1
  59. package/vue2/es/src/components/Pagination.vue.js.map +1 -1
  60. package/vue2/es/src/components/RangeInput.vue.js +1 -1
  61. package/vue2/es/src/components/RangeInput.vue.js.map +1 -1
  62. package/vue2/es/src/components/RatingMenu.vue.js +1 -1
  63. package/vue2/es/src/components/RatingMenu.vue.js.map +1 -1
  64. package/vue2/es/src/components/RefinementList.vue.js +1 -1
  65. package/vue2/es/src/components/RefinementList.vue.js.map +1 -1
  66. package/vue2/es/src/components/SearchBox.vue.js +1 -1
  67. package/vue2/es/src/components/SearchBox.vue.js.map +1 -1
  68. package/vue2/es/src/components/SearchInput.vue.js +1 -1
  69. package/vue2/es/src/components/SearchInput.vue.js.map +1 -1
  70. package/vue2/es/src/components/SortBy.vue.js +1 -1
  71. package/vue2/es/src/components/SortBy.vue.js.map +1 -1
  72. package/vue2/es/src/components/ToggleRefinement.vue.js +1 -1
  73. package/vue2/es/src/components/ToggleRefinement.vue.js.map +1 -1
  74. package/vue2/es/src/components/VoiceSearch.vue.js +1 -1
  75. package/vue2/es/src/components/VoiceSearch.vue.js.map +1 -1
  76. package/vue2/es/src/mixins/panel.js +1 -1
  77. package/vue2/es/src/mixins/panel.js.map +1 -1
  78. package/vue2/es/src/util/createServerRootMixin.js +1 -1
  79. package/vue2/es/src/util/createServerRootMixin.js.map +1 -1
  80. package/vue2/umd/index.js +1 -1
  81. package/vue2/umd/index.js.map +1 -1
  82. package/vue3/cjs/index.js +1 -1
  83. package/vue3/cjs/index.js.map +1 -1
  84. package/vue3/es/package.json.js +1 -1
  85. package/vue3/es/src/components/Breadcrumb.vue_vue&type=script&lang.js +1 -1
  86. package/vue3/es/src/components/Breadcrumb.vue_vue&type=script&lang.js.map +1 -1
  87. package/vue3/es/src/components/Breadcrumb.vue_vue&type=template&id=6f46de9a&lang.js.map +1 -1
  88. package/vue3/es/src/components/ClearRefinements.vue_vue&type=script&lang.js +1 -1
  89. package/vue3/es/src/components/ClearRefinements.vue_vue&type=script&lang.js.map +1 -1
  90. package/vue3/es/src/components/ClearRefinements.vue_vue&type=template&id=410a3aaa&lang.js.map +1 -1
  91. package/vue3/es/src/components/CurrentRefinements.vue_vue&type=script&lang.js +1 -1
  92. package/vue3/es/src/components/CurrentRefinements.vue_vue&type=script&lang.js.map +1 -1
  93. package/vue3/es/src/components/CurrentRefinements.vue_vue&type=template&id=4f1917ff&lang.js.map +1 -1
  94. package/vue3/es/src/components/HierarchicalMenu.vue_vue&type=script&lang.js +1 -1
  95. package/vue3/es/src/components/HierarchicalMenu.vue_vue&type=script&lang.js.map +1 -1
  96. package/vue3/es/src/components/HierarchicalMenu.vue_vue&type=template&id=4361a0b8&lang.js +1 -1
  97. package/vue3/es/src/components/HierarchicalMenu.vue_vue&type=template&id=4361a0b8&lang.js.map +1 -1
  98. package/vue3/es/src/components/HitsPerPage.vue_vue&type=script&lang.js +1 -1
  99. package/vue3/es/src/components/HitsPerPage.vue_vue&type=script&lang.js.map +1 -1
  100. package/vue3/es/src/components/HitsPerPage.vue_vue&type=template&id=74f3ac28&lang.js +1 -1
  101. package/vue3/es/src/components/HitsPerPage.vue_vue&type=template&id=74f3ac28&lang.js.map +1 -1
  102. package/vue3/es/src/components/Menu.vue_vue&type=script&lang.js +1 -1
  103. package/vue3/es/src/components/Menu.vue_vue&type=script&lang.js.map +1 -1
  104. package/vue3/es/src/components/Menu.vue_vue&type=template&id=9bcc0be2&lang.js.map +1 -1
  105. package/vue3/es/src/components/MenuSelect.vue_vue&type=script&lang.js +1 -1
  106. package/vue3/es/src/components/MenuSelect.vue_vue&type=script&lang.js.map +1 -1
  107. package/vue3/es/src/components/MenuSelect.vue_vue&type=template&id=694477eb&lang.js.map +1 -1
  108. package/vue3/es/src/components/NumericMenu.vue_vue&type=script&lang.js +1 -1
  109. package/vue3/es/src/components/NumericMenu.vue_vue&type=script&lang.js.map +1 -1
  110. package/vue3/es/src/components/NumericMenu.vue_vue&type=template&id=160fae0c&lang.js +1 -1
  111. package/vue3/es/src/components/NumericMenu.vue_vue&type=template&id=160fae0c&lang.js.map +1 -1
  112. package/vue3/es/src/components/Pagination.vue_vue&type=script&lang.js +1 -1
  113. package/vue3/es/src/components/Pagination.vue_vue&type=script&lang.js.map +1 -1
  114. package/vue3/es/src/components/Pagination.vue_vue&type=template&id=849a166c&lang.js.map +1 -1
  115. package/vue3/es/src/components/RangeInput.vue_vue&type=script&lang.js +1 -1
  116. package/vue3/es/src/components/RangeInput.vue_vue&type=script&lang.js.map +1 -1
  117. package/vue3/es/src/components/RangeInput.vue_vue&type=template&id=1e17783d&lang.js +1 -1
  118. package/vue3/es/src/components/RangeInput.vue_vue&type=template&id=1e17783d&lang.js.map +1 -1
  119. package/vue3/es/src/components/RatingMenu.vue_vue&type=script&lang.js +1 -1
  120. package/vue3/es/src/components/RatingMenu.vue_vue&type=script&lang.js.map +1 -1
  121. package/vue3/es/src/components/RatingMenu.vue_vue&type=template&id=9254de68&lang.js +1 -1
  122. package/vue3/es/src/components/RatingMenu.vue_vue&type=template&id=9254de68&lang.js.map +1 -1
  123. package/vue3/es/src/components/RefinementList.vue_vue&type=script&lang.js +1 -1
  124. package/vue3/es/src/components/RefinementList.vue_vue&type=script&lang.js.map +1 -1
  125. package/vue3/es/src/components/RefinementList.vue_vue&type=template&id=28927239&lang.js.map +1 -1
  126. package/vue3/es/src/components/SearchBox.vue_vue&type=script&lang.js +1 -1
  127. package/vue3/es/src/components/SearchBox.vue_vue&type=script&lang.js.map +1 -1
  128. package/vue3/es/src/components/SearchBox.vue_vue&type=template&id=27029d83&lang.js +1 -1
  129. package/vue3/es/src/components/SearchBox.vue_vue&type=template&id=27029d83&lang.js.map +1 -1
  130. package/vue3/es/src/components/SearchInput.vue_vue&type=script&lang.js +1 -1
  131. package/vue3/es/src/components/SearchInput.vue_vue&type=script&lang.js.map +1 -1
  132. package/vue3/es/src/components/SearchInput.vue_vue&type=template&id=2eed8ffc&lang.js.map +1 -1
  133. package/vue3/es/src/components/SortBy.vue_vue&type=script&lang.js +1 -1
  134. package/vue3/es/src/components/SortBy.vue_vue&type=script&lang.js.map +1 -1
  135. package/vue3/es/src/components/SortBy.vue_vue&type=template&id=b69b3b76&lang.js +1 -1
  136. package/vue3/es/src/components/SortBy.vue_vue&type=template&id=b69b3b76&lang.js.map +1 -1
  137. package/vue3/es/src/components/ToggleRefinement.vue_vue&type=script&lang.js +1 -1
  138. package/vue3/es/src/components/ToggleRefinement.vue_vue&type=script&lang.js.map +1 -1
  139. package/vue3/es/src/components/ToggleRefinement.vue_vue&type=template&id=14e4586f&lang.js +1 -1
  140. package/vue3/es/src/components/ToggleRefinement.vue_vue&type=template&id=14e4586f&lang.js.map +1 -1
  141. package/vue3/es/src/components/VoiceSearch.vue_vue&type=script&lang.js +1 -1
  142. package/vue3/es/src/components/VoiceSearch.vue_vue&type=script&lang.js.map +1 -1
  143. package/vue3/es/src/components/VoiceSearch.vue_vue&type=template&id=24b0f67a&lang.js.map +1 -1
  144. package/vue3/es/src/mixins/panel.js +1 -1
  145. package/vue3/es/src/mixins/panel.js.map +1 -1
  146. package/vue3/es/src/util/createServerRootMixin.js +1 -1
  147. package/vue3/es/src/util/createServerRootMixin.js.map +1 -1
  148. package/vue3/umd/index.js +1 -1
  149. package/vue3/umd/index.js.map +1 -1
package/CHANGELOG.md CHANGED
@@ -1,3 +1,36 @@
1
+ # [4.5.0](https://github.com/algolia/vue-instantsearch/compare/v4.4.2...v4.5.0) (2022-09-07)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * **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)
7
+
8
+
9
+ ### Features
10
+
11
+ * **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))
12
+
13
+
14
+
15
+ ## [4.4.2](https://github.com/algolia/vue-instantsearch/compare/v4.4.1...v4.4.2) (2022-07-25)
16
+
17
+
18
+ ### Bug Fixes
19
+
20
+ * **SearchBox:** forward missing prop queryHook ([#1136](https://github.com/algolia/vue-instantsearch/issues/1136)) ([7f8754d](https://github.com/algolia/vue-instantsearch/commit/7f8754dad73542c976b5218bda9a2db0c21c36a1))
21
+ * **VoiceSearch:** forward missing props language and additionalQueryParameters ([#1136](https://github.com/algolia/vue-instantsearch/issues/1136)) ([7f8754d](https://github.com/algolia/vue-instantsearch/commit/7f8754dad73542c976b5218bda9a2db0c21c36a1)), closes [#1135](https://github.com/algolia/vue-instantsearch/issues/1135)
22
+
23
+
24
+
25
+ ## [4.4.1](https://github.com/algolia/vue-instantsearch/compare/v4.4.0...v4.4.1) (2022-07-19)
26
+
27
+
28
+ ### Bug Fixes
29
+
30
+ * **searchbox:** prevent concurrent query updates from state while input is focused ([#1133](https://github.com/algolia/vue-instantsearch/issues/1133)) ([c468c0a](https://github.com/algolia/vue-instantsearch/commit/c468c0aee633358f3fb64e41d7aa73b14b344fd2))
31
+
32
+
33
+
1
34
  # [4.4.0](https://github.com/algolia/vue-instantsearch/compare/v4.3.3...v4.4.0) (2022-06-28)
2
35
 
3
36
 
package/package.json CHANGED
@@ -16,7 +16,7 @@
16
16
  "autocomplete"
17
17
  ],
18
18
  "license": "MIT",
19
- "version": "4.4.0",
19
+ "version": "4.5.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.45.0",
50
50
  "mitt": "^2.1.0"
51
51
  },
52
52
  "peerDependencies": {
@@ -133,11 +133,11 @@
133
133
  "bundlesize": [
134
134
  {
135
135
  "path": "./vue2/umd/index.js",
136
- "maxSize": "56.50 kB"
136
+ "maxSize": "56.75 kB"
137
137
  },
138
138
  {
139
139
  "path": "./vue3/umd/index.js",
140
- "maxSize": "57.75 kB"
140
+ "maxSize": "58.00 kB"
141
141
  },
142
142
  {
143
143
  "path": "./vue2/cjs/index.js",
@@ -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>
@@ -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: {
@@ -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: {
@@ -20,6 +20,7 @@
20
20
  :reset-title="resetTitle"
21
21
  :class-names="classNames"
22
22
  v-model="currentRefinement"
23
+ ref="searchInput"
23
24
  >
24
25
  <template
25
26
  v-slot:loading-indicator
@@ -119,6 +120,10 @@ export default {
119
120
  type: String,
120
121
  default: undefined,
121
122
  },
123
+ queryHook: {
124
+ type: Function,
125
+ default: undefined,
126
+ },
122
127
  },
123
128
  data() {
124
129
  return {
@@ -128,6 +133,11 @@ export default {
128
133
  };
129
134
  },
130
135
  computed: {
136
+ widgetParams() {
137
+ return {
138
+ queryHook: this.queryHook,
139
+ };
140
+ },
131
141
  isControlled() {
132
142
  return (
133
143
  typeof this.value !== 'undefined' ||
@@ -148,6 +158,14 @@ export default {
148
158
  this.$emit('update:modelValue', this.model);
149
159
  this.state.refine(this.model);
150
160
  }
161
+
162
+ // we return the local value if the input is focused to avoid
163
+ // concurrent updates when typing
164
+ const { searchInput } = this.$refs;
165
+ if (searchInput && searchInput.isFocused()) {
166
+ return this.localValue;
167
+ }
168
+
151
169
  return this.model || this.state.query || '';
152
170
  },
153
171
  set(val) {
@@ -170,6 +170,9 @@ export default {
170
170
  };
171
171
  },
172
172
  methods: {
173
+ isFocused() {
174
+ return document.activeElement === this.$refs.input;
175
+ },
173
176
  onFormSubmit() {
174
177
  const input = this.$refs.input;
175
178
  input.blur();
@@ -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: {
@@ -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>
@@ -100,6 +100,14 @@ export default {
100
100
  required: false,
101
101
  default: undefined,
102
102
  },
103
+ language: {
104
+ type: String,
105
+ default: undefined,
106
+ },
107
+ additionalQueryParameters: {
108
+ type: Object,
109
+ default: undefined,
110
+ },
103
111
  buttonTitle: {
104
112
  type: String,
105
113
  required: false,
@@ -130,6 +138,8 @@ export default {
130
138
  widgetParams() {
131
139
  return {
132
140
  searchAsYouSpeak: this.searchAsYouSpeak,
141
+ language: this.language,
142
+ additionalQueryParameters: this.additionalQueryParameters,
133
143
  };
134
144
  },
135
145
  errorNotAllowed() {
@@ -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
- });
@@ -325,28 +325,6 @@ describe('default render', () => {
325
325
  });
326
326
  });
327
327
 
328
- it('calls the Panel mixin with `canRefine`', async () => {
329
- __setState({ ...defaultState });
330
-
331
- const wrapper = mount(Menu, {
332
- propsData: defaultProps,
333
- });
334
-
335
- const mapStateToCanRefine = () =>
336
- wrapper.vm.mapStateToCanRefine(wrapper.vm.state);
337
-
338
- expect(mapStateToCanRefine()).toBe(true);
339
-
340
- await wrapper.setData({
341
- state: {
342
- canRefine: false,
343
- },
344
- });
345
- expect(mapStateToCanRefine()).toBe(false);
346
-
347
- expect(wrapper.vm.mapStateToCanRefine({})).toBe(false);
348
- });
349
-
350
328
  it('exposes send-event method for insights middleware', async () => {
351
329
  const sendEvent = jest.fn();
352
330
  __setState({