@miso.ai/client-sdk-ui 1.11.0-beta.11 → 1.11.0-beta.12

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.
@@ -4,4 +4,4 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
- var _default = exports.default = '1.11.0-beta.11';
7
+ var _default = exports.default = '1.11.0-beta.12';
@@ -12,6 +12,7 @@ var _index2 = require("../layout/index.js");
12
12
  var _index3 = require("../affiliation/index.js");
13
13
  var _options = require("./options.js");
14
14
  var _processors = require("./processors.js");
15
+ var _useLink = require("./use-link.js");
15
16
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
16
17
  const DEFAULT_API_OPTIONS = Object.freeze(Object.assign({}, _base.default.DEFAULT_API_OPTIONS, {
17
18
  group: _commons.API.GROUP.ASK,
@@ -84,15 +85,6 @@ class AnswerBasedWorkflow extends _base.default {
84
85
  this._unsubscribes = [...this._unsubscribes, this._hub.on(_index.fields.query(), args => this._query(args)), this._views.get(_constants.ROLE.ANSWER).on('citation-click', event => this._onCitationClick(event))];
85
86
  }
86
87
 
87
- // configuration //
88
- useLink(fn) {
89
- if (typeof fn !== 'function' && fn !== false) {
90
- throw new Error('useLink(fn) expects fn to be a function or false');
91
- }
92
- this._linkFn = fn;
93
- return this;
94
- }
95
-
96
88
  // lifecycle //
97
89
  restart() {
98
90
  // clear question id from previous session
@@ -166,7 +158,7 @@ class AnswerBasedWorkflow extends _base.default {
166
158
  _query() {
167
159
  let args = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
168
160
  if (this._linkFn) {
169
- this._submit(args);
161
+ this._submitToPage(args);
170
162
  return;
171
163
  }
172
164
  // start a new session
@@ -181,14 +173,6 @@ class AnswerBasedWorkflow extends _base.default {
181
173
  payload
182
174
  });
183
175
  }
184
- _submit(args) {
185
- if (!this._linkFn) {
186
- return;
187
- }
188
- // TODO: we want a submit event, but only with linkFn
189
- const url = this._linkFn(args.q);
190
- window.open(url, '_blank');
191
- }
192
176
  _writeQuestionSourceToSession(args) {
193
177
  this.session.meta.question_source = args.qs || _constants.ORGANIC_QUESTION_SOURCE; // might be null, not undefined
194
178
  }
@@ -323,6 +307,7 @@ class AnswerBasedWorkflow extends _base.default {
323
307
  }
324
308
  }
325
309
  exports.default = AnswerBasedWorkflow;
310
+ (0, _useLink.enableUseLink)(AnswerBasedWorkflow.prototype);
326
311
  Object.assign(AnswerBasedWorkflow, {
327
312
  DEFAULT_API_OPTIONS,
328
313
  DEFAULT_AUTOCOMPLETE_OPTIONS,
@@ -10,6 +10,7 @@ var _index = require("../actor/index.js");
10
10
  var _constants = require("../constants.js");
11
11
  var _index2 = require("../layout/index.js");
12
12
  var _options = require("./options.js");
13
+ var _useLink = require("./use-link.js");
13
14
  const _excluded = ["value"];
14
15
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
15
16
  function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (e.includes(n)) continue; t[n] = r[n]; } return t; }
@@ -61,7 +62,7 @@ class Explore extends _base.default {
61
62
  }
62
63
  _initSubscriptions(args) {
63
64
  super._initSubscriptions(args);
64
- this._unsubscribes = [...this._unsubscribes, this._views.get(_constants.ROLE.RELATED_QUESTIONS).on('click', event => this._handleRelatedQuestionClick(event)), this._hub.on(_index.fields.query(), args => this._submit(args))];
65
+ this._unsubscribes = [...this._unsubscribes, this._views.get(_constants.ROLE.RELATED_QUESTIONS).on('click', event => this._handleRelatedQuestionClick(event)), this._hub.on(_index.fields.query(), args => this._query(args))];
65
66
  }
66
67
 
67
68
  // configuration //
@@ -80,13 +81,6 @@ class Explore extends _base.default {
80
81
  }
81
82
  return super.useApi(options);
82
83
  }
83
- useLink(fn) {
84
- if (typeof fn !== 'function' && fn !== false) {
85
- throw new Error('useLink(fn) expects fn to be a function or false');
86
- }
87
- this._linkFn = fn;
88
- return this;
89
- }
90
84
 
91
85
  // lifecycle //
92
86
  start() {
@@ -94,7 +88,7 @@ class Explore extends _base.default {
94
88
  relatedQuestions = true
95
89
  } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
96
90
  if (this._linkFn === undefined) {
97
- throw new Error('Define link mapping function before calling start()');
91
+ throw new Error('Must define link mapping function with useLink(fn) before calling start()');
98
92
  }
99
93
  // in explore workflow, start() triggers query
100
94
  // TODO: we should still make the query lifecycle
@@ -125,16 +119,24 @@ class Explore extends _base.default {
125
119
  }
126
120
  _defaultProcessData(data) {
127
121
  data = super._defaultProcessData(data);
128
- let {
122
+ data = this._addUrlToRelatedQuestions(data);
123
+ return data;
124
+ }
125
+ _addUrlToRelatedQuestions(data) {
126
+ const {
129
127
  value
130
128
  } = data;
131
- if (!value) {
129
+ if (!value || !value.related_questions) {
132
130
  return data;
133
131
  }
134
- // patch value with links
135
- const related_questions = value.related_questions.map(this._linkFn ? text => ({
132
+ const linkFn = this._linkFn && this._linkFn[0];
133
+ const related_questions = value.related_questions.map(linkFn ? text => ({
136
134
  text,
137
- url: this._getAnswersUrl(text, true)
135
+ url: this._getSubmitUrl({
136
+ q: text
137
+ }, {
138
+ generated: true
139
+ })
138
140
  }) : text => ({
139
141
  text
140
142
  }));
@@ -159,26 +161,19 @@ class Explore extends _base.default {
159
161
  }
160
162
  this._hub.update(_index.fields.query(), args);
161
163
  }
162
- _submit() {
163
- let {
164
- q
165
- } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
166
- if (!this._linkFn) {
167
- return;
168
- }
169
- const url = this._getAnswersUrl(q);
170
- window.open(url, '_blank');
164
+ _query(args) {
165
+ this._submitToPage(args);
171
166
  }
172
- _getAnswersUrl(text) {
173
- let generated = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
174
- if (!this._linkFn) {
175
- return;
176
- }
177
- const url = this._linkFn(text);
167
+ _getSubmitUrl(args) {
168
+ let {
169
+ generated = false
170
+ } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
171
+ let url = _useLink.UseLinkMixin.prototype._getSubmitUrl.call(this, args);
178
172
  if (!generated || !this._productId) {
179
173
  return url;
180
174
  }
181
175
  return `${url}&qs=${encodeURIComponent(this._productId)}`;
182
176
  }
183
177
  }
184
- exports.default = Explore;
178
+ exports.default = Explore;
179
+ (0, _useLink.enableUseLink)(Explore.prototype);
@@ -95,8 +95,8 @@ class HybridSearch extends _base.default {
95
95
  }
96
96
 
97
97
  // configuration //
98
- useLink(fn) {
99
- this._answer.useLink(fn);
98
+ useLink(fn, options) {
99
+ this._answer.useLink(fn, options);
100
100
  return this;
101
101
  }
102
102
 
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.UseLinkMixin = void 0;
7
+ exports.enableUseLink = enableUseLink;
8
+ var _commons = require("@miso.ai/commons");
9
+ function enableUseLink(prototype) {
10
+ (0, _commons.mixin)(prototype, UseLinkMixin.prototype);
11
+ }
12
+ class UseLinkMixin {
13
+ useLink(fn) {
14
+ let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
15
+ if (typeof fn !== 'function' && fn !== false) {
16
+ throw new Error('useLink(fn) expects fn to be a function or false');
17
+ }
18
+ this._linkFn = fn ? [fn, options] : false;
19
+ return this;
20
+ }
21
+ _submitToPage() {
22
+ let args = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
23
+ if (!this._linkFn) {
24
+ return;
25
+ }
26
+ // TODO: we want a submit event
27
+ const url = this._getSubmitUrl(args);
28
+ const [_, options = {}] = this._linkFn;
29
+ if (options.open === false) {
30
+ window.location.href = url;
31
+ } else {
32
+ const target = options.target || '_blank';
33
+ const windowFeatures = options.windowFeatures || '';
34
+ window.open(url, target, windowFeatures);
35
+ }
36
+ }
37
+ _getSubmitUrl(args) {
38
+ if (!this._linkFn) {
39
+ throw new Error('useLink(fn) must be called before _getSubmitUrl()');
40
+ }
41
+ return this._linkFn[0](args.q);
42
+ }
43
+ }
44
+ exports.UseLinkMixin = UseLinkMixin;
package/package.json CHANGED
@@ -26,7 +26,7 @@
26
26
  "url": "https://github.com/MisoAI/miso-client-js-sdk/issues"
27
27
  },
28
28
  "dependencies": {
29
- "@miso.ai/commons": "1.11.0-beta.11"
29
+ "@miso.ai/commons": "1.11.0-beta.12"
30
30
  },
31
- "version": "1.11.0-beta.11"
31
+ "version": "1.11.0-beta.12"
32
32
  }
package/src/version.js CHANGED
@@ -1 +1 @@
1
- export default '1.11.0-beta.11';
1
+ export default '1.11.0-beta.12';
@@ -6,6 +6,7 @@ import { SearchBoxLayout, TextLayout, ListLayout, TypewriterLayout, FeedbackLayo
6
6
  import { processData as processAffiliationData } from '../affiliation/index.js';
7
7
  import { mergeRolesOptions } from './options.js';
8
8
  import { writeAnswerStageToMeta, mergeInteraction } from './processors.js';
9
+ import { enableUseLink } from './use-link.js';
9
10
 
10
11
  const DEFAULT_API_OPTIONS = Object.freeze({
11
12
  ...Workflow.DEFAULT_API_OPTIONS,
@@ -80,15 +81,6 @@ export default class AnswerBasedWorkflow extends Workflow {
80
81
  ];
81
82
  }
82
83
 
83
- // configuration //
84
- useLink(fn) {
85
- if (typeof fn !== 'function' && fn !== false) {
86
- throw new Error('useLink(fn) expects fn to be a function or false');
87
- }
88
- this._linkFn = fn;
89
- return this;
90
- }
91
-
92
84
  // lifecycle //
93
85
  restart() {
94
86
  // clear question id from previous session
@@ -154,7 +146,7 @@ export default class AnswerBasedWorkflow extends Workflow {
154
146
 
155
147
  _query(args = {}) {
156
148
  if (this._linkFn) {
157
- this._submit(args);
149
+ this._submitToPage(args);
158
150
  return;
159
151
  }
160
152
  // start a new session
@@ -168,15 +160,6 @@ export default class AnswerBasedWorkflow extends Workflow {
168
160
  this._request({ payload });
169
161
  }
170
162
 
171
- _submit(args) {
172
- if (!this._linkFn) {
173
- return;
174
- }
175
- // TODO: we want a submit event, but only with linkFn
176
- const url = this._linkFn(args.q);
177
- window.open(url, '_blank');
178
- }
179
-
180
163
  _writeQuestionSourceToSession(args) {
181
164
  this.session.meta.question_source = args.qs || ORGANIC_QUESTION_SOURCE; // might be null, not undefined
182
165
  }
@@ -294,6 +277,8 @@ export default class AnswerBasedWorkflow extends Workflow {
294
277
 
295
278
  }
296
279
 
280
+ enableUseLink(AnswerBasedWorkflow.prototype);
281
+
297
282
  Object.assign(AnswerBasedWorkflow, {
298
283
  DEFAULT_API_OPTIONS,
299
284
  DEFAULT_AUTOCOMPLETE_OPTIONS,
@@ -4,6 +4,7 @@ import { fields } from '../actor/index.js';
4
4
  import { ROLE, EVENT_TYPE } from '../constants.js';
5
5
  import { ListLayout, SearchBoxLayout } from '../layout/index.js';
6
6
  import { mergeRolesOptions } from './options.js';
7
+ import { enableUseLink, UseLinkMixin } from './use-link.js';
7
8
 
8
9
  const DEFAULT_API_OPTIONS = Object.freeze({
9
10
  ...Workflow.DEFAULT_API_OPTIONS,
@@ -61,7 +62,7 @@ export default class Explore extends Workflow {
61
62
  this._unsubscribes = [
62
63
  ...this._unsubscribes,
63
64
  this._views.get(ROLE.RELATED_QUESTIONS).on('click', event => this._handleRelatedQuestionClick(event)),
64
- this._hub.on(fields.query(), args => this._submit(args)),
65
+ this._hub.on(fields.query(), args => this._query(args)),
65
66
  ];
66
67
  }
67
68
 
@@ -81,18 +82,10 @@ export default class Explore extends Workflow {
81
82
  return super.useApi(options);
82
83
  }
83
84
 
84
- useLink(fn) {
85
- if (typeof fn !== 'function' && fn !== false) {
86
- throw new Error('useLink(fn) expects fn to be a function or false');
87
- }
88
- this._linkFn = fn;
89
- return this;
90
- }
91
-
92
85
  // lifecycle //
93
86
  start({ relatedQuestions = true } = {}) {
94
87
  if (this._linkFn === undefined) {
95
- throw new Error('Define link mapping function before calling start()');
88
+ throw new Error('Must define link mapping function with useLink(fn) before calling start()');
96
89
  }
97
90
  // in explore workflow, start() triggers query
98
91
  // TODO: we should still make the query lifecycle
@@ -113,12 +106,17 @@ export default class Explore extends Workflow {
113
106
 
114
107
  _defaultProcessData(data) {
115
108
  data = super._defaultProcessData(data);
116
- let { value } = data;
117
- if (!value) {
109
+ data = this._addUrlToRelatedQuestions(data);
110
+ return data;
111
+ }
112
+
113
+ _addUrlToRelatedQuestions(data) {
114
+ const { value } = data;
115
+ if (!value || !value.related_questions) {
118
116
  return data;
119
117
  }
120
- // patch value with links
121
- const related_questions = value.related_questions.map(this._linkFn ? (text => ({ text, url: this._getAnswersUrl(text, true) })) : (text => ({ text })));
118
+ const linkFn = this._linkFn && this._linkFn[0];
119
+ const related_questions = value.related_questions.map(linkFn ? (text => ({ text, url: this._getSubmitUrl({ q: text }, { generated: true }) })) : (text => ({ text })));
122
120
  return {
123
121
  ...data,
124
122
  value: {
@@ -139,19 +137,12 @@ export default class Explore extends Workflow {
139
137
  this._hub.update(fields.query(), args);
140
138
  }
141
139
 
142
- _submit({ q } = {}) {
143
- if (!this._linkFn) {
144
- return;
145
- }
146
- const url = this._getAnswersUrl(q);
147
- window.open(url, '_blank');
140
+ _query(args) {
141
+ this._submitToPage(args);
148
142
  }
149
143
 
150
- _getAnswersUrl(text, generated = false) {
151
- if (!this._linkFn) {
152
- return;
153
- }
154
- const url = this._linkFn(text);
144
+ _getSubmitUrl(args, { generated = false } = {}) {
145
+ let url = UseLinkMixin.prototype._getSubmitUrl.call(this, args);
155
146
  if (!generated || !this._productId) {
156
147
  return url;
157
148
  }
@@ -159,3 +150,5 @@ export default class Explore extends Workflow {
159
150
  }
160
151
 
161
152
  }
153
+
154
+ enableUseLink(Explore.prototype);
@@ -111,8 +111,8 @@ export default class HybridSearch extends Workflow {
111
111
  }
112
112
 
113
113
  // configuration //
114
- useLink(fn) {
115
- this._answer.useLink(fn);
114
+ useLink(fn, options) {
115
+ this._answer.useLink(fn, options);
116
116
  return this;
117
117
  }
118
118
 
@@ -0,0 +1,40 @@
1
+ import { mixin } from '@miso.ai/commons';
2
+
3
+ export function enableUseLink(prototype) {
4
+ mixin(prototype, UseLinkMixin.prototype);
5
+ }
6
+
7
+ export class UseLinkMixin {
8
+
9
+ useLink(fn, options = {}) {
10
+ if (typeof fn !== 'function' && fn !== false) {
11
+ throw new Error('useLink(fn) expects fn to be a function or false');
12
+ }
13
+ this._linkFn = fn ? [fn, options] : false;
14
+ return this;
15
+ }
16
+
17
+ _submitToPage(args = {}) {
18
+ if (!this._linkFn) {
19
+ return;
20
+ }
21
+ // TODO: we want a submit event
22
+ const url = this._getSubmitUrl(args);
23
+ const [_, options = {}] = this._linkFn;
24
+ if (options.open === false) {
25
+ window.location.href = url;
26
+ } else {
27
+ const target = options.target || '_blank';
28
+ const windowFeatures = options.windowFeatures || '';
29
+ window.open(url, target, windowFeatures);
30
+ }
31
+ }
32
+
33
+ _getSubmitUrl(args) {
34
+ if (!this._linkFn) {
35
+ throw new Error('useLink(fn) must be called before _getSubmitUrl()');
36
+ }
37
+ return this._linkFn[0](args.q);
38
+ }
39
+
40
+ }