@miso.ai/client-sdk-ui 1.12.7 → 1.13.0-beta.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 (45) hide show
  1. package/dist/cjs/actor/index.js +21 -7
  2. package/dist/cjs/actor/trackers.js +19 -4
  3. package/dist/cjs/actor/view.js +7 -19
  4. package/dist/cjs/actor/views.js +38 -100
  5. package/dist/cjs/element/container/miso-container.js +4 -0
  6. package/dist/cjs/layout/affiliation/affiliation.js +1 -1
  7. package/dist/cjs/layout/button/more-button.js +2 -1
  8. package/dist/cjs/layout/container/container.js +10 -5
  9. package/dist/cjs/layout/input/option-list.js +1 -1
  10. package/dist/cjs/layout/input/search-box.js +2 -2
  11. package/dist/cjs/layout/input/select.js +1 -1
  12. package/dist/cjs/layout/list/collection.js +1 -1
  13. package/dist/cjs/layout/mixin/swipeable.js +1 -1
  14. package/dist/cjs/layout/text/typewriter/index.js +3 -3
  15. package/dist/cjs/version.js +1 -1
  16. package/dist/cjs/workflow/answer-based.js +19 -1
  17. package/dist/cjs/workflow/ask.js +8 -10
  18. package/dist/cjs/workflow/base.js +6 -2
  19. package/dist/cjs/workflow/explore.js +1 -1
  20. package/dist/cjs/workflow/hybrid-search-views.js +9 -15
  21. package/dist/cjs/workflow/options/auto-query.js +4 -4
  22. package/dist/cjs/workflow/search-based.js +1 -1
  23. package/package.json +2 -2
  24. package/src/actor/index.js +1 -1
  25. package/src/actor/trackers.js +19 -4
  26. package/src/actor/view.js +10 -14
  27. package/src/actor/views.js +42 -96
  28. package/src/element/container/miso-container.js +5 -0
  29. package/src/layout/affiliation/affiliation.js +1 -1
  30. package/src/layout/button/more-button.js +2 -1
  31. package/src/layout/container/container.js +7 -6
  32. package/src/layout/input/option-list.js +1 -1
  33. package/src/layout/input/search-box.js +2 -2
  34. package/src/layout/input/select.js +1 -1
  35. package/src/layout/list/collection.js +3 -3
  36. package/src/layout/mixin/swipeable.js +2 -2
  37. package/src/layout/text/typewriter/index.js +3 -3
  38. package/src/version.js +1 -1
  39. package/src/workflow/answer-based.js +14 -2
  40. package/src/workflow/ask.js +10 -13
  41. package/src/workflow/base.js +5 -4
  42. package/src/workflow/explore.js +1 -1
  43. package/src/workflow/hybrid-search-views.js +11 -12
  44. package/src/workflow/options/auto-query.js +4 -2
  45. package/src/workflow/search-based.js +1 -1
@@ -90,8 +90,8 @@ export default class AnswerBasedWorkflow extends Workflow {
90
90
  this._unsubscribes = [
91
91
  ...this._unsubscribes,
92
92
  this._hub.on(fields.query(), args => this._query(args)),
93
- this._views.get(ROLE.ANSWER).on('citation-click', event => this._onCitationClick(event)),
94
- this._views.get(ROLE.ANSWER).on('link-click', event => this._onAnswerLinkClick(event)),
93
+ this._views.on(ROLE.ANSWER, 'citation-click', event => this._onCitationClick(event)),
94
+ this._views.on(ROLE.ANSWER, 'link-click', event => this._onAnswerLinkClick(event)),
95
95
  ];
96
96
  }
97
97
 
@@ -123,6 +123,7 @@ export default class AnswerBasedWorkflow extends Workflow {
123
123
  const done = status === STATUS.READY && !state.ongoing;
124
124
  const erroneous = status === STATUS.ERRONEOUS;
125
125
  const eventName = done ? 'done' : erroneous ? 'error' : status;
126
+
126
127
  // answer-stage
127
128
  const context = this._getSessionContext(session);
128
129
  const oldAnswerStage = context.answerStage;
@@ -131,6 +132,17 @@ export default class AnswerBasedWorkflow extends Workflow {
131
132
  this._emitLifecycleEvent('answer-stage', Object.freeze({ ...state, answer_stage: newAnswerStage }));
132
133
  context.answerStage = newAnswerStage;
133
134
  }
135
+
136
+ // blocked reason
137
+ const data = this._hub.states[fields.data()] || {};
138
+ const { value } = data;
139
+ if (value) {
140
+ const { blocked_reason } = value;
141
+ if (blocked_reason) {
142
+ this._emitLifecycleEvent('blocked', { ...state, blockedReason: blocked_reason });
143
+ }
144
+ }
145
+
134
146
  // ready, done, or error
135
147
  this._emitLifecycleEvent(eventName, state);
136
148
  if (done || erroneous) {
@@ -80,9 +80,9 @@ export default class Ask extends AnswerBasedWorkflow {
80
80
  this._unsubscribes = [
81
81
  ...this._unsubscribes,
82
82
  this._hub.on(fields.view(ROLE.REASONING), state => this._onReasoningViewUpdate(state)),
83
- this._views.get(ROLE.ANSWER).on('follow-up-click', event => this._onFollowUpClick(event)),
84
- this._views.get(ROLE.FOLLOW_UP_QUESTIONS).on('select', event => this._onFollowUpQuestionSelect(event)),
85
- this._views.get(ROLE.QUERY_SUGGESTIONS).on('select', event => this._onQuerySuggestionSelect(event)),
83
+ this._views.on(ROLE.ANSWER, 'follow-up-click', event => this._onFollowUpClick(event)),
84
+ this._views.on(ROLE.FOLLOW_UP_QUESTIONS, 'select', event => this._onFollowUpQuestionSelect(event)),
85
+ this._views.on(ROLE.QUERY_SUGGESTIONS, 'select', event => this._onQuerySuggestionSelect(event)),
86
86
  ];
87
87
  }
88
88
 
@@ -154,8 +154,9 @@ export default class Ask extends AnswerBasedWorkflow {
154
154
  if (!next) {
155
155
  return;
156
156
  }
157
- const view = next._views.get(ROLE.QUERY_SUGGESTIONS);
158
- view && view.refresh();
157
+ for (const view of next._views.getAll(ROLE.QUERY_SUGGESTIONS)) {
158
+ view.refresh();
159
+ }
159
160
  }
160
161
 
161
162
  // view //
@@ -163,8 +164,10 @@ export default class Ask extends AnswerBasedWorkflow {
163
164
  if (status !== STATUS.READY || ongoing) {
164
165
  return;
165
166
  }
166
- const element = this._getReasoningBoxElement();
167
- element && element.classList.add('done');
167
+ for (const view of this._views.getAll(ROLE.REASONING)) {
168
+ const element = view.element && view.element.closest('[data-role="reasoning-box"]');
169
+ element && element.classList.add('done');
170
+ }
168
171
  }
169
172
 
170
173
  // interactions //
@@ -251,12 +254,6 @@ export default class Ask extends AnswerBasedWorkflow {
251
254
  }
252
255
  }
253
256
 
254
- _getReasoningBoxElement() {
255
- const view = this._views.get(ROLE.REASONING);
256
- const element = view && view.element;
257
- return element && element.closest('[data-role="reasoning-box"]');
258
- }
259
-
260
257
  // destroy //
261
258
  _destroy(options) {
262
259
  const { next, parentQuestionId, questionId } = this;
@@ -1,5 +1,5 @@
1
1
  import { Component, isNullLike, mergeInteractions } from '@miso.ai/commons';
2
- import { Hub, SessionMaker, DataActor, ViewsActor, InteractionsActor, TrackersActor, fields } from '../actor/index.js';
2
+ import { Hub, SessionMaker, DataActor, ViewsActor, InteractionsActor, TrackersActor, proxyTrackers, fields } from '../actor/index.js';
3
3
  import * as sources from '../source.js';
4
4
  import { STATUS, ROLE } from '../constants.js';
5
5
  import { ContainerLayout, ErrorLayout } from '../layout/index.js';
@@ -78,9 +78,10 @@ export default class Workflow extends Component {
78
78
  const layouts = this._plugin.layouts;
79
79
 
80
80
  this._sessions = new SessionMaker(hub);
81
+ this._trackers = new TrackersActor(hub, { roles, options });
82
+ this._proxyTrackers = proxyTrackers(this._trackers);
81
83
  this._data = new DataActor(hub, { source: sources.api(client), options, ...this._extraOptions.api });
82
84
  this._views = new ViewsActor(hub, { extensions, layouts, roles, options, workflow: this });
83
- //this._trackers = new TrackersActor(hub, { options });
84
85
  this._interactions = new InteractionsActor(hub, { client, options });
85
86
  }
86
87
 
@@ -272,7 +273,7 @@ export default class Workflow extends Component {
272
273
 
273
274
  // trackers //
274
275
  get trackers() {
275
- return this._views.trackers;
276
+ return this._proxyTrackers;
276
277
  }
277
278
 
278
279
  _onTracker(args) {
@@ -355,7 +356,7 @@ export default class Workflow extends Component {
355
356
  for (const callback of callbacks) {
356
357
  try {
357
358
  callback({ workflow: this, ...event });
358
- } catch(e) {
359
+ } catch (e) {
359
360
  this._error(e);
360
361
  }
361
362
  }
@@ -66,7 +66,7 @@ export default class Explore extends UnitWorkflow {
66
66
  super._initSubscriptions(args);
67
67
  this._unsubscribes = [
68
68
  ...this._unsubscribes,
69
- this._views.get(ROLE.RELATED_QUESTIONS).on('click', event => this._handleRelatedQuestionClick(event)),
69
+ this._views.on(ROLE.RELATED_QUESTIONS, 'click', event => this._handleRelatedQuestionClick(event)),
70
70
  this._hub.on(fields.query(), args => this._query(args)),
71
71
  ];
72
72
  }
@@ -18,10 +18,18 @@ export default class HybridSearchViewsActor {
18
18
  return this._subviews.results.filters;
19
19
  }
20
20
 
21
+ on(role, event, callback) {
22
+ return this._getSubviews(role).on(role, event, callback);
23
+ }
24
+
21
25
  get(role) {
22
26
  return this._getSubviews(role).get(role);
23
27
  }
24
28
 
29
+ getAll(role) {
30
+ return this._getSubviews(role).getAll(role);
31
+ }
32
+
25
33
  addContainer(element) {
26
34
  if (this._containers.has(element)) {
27
35
  return;
@@ -42,12 +50,12 @@ export default class HybridSearchViewsActor {
42
50
  }
43
51
 
44
52
  addComponent(element) {
45
- this._getViewByElement(element).element = element;
53
+ this._getSubviews(element.role).addComponent(element);
46
54
  this._addContainerToSubviews(element._container, element);
47
55
  }
48
56
 
49
57
  removeComponent(element) {
50
- this._getViewByElement(element).element = undefined;
58
+ this._getSubviews(element.role).removeComponent(element);
51
59
  this._removeContainerFromSubviewsIfNecessary(element._container);
52
60
  }
53
61
 
@@ -56,8 +64,7 @@ export default class HybridSearchViewsActor {
56
64
  }
57
65
 
58
66
  refreshElement(element) {
59
- const view = element.isContainer ? this._containers.get(element) : this._getViewByElement(element);
60
- view && view.refresh({ force: true });
67
+ this._getSubviews(element.role).refreshElement(element);
61
68
  }
62
69
 
63
70
  // helpers //
@@ -69,14 +76,6 @@ export default class HybridSearchViewsActor {
69
76
  return this._subviews[getSubworkflowByRole(role)];
70
77
  }
71
78
 
72
- _getViewByElement(element) {
73
- let { role } = element;
74
- if (!role) {
75
- throw new Error('Component must have a role');
76
- }
77
- return this.get(role);
78
- }
79
-
80
79
  _addContainerToSubviews(container, child) {
81
80
  if (!container) {
82
81
  return;
@@ -21,8 +21,9 @@ export function autoQuery(options = {}) {
21
21
  const searchParams = new URLSearchParams(window.location.search);
22
22
  const q = searchParams.get(param);
23
23
  const qs = searchParams.get(sourceParam) || undefined;
24
- const { layout } = this._views.get(ROLE.QUERY);
25
- if (layout) {
24
+
25
+ for (const view of this._views.getAll(ROLE.QUERY)) {
26
+ const { layout } = view;
26
27
  if (q && setValue) {
27
28
  layout.value = q;
28
29
  }
@@ -30,6 +31,7 @@ export function autoQuery(options = {}) {
30
31
  layout.focus();
31
32
  }
32
33
  }
34
+
33
35
  if (q) {
34
36
  this.query(trimObj({ q, qs }));
35
37
  }
@@ -68,7 +68,7 @@ export default class SearchBasedWorkflow extends Workflow {
68
68
  this._hub.on(fields.query(), args => this._query(args)),
69
69
  this._hub.on(fields.filters(), () => this._refine()),
70
70
  this._hub.on(fields.more(), () => this._more()),
71
- this._views.get(ROLE.SORT).on('select', event => this._handleSortSelect(event)),
71
+ this._views.on(ROLE.SORT, 'select', event => this._handleSortSelect(event)),
72
72
  ];
73
73
  }
74
74