@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.
- package/dist/cjs/asset/svgs.js +4 -2
- package/dist/cjs/constants.js +2 -0
- package/dist/cjs/defaults/ask/index.js +2 -1
- package/dist/cjs/defaults/ask/templates.js +2 -1
- package/dist/cjs/defaults/hybrid-search/index.js +2 -1
- package/dist/cjs/defaults/hybrid-search/templates.js +2 -1
- package/dist/cjs/defaults/index.js +2 -1
- package/dist/cjs/defaults.js +107 -10
- package/dist/cjs/element/container/index.js +14 -0
- package/dist/cjs/element/container/miso-message-item.js +91 -0
- package/dist/cjs/element/container/miso-thread-item.js +91 -0
- package/dist/cjs/element/index.js +2 -1
- package/dist/cjs/element/role/index.js +7 -0
- package/dist/cjs/element/role/miso-delete.js +20 -0
- package/dist/cjs/layout/button/button.js +45 -5
- package/dist/cjs/layout/button/checkbox.js +2 -1
- package/dist/cjs/layout/container/item-container.js +99 -0
- package/dist/cjs/layout/index.js +14 -0
- package/dist/cjs/layout/input/search-box.js +9 -4
- package/dist/cjs/layout/list/collection.js +21 -4
- package/dist/cjs/layout/list/messages.js +261 -224
- package/dist/cjs/layout/list/threads.js +106 -150
- package/dist/cjs/layout/templates.js +98 -38
- package/dist/cjs/layout/text/question.js +71 -0
- package/dist/cjs/layout/text/typewriter/index.js +15 -21
- package/dist/cjs/plugin.js +6 -3
- package/dist/cjs/util/dom.js +21 -0
- package/dist/cjs/util/notify.js +74 -0
- package/dist/cjs/version.js +1 -1
- package/package.json +3 -3
- package/src/CLAUDE.md +7 -2
- package/src/asset/svgs.js +3 -1
- package/src/constants.js +2 -0
- package/src/defaults.js +75 -5
- package/src/element/container/index.js +2 -0
- package/src/element/container/miso-message-item.js +94 -0
- package/src/element/container/miso-thread-item.js +94 -0
- package/src/element/role/index.js +1 -0
- package/src/element/role/miso-delete.js +16 -0
- package/src/layout/button/button.js +40 -4
- package/src/layout/button/checkbox.js +2 -1
- package/src/layout/container/item-container.js +99 -0
- package/src/layout/index.js +2 -0
- package/src/layout/input/search-box.js +4 -2
- package/src/layout/list/collection.js +22 -5
- package/src/layout/list/messages.js +231 -201
- package/src/layout/list/threads.js +107 -128
- package/src/layout/templates.js +100 -38
- package/src/layout/text/question.js +58 -0
- package/src/layout/text/typewriter/index.js +11 -15
- package/src/plugin.js +3 -2
- package/src/util/dom.js +16 -0
- package/src/util/notify.js +68 -0
- 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;
|
package/dist/cjs/layout/index.js
CHANGED
|
@@ -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
|
-
//
|
|
410
|
-
|
|
411
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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"]`);
|