@miso.ai/client-sdk-ui 1.13.2-beta.1 → 1.14.0-beta.3

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 (226) hide show
  1. package/dist/cjs/asset/svgs.js +17 -4
  2. package/dist/cjs/combo/ask/index.js +2 -2
  3. package/dist/cjs/constants.js +120 -98
  4. package/dist/cjs/defaults/ask/controls.js +1 -1
  5. package/dist/cjs/defaults/hybrid-search/answer-box.js +4 -4
  6. package/dist/cjs/defaults.js +259 -0
  7. package/dist/cjs/element/container/index.js +28 -0
  8. package/dist/cjs/element/container/miso-ask.js +3 -3
  9. package/dist/cjs/element/container/miso-conversation.js +21 -0
  10. package/dist/cjs/element/container/miso-explore.js +1 -1
  11. package/dist/cjs/element/container/miso-history.js +21 -0
  12. package/dist/cjs/element/container/miso-hybrid-search.js +1 -1
  13. package/dist/cjs/element/container/miso-message-item.js +91 -0
  14. package/dist/cjs/element/container/miso-recommendation.js +1 -1
  15. package/dist/cjs/element/container/miso-search.js +1 -1
  16. package/dist/cjs/element/container/miso-thread-item.js +91 -0
  17. package/dist/cjs/element/context/miso-follow-ups.js +1 -1
  18. package/dist/cjs/element/role/index.js +49 -0
  19. package/dist/cjs/element/role/miso-delete.js +20 -0
  20. package/dist/cjs/element/role/miso-messages.js +20 -0
  21. package/dist/cjs/element/role/miso-new-thread.js +20 -0
  22. package/dist/cjs/element/role/miso-rename.js +20 -0
  23. package/dist/cjs/element/role/miso-subscription.js +20 -0
  24. package/dist/cjs/element/role/miso-threads.js +20 -0
  25. package/dist/cjs/element/role/miso-title.js +20 -0
  26. package/dist/cjs/layout/affiliation/affiliation.js +1 -1
  27. package/dist/cjs/layout/banner/banner.js +2 -1
  28. package/dist/cjs/layout/button/button.js +170 -0
  29. package/dist/cjs/layout/button/checkbox.js +116 -0
  30. package/dist/cjs/layout/button/more-button.js +3 -3
  31. package/dist/cjs/layout/container/container.js +1 -1
  32. package/dist/cjs/layout/container/item-container.js +99 -0
  33. package/dist/cjs/layout/error/error.js +2 -1
  34. package/dist/cjs/layout/index.js +42 -0
  35. package/dist/cjs/layout/input/facets.js +4 -3
  36. package/dist/cjs/layout/input/option-list.js +3 -2
  37. package/dist/cjs/layout/input/search-box.js +50 -12
  38. package/dist/cjs/layout/input/select.js +2 -1
  39. package/dist/cjs/layout/list/cards.js +2 -1
  40. package/dist/cjs/layout/list/carousel.js +2 -1
  41. package/dist/cjs/layout/list/collection.js +13 -1
  42. package/dist/cjs/layout/list/gallery.js +2 -1
  43. package/dist/cjs/layout/list/horizontal.js +2 -1
  44. package/dist/cjs/layout/list/list.js +2 -1
  45. package/dist/cjs/layout/list/messages.js +359 -0
  46. package/dist/cjs/layout/list/threads.js +199 -0
  47. package/dist/cjs/layout/mixin/trackable.js +4 -5
  48. package/dist/cjs/layout/mixin/triggerable.js +2 -2
  49. package/dist/cjs/layout/radio/feedback.js +4 -3
  50. package/dist/cjs/layout/templates.js +97 -0
  51. package/dist/cjs/layout/text/question.js +71 -0
  52. package/dist/cjs/layout/text/text.js +2 -1
  53. package/dist/cjs/layout/text/typewriter/index.js +18 -23
  54. package/dist/cjs/plugin.js +43 -104
  55. package/dist/cjs/util/confirm.js +33 -0
  56. package/dist/cjs/util/dom.js +21 -0
  57. package/dist/cjs/util/modal.js +48 -0
  58. package/dist/cjs/util/prompt.js +47 -0
  59. package/dist/cjs/version.js +1 -1
  60. package/package.json +5 -4
  61. package/src/CLAUDE.md +51 -104
  62. package/src/asset/svgs.js +16 -3
  63. package/src/combo/ask/index.js +2 -2
  64. package/src/constants.js +39 -147
  65. package/src/defaults/ask/controls.js +1 -1
  66. package/src/defaults/hybrid-search/answer-box.js +2 -2
  67. package/src/defaults.js +174 -0
  68. package/src/element/container/index.js +4 -0
  69. package/src/element/container/miso-ask.js +3 -3
  70. package/src/element/container/miso-conversation.js +19 -0
  71. package/src/element/container/miso-explore.js +1 -1
  72. package/src/element/container/miso-history.js +19 -0
  73. package/src/element/container/miso-hybrid-search.js +1 -1
  74. package/src/element/container/miso-message-item.js +94 -0
  75. package/src/element/container/miso-recommendation.js +1 -1
  76. package/src/element/container/miso-search.js +1 -1
  77. package/src/element/container/miso-thread-item.js +94 -0
  78. package/src/element/context/miso-follow-ups.js +1 -1
  79. package/src/element/role/index.js +7 -0
  80. package/src/element/role/miso-delete.js +16 -0
  81. package/src/element/role/miso-messages.js +16 -0
  82. package/src/element/role/miso-new-thread.js +16 -0
  83. package/src/element/role/miso-rename.js +16 -0
  84. package/src/element/role/miso-subscription.js +16 -0
  85. package/src/element/role/miso-threads.js +16 -0
  86. package/src/element/role/miso-title.js +16 -0
  87. package/src/layout/affiliation/affiliation.js +2 -2
  88. package/src/layout/banner/banner.js +2 -1
  89. package/src/layout/button/button.js +152 -0
  90. package/src/layout/button/checkbox.js +92 -0
  91. package/src/layout/button/more-button.js +3 -3
  92. package/src/layout/container/container.js +2 -2
  93. package/src/layout/container/item-container.js +99 -0
  94. package/src/layout/error/error.js +2 -1
  95. package/src/layout/index.js +6 -0
  96. package/src/layout/input/facets.js +3 -2
  97. package/src/layout/input/option-list.js +3 -2
  98. package/src/layout/input/search-box.js +45 -8
  99. package/src/layout/input/select.js +2 -1
  100. package/src/layout/list/cards.js +2 -1
  101. package/src/layout/list/carousel.js +2 -1
  102. package/src/layout/list/collection.js +15 -2
  103. package/src/layout/list/gallery.js +2 -1
  104. package/src/layout/list/horizontal.js +2 -1
  105. package/src/layout/list/list.js +2 -1
  106. package/src/layout/list/messages.js +316 -0
  107. package/src/layout/list/threads.js +166 -0
  108. package/src/layout/mixin/trackable.js +2 -3
  109. package/src/layout/mixin/triggerable.js +1 -1
  110. package/src/layout/radio/feedback.js +3 -2
  111. package/src/layout/templates.js +97 -0
  112. package/src/layout/text/question.js +58 -0
  113. package/src/layout/text/text.js +2 -1
  114. package/src/layout/text/typewriter/index.js +15 -18
  115. package/src/plugin.js +31 -117
  116. package/src/util/confirm.js +28 -0
  117. package/src/util/dom.js +16 -0
  118. package/src/util/modal.js +49 -0
  119. package/src/util/prompt.js +42 -0
  120. package/src/version.js +1 -1
  121. package/dist/cjs/actor/data.js +0 -132
  122. package/dist/cjs/actor/feedback.js +0 -29
  123. package/dist/cjs/actor/fields.js +0 -57
  124. package/dist/cjs/actor/filters.js +0 -161
  125. package/dist/cjs/actor/hub.js +0 -57
  126. package/dist/cjs/actor/index.js +0 -73
  127. package/dist/cjs/actor/interactions.js +0 -36
  128. package/dist/cjs/actor/sessions.js +0 -25
  129. package/dist/cjs/actor/tracker-states.js +0 -61
  130. package/dist/cjs/actor/tracker.js +0 -109
  131. package/dist/cjs/actor/trackers.js +0 -52
  132. package/dist/cjs/actor/utils.js +0 -15
  133. package/dist/cjs/actor/view.js +0 -294
  134. package/dist/cjs/actor/views.js +0 -209
  135. package/dist/cjs/source.js +0 -27
  136. package/dist/cjs/util/proxy.js +0 -88
  137. package/dist/cjs/util/trackers.js +0 -88
  138. package/dist/cjs/workflow/affiliations.js +0 -140
  139. package/dist/cjs/workflow/answer-based.js +0 -337
  140. package/dist/cjs/workflow/ask.js +0 -319
  141. package/dist/cjs/workflow/asks.js +0 -150
  142. package/dist/cjs/workflow/autocompletable.js +0 -63
  143. package/dist/cjs/workflow/autocomplete.js +0 -120
  144. package/dist/cjs/workflow/base.js +0 -418
  145. package/dist/cjs/workflow/context.js +0 -19
  146. package/dist/cjs/workflow/explore.js +0 -210
  147. package/dist/cjs/workflow/explores.js +0 -21
  148. package/dist/cjs/workflow/hybrid-search-answer.js +0 -88
  149. package/dist/cjs/workflow/hybrid-search-views.js +0 -109
  150. package/dist/cjs/workflow/hybrid-search.js +0 -213
  151. package/dist/cjs/workflow/index.js +0 -41
  152. package/dist/cjs/workflow/options/api.js +0 -41
  153. package/dist/cjs/workflow/options/auto-query.js +0 -97
  154. package/dist/cjs/workflow/options/configurable.js +0 -45
  155. package/dist/cjs/workflow/options/data-processor.js +0 -20
  156. package/dist/cjs/workflow/options/filters.js +0 -15
  157. package/dist/cjs/workflow/options/index.js +0 -126
  158. package/dist/cjs/workflow/options/interactions.js +0 -41
  159. package/dist/cjs/workflow/options/layouts.js +0 -79
  160. package/dist/cjs/workflow/options/options.js +0 -156
  161. package/dist/cjs/workflow/options/pagination.js +0 -25
  162. package/dist/cjs/workflow/options/roles.js +0 -15
  163. package/dist/cjs/workflow/options/templates.js +0 -30
  164. package/dist/cjs/workflow/options/trackers.js +0 -83
  165. package/dist/cjs/workflow/options/utils.js +0 -33
  166. package/dist/cjs/workflow/processors.js +0 -607
  167. package/dist/cjs/workflow/recommendation.js +0 -57
  168. package/dist/cjs/workflow/recommendations.js +0 -18
  169. package/dist/cjs/workflow/search-based.js +0 -337
  170. package/dist/cjs/workflow/search.js +0 -64
  171. package/dist/cjs/workflow/unit.js +0 -57
  172. package/dist/cjs/workflow/units.js +0 -42
  173. package/dist/cjs/workflow/use-link.js +0 -49
  174. package/src/actor/data.js +0 -106
  175. package/src/actor/feedback.js +0 -28
  176. package/src/actor/fields.js +0 -51
  177. package/src/actor/filters.js +0 -149
  178. package/src/actor/hub.js +0 -47
  179. package/src/actor/index.js +0 -10
  180. package/src/actor/interactions.js +0 -32
  181. package/src/actor/sessions.js +0 -21
  182. package/src/actor/tracker-states.js +0 -57
  183. package/src/actor/tracker.js +0 -104
  184. package/src/actor/trackers.js +0 -45
  185. package/src/actor/utils.js +0 -7
  186. package/src/actor/view.js +0 -272
  187. package/src/actor/views.js +0 -224
  188. package/src/source.js +0 -17
  189. package/src/util/proxy.js +0 -81
  190. package/src/util/trackers.js +0 -84
  191. package/src/workflow/affiliations.js +0 -121
  192. package/src/workflow/answer-based.js +0 -312
  193. package/src/workflow/ask.js +0 -284
  194. package/src/workflow/asks.js +0 -143
  195. package/src/workflow/autocompletable.js +0 -67
  196. package/src/workflow/autocomplete.js +0 -114
  197. package/src/workflow/base.js +0 -396
  198. package/src/workflow/context.js +0 -16
  199. package/src/workflow/explore.js +0 -194
  200. package/src/workflow/explores.js +0 -18
  201. package/src/workflow/hybrid-search-answer.js +0 -73
  202. package/src/workflow/hybrid-search-views.js +0 -116
  203. package/src/workflow/hybrid-search.js +0 -230
  204. package/src/workflow/index.js +0 -5
  205. package/src/workflow/options/api.js +0 -31
  206. package/src/workflow/options/auto-query.js +0 -70
  207. package/src/workflow/options/configurable.js +0 -48
  208. package/src/workflow/options/data-processor.js +0 -15
  209. package/src/workflow/options/filters.js +0 -10
  210. package/src/workflow/options/index.js +0 -11
  211. package/src/workflow/options/interactions.js +0 -36
  212. package/src/workflow/options/layouts.js +0 -73
  213. package/src/workflow/options/options.js +0 -175
  214. package/src/workflow/options/pagination.js +0 -18
  215. package/src/workflow/options/roles.js +0 -12
  216. package/src/workflow/options/templates.js +0 -27
  217. package/src/workflow/options/trackers.js +0 -80
  218. package/src/workflow/options/utils.js +0 -26
  219. package/src/workflow/processors.js +0 -490
  220. package/src/workflow/recommendation.js +0 -63
  221. package/src/workflow/recommendations.js +0 -14
  222. package/src/workflow/search-based.js +0 -329
  223. package/src/workflow/search.js +0 -73
  224. package/src/workflow/unit.js +0 -51
  225. package/src/workflow/units.js +0 -43
  226. package/src/workflow/use-link.js +0 -41
@@ -1,329 +0,0 @@
1
- import { API, asArray, trimObj, mergeInteractions } from '@miso.ai/commons';
2
- import Workflow from './base.js';
3
- import { fields } from '../actor/index.js';
4
- import { STATUS, ROLE, WORKFLOW_CONFIGURABLE, REQUEST_TYPE } from '../constants.js';
5
- import { SearchBoxLayout, ListLayout, TextLayout, FacetsLayout, SelectLayout, MoreButtonLayout } from '../layout/index.js';
6
- import { mappingSortData, writeKeywordsToData, retainFacetCountsInData, writeExhaustionToData, writeMisoIdAsRootMisoId, concatItemsFromMoreResponse } from './processors.js';
7
- import { mergeRolesOptions, autoQuery as autoQueryFn, updateQueryParametersInUrl, makeConfigurable, DEFAULT_TRACKER_OPTIONS } from './options/index.js';
8
- import { enableUseLink } from './use-link.js';
9
-
10
- const DEFAULT_ROWS = 10;
11
- const DEFAULT_PAGE_LIMIT = 10;
12
-
13
- const DEFAULT_API_OPTIONS = Object.freeze({
14
- ...Workflow.DEFAULT_API_OPTIONS,
15
- group: API.GROUP.SEARCH,
16
- payload: {
17
- ...Workflow.DEFAULT_API_OPTIONS.payload,
18
- fl: ['cover_image', 'url', 'created_at', 'updated_at', 'published_at', 'title'],
19
- rows: DEFAULT_ROWS,
20
- },
21
- });
22
-
23
- function totalContent(layout, { value }) {
24
- if (value === undefined) {
25
- return '';
26
- }
27
- const { formatNumber } = layout.templates.helpers;
28
- const formatted = formatNumber(value);
29
- const label = value === 1 ? 'result' : 'results';
30
- return `${formatted} ${label}`;
31
- }
32
-
33
- const DEFAULT_LAYOUTS = Object.freeze({
34
- ...Workflow.DEFAULT_LAYOUTS,
35
- [ROLE.QUERY]: [SearchBoxLayout.type],
36
- [ROLE.PRODUCTS]: [ListLayout.type, { incremental: true, infiniteScroll: true }],
37
- [ROLE.KEYWORDS]: [TextLayout.type, { raw: true }],
38
- [ROLE.TOTAL]: [TextLayout.type, { raw: true, templates: { content: totalContent } }],
39
- [ROLE.FACETS]: [FacetsLayout.type],
40
- [ROLE.SORT]: [SelectLayout.type],
41
- [ROLE.MORE]: [MoreButtonLayout.type],
42
- });
43
-
44
- const DEFAULT_TRACKERS = Object.freeze({
45
- ...Workflow.DEFAULT_TRACKERS,
46
- [ROLE.PRODUCTS]: DEFAULT_TRACKER_OPTIONS,
47
- });
48
-
49
- const DEFAULT_PAGINATION = Object.freeze({
50
- active: false,
51
- mode: 'infiniteScroll',
52
- pageLimit: 10,
53
- });
54
-
55
- const DEFAULT_OPTIONS = Object.freeze({
56
- ...Workflow.DEFAULT_OPTIONS,
57
- api: DEFAULT_API_OPTIONS,
58
- layouts: DEFAULT_LAYOUTS,
59
- trackers: DEFAULT_TRACKERS,
60
- pagination: DEFAULT_PAGINATION,
61
- });
62
-
63
- const ROLES_OPTIONS = mergeRolesOptions(Workflow.ROLES_OPTIONS, {
64
- main: ROLE.PRODUCTS,
65
- members: Object.keys(DEFAULT_LAYOUTS),
66
- mappings: {
67
- [ROLE.FACETS]: 'facet_counts',
68
- [ROLE.SORT]: mappingSortData,
69
- },
70
- });
71
-
72
- export default class SearchBasedWorkflow extends Workflow {
73
-
74
- _initSubscriptions(args) {
75
- super._initSubscriptions(args);
76
- this._unsubscribes = [
77
- ...this._unsubscribes,
78
- this._hub.on(fields.query(), args => this._query(args)),
79
- this._hub.on(fields.filters(), () => this._refine()),
80
- this._hub.on(fields.more(), () => this._more()),
81
- this._views.on(ROLE.SORT, 'select', event => this._handleSortSelect(event)),
82
- ];
83
- }
84
-
85
- restart() {
86
- super.restart();
87
- this._page = 0;
88
- }
89
-
90
- // properties //
91
- get exhausted() {
92
- const data = this._hub.states[fields.data()];
93
- return !!(data && data.meta && data.meta.exhausted);
94
- }
95
-
96
- get page() {
97
- return this._page;
98
- }
99
-
100
- // query //
101
- autoQuery(options = {}) {
102
- autoQueryFn.call(this, options);
103
- }
104
-
105
- query(args) {
106
- if (!args.q) {
107
- throw new Error(`q is required in query() call`);
108
- }
109
- this._hub.update(fields.query(), args);
110
- }
111
-
112
- _query(args) {
113
- if (this._linkFn) {
114
- this._submitToPage(args);
115
- return;
116
- }
117
- const type = REQUEST_TYPE.QUERY;
118
-
119
- // reset filters view
120
- this._views.filters.reset({ silent: true });
121
-
122
- // start a new session
123
- this.restart({ type });
124
-
125
- // payload
126
- const payload = this._buildPayload(args, type);
127
-
128
- this._request({ payload, type });
129
- }
130
-
131
- _refine() {
132
- const type = REQUEST_TYPE.REFINE;
133
-
134
- // remember current facet_counts
135
- const { facet_counts } = this._hub.states[fields.data()].value || {};
136
- this._currentFacetCounts = facet_counts;
137
-
138
- // start a new session
139
- this.restart({ type });
140
-
141
- // payload
142
- const query = this._getQuery();
143
- const payload = this._buildPayload(query, type);
144
-
145
- this._request({ payload, type });
146
- }
147
-
148
- // TODO: expose API
149
- _more() {
150
- // if still loading, complain
151
- if (this.status !== STATUS.READY) {
152
- throw new Error(`Can not call more() while loading.`);
153
- }
154
- // no more pages, ignore
155
- if (this.exhausted || this._page >= DEFAULT_PAGE_LIMIT - 1) {
156
- return;
157
- }
158
- // don't create a new session!
159
-
160
- this._page++;
161
-
162
- // payload
163
- const type = REQUEST_TYPE.MORE;
164
- const query = this._getQuery();
165
- const payload = this._buildPayload(query, type);
166
-
167
- this._request({ payload, type });
168
- }
169
-
170
- _getQuery() {
171
- return this._hub.states[fields.query()];
172
- }
173
-
174
- _getPageSize() {
175
- return this._options.resolved.api.payload.rows;
176
- }
177
-
178
- _buildPayload(payload, type) {
179
- payload = this._writeFiltersToPayload(payload);
180
- payload = this._writePageInfoToPayload(payload);
181
- if (type === REQUEST_TYPE.MORE) {
182
- payload = this._processPayloadForMoreRequest(payload);
183
- }
184
- return payload;
185
- }
186
-
187
- _writeFiltersToPayload(payload) {
188
- const filters = this._hub.states[fields.filters()];
189
- const { facets, sort } = filters || {};
190
- return trimObj({
191
- ...payload,
192
- facet_filters: this._buildFacetFilters(facets),
193
- order_by: this._buildOrderBy(sort),
194
- });
195
- }
196
-
197
- _buildFacetFilters(facets) {
198
- if (!facets) {
199
- return undefined;
200
- }
201
- const filters = {};
202
- for (const field in facets) {
203
- const values = facets[field];
204
- if (!values || !values.length) {
205
- continue; // just in case
206
- }
207
- filters[field] = {
208
- terms: values,
209
- };
210
- }
211
- return Object.keys(filters).length ? filters : undefined;
212
- }
213
-
214
- _buildOrderBy(sort) {
215
- if (!sort) {
216
- return undefined;
217
- }
218
- return asArray(sort);
219
- }
220
-
221
- _writePageInfoToPayload(payload) {
222
- return {
223
- ...payload,
224
- metadata: {
225
- ...payload.metadata,
226
- page: this._page,
227
- },
228
- };
229
- }
230
-
231
- _processPayloadForMoreRequest(payload = {}) {
232
- const data = this._hub.states[fields.data()];
233
- const { [this._roles.main]: items = [] } = (data && data.value) || {};
234
- const productIds = items.map(item => item.product_id).filter(v => v);
235
- const exclude = [...(payload.exclude || []), ...productIds];
236
- if (exclude.length === 0) {
237
- return payload;
238
- }
239
- return {
240
- ...payload,
241
- exclude,
242
- };
243
- }
244
-
245
- _writeRequestTimeToSession(timestamp, options = {}) {
246
- if (options.type !== REQUEST_TYPE.QUERY) {
247
- return;
248
- }
249
- super._writeRequestTimeToSession(timestamp, options);
250
- }
251
-
252
- // data //
253
- _defaultProcessData(data, oldData) {
254
- data = super._defaultProcessData(data, oldData);
255
- data = writeKeywordsToData(data);
256
- data = retainFacetCountsInData(data, this._currentFacetCounts);
257
- data = writeExhaustionToData(data, { role: this._roles.main });
258
- return data;
259
- }
260
-
261
- _updateData(data) {
262
- super._updateData(data);
263
- updateQueryParametersInUrl.call(this, data);
264
- }
265
-
266
- _updateDataInHub(data, oldData) {
267
- data = this._appendResultsFromMoreRequest(data);
268
- super._updateDataInHub(data, oldData);
269
- }
270
-
271
- _appendResultsFromMoreRequest(data) {
272
- const { request } = data;
273
- if (!request) {
274
- return data; // the initial state
275
- }
276
- const { metadata } = request.payload;
277
- if (!metadata || !metadata.page) {
278
- return writeMisoIdAsRootMisoId(data); // not from "more" request
279
- }
280
- // concat records if it's from "more" request
281
- const currentData = this._hub.states[fields.data()];
282
- return concatItemsFromMoreResponse(currentData, data, { role: this._roles.main });
283
- }
284
-
285
- // view actions //
286
- _handleSortSelect({ value } = {}) {
287
- if (!value) {
288
- return;
289
- }
290
- this._views.filters.update({ sort: value });
291
- this._views.filters.apply();
292
- }
293
-
294
- // interactions //
295
- _defaultProcessInteraction(payload, args) {
296
- payload = super._defaultProcessInteraction(payload, args);
297
- payload = this._writeRootMisoIdToInteraction(payload);
298
- return payload;
299
- }
300
-
301
- _writeRootMisoIdToInteraction(payload) {
302
- const data = this._hub.states[fields.data()];
303
- const { root_miso_id } = (data && data.value) || {};
304
- if (!root_miso_id) {
305
- return payload;
306
- }
307
- return mergeInteractions(payload, {
308
- context: {
309
- custom_context: {
310
- root_miso_id,
311
- }
312
- }
313
- });
314
- }
315
-
316
- }
317
-
318
- makeConfigurable(SearchBasedWorkflow.prototype, [WORKFLOW_CONFIGURABLE.PAGINATION, WORKFLOW_CONFIGURABLE.FILTERS]);
319
-
320
- enableUseLink(SearchBasedWorkflow.prototype);
321
-
322
- Object.assign(SearchBasedWorkflow, {
323
- DEFAULT_API_OPTIONS,
324
- DEFAULT_LAYOUTS,
325
- DEFAULT_TRACKERS,
326
- DEFAULT_PAGINATION,
327
- DEFAULT_OPTIONS,
328
- ROLES_OPTIONS,
329
- });
@@ -1,73 +0,0 @@
1
- import { API } from '@miso.ai/commons';
2
- import { ROLE } from '../constants.js';
3
- import SearchBasedWorkflow from './search-based.js';
4
- import { makeAutocompletable } from './autocompletable.js';
5
-
6
- const DEFAULT_API_OPTIONS = Object.freeze({
7
- group: API.GROUP.SEARCH,
8
- name: API.NAME.SEARCH,
9
- payload: {
10
- fl: ['*'],
11
- },
12
- });
13
-
14
- const DEFAULT_AUTOCOMPLETE_OPTIONS = Object.freeze({
15
- api: {
16
- group: API.GROUP.SEARCH,
17
- name: API.NAME.AUTOCOMPLETE,
18
- payload: {
19
- completion_fields: ['suggested_queries', 'title'],
20
- fl: ['title', 'url', 'cover_image'],
21
- },
22
- },
23
- });
24
-
25
- const DEFAULT_LAYOUTS = Object.freeze({
26
- ...SearchBasedWorkflow.DEFAULT_LAYOUTS,
27
- });
28
-
29
- const DEFAULT_TRACKERS = Object.freeze({
30
- ...SearchBasedWorkflow.DEFAULT_TRACKERS,
31
- });
32
-
33
- const DEFAULT_OPTIONS = Object.freeze({
34
- ...SearchBasedWorkflow.DEFAULT_OPTIONS,
35
- api: DEFAULT_API_OPTIONS,
36
- autocomplete: DEFAULT_AUTOCOMPLETE_OPTIONS,
37
- layouts: DEFAULT_LAYOUTS,
38
- trackers: DEFAULT_TRACKERS,
39
- });
40
-
41
- const ROLES_OPTIONS = SearchBasedWorkflow.ROLES_OPTIONS;
42
-
43
- export default class Search extends SearchBasedWorkflow {
44
-
45
- constructor(plugin, client) {
46
- super({
47
- name: 'search',
48
- plugin,
49
- client,
50
- roles: ROLES_OPTIONS,
51
- defaults: DEFAULT_OPTIONS,
52
- });
53
- }
54
-
55
- _initProperties(args) {
56
- super._initProperties(args);
57
- this._initAutocomplete(args);
58
- }
59
-
60
- notifyViewUpdate(role = ROLE.PRODUCTS, ...args) {
61
- super.notifyViewUpdate(role, ...args);
62
- return this;
63
- }
64
-
65
- // destroy //
66
- _destroy(options) {
67
- this._destroyAutocomplete();
68
- super._destroy(options);
69
- }
70
-
71
- }
72
-
73
- makeAutocompletable(Search.prototype);
@@ -1,51 +0,0 @@
1
- import { defineValues, mergeInteractions } from '@miso.ai/commons';
2
- import Workflow from './base.js';
3
-
4
- export default class UnitWorkflow extends Workflow {
5
-
6
- _initProperties(args) {
7
- super._initProperties(args);
8
- const { id } = args;
9
- defineValues(this, { id });
10
- }
11
-
12
- _initSession(args) {
13
- this._context._members.set(args.id, this);
14
- super._initSession(args);
15
- }
16
-
17
- // interactions //
18
- _defaultProcessInteraction(payload, args) {
19
- payload = super._defaultProcessInteraction(payload, args);
20
- payload = this._writeUnitIdToInteraction(payload, args);
21
- return payload;
22
- }
23
-
24
- _writeUnitIdToInteraction(payload) {
25
- const unit_id = this.id;
26
- const unit_instance_uuid = this.uuid;
27
- return mergeInteractions(payload, {
28
- context: {
29
- custom_context: {
30
- unit_id,
31
- unit_instance_uuid,
32
- },
33
- },
34
- });
35
- }
36
-
37
- // destroy //
38
- _destroy(options) {
39
- this._context._members.delete(this.id);
40
- super._destroy(options);
41
- }
42
-
43
- }
44
-
45
- Object.assign(UnitWorkflow, {
46
- DEFAULT_API_OPTIONS: Workflow.DEFAULT_API_OPTIONS,
47
- DEFAULT_LAYOUTS: Workflow.DEFAULT_LAYOUTS,
48
- DEFAULT_TRACKERS: Workflow.DEFAULT_TRACKERS,
49
- DEFAULT_OPTIONS: Workflow.DEFAULT_OPTIONS,
50
- ROLES_OPTIONS: Workflow.ROLES_OPTIONS,
51
- });
@@ -1,43 +0,0 @@
1
- import { DEFAULT_UNIT_ID } from '../constants.js';
2
- import WorkflowContext from './context.js';
3
-
4
- export default class UnitWorkflowContext extends WorkflowContext {
5
-
6
- constructor(name, plugin, client) {
7
- super(name, plugin, client);
8
- this._members = new Map();
9
- }
10
-
11
- workflows() {
12
- return [...this._members.values()];
13
- }
14
-
15
- create(unitId = DEFAULT_UNIT_ID) {
16
- if (this._members.has(unitId)) {
17
- throw new Error(`Unit already exists: ${unitId}`);
18
- }
19
- return this._createAndEmit(unitId);
20
- }
21
-
22
- has(unitId = DEFAULT_UNIT_ID) {
23
- return this._members.has(unitId);
24
- }
25
-
26
- get(unitId = DEFAULT_UNIT_ID) {
27
- if (typeof unitId !== 'string') {
28
- throw new Error(`Required unit ID to be a string: ${unitId}`);
29
- }
30
- return this._members.get(unitId) || this._createAndEmit(unitId);
31
- }
32
-
33
- _createAndEmit(unitId) {
34
- const workflow = this._create(unitId);
35
- this._client._events.emit('postworkflow', workflow);
36
- return workflow;
37
- }
38
-
39
- _create(unitId) {
40
- throw new Error('Not implemented');
41
- }
42
-
43
- }
@@ -1,41 +0,0 @@
1
- import { mixin } from '@miso.ai/commons';
2
-
3
- // TODO: eliminate browser dependency
4
-
5
- export function enableUseLink(prototype) {
6
- mixin(prototype, UseLinkMixin.prototype);
7
- }
8
-
9
- export class UseLinkMixin {
10
-
11
- useLink(fn, options = {}) {
12
- if (typeof fn !== 'function' && fn !== false) {
13
- throw new Error('useLink(fn) expects fn to be a function or false');
14
- }
15
- this._linkFn = fn ? [fn, options] : false;
16
- return this;
17
- }
18
-
19
- _submitToPage(args = {}) {
20
- if (!this._linkFn) {
21
- return;
22
- }
23
- const url = this._getSubmitUrl(args);
24
- const [_, options = {}] = this._linkFn;
25
- if (options.open === false) {
26
- window.location.href = url;
27
- } else {
28
- const target = options.target || '_blank';
29
- const windowFeatures = options.windowFeatures || 'noopener';
30
- window.open(url, target, windowFeatures);
31
- }
32
- }
33
-
34
- _getSubmitUrl({ q, ...args } = {}) {
35
- if (!this._linkFn) {
36
- throw new Error('useLink(fn) must be called before _getSubmitUrl()');
37
- }
38
- return this._linkFn[0](q, args);
39
- }
40
-
41
- }