@coveo/quantic 3.43.0 → 3.43.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 (17) hide show
  1. package/force-app/main/default/lwc/quanticGeneratedAnswer/__tests__/quanticGeneratedAnswer.test.js +145 -60
  2. package/force-app/main/default/lwc/quanticGeneratedAnswer/e2e/fixture-agent.ts +3 -3
  3. package/force-app/main/default/lwc/quanticGeneratedAnswer/e2e/fixture.ts +12 -9
  4. package/force-app/main/default/lwc/quanticGeneratedAnswer/e2e/pageObject.ts +5 -8
  5. package/force-app/main/default/lwc/quanticGeneratedAnswer/quanticGeneratedAnswer.js +12 -108
  6. package/force-app/main/default/lwc/quanticGeneratedAnswer/templates/generatedAnswer.html +8 -47
  7. package/force-app/main/default/lwc/quanticGeneratedAnswerContent/__tests__/quanticGeneratedAnswerContent.test.js +27 -0
  8. package/force-app/main/default/lwc/quanticGeneratedAnswerContent/quanticGeneratedAnswerContent.js +8 -1
  9. package/force-app/main/default/lwc/quanticGeneratedAnswerThread/quanticGeneratedAnswerThread.css +16 -4
  10. package/force-app/main/default/lwc/quanticGeneratedAnswerThread/quanticGeneratedAnswerThread.html +12 -16
  11. package/force-app/main/default/lwc/quanticThreadItem/quanticThreadItem.css +29 -11
  12. package/force-app/main/default/lwc/quanticThreadItem/quanticThreadItem.html +11 -15
  13. package/force-app/main/default/staticresources/coveoheadless/case-assist/headless.js +2 -2
  14. package/force-app/main/default/staticresources/coveoheadless/headless.js +2 -2
  15. package/force-app/main/default/staticresources/coveoheadless/insight/headless.js +2 -2
  16. package/force-app/main/default/staticresources/coveoheadless/recommendation/headless.js +2 -2
  17. package/package.json +3 -2
@@ -33,63 +33,24 @@
33
33
  data-testid="generated-answer__answer"
34
34
  class={generatedAnswerClass}
35
35
  >
36
- <c-quantic-generated-answer-content
36
+ <c-quantic-generated-answer-body
37
37
  engine-id={engineId}
38
- answer-id={answerId}
39
- answer-content-format={answerContentFormat}
40
- answer={answer}
41
- is-streaming={isStreaming}
38
+ generated-answer={initialAnswer}
39
+ disable-citation-anchoring={disableCitationAnchoring}
40
+ onquantic__generatedanswerlike={handleLike}
41
+ onquantic__generatedanswerdislike={handleDislike}
42
+ onquantic__citationhover={handleCitationHover}
42
43
  onquantic__answercontentupdated={handleAnswerContentUpdated}
43
- >
44
- </c-quantic-generated-answer-content>
44
+ ></c-quantic-generated-answer-body>
45
45
  </div>
46
46
  <div class="slds-grid slds-grid_vertical">
47
- <template lwc:if={shouldDisplayCitations}>
48
- <div class="slds-size_1-of-1 slds-var-m-top_x-small">
49
- <c-quantic-source-citations
50
- engine-id={engineId}
51
- data-testid="generated-answer__citations"
52
- citations={citations}
53
- citation-hover-handler={logCitationHover}
54
- disable-citation-anchoring={disableCitationAnchoring}
55
- ></c-quantic-source-citations>
56
- </div>
57
- </template>
58
- <template lwc:if={shouldDisplayActions}>
59
- <div class="slds-size_1-of-1 slds-grid slds-grid_vertical-align-center slds-var-m-top_x-small slds-grid_align-start">
60
- <div
61
- data-testid="generated-answer__actions"
62
- class="slds-grid slds-grid_vertical-align-center"
63
- >
64
- <c-quantic-feedback
65
- state={feedbackState}
66
- onquantic__like={handleLike}
67
- onquantic__dislike={handleDislike}
68
- like-icon-name="utility:like"
69
- like-label={labels.thisAnswerWasHelpful}
70
- dislike-icon-name="utility:dislike"
71
- dislike-label={labels.thisAnswerWasNotHelpful}
72
- size="x-small"
73
- question=""
74
- hide-explain-why-button
75
- hide-labels
76
- ></c-quantic-feedback>
77
- <c-quantic-generated-answer-copy-to-clipboard
78
- data-testid="generated-answer__copy-to-clipboard"
79
- answer={answer}
80
- size="x-small"
81
- class="slds-var-m-horizontal_xx-small"
82
- ></c-quantic-generated-answer-copy-to-clipboard>
83
- </div>
84
- </div>
85
- </template>
86
47
  <template lwc:if={isAnswerCollapsed}>
87
48
  <div class="slds-grid slds-size_1-of-1 slds-wrap slds-grid_vertical-align-center slds-var-m-top_x-small">
88
49
  <div class="slds-grid slds-wrap slds-grid_vertical-align-center">
89
50
  <template lwc:if={isStreaming}>
90
51
  <div
91
52
  data-testid="generated-answer__collapse-generating-message"
92
- class="generated-answer__collapse-generating-message slds-var-m-right_small"
53
+ class="generated-answer__collapse-generating-message slds-var-m-right_small slds-var-m-bottom_medium"
93
54
  >
94
55
  {labels.generatingAnswer}...
95
56
  </div>
@@ -5,6 +5,8 @@ import {createElement} from 'lwc';
5
5
  import {loadMarkdownDependencies} from 'c/quanticUtils';
6
6
  import * as mockHeadlessLoader from 'c/quanticHeadlessLoader';
7
7
 
8
+ const mockAnswerHeight = 250;
9
+
8
10
  jest.mock('c/quanticHeadlessLoader');
9
11
  jest.mock('c/quanticUtils', () => ({
10
12
  loadMarkdownDependencies: jest.fn(
@@ -17,6 +19,7 @@ jest.mock('c/quanticUtils', () => ({
17
19
  LinkUtils: {
18
20
  bindAnalyticsToLink: jest.fn(() => jest.fn()),
19
21
  },
22
+ getAbsoluteHeight: jest.fn(() => mockAnswerHeight),
20
23
  }));
21
24
 
22
25
  const mockMarkedUse = jest.fn();
@@ -417,4 +420,28 @@ describe('c-quantic-generated-answer-content', () => {
417
420
  });
418
421
  });
419
422
  });
423
+
424
+ describe('the quantic__answercontentupdated event', () => {
425
+ beforeEach(() => {
426
+ mockSuccessfulHeadlessInitialization();
427
+ prepareHeadlessState();
428
+ });
429
+
430
+ it('should dispatch the event with the measured height when the markdown content is updated', async () => {
431
+ const element = createTestComponent({
432
+ ...defaultOptions,
433
+ answerContentFormat: 'text/markdown',
434
+ answer: 'Hello, world!',
435
+ });
436
+ const handler = jest.fn();
437
+ element.addEventListener('quantic__answercontentupdated', handler);
438
+ await flushPromises();
439
+
440
+ expect(handler).toHaveBeenCalledTimes(1);
441
+ const event = handler.mock.calls[0][0];
442
+ expect(event.detail).toEqual({height: mockAnswerHeight});
443
+ expect(event.bubbles).toBe(true);
444
+ expect(event.composed).toBe(true);
445
+ });
446
+ });
420
447
  });
@@ -7,6 +7,7 @@ import {
7
7
  transformMarkdownToHtml,
8
8
  loadMarkdownDependencies,
9
9
  LinkUtils,
10
+ getAbsoluteHeight,
10
11
  } from 'c/quanticUtils';
11
12
  import {LightningElement, api} from 'lwc';
12
13
  // @ts-ignore
@@ -171,7 +172,13 @@ export default class QuanticGeneratedAnswerContent extends LightningElement {
171
172
  else {
172
173
  answerContainer.textContent = this.answer;
173
174
  }
174
- this.dispatchEvent(new CustomEvent('quantic__answercontentupdated'));
175
+ this.dispatchEvent(
176
+ new CustomEvent('quantic__answercontentupdated', {
177
+ bubbles: true,
178
+ composed: true,
179
+ detail: {height: getAbsoluteHeight(answerContainer)},
180
+ })
181
+ );
175
182
  }
176
183
 
177
184
  /**
@@ -1,6 +1,19 @@
1
- .generated-answer-thread__dot-column,
2
- .generated-answer-thread__line-column {
1
+ .generated-answer-thread__grid {
2
+ display: grid;
3
+ grid-template-columns: 10px 1fr;
4
+ grid-template-rows: auto 1fr;
5
+ column-gap: var(--lwc-spacingXSmall, 8px);
6
+ }
7
+
8
+ .generated-answer-thread__timeline {
9
+ grid-row: 1 / -1;
10
+ align-self: stretch;
11
+ }
12
+
13
+ .generated-answer-thread__dot-column {
3
14
  width: 10px;
15
+ height: 1lh;
16
+ margin-block: var(--lwc-spacingXxSmall, 4px);
4
17
  }
5
18
 
6
19
  .generated-answer-thread__dot {
@@ -12,9 +25,8 @@
12
25
 
13
26
  .generated-answer-thread__connector {
14
27
  position: relative;
28
+ flex: 1;
15
29
  width: 1px;
16
- height: 100%;
17
- min-height: 12px;
18
30
  background-color: var(--lwc-colorBorder, #dddbda);
19
31
  }
20
32
 
@@ -11,16 +11,19 @@
11
11
  <ul class="generated-answer-thread">
12
12
  <template lwc:if={shouldCollapseOlderAnswers}>
13
13
  <li class="generated-answer-thread__show-previous">
14
- <div class="slds-grid slds-grid_vertical-align-center">
15
- <div
16
- class="slds-grid slds-grid_align-center slds-grid_vertical-align-center slds-shrink-none slds-m-right_x-small generated-answer-thread__dot-column"
17
- >
18
- <span
19
- class="generated-answer-thread__dot"
20
- data-testid="show-previous-dot"
21
- ></span>
14
+ <div class="generated-answer-thread__grid">
15
+ <div class="slds-grid slds-grid_vertical slds-grid_vertical-align-center generated-answer-thread__timeline">
16
+ <div
17
+ class="slds-grid slds-grid_align-center slds-grid_vertical-align-center generated-answer-thread__dot-column"
18
+ >
19
+ <span
20
+ class="generated-answer-thread__dot"
21
+ data-testid="show-previous-dot"
22
+ ></span>
23
+ </div>
24
+ <span class="generated-answer-thread__connector"></span>
22
25
  </div>
23
- <div>
26
+ <div class="slds-has-flexi-truncate">
24
27
  <button
25
28
  type="button"
26
29
  class="slds-button_reset slds-p-horizontal_x-small slds-p-vertical_xx-small generated-answer-thread__show-previous-button"
@@ -31,13 +34,6 @@
31
34
  </button>
32
35
  </div>
33
36
  </div>
34
- <div class="slds-grid">
35
- <div
36
- class="slds-grid slds-grid_align-center slds-shrink-none generated-answer-thread__line-column slds-m-right_x-small"
37
- >
38
- <span class="generated-answer-thread__connector"></span>
39
- </div>
40
- </div>
41
37
  </li>
42
38
  </template>
43
39
 
@@ -2,26 +2,28 @@
2
2
  list-style: none;
3
3
  }
4
4
 
5
- .thread-item__dot-column,
6
- .thread-item__line-column {
7
- width: 10px;
5
+ .thread-item__grid {
6
+ display: grid;
7
+ grid-template-columns: 10px 1fr;
8
+ grid-template-rows: auto 1fr;
9
+ column-gap: var(--lwc-spacingXSmall, 8px);
8
10
  }
9
11
 
10
- .thread-item__dot {
11
- height: 8px;
12
- width: 8px;
13
- border-radius: 50%;
14
- background-color: var(--lwc-colorBorder, #dddbda);
12
+ .thread-item__timeline {
13
+ grid-row: 1 / -1;
14
+ align-self: stretch;
15
15
  }
16
16
 
17
- .thread-item__dot--expanded {
18
- background-color: var(--lwc-colorTextDefault, #080707);
17
+ .thread-item__dot-column {
18
+ width: 10px;
19
+ height: 1lh;
20
+ margin-block: var(--lwc-spacingXxSmall, 4px);
19
21
  }
20
22
 
21
23
  .thread-item__line {
22
24
  position: relative;
25
+ flex: 1;
23
26
  width: 1px;
24
- height: 100%;
25
27
  background-color: var(--lwc-colorBorder, #dddbda);
26
28
  }
27
29
 
@@ -43,6 +45,22 @@
43
45
  bottom: -8px;
44
46
  }
45
47
 
48
+ .thread-item__content {
49
+ grid-column: 2;
50
+ grid-row: 2;
51
+ }
52
+
53
+ .thread-item__dot {
54
+ height: 8px;
55
+ width: 8px;
56
+ border-radius: 50%;
57
+ background-color: var(--lwc-colorBorder, #dddbda);
58
+ }
59
+
60
+ .thread-item__dot--expanded {
61
+ background-color: var(--lwc-colorTextDefault, #080707);
62
+ }
63
+
46
64
  .thread-item__clamped-text {
47
65
  display: -webkit-box;
48
66
  -webkit-line-clamp: 3;
@@ -1,10 +1,15 @@
1
1
  <template>
2
2
  <li class="thread-item">
3
- <div class="slds-grid slds-grid_vertical-align-center">
4
- <div
5
- class="slds-grid slds-grid_align-center slds-grid_vertical-align-center slds-shrink-none slds-m-right_x-small thread-item__dot-column"
6
- >
7
- <span class={dotClass} data-testid="thread-item-dot"></span>
3
+ <div class="thread-item__grid">
4
+ <div class="slds-grid slds-grid_vertical slds-grid_vertical-align-center thread-item__timeline">
5
+ <div
6
+ class="slds-grid slds-grid_align-center slds-grid_vertical-align-center thread-item__dot-column"
7
+ >
8
+ <span class={dotClass} data-testid="thread-item-dot"></span>
9
+ </div>
10
+ <template lwc:if={shouldDisplayLine}>
11
+ <span class="thread-item__line" data-testid="thread-item-line"></span>
12
+ </template>
8
13
  </div>
9
14
  <div class="slds-has-flexi-truncate">
10
15
  <template lwc:if={disableCollapse}>
@@ -25,18 +30,9 @@
25
30
  </button>
26
31
  </template>
27
32
  </div>
28
- </div>
29
- <div class="slds-grid">
30
- <div
31
- class="slds-grid slds-grid_align-center slds-shrink-none thread-item__line-column slds-m-right_x-small"
32
- >
33
- <template lwc:if={shouldDisplayLine}>
34
- <span class="thread-item__line" data-testid="thread-item-line"></span>
35
- </template>
36
- </div>
37
33
  <div
38
34
  id="thread-item-content"
39
- class="slds-col slds-p-left_x-small slds-p-vertical_xx-small"
35
+ class="slds-p-left_x-small slds-p-vertical_xx-small thread-item__content"
40
36
  data-testid="thread-item-content"
41
37
  >
42
38
  <div hidden={contentHidden}>