Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Comment thread
OEvgeny marked this conversation as resolved.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified __tests__/html2/part-grouping/copilot.dark.html.snap-9.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified __tests__/html2/part-grouping/copilot.html.snap-9.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified __tests__/html2/part-grouping/fluent.dark.html.snap-1.png
Comment thread
OEvgeny marked this conversation as resolved.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified __tests__/html2/part-grouping/fluent.dark.html.snap-2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified __tests__/html2/part-grouping/fluent.dark.html.snap-3.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified __tests__/html2/part-grouping/fluent.dark.html.snap-4.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified __tests__/html2/part-grouping/fluent.dark.html.snap-5.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified __tests__/html2/part-grouping/fluent.dark.html.snap-6.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified __tests__/html2/part-grouping/fluent.dark.html.snap-7.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified __tests__/html2/part-grouping/fluent.dark.html.snap-8.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified __tests__/html2/part-grouping/fluent.dark.html.snap-9.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified __tests__/html2/part-grouping/fluent.html.snap-1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified __tests__/html2/part-grouping/fluent.html.snap-2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified __tests__/html2/part-grouping/fluent.html.snap-3.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified __tests__/html2/part-grouping/fluent.html.snap-4.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified __tests__/html2/part-grouping/fluent.html.snap-5.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified __tests__/html2/part-grouping/fluent.html.snap-6.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified __tests__/html2/part-grouping/fluent.html.snap-7.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified __tests__/html2/part-grouping/fluent.html.snap-8.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified __tests__/html2/part-grouping/fluent.html.snap-9.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
10 changes: 10 additions & 0 deletions __tests__/html2/part-grouping/folded.copilot.dark.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<!doctype html>
<html>
<head>
<title>Part grouping folded (copilot) (dark)</title>
<script>
location = './folded.skip?variant=copilot&fluent-theme=dark';
</script>
</head>
<body></body>
</html>
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
10 changes: 10 additions & 0 deletions __tests__/html2/part-grouping/folded.copilot.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<!doctype html>
<html>
<head>
<title>Part grouping folded (copilot)</title>
<script>
location = './folded.skip?variant=copilot';
</script>
</head>
<body></body>
</html>
369 changes: 369 additions & 0 deletions __tests__/html2/part-grouping/folded.skip.html
Comment thread
OEvgeny marked this conversation as resolved.

Large diffs are not rendered by default.

Binary file modified __tests__/html2/part-grouping/index.html.snap-9.png
Comment thread
OEvgeny marked this conversation as resolved.
Binary file modified __tests__/html2/part-grouping/keyboard.html.snap-1.png
Binary file modified __tests__/html2/part-grouping/keyboard.html.snap-10.png
Binary file modified __tests__/html2/part-grouping/keyboard.html.snap-11.png
Binary file modified __tests__/html2/part-grouping/keyboard.html.snap-12.png
Binary file modified __tests__/html2/part-grouping/keyboard.html.snap-13.png
Binary file modified __tests__/html2/part-grouping/keyboard.html.snap-14.png
Binary file modified __tests__/html2/part-grouping/keyboard.html.snap-15.png
Binary file modified __tests__/html2/part-grouping/keyboard.html.snap-16.png
Binary file modified __tests__/html2/part-grouping/keyboard.html.snap-2.png
Binary file modified __tests__/html2/part-grouping/keyboard.html.snap-3.png
Binary file modified __tests__/html2/part-grouping/keyboard.html.snap-4.png
Binary file modified __tests__/html2/part-grouping/keyboard.html.snap-5.png
Binary file modified __tests__/html2/part-grouping/keyboard.html.snap-6.png
Binary file modified __tests__/html2/part-grouping/keyboard.html.snap-7.png
Binary file modified __tests__/html2/part-grouping/keyboard.html.snap-8.png
Binary file modified __tests__/html2/part-grouping/keyboard.html.snap-9.png
Binary file modified __tests__/html2/part-grouping/navigation.html.snap-1.png
Binary file modified __tests__/html2/part-grouping/navigation.html.snap-10.png
Binary file modified __tests__/html2/part-grouping/navigation.html.snap-11.png
Binary file modified __tests__/html2/part-grouping/navigation.html.snap-12.png
Binary file modified __tests__/html2/part-grouping/navigation.html.snap-13.png
Binary file modified __tests__/html2/part-grouping/navigation.html.snap-14.png
Binary file modified __tests__/html2/part-grouping/navigation.html.snap-15.png
Binary file modified __tests__/html2/part-grouping/navigation.html.snap-16.png
Binary file modified __tests__/html2/part-grouping/navigation.html.snap-17.png
Binary file modified __tests__/html2/part-grouping/navigation.html.snap-18.png
Binary file modified __tests__/html2/part-grouping/navigation.html.snap-19.png
Binary file modified __tests__/html2/part-grouping/navigation.html.snap-2.png
Binary file modified __tests__/html2/part-grouping/navigation.html.snap-20.png
Binary file modified __tests__/html2/part-grouping/navigation.html.snap-21.png
Binary file modified __tests__/html2/part-grouping/navigation.html.snap-22.png
Binary file modified __tests__/html2/part-grouping/navigation.html.snap-23.png
Binary file modified __tests__/html2/part-grouping/navigation.html.snap-24.png
Binary file modified __tests__/html2/part-grouping/navigation.html.snap-25.png
Binary file modified __tests__/html2/part-grouping/navigation.html.snap-26.png
Binary file modified __tests__/html2/part-grouping/navigation.html.snap-3.png
Binary file modified __tests__/html2/part-grouping/navigation.html.snap-4.png
Binary file modified __tests__/html2/part-grouping/navigation.html.snap-5.png
Binary file modified __tests__/html2/part-grouping/navigation.html.snap-6.png
Binary file modified __tests__/html2/part-grouping/navigation.html.snap-7.png
Binary file modified __tests__/html2/part-grouping/navigation.html.snap-8.png
Binary file modified __tests__/html2/part-grouping/navigation.html.snap-9.png
Binary file modified __tests__/html2/part-grouping/position.html.snap-1.png
Binary file modified __tests__/html2/part-grouping/position.html.snap-2.png
Binary file modified __tests__/html2/part-grouping/position.html.snap-3.png
Binary file modified __tests__/html2/part-grouping/position.html.snap-4.png
Binary file modified __tests__/html2/part-grouping/position.html.snap-5.png
Binary file modified __tests__/html2/part-grouping/position.html.snap-6.png
Binary file modified __tests__/html2/part-grouping/position.html.snap-7.png
Binary file modified __tests__/html2/part-grouping/position.html.snap-8.png
Binary file modified __tests__/html2/part-grouping/status.html.snap-2.png
Binary file modified __tests__/html2/part-grouping/status.html.snap-4.png
Binary file modified __tests__/html2/part-grouping/status.html.snap-5.png
Binary file modified __tests__/html2/part-grouping/status.html.snap-7.png
Binary file modified __tests__/html2/part-grouping/status.html.snap-8.png
Binary file modified __tests__/html2/part-grouping/status.html.snap-9.png
Original file line number Diff line number Diff line change
Expand Up @@ -64,3 +64,13 @@
visibility 0s linear 0s;
visibility: unset;
}

:global(.webchat) .collapsible-grouping__list {
display: grid;
gap: 0;
margin-block-end: calc(var(--webchat--collapsible-grouping__list--gap, var(--webchat__padding--regular)) * -1);

> * {
margin-block-end: var(--webchat--collapsible-grouping__list--gap, var(--webchat__padding--regular));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import { useStyles } from '@msinternal/botframework-webchat-styles/react';
import { reactNode, validateProps } from '@msinternal/botframework-webchat-react-valibot';
import cx from 'classnames';
import React, { memo } from 'react';
import { any, object, optional, pipe, readonly, string, type InferInput } from 'valibot';

import styles from './CollapsibleGrouping.module.css';

const collapsibleGroupingListPropsSchema = pipe(
object({
children: optional(reactNode()),
className: optional(string()),
tag: optional(any())
}),
readonly()
);

type CollapsibleGroupingListProps = InferInput<typeof collapsibleGroupingListPropsSchema>;

const CollapsibleGroupingList = (props: CollapsibleGroupingListProps) => {
const { className, children, tag: Tag = 'div' } = validateProps(collapsibleGroupingListPropsSchema, props);
const classNames = useStyles(styles);

return <Tag className={cx(classNames['collapsible-grouping__list'], className)}>{children}</Tag>;
};

CollapsibleGroupingList.displayName = 'CollapsibleGroupingList';

export default memo(CollapsibleGroupingList);
export { collapsibleGroupingListPropsSchema, type CollapsibleGroupingListProps };
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
:global(.webchat) .part-grouping-activity {
.part-grouping-activity__activities {
gap: 0;
padding-block: 0 var(--webchat__padding--regular);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ import {
import { android } from '../../../../../Utils/detectBrowser';
import isZeroOrPositive from '../../../../../Utils/isZeroOrPositive';
import CollapsibleGrouping from '../CollapsibleGrouping';
import CollapsibleGroupingList from '../CollapsibleGroupingList';
import CollapsibleGroupingTitle from '../CollapsibleGroupingTitle';
import usePartGroupingLogicalGroup from './usePartGroupingLogicalGroup';

Expand Down Expand Up @@ -166,7 +167,7 @@ function PartGroupingActivity(props: PartGroupingActivityProps) {
const lastActivity = activities.at(-1);

const currentMessage = useMemo(
() => messages.toReversed().find(message => message.creativeWorkStatus === 'Incomplete') || lastMessage,
() => messages.find(message => message.creativeWorkStatus === 'Incomplete') || lastMessage,
Comment thread
OEvgeny marked this conversation as resolved.
[messages, lastMessage]
);

Expand All @@ -185,21 +186,33 @@ function PartGroupingActivity(props: PartGroupingActivityProps) {
[messages]
);

const currentGroupStatus = currentMessage?.creativeWorkStatus || defaultWorkStatus;

/**
* The idea behind group header is that it displays the state of the entire group:
* - We start by determining if the group should display a status (i.e., if any message in the group has a creativeWorkStatus).
* - If there is a status to display we display it.
* - For the title we check if the current group status is 'Incomplete'.
* - If it is 'Incomplete', we show the abstract of the first message with 'Incomplete' status.
* - If not, we fall back to a default title.
*/
const groupHeader = useMemo(
() => (
<Fragment>
{defaultWorkStatus && (
<StackedLayoutMessageStatus
className={classNames['part-grouping-activity__message-status']}
creativeWorkStatus={currentMessage?.creativeWorkStatus ?? defaultWorkStatus}
creativeWorkStatus={currentGroupStatus}
/>
)}
<CollapsibleGroupingTitle>
{currentMessage?.abstract || localize('COLLAPSIBLE_GROUPING_TITLE')}
{currentGroupStatus === 'Incomplete'
? currentMessage?.abstract || localize('COLLAPSIBLE_GROUPING_TITLE')
: localize('COLLAPSIBLE_GROUPING_TITLE')}
</CollapsibleGroupingTitle>
</Fragment>
),
[classNames, currentMessage?.abstract, currentMessage?.creativeWorkStatus, defaultWorkStatus, localize]
[classNames, currentGroupStatus, currentMessage?.abstract, defaultWorkStatus, localize]
);

return (
Expand All @@ -223,9 +236,12 @@ function PartGroupingActivity(props: PartGroupingActivityProps) {
isOpen={isGroupOpen}
onToggle={setIsGroupOpen}
>
<TranscriptActivityList className={classNames['part-grouping-activity__activities']}>
<CollapsibleGroupingList
className={classNames['part-grouping-activity__activities']}
tag={TranscriptActivityList}
>
{children}
</TranscriptActivityList>
</CollapsibleGroupingList>
</CollapsibleGrouping>
</StackedLayoutMain>
{renderActivityStatus && <StackedLayoutStatus>{renderActivityStatus({ hideTimestamp })}</StackedLayoutStatus>}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { useStyles } from '@msinternal/botframework-webchat-styles/react';
import cx from 'classnames';
import React, { forwardRef, type HTMLAttributes } from 'react';
import React, { forwardRef, memo, type HTMLAttributes } from 'react';

import styles from './TranscriptFocus.module.css';

Expand All @@ -18,5 +18,5 @@ const TranscriptActivityList = forwardRef<HTMLDivElement, TranscriptActivityList

TranscriptActivityList.displayName = 'TranscriptActivityList';

export default TranscriptActivityList;
export default memo(TranscriptActivityList);
export { type TranscriptActivityListProps };
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@
.transcript-focus-area__content {
display: grid;
grid-template-areas: 'content';
min-height: 0;
min-width: 0;

> * {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -339,7 +339,7 @@
}

:global(.stacked-layout .collapsible-grouping__content .part-grouping-activity__activities) {
gap: var(--webchat-spacingVerticalS);
--webchat--collapsible-grouping__list--gap: var(--webchat-spacingVerticalS);
padding: var(--webchat-spacingVerticalL) var(--webchat-spacingHorizontalL);
}

Expand Down Expand Up @@ -561,6 +561,7 @@
--webchat-part-grouping__bubble--box-shadow: var(--webchat-shadow4);

:global(.stacked-layout .transcript-focus-area__activity-list) {
--webchat--collapsible-grouping__list--gap: var(--webchat-spacingVerticalXS);
padding: var(--webchat-spacingVerticalNone) var(--webchat-spacingHorizontalNone);
gap: var(--webchat-spacingVerticalXS);
}
Expand Down Expand Up @@ -739,7 +740,7 @@
}

:global(.stacked-layout .transcript-focus-area__activity-list) {
gap: var(--webchat-spacingVerticalL);
--webchat--collapsible-grouping__list--gap: var(--webchat-spacingVerticalL);
}

:global(.webchat__bubble:not(.webchat__bubble--from-user)::after) {
Expand Down Expand Up @@ -861,7 +862,7 @@
}

:global(.stacked-layout .transcript-focus-area__activity-list) {
gap: var(--webchat-spacingVerticalS);
--webchat--collapsible-grouping__list--gap: var(--webchat-spacingVerticalS);
padding: var(--webchat-spacingVerticalM) var(--webchat-spacingHorizontalM);
}

Expand All @@ -870,6 +871,73 @@
padding-block: var(--webchat-spacingVerticalM);
padding-inline: var(--webchat-spacingHorizontalL);
}

:global(.collapsible-grouping__content) {
height: unset;
opacity: unset;
visibility: unset;
}

:global(.collapsible-grouping__list) > * {
interpolate-size: allow-keywords;
transition:
margin calc(var(--webchat__transition-duration) / 2) var(--webchat__transition-easing),
height calc(var(--webchat__transition-duration) / 2) var(--webchat__transition-easing);
}

:global(.collapsible-grouping__content--open .collapsible-grouping__list) > * {
/* We use animation so we can reset needed properties immediately upon switching classes */
animation: collapsible-grouping__fade-in var(--webchat__transition-duration)
calc(var(--webchat__transition-duration) / 4) var(--webchat__transition-easing) both;
height: auto;
transition:
margin var(--webchat__transition-duration) var(--webchat__transition-easing),
height var(--webchat__transition-duration) var(--webchat__transition-easing);
}

:global(.collapsible-grouping__content:not(.collapsible-grouping__content--open)) {
/* We use animation so we can reset needed properties immediately upon switching classes */
animation: collapsible-grouping__fade-in var(--webchat__transition-duration) var(--webchat__transition-duration)
var(--webchat__transition-easing) both;
}

:global(.collapsible-grouping__content:not(.collapsible-grouping__content--open) .collapsible-grouping__list) {
padding: var(--webchat-spacingVerticalNone) var(--webchat-spacingHorizontalNone);

> *:not(:has(:global(.stacked-layout__message-status--incomplete))) {
height: 0;
margin: 0;
visibility: hidden;
overflow: clip;
}

> *:has(:global(.stacked-layout__message-status--incomplete)) {
/* We use animation so we can reset needed properties immediately upon switching classes */
animation: collapsible-grouping__fade-in var(--webchat__transition-duration) var(--webchat__transition-duration)
var(--webchat__transition-easing) both;
pointer-events: none;

:global(.stacked-layout__message-status--incomplete),
:global(.collapsible-content__chevron) {
visibility: hidden;
}
}

&:has(:global(.stacked-layout__message-status--incomplete)) {
padding: var(--webchat-spacingVerticalNone) var(--webchat-spacingHorizontalNone);
transform: translate(-4px, -20px);
margin-block-end: calc(-20px - var(--webchat--collapsible-grouping__list--gap));
}
}
}
/* #endregion */
}

@keyframes collapsible-grouping__fade-in {
0% {
opacity: 0;
}
100% {
opacity: 1;
}
}
Loading