@miso.ai/client-sdk-ui 1.11.4-beta.1 → 1.11.4-beta.2

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 (87) hide show
  1. package/dist/cjs/actor/filters.js +57 -11
  2. package/dist/cjs/actor/tracker.js +1 -6
  3. package/dist/cjs/actor/view.js +6 -8
  4. package/dist/cjs/actor/views.js +10 -26
  5. package/dist/cjs/constants.js +12 -2
  6. package/dist/cjs/element/role/index.js +7 -0
  7. package/dist/cjs/element/role/miso-sort.js +20 -0
  8. package/dist/cjs/layout/affiliation/affiliation.js +1 -1
  9. package/dist/cjs/layout/container/container.js +2 -2
  10. package/dist/cjs/layout/index.js +7 -0
  11. package/dist/cjs/layout/input/facets.js +2 -2
  12. package/dist/cjs/layout/input/search-box.js +1 -1
  13. package/dist/cjs/layout/input/select.js +150 -0
  14. package/dist/cjs/layout/raf.js +2 -4
  15. package/dist/cjs/layout/trackable.js +3 -3
  16. package/dist/cjs/layout/triggerable.js +1 -1
  17. package/dist/cjs/util/trackers.js +2 -0
  18. package/dist/cjs/version.js +1 -1
  19. package/dist/cjs/workflow/answer-based.js +2 -2
  20. package/dist/cjs/workflow/ask.js +4 -1
  21. package/dist/cjs/workflow/base.js +4 -4
  22. package/dist/cjs/workflow/context.js +3 -3
  23. package/dist/cjs/workflow/explore.js +2 -2
  24. package/dist/cjs/workflow/hybrid-search-answer.js +9 -7
  25. package/dist/cjs/workflow/hybrid-search-results.js +18 -16
  26. package/dist/cjs/workflow/hybrid-search-views.js +5 -12
  27. package/dist/cjs/workflow/hybrid-search.js +2 -2
  28. package/dist/cjs/workflow/options/api.js +56 -0
  29. package/dist/cjs/workflow/options/configurable.js +49 -0
  30. package/dist/cjs/workflow/options/data-processor.js +23 -0
  31. package/dist/cjs/workflow/options/filters.js +18 -0
  32. package/dist/cjs/workflow/options/index.js +115 -0
  33. package/dist/cjs/workflow/options/interactions.js +44 -0
  34. package/dist/cjs/workflow/options/layouts.js +83 -0
  35. package/dist/cjs/workflow/options/options.js +154 -0
  36. package/dist/cjs/workflow/options/pagination.js +28 -0
  37. package/dist/cjs/workflow/options/roles.js +17 -0
  38. package/dist/cjs/workflow/options/trackers.js +39 -0
  39. package/dist/cjs/workflow/options/utils.js +33 -0
  40. package/dist/cjs/workflow/processors.js +39 -33
  41. package/dist/cjs/workflow/recommendation.js +2 -2
  42. package/dist/cjs/workflow/search-based.js +59 -22
  43. package/package.json +2 -2
  44. package/src/actor/filters.js +53 -12
  45. package/src/actor/tracker.js +1 -6
  46. package/src/actor/view.js +7 -8
  47. package/src/actor/views.js +9 -30
  48. package/src/constants.js +11 -0
  49. package/src/element/role/index.js +1 -0
  50. package/src/element/role/miso-sort.js +16 -0
  51. package/src/layout/affiliation/affiliation.js +1 -1
  52. package/src/layout/container/container.js +2 -2
  53. package/src/layout/index.js +1 -0
  54. package/src/layout/input/facets.js +3 -2
  55. package/src/layout/input/search-box.js +1 -1
  56. package/src/layout/input/select.js +142 -0
  57. package/src/layout/raf.js +2 -2
  58. package/src/layout/trackable.js +3 -3
  59. package/src/layout/triggerable.js +1 -1
  60. package/src/util/trackers.js +2 -0
  61. package/src/version.js +1 -1
  62. package/src/workflow/answer-based.js +1 -1
  63. package/src/workflow/ask.js +4 -1
  64. package/src/workflow/base.js +1 -1
  65. package/src/workflow/context.js +1 -1
  66. package/src/workflow/explore.js +1 -1
  67. package/src/workflow/hybrid-search-answer.js +8 -3
  68. package/src/workflow/hybrid-search-results.js +21 -7
  69. package/src/workflow/hybrid-search-views.js +4 -12
  70. package/src/workflow/hybrid-search.js +3 -3
  71. package/src/workflow/options/api.js +46 -0
  72. package/src/workflow/options/configurable.js +48 -0
  73. package/src/workflow/options/data-processor.js +15 -0
  74. package/src/workflow/options/filters.js +10 -0
  75. package/src/workflow/options/index.js +10 -0
  76. package/src/workflow/options/interactions.js +36 -0
  77. package/src/workflow/options/layouts.js +73 -0
  78. package/src/workflow/options/options.js +169 -0
  79. package/src/workflow/options/pagination.js +18 -0
  80. package/src/workflow/options/roles.js +12 -0
  81. package/src/workflow/options/trackers.js +32 -0
  82. package/src/workflow/options/utils.js +26 -0
  83. package/src/workflow/processors.js +30 -34
  84. package/src/workflow/recommendation.js +1 -1
  85. package/src/workflow/search-based.js +58 -13
  86. package/dist/cjs/workflow/options.js +0 -448
  87. package/src/workflow/options.js +0 -433
@@ -15,6 +15,30 @@ function mergeState() {
15
15
  facets: Object.freeze((0, _commons.trimObj)(Object.assign({}, state.facets, update.facets)))
16
16
  })));
17
17
  }
18
+ function optionsToState() {
19
+ let {
20
+ sort
21
+ } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
22
+ // TODO: facets
23
+ return (0, _commons.trimObj)({
24
+ facets: Object.freeze({}),
25
+ sort: sortOptionsToState(sort)
26
+ });
27
+ }
28
+ function sortOptionsToState(sort) {
29
+ if (!sort) {
30
+ return undefined;
31
+ }
32
+ const {
33
+ options = []
34
+ } = sort;
35
+ for (const option of options) {
36
+ if (option.default) {
37
+ return Object.freeze(option);
38
+ }
39
+ }
40
+ return Object.freeze(options[0]);
41
+ }
18
42
  class Filters {
19
43
  constructor(views) {
20
44
  let {
@@ -22,7 +46,6 @@ class Filters {
22
46
  } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
23
47
  this._views = views;
24
48
  this._hub = views._hub;
25
- this._states = this._initialStates = mergeState({}); // TODO: support custom initial states
26
49
  const error = this._error = this._error.bind(this);
27
50
  this._events = new _commons.EventEmitter({
28
51
  target: this,
@@ -31,13 +54,24 @@ class Filters {
31
54
  (0, _commons.defineValues)(this, {
32
55
  facets: new Facets(this, facetsOptions)
33
56
  });
57
+ this._unsubscribes = [views._options.on('filters', () => this._syncOptions())];
58
+ this._syncOptions();
59
+ this._states = undefined;
34
60
  }
35
- get states() {
36
- return this._states;
61
+ _syncOptions() {
62
+ const options = this._views._options.resolved.filters;
63
+ this._initialStates = optionsToState(options);
64
+ this.apply({
65
+ silent: true
66
+ });
67
+ }
68
+ _getStates() {
69
+ return this._states || this._initialStates;
37
70
  }
38
71
  update(updates) {
39
- const oldStates = this._states;
40
- const states = this._states = mergeState(Object.assign({}, this._states, updates));
72
+ const oldStates = this._getStates();
73
+ this._states = mergeState(Object.assign({}, oldStates, updates));
74
+ const states = this._getStates();
41
75
  this._events.emit('update', {
42
76
  updates,
43
77
  states,
@@ -45,21 +79,33 @@ class Filters {
45
79
  });
46
80
  }
47
81
  reset() {
48
- const oldStates = this._states;
49
- const states = this._states = this._initialStates;
82
+ const oldStates = this.states;
83
+ this._states = undefined;
84
+ const states = this._getStates();
50
85
  this._events.emit('reset', {
51
86
  states,
52
87
  oldStates
53
88
  });
54
89
  }
55
90
  apply() {
56
- this._hub.update(fields.filters(), this._states);
57
- this._events.emit('apply');
91
+ let {
92
+ silent = false
93
+ } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
94
+ const states = this._getStates();
95
+ this._hub.update(fields.filters(), states, {
96
+ silent
97
+ });
98
+ !silent && this._events.emit('apply');
58
99
  }
59
100
  _error(error) {
60
101
  this._views._error(error);
61
102
  }
62
- _destroy() {}
103
+ _destroy() {
104
+ for (const unsubscribe of this._unsubscribes) {
105
+ unsubscribe();
106
+ }
107
+ this._unsubscribes = [];
108
+ }
63
109
  }
64
110
  exports.default = Filters;
65
111
  class Facets {
@@ -92,7 +138,7 @@ class Facets {
92
138
  }
93
139
  }
94
140
  _select(field, value) {
95
- const values = this._options.multiple ? [...(this._filters._states.facets[field] || []), value] : [value];
141
+ const values = this._options.multivalued ? [...(this._filters._states.facets[field] || []), value] : [value];
96
142
  values.sort();
97
143
  this._filters.update({
98
144
  facets: {
@@ -17,20 +17,15 @@ class Tracker {
17
17
  let {
18
18
  hub,
19
19
  role,
20
- valueless = false,
21
- options
20
+ valueless = false
22
21
  } = _ref;
23
22
  this._hub = hub;
24
23
  this._role = role;
25
24
  this._valueless = !!valueless;
26
- this._options = options;
27
25
  // TODO: know item type
28
26
 
29
27
  this._states = new _states.default(this._getSessionId());
30
28
  }
31
- get options() {
32
- return typeof this._options === 'function' ? this._options() : this._options;
33
- }
34
29
  getState(item) {
35
30
  return this._states.getFullState(item);
36
31
  }
@@ -106,14 +106,16 @@ class ViewActor {
106
106
  } = this;
107
107
  this._tracker = new _tracker.default({
108
108
  hub,
109
- role,
110
- options: () => this._getTrackerOptions()
109
+ role
111
110
  });
112
111
  }
113
112
  return this._tracker;
114
113
  }
115
114
  get workflowOptions() {
116
- return this._views._getWorkflowOptions();
115
+ return this._views._options.resolved;
116
+ }
117
+ get trackerOptions() {
118
+ return this._views._getTrackerOptions(this.role);
117
119
  }
118
120
  get filters() {
119
121
  return this._views.filters;
@@ -195,10 +197,6 @@ class ViewActor {
195
197
  silent
196
198
  });
197
199
  }
198
- _getTrackerOptions() {
199
- // used by tracker to expose tracker options to layout
200
- return this._views._getTrackerOptions(this.role);
201
- }
202
200
  _sliceData(data) {
203
201
  const {
204
202
  value,
@@ -207,7 +205,7 @@ class ViewActor {
207
205
  } = data,
208
206
  rest = _objectWithoutPropertiesLoose(data, _excluded);
209
207
  const sliced = Object.assign({
210
- value: this._mapping(data),
208
+ value: this._mapping(data, this),
211
209
  status,
212
210
  data: value,
213
211
  meta
@@ -47,10 +47,7 @@ class ViewsActor {
47
47
  window.addEventListener('resize', syncSize);
48
48
  this._unsubscribes = [() => window.removeEventListener('resize', syncSize), hub.on(fields.data(), data => this.refresh({
49
49
  data
50
- })), options.on('autocomplete', () => this._syncAutocompleteOptions()), options.on('pagination', () => this._syncPaginationOptions()), options.on('trackers', () => this._syncTrackers()), options.on('layouts', () => this._syncLayouts())];
51
- this._syncAutocompleteOptions();
52
- this._syncPaginationOptions();
53
- this._syncTrackers();
50
+ })), options.on('layouts', () => this._syncLayouts())];
54
51
  this._syncLayouts();
55
52
  }
56
53
  get trackers() {
@@ -150,15 +147,17 @@ class ViewsActor {
150
147
  // TODO: try to omit if unchanged
151
148
  const fn = () => this._layoutFactory.create(name, Object.assign({}, options, {
152
149
  role,
153
- workflow: this._workflowName,
154
- workflowOptions: this._getWorkflowOptions()
150
+ workflow: this._workflowName
155
151
  }));
156
152
  if (role === _constants.ROLE.CONTAINER) {
157
153
  for (const view of this._containers.values()) {
158
154
  view.layout = fn();
159
155
  }
160
156
  } else {
161
- this.get(role).layout = fn();
157
+ const view = this.get(role);
158
+ if (view) {
159
+ view.layout = fn();
160
+ }
162
161
  }
163
162
  }
164
163
  }
@@ -171,12 +170,11 @@ class ViewsActor {
171
170
  const [name, options] = args;
172
171
  return this._layoutFactory.create(name, Object.assign({}, options, {
173
172
  role,
174
- workflow: this._workflowName,
175
- workflowOptions: this._getWorkflowOptions()
173
+ workflow: this._workflowName
176
174
  }));
177
175
  }
178
176
  get(role) {
179
- return this._views[role] || (this._views[role] = new _view.default(this, role));
177
+ return this._views[role];
180
178
  }
181
179
  get views() {
182
180
  return this._getViews(true);
@@ -219,11 +217,9 @@ class ViewsActor {
219
217
  _getData(data) {
220
218
  return data || this._hub.states[fields.data()];
221
219
  }
222
- _syncTrackers() {
223
- this._trackerOptions = this._options.resolved.trackers;
224
- }
225
220
  _getTrackerOptions(role) {
226
- return (0, _trackers.normalizeTrackerOptions)(this._trackerOptions && this._trackerOptions[role] || false);
221
+ const allTrackerOptions = this._options.resolved.trackers;
222
+ return (0, _trackers.normalizeTrackerOptions)(allTrackerOptions && allTrackerOptions[role] || false);
227
223
  }
228
224
  _getContainerTracker() {
229
225
  if (!this._containerTracker) {
@@ -238,18 +234,6 @@ class ViewsActor {
238
234
  }
239
235
  return this._containerTracker;
240
236
  }
241
- _syncAutocompleteOptions() {
242
- this._autocompleteOptions = this._options.resolved.autocomplete;
243
- }
244
- _syncPaginationOptions() {
245
- this._paginationOptions = this._options.resolved.pagination;
246
- }
247
- _getWorkflowOptions() {
248
- return (0, _commons.trimObj)({
249
- autocomplete: this._autocompleteOptions,
250
- pagination: this._paginationOptions
251
- });
252
- }
253
237
  _error(e) {
254
238
  // TODO: hub trigger error event
255
239
  console.error(e);
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.TRACKING_STATUS = exports.TRACKING_EVENT_TYPES = exports.STATUS = exports.ROLE = exports.PERFORMANCE_EVENT_TYPES = exports.ORGANIC_QUESTION_SOURCE = exports.EVENT_TYPE = exports.DEFAULT_UNIT_ID = exports.ATTR_DATA_MISO_UNIT_ID = exports.ATTR_DATA_MISO_PRODUCT_ID = void 0;
6
+ exports.WORKFLOW_CONFIGURABLE = exports.TRACKING_STATUS = exports.TRACKING_EVENT_TYPES = exports.STATUS = exports.ROLE = exports.PERFORMANCE_EVENT_TYPES = exports.ORGANIC_QUESTION_SOURCE = exports.EVENT_TYPE = exports.DEFAULT_UNIT_ID = exports.ATTR_DATA_MISO_UNIT_ID = exports.ATTR_DATA_MISO_PRODUCT_ID = void 0;
7
7
  exports.isDataRole = isDataRole;
8
8
  exports.isPerformanceEventType = isPerformanceEventType;
9
9
  exports.isProductRole = isProductRole;
@@ -34,6 +34,7 @@ const ROLE = exports.ROLE = Object.freeze({
34
34
  FACETS: 'facets',
35
35
  TOTAL: 'total',
36
36
  MORE: 'more',
37
+ SORT: 'sort',
37
38
  ERROR: 'error'
38
39
  });
39
40
  const DATA_ROLE_SET = new Set([ROLE.PRODUCTS, ROLE.CATEGORIES, ROLE.ATTRIBUTES, ROLE.RESULTS, ROLE.ITEMS, ROLE.QUESTION, ROLE.ANSWER, ROLE.SOURCES, ROLE.RELATED_RESOURCES, ROLE.QUERY_SUGGESTIONS, ROLE.RELATED_QUESTIONS, ROLE.AFFILIATION, ROLE.FACETS, ROLE.TOTAL]);
@@ -81,4 +82,13 @@ function validateTrackingStatus(value) {
81
82
  if (value !== TRACKING_STATUS.UNTRACKED && value !== TRACKING_STATUS.TRACKING && value !== TRACKING_STATUS.TRIGGERED) {
82
83
  throw new Error(`Unrecognized tracking status: ${value}`);
83
84
  }
84
- }
85
+ }
86
+ const WORKFLOW_CONFIGURABLE = exports.WORKFLOW_CONFIGURABLE = Object.freeze({
87
+ API: 'api',
88
+ LAYOUTS: 'layouts',
89
+ DATA_PROCESSOR: 'dataProcessor',
90
+ TRACKERS: 'trackers',
91
+ INTERACTIONS: 'interactions',
92
+ FILTERS: 'filters',
93
+ PAGINATION: 'pagination'
94
+ });
@@ -87,6 +87,12 @@ Object.defineProperty(exports, "MisoResultsElement", {
87
87
  return _misoResults.default;
88
88
  }
89
89
  });
90
+ Object.defineProperty(exports, "MisoSortElement", {
91
+ enumerable: true,
92
+ get: function () {
93
+ return _misoSort.default;
94
+ }
95
+ });
90
96
  Object.defineProperty(exports, "MisoSourcesElement", {
91
97
  enumerable: true,
92
98
  get: function () {
@@ -121,5 +127,6 @@ var _misoKeywords = _interopRequireDefault(require("./miso-keywords.js"));
121
127
  var _misoTotal = _interopRequireDefault(require("./miso-total.js"));
122
128
  var _misoFacets = _interopRequireDefault(require("./miso-facets.js"));
123
129
  var _misoMore = _interopRequireDefault(require("./miso-more.js"));
130
+ var _misoSort = _interopRequireDefault(require("./miso-sort.js"));
124
131
  var _misoError = _interopRequireDefault(require("./miso-error.js"));
125
132
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _misoComponent = _interopRequireDefault(require("./miso-component.js"));
8
+ var _constants = require("../../constants.js");
9
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
10
+ class MisoSortElement extends _misoComponent.default {
11
+ constructor() {
12
+ super({
13
+ role: _constants.ROLE.SORT
14
+ });
15
+ }
16
+ static get tagName() {
17
+ return 'miso-sort';
18
+ }
19
+ }
20
+ exports.default = MisoSortElement;
@@ -203,7 +203,7 @@ class AffiliationLayout extends _collection.default {
203
203
  super.initialize(view);
204
204
  const {
205
205
  viewable: options
206
- } = this._view.tracker.options || {};
206
+ } = this._view.trackerOptions || {};
207
207
  this._viewable = new _commons.CarouselItemViewabilityObserver(this._onViewable.bind(this), options);
208
208
  }
209
209
 
@@ -106,7 +106,7 @@ class ContainerLayout extends _raf.default {
106
106
  _trackImpression() {
107
107
  const {
108
108
  impression: options
109
- } = this._view.tracker.options || {};
109
+ } = this._view.trackerOptions || {};
110
110
  if (!options) {
111
111
  return;
112
112
  }
@@ -119,7 +119,7 @@ class ContainerLayout extends _raf.default {
119
119
  async _trackViewable(element) {
120
120
  const {
121
121
  viewable: options
122
- } = this._view.tracker.options || {};
122
+ } = this._view.trackerOptions || {};
123
123
  if (!options) {
124
124
  return;
125
125
  }
@@ -81,6 +81,12 @@ Object.defineProperty(exports, "SearchBoxLayout", {
81
81
  return _searchBox.default;
82
82
  }
83
83
  });
84
+ Object.defineProperty(exports, "SelectLayout", {
85
+ enumerable: true,
86
+ get: function () {
87
+ return _select.default;
88
+ }
89
+ });
84
90
  Object.defineProperty(exports, "TemplateBasedLayout", {
85
91
  enumerable: true,
86
92
  get: function () {
@@ -114,5 +120,6 @@ var _text = _interopRequireDefault(require("./text/text.js"));
114
120
  var _index = _interopRequireDefault(require("./text/typewriter/index.js"));
115
121
  var _affiliation = _interopRequireDefault(require("./affiliation/affiliation.js"));
116
122
  var _facets = _interopRequireDefault(require("./input/facets.js"));
123
+ var _select = _interopRequireDefault(require("./input/select.js"));
117
124
  var _moreButton = _interopRequireDefault(require("./button/more-button.js"));
118
125
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = void 0;
7
7
  var _commons = require("@miso.ai/commons");
8
+ var _index = require("../../actor/index.js");
8
9
  var _template = _interopRequireDefault(require("../template.js"));
9
10
  var _bindings = _interopRequireDefault(require("../../util/bindings.js"));
10
11
  const _excluded = ["className", "templates"];
@@ -150,7 +151,6 @@ class FacetsLayout extends _template.default {
150
151
  initialize(view) {
151
152
  const {
152
153
  proxyElement,
153
- hub,
154
154
  filters
155
155
  } = view;
156
156
  this._unsubscribes = [...this._unsubscribes, proxyElement.on('click', e => this._handleClick(e)), filters.on('update', e => this._updateSelections(e)), filters.on('reset', () => this._syncSelections())];
@@ -166,7 +166,7 @@ class FacetsLayout extends _template.default {
166
166
  this._clearBindings();
167
167
  }
168
168
  _syncSelections() {
169
- const selectedValues = getSelectedValues(this._view.filters.states.facets);
169
+ const selectedValues = getSelectedValues(this._view.hub.states[_index.fields.filters()].facets);
170
170
  for (const {
171
171
  value: {
172
172
  field,
@@ -396,7 +396,7 @@ class SearchBoxLayout extends _template.default {
396
396
  _trackSubmit(value) {
397
397
  const {
398
398
  [_constants.EVENT_TYPE.SUBMIT]: options
399
- } = this._view.tracker.options || {};
399
+ } = this._view.trackerOptions || {};
400
400
  if (!options) {
401
401
  return;
402
402
  }
@@ -0,0 +1,150 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _commons = require("@miso.ai/commons");
8
+ var _template = _interopRequireDefault(require("../template.js"));
9
+ var _trackable = require("../trackable.js");
10
+ const _excluded = ["className", "templates"];
11
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
12
+ 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; }
13
+ const TYPE = 'select';
14
+ const DEFAULT_CLASSNAME = 'miso-select';
15
+ function root(layout, state) {
16
+ const {
17
+ className,
18
+ role,
19
+ templates
20
+ } = layout;
21
+ const roleAttr = role ? `data-role="${role}"` : '';
22
+ const values = layout._getItems(state);
23
+ const selected = values.find(value => value.selected) || values[0];
24
+ return `
25
+ <div class="${className}" ${roleAttr}>
26
+ ${templates.button(layout, selected)}
27
+ ${templates.options(layout, state)}
28
+ </div>`;
29
+ }
30
+ function button(layout, value) {
31
+ const {
32
+ className,
33
+ templates
34
+ } = layout;
35
+ return `<button class="${className}__button" data-role="button" tabindex="0">${templates.text(layout, value)}</button>`;
36
+ }
37
+ function options(layout, state) {
38
+ const {
39
+ className,
40
+ templates
41
+ } = layout;
42
+ const values = layout._getItems(state);
43
+ return `<ul class="${className}__options">${values.map((value, index) => templates.option(layout, value, {
44
+ index
45
+ })).join('')}</ul>`;
46
+ }
47
+ function option(layout, value) {
48
+ const {
49
+ className,
50
+ templates
51
+ } = layout;
52
+ const selectedClass = value.selected ? 'selected' : '';
53
+ return `<li class="${className}__option ${selectedClass}" data-role="option" tabindex="0">${templates.text(layout, value)}</li>`;
54
+ }
55
+ function text(layout, value) {
56
+ return (0, _commons.escapeHtml)(value && value.text && (0, _commons.kebabOrSnakeToHuman)(value.text) || value || '');
57
+ }
58
+ const DEFAULT_TEMPLATES = Object.freeze({
59
+ root,
60
+ button,
61
+ options,
62
+ option,
63
+ text
64
+ });
65
+ class SelectLayout extends _template.default {
66
+ static get type() {
67
+ return TYPE;
68
+ }
69
+ static get defaultTemplates() {
70
+ return DEFAULT_TEMPLATES;
71
+ }
72
+ static get defaultClassName() {
73
+ return DEFAULT_CLASSNAME;
74
+ }
75
+ constructor() {
76
+ let _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
77
+ let {
78
+ className = DEFAULT_CLASSNAME,
79
+ templates
80
+ } = _ref,
81
+ options = _objectWithoutPropertiesLoose(_ref, _excluded);
82
+ super(Object.assign({
83
+ className,
84
+ templates: Object.assign({}, DEFAULT_TEMPLATES, templates)
85
+ }, options));
86
+ this._initTrackable();
87
+ }
88
+ initialize(view) {
89
+ const {
90
+ proxyElement
91
+ } = view;
92
+ this._unsubscribes = [...this._unsubscribes, proxyElement.on('click', e => this._handleClick(e))];
93
+ }
94
+ _afterRender(element, state) {
95
+ this._syncBindings(element, state);
96
+ }
97
+ _unrender() {
98
+ this._clearBindings();
99
+ }
100
+ _getItems(state) {
101
+ return state.value || [];
102
+ }
103
+ _getOptionsElement(element) {
104
+ return element.querySelector(`[data-role="options"]`);
105
+ }
106
+ _getItemElements(element) {
107
+ return element ? Array.from(element.querySelectorAll(`[data-role="option"]`)) : [];
108
+ }
109
+ _handleClick(event) {
110
+ if (!this._element) {
111
+ return;
112
+ }
113
+ for (let element = event.target; element && element !== this._element; element = element.parentElement) {
114
+ const {
115
+ role
116
+ } = element.dataset;
117
+ switch (role) {
118
+ case 'button':
119
+ this._toggle();
120
+ break;
121
+ case 'option':
122
+ const binding = this._bindings.get(element);
123
+ this._select(binding && binding.value);
124
+ break;
125
+ }
126
+ }
127
+ }
128
+ _toggle() {
129
+ if (!this._element) {
130
+ return;
131
+ }
132
+ const child = this._element.children[0];
133
+ child && child.classList.toggle('open');
134
+ }
135
+ async _select(value) {
136
+ if (!value) {
137
+ return;
138
+ }
139
+ // TODO: reflect selection right away
140
+ this._view._events.emit('select', {
141
+ value
142
+ });
143
+ }
144
+ destroy() {
145
+ this._destroyTrackable();
146
+ super.destroy();
147
+ }
148
+ }
149
+ exports.default = SelectLayout;
150
+ (0, _trackable.makeTrackable)(SelectLayout.prototype);
@@ -5,21 +5,19 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = void 0;
7
7
  var _commons = require("@miso.ai/commons");
8
- const _excluded = ["role", "workflow", "workflowOptions"];
8
+ const _excluded = ["role", "workflow"];
9
9
  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; }
10
10
  class RafLayout {
11
11
  constructor() {
12
12
  let _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
13
13
  let {
14
14
  role,
15
- workflow,
16
- workflowOptions
15
+ workflow
17
16
  } = _ref,
18
17
  options = _objectWithoutPropertiesLoose(_ref, _excluded);
19
18
  (0, _commons.defineValues)(this, {
20
19
  role,
21
20
  workflow,
22
- workflowOptions,
23
21
  options
24
22
  });
25
23
  this._unsubscribes = [];
@@ -56,7 +56,7 @@ class TrackableMixin {
56
56
  }
57
57
  const {
58
58
  impression: options
59
- } = this._view.tracker.options || {};
59
+ } = this._view.trackerOptions || {};
60
60
  if (!options) {
61
61
  return;
62
62
  }
@@ -80,7 +80,7 @@ class TrackableMixin {
80
80
  }
81
81
  const {
82
82
  viewable: options
83
- } = this._view.tracker.options || {};
83
+ } = this._view.trackerOptions || {};
84
84
  if (!options) {
85
85
  return;
86
86
  }
@@ -94,7 +94,7 @@ class TrackableMixin {
94
94
  _trackClick(event, binding) {
95
95
  const {
96
96
  click: options
97
- } = this._view.tracker.options || {};
97
+ } = this._view.trackerOptions || {};
98
98
  if ((0, _trackers.validateClick)(options, event, binding)) {
99
99
  this._view.tracker.click([binding.value]);
100
100
  }
@@ -19,7 +19,7 @@ class TriggerableMixin {
19
19
  if (!this.options.infiniteScroll) {
20
20
  return;
21
21
  }
22
- const workflowPaginationOptions = this.workflowOptions.pagination;
22
+ const workflowPaginationOptions = this._view.workflowOptions.pagination;
23
23
  if (!workflowPaginationOptions.active || workflowPaginationOptions.mode !== 'infiniteScroll') {
24
24
  return;
25
25
  }
@@ -8,6 +8,8 @@ exports.validateClick = validateClick;
8
8
  var _commons = require("@miso.ai/commons");
9
9
  const _excluded = ["impression", "viewable", "click"];
10
10
  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; }
11
+ // TODO: think about how to incorporate this with workflow options
12
+
11
13
  const DEFAULT_TRACKER_OPTIONS = Object.freeze({
12
14
  impression: Object.freeze({}),
13
15
  viewable: Object.freeze({
@@ -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.4-beta.1';
7
+ var _default = exports.default = '1.11.4-beta.2';
@@ -10,7 +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 _index3 = require("../affiliation/index.js");
13
- var _options = require("./options.js");
13
+ var _index4 = require("./options/index.js");
14
14
  var _processors = require("./processors.js");
15
15
  var _useLink = require("./use-link.js");
16
16
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
@@ -65,7 +65,7 @@ const DEFAULT_OPTIONS = Object.freeze(Object.assign({}, _base.default.DEFAULT_OP
65
65
  layouts: DEFAULT_LAYOUTS,
66
66
  trackers: DEFAULT_TRACKERS
67
67
  }));
68
- const ROLES_OPTIONS = (0, _options.mergeRolesOptions)(_base.default.ROLES_OPTIONS, {
68
+ const ROLES_OPTIONS = (0, _index4.mergeRolesOptions)(_base.default.ROLES_OPTIONS, {
69
69
  main: _constants.ROLE.ANSWER,
70
70
  members: Object.keys(DEFAULT_LAYOUTS)
71
71
  });