@miso.ai/client-sdk-ui 1.14.0-beta.2 → 1.14.0-beta.4

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 (54) hide show
  1. package/dist/cjs/asset/svgs.js +4 -2
  2. package/dist/cjs/constants.js +2 -0
  3. package/dist/cjs/defaults/ask/index.js +2 -1
  4. package/dist/cjs/defaults/ask/templates.js +2 -1
  5. package/dist/cjs/defaults/hybrid-search/index.js +2 -1
  6. package/dist/cjs/defaults/hybrid-search/templates.js +2 -1
  7. package/dist/cjs/defaults/index.js +2 -1
  8. package/dist/cjs/defaults.js +107 -10
  9. package/dist/cjs/element/container/index.js +14 -0
  10. package/dist/cjs/element/container/miso-message-item.js +91 -0
  11. package/dist/cjs/element/container/miso-thread-item.js +91 -0
  12. package/dist/cjs/element/index.js +2 -1
  13. package/dist/cjs/element/role/index.js +7 -0
  14. package/dist/cjs/element/role/miso-delete.js +20 -0
  15. package/dist/cjs/layout/button/button.js +45 -5
  16. package/dist/cjs/layout/button/checkbox.js +2 -1
  17. package/dist/cjs/layout/container/item-container.js +99 -0
  18. package/dist/cjs/layout/index.js +14 -0
  19. package/dist/cjs/layout/input/search-box.js +9 -4
  20. package/dist/cjs/layout/list/collection.js +21 -4
  21. package/dist/cjs/layout/list/messages.js +261 -224
  22. package/dist/cjs/layout/list/threads.js +106 -150
  23. package/dist/cjs/layout/templates.js +98 -38
  24. package/dist/cjs/layout/text/question.js +71 -0
  25. package/dist/cjs/layout/text/typewriter/index.js +15 -21
  26. package/dist/cjs/plugin.js +6 -3
  27. package/dist/cjs/util/dom.js +21 -0
  28. package/dist/cjs/util/notify.js +74 -0
  29. package/dist/cjs/version.js +1 -1
  30. package/package.json +3 -3
  31. package/src/CLAUDE.md +7 -2
  32. package/src/asset/svgs.js +3 -1
  33. package/src/constants.js +2 -0
  34. package/src/defaults.js +75 -5
  35. package/src/element/container/index.js +2 -0
  36. package/src/element/container/miso-message-item.js +94 -0
  37. package/src/element/container/miso-thread-item.js +94 -0
  38. package/src/element/role/index.js +1 -0
  39. package/src/element/role/miso-delete.js +16 -0
  40. package/src/layout/button/button.js +40 -4
  41. package/src/layout/button/checkbox.js +2 -1
  42. package/src/layout/container/item-container.js +99 -0
  43. package/src/layout/index.js +2 -0
  44. package/src/layout/input/search-box.js +4 -2
  45. package/src/layout/list/collection.js +22 -5
  46. package/src/layout/list/messages.js +231 -201
  47. package/src/layout/list/threads.js +107 -128
  48. package/src/layout/templates.js +100 -38
  49. package/src/layout/text/question.js +58 -0
  50. package/src/layout/text/typewriter/index.js +11 -15
  51. package/src/plugin.js +3 -2
  52. package/src/util/dom.js +16 -0
  53. package/src/util/notify.js +68 -0
  54. package/src/version.js +1 -1
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _constants = require("../../constants.js");
8
+ var _container = _interopRequireDefault(require("./container.js"));
9
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
10
+ const TYPE = _constants.LAYOUT_TYPE.ITEM_CONTAINER;
11
+
12
+ /**
13
+ * The container layout of a collection's item subworkflow (a thread of the
14
+ * thread list, a message of the conversation panel): the standard container
15
+ * duties (status attributes, banner, trackings), plus the item-level
16
+ * behaviors — currently the context menu (vertical dots + popup).
17
+ *
18
+ * The menu is handled by contract, not rendered here: the item template
19
+ * supplies the markup (e.g. the threads layout's threadMenuBlock), marking
20
+ * the toggle button `data-role="item-menu-button"` and the popup
21
+ * `data-role="item-menu"`, and this layout drives their open/close behavior
22
+ * — toggle on the button; any other click on the item (a menu action
23
+ * included) closes it, and so does a click outside the item, which is also
24
+ * how opening one item's menu closes another's. The menu contents are
25
+ * typically role elements binding to the item workflow (e.g. the thread
26
+ * item's `<miso-rename>`/`<miso-delete>` buttons), so the actions stay the
27
+ * workflow's own controls. Collection shells treat clicks carrying the
28
+ * menu data-roles as item-internal (e.g. the threads layout does not
29
+ * select); an item template without menu markup simply has nothing to
30
+ * drive. Ownership is guarded: the layout only ever drives its own item's
31
+ * menu — a menu or click inside a nested container element is that
32
+ * container's own layout's — so the layout is inert on the list panel
33
+ * itself, whose options bag it shares with the items.
34
+ */
35
+ class ItemContainerLayout extends _container.default {
36
+ static get type() {
37
+ return TYPE;
38
+ }
39
+ initialize(view) {
40
+ this._unsubscribes.push(view.proxyElement.on('click', event => this._handleClick(event)));
41
+ if (typeof document !== 'undefined') {
42
+ const onDocumentClick = event => {
43
+ const element = this._element;
44
+ if (element && !element.contains(event.target)) {
45
+ this._closeMenu();
46
+ }
47
+ };
48
+ document.addEventListener('click', onDocumentClick);
49
+ this._unsubscribes.push(() => document.removeEventListener('click', onDocumentClick));
50
+ }
51
+ }
52
+
53
+ // menu //
54
+ _handleClick(event) {
55
+ // only left click
56
+ if (event.button !== 0) {
57
+ return;
58
+ }
59
+ // a click inside a nested container element belongs to that
60
+ // container's own layout (this layout may also host the list panel,
61
+ // whose subtree holds the items)
62
+ if (!this._owns(event.target)) {
63
+ return;
64
+ }
65
+ if (event.target.closest(`[data-role="item-menu-button"]`)) {
66
+ this._toggleMenu();
67
+ return;
68
+ }
69
+ // any other click on the item — a menu action included — closes the menu
70
+ this._closeMenu();
71
+ }
72
+ _getMenu() {
73
+ const menu = this._element && this._element.querySelector(`[data-role="item-menu"]`);
74
+ // only its own item's menu: one found inside a nested container
75
+ // element is that container's own layout's to drive
76
+ return menu && this._owns(menu) ? menu : undefined;
77
+ }
78
+ _owns(node) {
79
+ for (let el = node; el && el !== this._element; el = el.parentElement) {
80
+ if (el.isContainer) {
81
+ return false;
82
+ }
83
+ }
84
+ return true;
85
+ }
86
+ _toggleMenu() {
87
+ const menu = this._getMenu();
88
+ if (menu) {
89
+ menu.hidden = !menu.hidden;
90
+ }
91
+ }
92
+ _closeMenu() {
93
+ const menu = this._getMenu();
94
+ if (menu && !menu.hidden) {
95
+ menu.hidden = true;
96
+ }
97
+ }
98
+ }
99
+ exports.default = ItemContainerLayout;
@@ -81,6 +81,12 @@ Object.defineProperty(exports, "HorizontalLayout", {
81
81
  return _horizontal.default;
82
82
  }
83
83
  });
84
+ Object.defineProperty(exports, "ItemContainerLayout", {
85
+ enumerable: true,
86
+ get: function () {
87
+ return _itemContainer.default;
88
+ }
89
+ });
84
90
  Object.defineProperty(exports, "ListLayout", {
85
91
  enumerable: true,
86
92
  get: function () {
@@ -105,6 +111,12 @@ Object.defineProperty(exports, "OptionListLayout", {
105
111
  return _optionList.default;
106
112
  }
107
113
  });
114
+ Object.defineProperty(exports, "QuestionLayout", {
115
+ enumerable: true,
116
+ get: function () {
117
+ return _question.default;
118
+ }
119
+ });
108
120
  Object.defineProperty(exports, "SearchBoxLayout", {
109
121
  enumerable: true,
110
122
  get: function () {
@@ -143,6 +155,7 @@ Object.defineProperty(exports, "TypewriterLayout", {
143
155
  });
144
156
  var _template = _interopRequireDefault(require("./template.js"));
145
157
  var _container = _interopRequireDefault(require("./container/container.js"));
158
+ var _itemContainer = _interopRequireDefault(require("./container/item-container.js"));
146
159
  var _error = _interopRequireDefault(require("./error/error.js"));
147
160
  var _banner = _interopRequireDefault(require("./banner/banner.js"));
148
161
  var _collection = _interopRequireDefault(require("./list/collection.js"));
@@ -157,6 +170,7 @@ var _searchBox = _interopRequireDefault(require("./input/search-box.js"));
157
170
  var _optionList = _interopRequireDefault(require("./input/option-list.js"));
158
171
  var _feedback = _interopRequireDefault(require("./radio/feedback.js"));
159
172
  var _text = _interopRequireDefault(require("./text/text.js"));
173
+ var _question = _interopRequireDefault(require("./text/question.js"));
160
174
  var _index = _interopRequireDefault(require("./text/typewriter/index.js"));
161
175
  var _affiliation = _interopRequireDefault(require("./affiliation/affiliation.js"));
162
176
  var _facets = _interopRequireDefault(require("./input/facets.js"));
@@ -406,10 +406,15 @@ class SearchBoxLayout extends _template.default {
406
406
  return;
407
407
  }
408
408
  this.close();
409
- // TODO: q -> value
410
- this._view.hub.update(_clientSdkWorkflow.fields.query(), {
411
- q: value
412
- });
409
+ // a view event, like the buttons: the workflow routes it into its query
410
+ // flow (or its own submission semantics), the layout stays hands-off
411
+ const {
412
+ session
413
+ } = this._view._state || {};
414
+ this._view._emit('submit', Object.freeze({
415
+ session,
416
+ value
417
+ }));
413
418
  if (this.options.clearOnSubmit) {
414
419
  const inputElement = this._element && this._element.querySelector(`[data-role="input"]`);
415
420
  if (inputElement) {
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
+ exports.hasStatusTemplate = hasStatusTemplate;
7
8
  var _constants = require("../../constants.js");
8
9
  var _template = _interopRequireDefault(require("../template.js"));
9
10
  var _trackable = require("../mixin/trackable.js");
@@ -24,7 +25,13 @@ function root(layout, state) {
24
25
  } = state;
25
26
  const roleAttr = role ? ` data-role="${role}"` : '';
26
27
  const itemTypeAttr = options.itemType ? ` data-item-type="${options.itemType}"` : '';
27
- return `<div class="${className} ${status}"${roleAttr}${itemTypeAttr}>${status === _constants.STATUS.READY ? templates[status](layout, state) : ''}${templates.trigger(layout, state)}${templates.loading(layout, state)}</div>`;
28
+ return `<div class="${className} ${status}"${roleAttr}${itemTypeAttr}>${hasStatusTemplate(status) ? templates[status](layout, state) : ''}${templates.trigger(layout, state)}${templates.loading(layout, state)}</div>`;
29
+ }
30
+
31
+ // the statuses with a content template of their own: the list at ready, the
32
+ // error notice at erroneous
33
+ function hasStatusTemplate(status) {
34
+ return status === _constants.STATUS.READY || status === _constants.STATUS.ERRONEOUS;
28
35
  }
29
36
  function ready(layout, state) {
30
37
  const {
@@ -96,13 +103,16 @@ const DEFAULT_TEMPLATES = Object.freeze({
96
103
  image: _templates.image,
97
104
  question: _templates.question,
98
105
  thread: _templates.thread,
106
+ threadBody: _templates.threadBody,
99
107
  threadMenuBlock: _templates.threadMenuBlock,
100
108
  message: _templates.message,
101
- messageQuestionBlock: _templates.messageQuestionBlock,
102
- messageAnswerBlock: _templates.messageAnswerBlock,
109
+ messageBody: _templates.messageBody,
103
110
  root,
104
111
  [_constants.STATUS.READY]: ready,
105
112
  empty: () => ``,
113
+ // no notice by default: the ask/search UIs present errors in a section of
114
+ // their own (<miso-error>); list layouts that stand alone supply one
115
+ [_constants.STATUS.ERRONEOUS]: () => ``,
106
116
  body,
107
117
  list,
108
118
  ordered: false,
@@ -208,7 +218,14 @@ class CollectionLayout extends _template.default {
208
218
  return element.querySelector('[data-role="list"]');
209
219
  }
210
220
  _getItemElements(element) {
211
- return element ? Array.from(element.querySelectorAll(`[data-role="item"]`)) : [];
221
+ if (!element) {
222
+ return [];
223
+ }
224
+ // an item may host a nested collection with items of its own (a
225
+ // conversation message and its source cards): ours are only those whose
226
+ // closest list is this layout's own list
227
+ const listElement = this._getListElement(element);
228
+ return Array.from((listElement || element).querySelectorAll(`[data-role="item"]`)).filter(item => item.closest(`[data-role="list"]`) === listElement);
212
229
  }
213
230
  _onClick(event) {
214
231
  const element = event.target.closest(`[data-role="item"]`);