@box/threaded-annotations 4.2.1 → 4.3.0

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.
@@ -1 +1 @@
1
- import messages from"../esm/lib/messages.js";import{MentionContextProvider}from"../esm/lib/components/mention-component/mention-context.js";import{MessagesView}from"../esm/lib/components/messages-view/messages-view.js";import{MessageEditor}from"../esm/lib/components/message-editor/message-editor.js";import{TextButton}from"@box/blueprint-web";import{ArrowArchedRight}from"@box/blueprint-web-assets/icons/Fill";import clsx from"clsx";import{useCallback,useEffect,useState}from"react";import{useIntl}from"react-intl";import{jsx,jsxs}from"react/jsx-runtime";import '../styles/threaded-annotations.css';var threaded_annotations_module_default={threadedAnnotations:`_threadedAnnotations_14dbm_1`,messagesContainer:`_messagesContainer_14dbm_11`,editorContainer:`_editorContainer_14dbm_20`,editorContainerWithBorder:`_editorContainerWithBorder_14dbm_25`,removePaddingTop:`_removePaddingTop_14dbm_28`},ThreadedAnnotations=({messageEditorOptions,messagesViewOptions,onEditorOpen,onEditorClose,onAnnotationsClose,isReplyAllowed=!0,collaborationPopoverProps,getAvatarUrl,fetchCollaboratorState,fetchEmail})=>{let messageCount=messagesViewOptions.messages.length,isMessagesEmpty=messageCount===0,intl=useIntl(),[isOverflowing,setIsOverflowing]=useState(!1),[isReplyOpen,setIsReplyOpen]=useState(()=>messageCount===0);useEffect(()=>{messageCount===0&&setIsReplyOpen(!0)},[messageCount]);let handleEditorOpen=useCallback(()=>{isReplyAllowed&&(setIsReplyOpen(!0),onEditorOpen?.())},[onEditorOpen,isReplyAllowed]),handleEditorClose=useCallback(replyMode=>{if(isMessagesEmpty&&replyMode){onAnnotationsClose?.();return}setIsReplyOpen(!1),onEditorClose?.()},[onEditorClose,isMessagesEmpty,onAnnotationsClose]),handleOverflowChange=useCallback(overflowing=>{setIsOverflowing(overflowing)},[]);return jsx(MentionContextProvider,{value:{collaborationPopoverProps,getAvatarUrl,fetchCollaboratorState,fetchEmail},children:jsxs(`div`,{className:threaded_annotations_module_default.threadedAnnotations,children:[jsx(`div`,{className:clsx(threaded_annotations_module_default.messagesContainer,{[threaded_annotations_module_default.removePaddingTop]:isMessagesEmpty}),children:jsx(MessagesView,{...messagesViewOptions,onOverflowChange:handleOverflowChange})}),jsx(`div`,{className:clsx(threaded_annotations_module_default.editorContainer,{[threaded_annotations_module_default.removePaddingBottom]:!isReplyAllowed,[threaded_annotations_module_default.editorContainerWithBorder]:isOverflowing&&isReplyAllowed}),children:isReplyAllowed&&(isReplyOpen?jsx(MessageEditor,{...messageEditorOptions,messageCount,onCancel:handleEditorClose}):jsx(TextButton,{"aria-label":intl.formatMessage(messages.replyButtonAriaLabel),icon:ArrowArchedRight,onClick:handleEditorOpen,children:intl.formatMessage(messages.reply)}))})]})})};export{ThreadedAnnotations as t};
1
+ import messages from"../esm/lib/messages.js";import{MentionContextProvider}from"../esm/lib/components/mention-component/mention-context.js";import{MessagesView}from"../esm/lib/components/messages-view/messages-view.js";import{MessageEditor}from"../esm/lib/components/message-editor/message-editor.js";import{TextButton}from"@box/blueprint-web";import{ArrowArchedRight}from"@box/blueprint-web-assets/icons/Fill";import clsx from"clsx";import{useCallback,useEffect,useState}from"react";import{useIntl}from"react-intl";import{jsx,jsxs}from"react/jsx-runtime";import '../styles/threaded-annotations.css';var threaded_annotations_module_default={threadedAnnotations:`_threadedAnnotations_14dbm_1`,messagesContainer:`_messagesContainer_14dbm_11`,editorContainer:`_editorContainer_14dbm_20`,editorContainerWithBorder:`_editorContainerWithBorder_14dbm_25`,removePaddingTop:`_removePaddingTop_14dbm_28`},ThreadedAnnotations=({messageEditorOptions,messagesViewOptions,onEditorOpen,onEditorClose,onAnnotationsClose,isReplyAllowed=!0,collaborationPopoverProps,getAvatarUrl,fetchCollaboratorState,fetchEmail})=>{let messageCount=messagesViewOptions.messages.length,isMessagesEmpty=messageCount===0,intl=useIntl(),[isOverflowing,setIsOverflowing]=useState(!1),[isReplyOpen,setIsReplyOpen]=useState(()=>messageCount===0);useEffect(()=>{messageCount===0&&setIsReplyOpen(!0)},[messageCount]);let handleEditorOpen=useCallback(()=>{isReplyAllowed&&(setIsReplyOpen(!0),onEditorOpen?.())},[onEditorOpen,isReplyAllowed]),handleEditorClose=useCallback(replyMode=>{if(isMessagesEmpty&&replyMode){onAnnotationsClose?.();return}setIsReplyOpen(!1),onEditorClose?.()},[onEditorClose,isMessagesEmpty,onAnnotationsClose]),handleOverflowChange=useCallback(overflowing=>{setIsOverflowing(overflowing)},[]);return jsx(MentionContextProvider,{value:{collaborationPopoverProps,getAvatarUrl,fetchCollaboratorState,fetchEmail},children:jsxs(`div`,{className:threaded_annotations_module_default.threadedAnnotations,children:[jsx(`div`,{className:clsx(threaded_annotations_module_default.messagesContainer,{[threaded_annotations_module_default.removePaddingTop]:isMessagesEmpty}),children:jsx(MessagesView,{...messagesViewOptions,onOverflowChange:handleOverflowChange})}),jsx(`div`,{className:clsx(threaded_annotations_module_default.editorContainer,{[threaded_annotations_module_default.editorContainerWithBorder]:isOverflowing&&isReplyAllowed}),children:isReplyAllowed&&(isReplyOpen?jsx(MessageEditor,{...messageEditorOptions,messageCount,onCancel:handleEditorClose}):jsx(TextButton,{"aria-label":intl.formatMessage(messages.replyButtonAriaLabel),icon:ArrowArchedRight,onClick:handleEditorOpen,children:intl.formatMessage(messages.reply)}))})]})})};export{ThreadedAnnotations as t};
@@ -1 +1 @@
1
- import{t as MentionComponent}from"../../../../../../chunks/mention-component.js";import messages from"../messages.js";import{t as text_message_module_default}from"../../../../../../chunks/text-message.module.js";import"../constants.js";import{splitTextIntoSegments}from"./url-segments.js";import{getDocumentLength,truncateDocument}from"./truncate-document.js";import{Link,Text,TextButton}from"@box/blueprint-web";import{useState}from"react";import{useIntl}from"react-intl";import{jsx,jsxs}from"react/jsx-runtime";var renderMentionNode=({node,index,paragraphIndex})=>{let key=`mention-${node.attrs.mentionedUserId}-${paragraphIndex}-${index}`;return jsx(MentionComponent,{authorId:node.attrs.authorId,mentionedUserEmail:node.attrs.mentionedUserEmail,mentionedUserId:node.attrs.mentionedUserId,mentionedUserName:node.attrs.mentionedUserName,mentionId:node.attrs.mentionId},key)},handleMessageLinkClick=event=>{event.currentTarget.closest(`[data-thread-expandable]`)&&event.preventDefault()},renderTextNode=({node,index,paragraphIndex,intl})=>{let key=`text-${node.text.substring(0,20)}-${paragraphIndex}-${index}`,segments=splitTextIntoSegments(node.text);return jsx(Text,{"aria-label":intl.formatMessage(messages.textMessageAriaLabel),as:`span`,color:`textOnLightDefault`,variant:`bodyDefault`,children:segments.map((segment,segmentIndex)=>segment.type===`url`?jsx(Link,{href:segment.value,inheritFont:!0,rel:`noopener noreferrer`,target:`_blank`,onClick:handleMessageLinkClick,children:segment.value},`${key}-segment-${segmentIndex}`):segment.value)},key)},renderParagraphContent=({content,paragraphIndex,intl})=>content.map((node,index)=>{switch(node.type){case`mention`:return renderMentionNode({node,index,paragraphIndex});case`text`:return renderTextNode({node,index,paragraphIndex,intl});default:return[]}}),renderParagraphNode=({paragraph,index,intl,inlineSuffix})=>{let content=paragraph.content||[],key=`paragraph-${index}`;return jsxs(Text,{as:`p`,variant:`bodyDefault`,children:[content.length>0?renderParagraphContent({content,paragraphIndex:index,intl}):jsx(`br`,{}),inlineSuffix]},key)},MessageRenderer=({messageObject})=>{let intl=useIntl(),[isExpanded,setIsExpanded]=useState(!1);if(!messageObject.content||messageObject.content.length===0)return null;let totalLength=getDocumentLength(messageObject),isTruncated=!isExpanded&&totalLength>450,documentToRender=isTruncated?truncateDocument(messageObject,450):messageObject,suffixAnchorIndex=documentToRender.content.length-1;for(let i=documentToRender.content.length-1;i>=0;--i)if((documentToRender.content[i].content?.length??0)>0){suffixAnchorIndex=i;break}let seeMoreButton=isTruncated?jsx(TextButton,{className:text_message_module_default.seeMoreButton,color:`textOnLightLink`,"data-no-expand":!0,onClick:()=>setIsExpanded(!0),variant:`bodyDefaultBold`,children:intl.formatMessage(messages.seeMore)}):null;return documentToRender.content.map((paragraph,index)=>renderParagraphNode({paragraph,index,intl,inlineSuffix:index===suffixAnchorIndex?seeMoreButton:null}))};export{MessageRenderer};
1
+ import{t as MentionComponent}from"../../../../../../chunks/mention-component.js";import{isParagraphNode}from"../../../../v2/types/document-node-types.js";import messages from"../messages.js";import{t as text_message_module_default}from"../../../../../../chunks/text-message.module.js";import"../constants.js";import{splitTextIntoSegments}from"./url-segments.js";import{getDocumentLength,truncateDocument}from"./truncate-document.js";import{Link,Text,TextButton}from"@box/blueprint-web";import{useState}from"react";import{useIntl}from"react-intl";import{jsx,jsxs}from"react/jsx-runtime";var renderMentionNode=({node,index,paragraphIndex})=>{let key=`mention-${node.attrs.mentionedUserId}-${paragraphIndex}-${index}`;return jsx(MentionComponent,{authorId:node.attrs.authorId,mentionedUserEmail:node.attrs.mentionedUserEmail,mentionedUserId:node.attrs.mentionedUserId,mentionedUserName:node.attrs.mentionedUserName,mentionId:node.attrs.mentionId},key)},handleMessageLinkClick=event=>{event.currentTarget.closest(`[data-thread-expandable]`)&&event.preventDefault()},renderTextNode=({node,index,paragraphIndex,intl})=>{let key=`text-${node.text.substring(0,20)}-${paragraphIndex}-${index}`,segments=splitTextIntoSegments(node.text);return jsx(Text,{"aria-label":intl.formatMessage(messages.textMessageAriaLabel),as:`span`,color:`textOnLightDefault`,variant:`bodyDefault`,children:segments.map((segment,segmentIndex)=>segment.type===`url`?jsx(Link,{href:segment.value,inheritFont:!0,rel:`noopener noreferrer`,target:`_blank`,onClick:handleMessageLinkClick,children:segment.value},`${key}-segment-${segmentIndex}`):segment.value)},key)},renderParagraphContent=({content,paragraphIndex,intl})=>content.map((node,index)=>{switch(node.type){case`mention`:return renderMentionNode({node,index,paragraphIndex});case`text`:return renderTextNode({node,index,paragraphIndex,intl});default:return[]}}),renderParagraphNode=({paragraph,index,intl,inlineSuffix})=>{let content=paragraph.content||[],key=`paragraph-${index}`;return jsxs(Text,{as:`p`,variant:`bodyDefault`,children:[content.length>0?renderParagraphContent({content,paragraphIndex:index,intl}):jsx(`br`,{}),inlineSuffix]},key)},MessageRenderer=({messageObject})=>{let intl=useIntl(),[isExpanded,setIsExpanded]=useState(!1);if(!messageObject.content||messageObject.content.length===0)return null;let totalLength=getDocumentLength(messageObject),isTruncated=!isExpanded&&totalLength>450,paragraphsToRender=(isTruncated?truncateDocument(messageObject,450):messageObject).content.filter(isParagraphNode),suffixAnchorIndex=paragraphsToRender.length-1;for(let i=paragraphsToRender.length-1;i>=0;--i)if((paragraphsToRender[i].content?.length??0)>0){suffixAnchorIndex=i;break}let seeMoreButton=isTruncated?jsx(TextButton,{className:text_message_module_default.seeMoreButton,color:`textOnLightLink`,"data-no-expand":!0,onClick:()=>setIsExpanded(!0),variant:`bodyDefaultBold`,children:intl.formatMessage(messages.seeMore)}):null;return paragraphsToRender.map((paragraph,index)=>renderParagraphNode({paragraph,index,intl,inlineSuffix:index===suffixAnchorIndex?seeMoreButton:null}))};export{MessageRenderer};
@@ -1 +1 @@
1
- import{splitTextIntoSegments}from"./url-segments.js";var TRUNCATION_ELLIPSIS=`…`,getMentionDisplayLength=node=>`@${node.attrs.mentionedUserName}`.length,getDocumentLength=document=>{let total=0;for(let paragraph of document.content)for(let node of paragraph.content||[])node.type===`text`?total+=node.text.length:node.type===`mention`&&(total+=getMentionDisplayLength(node));return total},flattenDocument=document=>{let atoms=[];return document.content.forEach((paragraph,paragraphIndex)=>{paragraphIndex>0&&atoms.push({kind:`paragraph-break`,sourceParagraph:paragraph});for(let node of paragraph.content||[])if(node.type===`mention`)atoms.push({kind:`mention`,node});else if(node.type===`text`)for(let segment of splitTextIntoSegments(node.text))atoms.push({kind:segment.type,value:segment.value,sourceNode:node})}),atoms},collectAtomsWithinThreshold=(atoms,threshold)=>{let collected=[],pendingBreaks=[],remaining=threshold,accept=atom=>{collected.push(...pendingBreaks,atom),pendingBreaks.length=0};for(let atom of atoms)if(atom.kind===`paragraph-break`)pendingBreaks.push(atom);else if(remaining<=0)return{collected,truncated:!0};else if(atom.kind===`mention`){let length=getMentionDisplayLength(atom.node);if(length>remaining)return{collected,truncated:!0};accept(atom),remaining-=length}else if(atom.kind===`url`){if(atom.value.length>remaining)return{collected,truncated:!0};accept(atom),remaining-=atom.value.length}else if(atom.value.length<=remaining)accept(atom),remaining-=atom.value.length;else return accept({...atom,value:atom.value.slice(0,remaining)}),{collected,truncated:!0};return{collected,truncated:!1}},reassembleParagraphs=(atoms,firstParagraph)=>{let paragraphs=[],currentNodes=[],currentSource=firstParagraph,lastTextSourceNode=null,flushParagraph=()=>{paragraphs.push({...currentSource,content:currentNodes}),currentNodes=[],lastTextSourceNode=null};for(let atom of atoms)if(atom.kind===`paragraph-break`)flushParagraph(),currentSource=atom.sourceParagraph;else if(atom.kind===`mention`)currentNodes.push(atom.node),lastTextSourceNode=null;else if(lastTextSourceNode===atom.sourceNode){let previousTextNode=currentNodes[currentNodes.length-1];currentNodes[currentNodes.length-1]={...previousTextNode,text:previousTextNode.text+atom.value}}else currentNodes.push({...atom.sourceNode,text:atom.value}),lastTextSourceNode=atom.sourceNode;return flushParagraph(),paragraphs},withTruncationEllipsis=paragraphs=>{let lastNonEmptyIndex=-1;for(let i=paragraphs.length-1;i>=0;--i)if((paragraphs[i].content?.length??0)>0){lastNonEmptyIndex=i;break}if(lastNonEmptyIndex===-1)return[...paragraphs,{type:`paragraph`,content:[{type:`text`,text:TRUNCATION_ELLIPSIS}]}];let targetContent=paragraphs[lastNonEmptyIndex].content||[],lastChild=targetContent[targetContent.length-1],updatedContent;if(lastChild?.type===`text`){if(lastChild.text.endsWith(TRUNCATION_ELLIPSIS))return paragraphs;updatedContent=[...targetContent.slice(0,-1),{...lastChild,text:`${lastChild.text}${TRUNCATION_ELLIPSIS}`}]}else updatedContent=[...targetContent,{type:`text`,text:TRUNCATION_ELLIPSIS}];return paragraphs.map((paragraph,index)=>index===lastNonEmptyIndex?{...paragraph,content:updatedContent}:paragraph)},truncateDocument=(document,threshold)=>{if(document.content.length===0)return document;let{collected,truncated}=collectAtomsWithinThreshold(flattenDocument(document),threshold),paragraphs=reassembleParagraphs(collected,document.content[0]),finalParagraphs=truncated?withTruncationEllipsis(paragraphs):paragraphs;return{...document,content:finalParagraphs}};export{getDocumentLength,truncateDocument};
1
+ import{isParagraphNode}from"../../../../v2/types/document-node-types.js";import{splitTextIntoSegments}from"./url-segments.js";var TRUNCATION_ELLIPSIS=`…`,getMentionDisplayLength=node=>`@${node.attrs.mentionedUserName}`.length,getDocumentLength=document=>{let total=0;for(let paragraph of document.content.filter(isParagraphNode))for(let node of paragraph.content||[])node.type===`text`?total+=node.text.length:node.type===`mention`&&(total+=getMentionDisplayLength(node));return total},flattenDocument=paragraphs=>{let atoms=[];return paragraphs.forEach((paragraph,paragraphIndex)=>{paragraphIndex>0&&atoms.push({kind:`paragraph-break`,sourceParagraph:paragraph});for(let node of paragraph.content||[])if(node.type===`mention`)atoms.push({kind:`mention`,node});else if(node.type===`text`)for(let segment of splitTextIntoSegments(node.text))atoms.push({kind:segment.type,value:segment.value,sourceNode:node})}),atoms},collectAtomsWithinThreshold=(atoms,threshold)=>{let collected=[],pendingBreaks=[],remaining=threshold,accept=atom=>{collected.push(...pendingBreaks,atom),pendingBreaks.length=0};for(let atom of atoms)if(atom.kind===`paragraph-break`)pendingBreaks.push(atom);else if(remaining<=0)return{collected,truncated:!0};else if(atom.kind===`mention`){let length=getMentionDisplayLength(atom.node);if(length>remaining)return{collected,truncated:!0};accept(atom),remaining-=length}else if(atom.kind===`url`){if(atom.value.length>remaining)return{collected,truncated:!0};accept(atom),remaining-=atom.value.length}else if(atom.value.length<=remaining)accept(atom),remaining-=atom.value.length;else return accept({...atom,value:atom.value.slice(0,remaining)}),{collected,truncated:!0};return{collected,truncated:!1}},reassembleParagraphs=(atoms,firstParagraph)=>{let paragraphs=[],currentNodes=[],currentSource=firstParagraph,lastTextSourceNode=null,flushParagraph=()=>{paragraphs.push({...currentSource,content:currentNodes}),currentNodes=[],lastTextSourceNode=null};for(let atom of atoms)if(atom.kind===`paragraph-break`)flushParagraph(),currentSource=atom.sourceParagraph;else if(atom.kind===`mention`)currentNodes.push(atom.node),lastTextSourceNode=null;else if(lastTextSourceNode===atom.sourceNode){let previousTextNode=currentNodes[currentNodes.length-1];currentNodes[currentNodes.length-1]={...previousTextNode,text:previousTextNode.text+atom.value}}else currentNodes.push({...atom.sourceNode,text:atom.value}),lastTextSourceNode=atom.sourceNode;return flushParagraph(),paragraphs},withTruncationEllipsis=paragraphs=>{let lastNonEmptyIndex=-1;for(let i=paragraphs.length-1;i>=0;--i)if((paragraphs[i].content?.length??0)>0){lastNonEmptyIndex=i;break}if(lastNonEmptyIndex===-1)return[...paragraphs,{type:`paragraph`,content:[{type:`text`,text:TRUNCATION_ELLIPSIS}]}];let targetContent=paragraphs[lastNonEmptyIndex].content||[],lastChild=targetContent[targetContent.length-1],updatedContent;if(lastChild?.type===`text`){if(lastChild.text.endsWith(TRUNCATION_ELLIPSIS))return paragraphs;updatedContent=[...targetContent.slice(0,-1),{...lastChild,text:`${lastChild.text}${TRUNCATION_ELLIPSIS}`}]}else updatedContent=[...targetContent,{type:`text`,text:TRUNCATION_ELLIPSIS}];return paragraphs.map((paragraph,index)=>index===lastNonEmptyIndex?{...paragraph,content:updatedContent}:paragraph)},truncateDocument=(document,threshold)=>{let paragraphBlocks=document.content.filter(isParagraphNode);if(paragraphBlocks.length===0)return document;let{collected,truncated}=collectAtomsWithinThreshold(flattenDocument(paragraphBlocks),threshold),paragraphs=reassembleParagraphs(collected,paragraphBlocks[0]),finalParagraphs=truncated?withTruncationEllipsis(paragraphs):paragraphs;return{...document,content:finalParagraphs}};export{getDocumentLength,truncateDocument};
@@ -1 +1 @@
1
- import{THREADED_ANNOTATIONS_RESIN_COMPONENTS}from"../../../v2/resin-targets.js";import{MessageEditorVariant}from"../message-editor/message-editor.types.js";import{MessageEditor}from"../message-editor/message-editor.js";import{useThreadedAnnotationsContext}from"../../../v2/threaded-annotations-context.js";import{t as AnnotationBadge}from"../../../../../chunks/annotation-badge.js";import{MessageHeader}from"../message-header/message-header.js";import messages from"./messages.js";import{t as text_message_module_default}from"../../../../../chunks/text-message.module.js";import{MessageFooter}from"./subcomponents/message-footer.js";import{MessageRenderer}from"./subcomponents/message-renderer.js";import clsx from"clsx";import{useIntl}from"react-intl";import{Fragment,jsx,jsxs}from"react/jsx-runtime";var TextMessage=({id,author,message,createdAt,updatedAt,permissions,showThreadedIndicator=!0,isResolved=!1,isFirstMessage=!1,hasReplies=!1,maxCharacterCount,onAvatarClick,onCopyLink,onDelete,onThreadDelete,onEdit,onEditError,onResolve,onUnresolve,userSelectorProps,annotationTarget,onAnnotationBadgeClick,originalContentDeleted})=>{let{canResolve,canEdit,canDelete}=permissions,intl=useIntl(),{dispatch,isReplyDisabled,isEditDisabled,isAnnotations,editingMessageId}=useThreadedAnnotationsContext(),isEditing=editingMessageId===id,canOpenEdit=!!onEdit&&!isEditDisabled&&canEdit;return jsxs(`div`,{"aria-label":intl.formatMessage(messages.annotationMessageAriaLabel),className:text_message_module_default.textMessage,"data-message-wrapper":!0,"data-message-id":id,"data-resin-component":THREADED_ANNOTATIONS_RESIN_COMPONENTS.COMMENT_CARD,children:[jsx(MessageHeader,{author,canResolve,isResolved,canDelete,canEdit:canOpenEdit,hasReplies,isFirstMessage,onAvatarClick,onCopyLink:onCopyLink?()=>onCopyLink(id):void 0,onDelete:()=>onDelete(id),onThreadDelete,onEdit:canOpenEdit?()=>dispatch({type:`EDIT`,id}):void 0,onResolve:onResolve?()=>onResolve(id):void 0,onUnresolve:onUnresolve?()=>onUnresolve(id):void 0}),jsxs(`div`,{className:text_message_module_default.contentWrapper,children:[jsx(`div`,{className:clsx(text_message_module_default.threadedIndicator,!showThreadedIndicator&&text_message_module_default.threadedIndicatorHidden)}),jsxs(`div`,{className:text_message_module_default.messageContent,children:[annotationTarget&&!isAnnotations&&jsx(`div`,{className:text_message_module_default.annotationBadgeWrapper,children:jsx(AnnotationBadge,{annotationTarget,onClick:()=>onAnnotationBadgeClick?.(id),originalContentDeleted})}),isEditing&&onEdit?jsx(`div`,{className:text_message_module_default.inlineEditSlot,children:jsx(MessageEditor,{initialContent:message,maxCharacterCount,onEditCancel:()=>dispatch({type:`CLEAR_EDIT`}),onEditSuccess:()=>dispatch({type:`CLEAR_EDIT`}),onSave:content=>onEdit(id,content),onSaveError:onEditError,userSelectorProps,variant:MessageEditorVariant.EDIT_MESSAGE})}):jsxs(Fragment,{children:[jsx(`div`,{className:text_message_module_default.rendererWrapper,"data-message-body":!0,children:jsx(MessageRenderer,{messageObject:message})}),jsx(MessageFooter,{createdAt,onReply:isReplyDisabled?void 0:()=>dispatch({type:`REPLY`,author}),updatedAt})]})]})]})]})};export{TextMessage};
1
+ import{THREADED_ANNOTATIONS_RESIN_COMPONENTS}from"../../../v2/resin-targets.js";import{MessageEditorVariant}from"../message-editor/message-editor.types.js";import{MessageEditor}from"../message-editor/message-editor.js";import{useThreadedAnnotationsContext}from"../../../v2/threaded-annotations-context.js";import{t as AnnotationBadge}from"../../../../../chunks/annotation-badge.js";import{MessageHeader}from"../message-header/message-header.js";import messages from"./messages.js";import{t as text_message_module_default}from"../../../../../chunks/text-message.module.js";import{MessageFooter}from"./subcomponents/message-footer.js";import{MessageRenderer}from"./subcomponents/message-renderer.js";import clsx from"clsx";import{useIntl}from"react-intl";import{Fragment,jsx,jsxs}from"react/jsx-runtime";var TextMessage=({id,author,message,createdAt,updatedAt,permissions,showThreadedIndicator=!0,isResolved=!1,isFirstMessage=!1,hasReplies=!1,maxCharacterCount,onAvatarClick,onCopyLink,onDelete,onThreadDelete,onEdit,onEditError,onResolve,onUnresolve,userSelectorProps,annotationTarget,onAnnotationBadgeClick,originalContentDeleted})=>{let{canResolve,canEdit,canDelete}=permissions,intl=useIntl(),{dispatch,isReplyDisabled,isEditDisabled,isAnnotations,editingMessageId}=useThreadedAnnotationsContext(),isEditing=editingMessageId===id,canOpenEdit=!!onEdit&&!isEditDisabled&&canEdit;return jsxs(`div`,{"aria-label":intl.formatMessage(messages.annotationMessageAriaLabel),className:text_message_module_default.textMessage,"data-message-wrapper":!0,"data-message-id":id,"data-resin-component":THREADED_ANNOTATIONS_RESIN_COMPONENTS.COMMENT_CARD,children:[jsx(MessageHeader,{author,canResolve,isResolved,canDelete,canEdit:canOpenEdit,hasReplies,isFirstMessage,onAvatarClick,onCopyLink:onCopyLink?()=>onCopyLink(id):void 0,onDelete:()=>onDelete(id),onThreadDelete,onEdit:canOpenEdit?()=>dispatch({type:`EDIT`,id}):void 0,onResolve:onResolve?()=>onResolve(id):void 0,onUnresolve:onUnresolve?()=>onUnresolve(id):void 0}),jsxs(`div`,{className:text_message_module_default.contentWrapper,children:[jsx(`div`,{className:clsx(text_message_module_default.threadedIndicator,!showThreadedIndicator&&text_message_module_default.threadedIndicatorHidden)}),jsxs(`div`,{className:text_message_module_default.messageContent,children:[annotationTarget&&!isAnnotations&&jsx(`div`,{className:text_message_module_default.annotationBadgeWrapper,children:jsx(AnnotationBadge,{annotationTarget,onClick:()=>onAnnotationBadgeClick?.(id),originalContentDeleted})}),isEditing&&onEdit?jsx(`div`,{className:text_message_module_default.inlineEditSlot,children:jsx(MessageEditor,{initialContent:message,maxCharacterCount,onEditCancel:()=>dispatch({type:`CLEAR_EDIT`}),onEditSuccess:()=>dispatch({type:`CLEAR_EDIT`}),onSave:content=>onEdit(id,content),onSaveError:onEditError,userSelectorProps,variant:MessageEditorVariant.EDIT_MESSAGE})}):jsxs(Fragment,{children:[jsx(`div`,{"data-message-body":!0,children:jsx(MessageRenderer,{messageObject:message})}),jsx(MessageFooter,{createdAt,onReply:isReplyDisabled?void 0:()=>dispatch({type:`REPLY`,author}),updatedAt})]})]})]})]})};export{TextMessage};
@@ -0,0 +1 @@
1
+ var isParagraphNode=node=>node.type===`paragraph`;export{isParagraphNode};
@@ -1 +1 @@
1
- import{AnnotationBadgeType}from"./annotation-badge-types.js";export{AnnotationBadgeType};
1
+ import{AnnotationBadgeType}from"./annotation-badge-types.js";import{isParagraphNode}from"./document-node-types.js";export{AnnotationBadgeType,isParagraphNode};
@@ -25,8 +25,31 @@ export type ParagraphNode = {
25
25
  content?: (MentionNode | TextNode)[];
26
26
  attrs?: Record<string, unknown>;
27
27
  };
28
+ export type ListItemNode = {
29
+ type: 'listItem';
30
+ content?: (BulletListNode | OrderedListNode | ParagraphNode)[];
31
+ attrs?: Record<string, unknown>;
32
+ };
33
+ export type BulletListNode = {
34
+ type: 'bulletList';
35
+ content?: ListItemNode[];
36
+ attrs?: Record<string, unknown>;
37
+ };
38
+ export type OrderedListNode = {
39
+ type: 'orderedList';
40
+ content?: ListItemNode[];
41
+ attrs?: Record<string, unknown>;
42
+ };
28
43
  export type DocumentNode = {
29
44
  type: 'doc';
30
- content: ParagraphNode[];
45
+ content: (BulletListNode | OrderedListNode | ParagraphNode)[];
31
46
  attrs?: Record<string, unknown>;
32
47
  };
48
+ /** Formats toggleable from the rich text formatting bar (or their keyboard shortcuts). */
49
+ export type RichTextFormat = 'bold' | 'italic' | 'underline' | 'bulletList' | 'orderedList';
50
+ /**
51
+ * Narrows a top-level document block to a paragraph. Consumers that only
52
+ * support paragraph blocks (renderer, truncation — dedicated list support
53
+ * lands separately) use this to skip list blocks.
54
+ */
55
+ export declare const isParagraphNode: (node: DocumentNode["content"][number]) => node is ParagraphNode;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@box/threaded-annotations",
3
- "version": "4.2.1",
3
+ "version": "4.3.0",
4
4
  "license": "SEE LICENSE IN LICENSE",
5
5
  "dependencies": {
6
6
  "@floating-ui/dom": "^1.6.0",
@@ -17,23 +17,23 @@
17
17
  "uuid": "^9.0.1"
18
18
  },
19
19
  "peerDependencies": {
20
- "@box/blueprint-web": "^16.14.1",
21
- "@box/blueprint-web-assets": "^5.6.1",
22
- "@box/collaboration-popover": "^2.2.1",
23
- "@box/readable-time": "^2.2.1",
24
- "@box/user-selector": "^2.2.1",
20
+ "@box/blueprint-web": "^16.14.2",
21
+ "@box/blueprint-web-assets": "^5.6.2",
22
+ "@box/collaboration-popover": "^2.2.2",
23
+ "@box/readable-time": "^2.2.2",
24
+ "@box/user-selector": "^2.2.2",
25
25
  "clsx": "^1.2.1",
26
26
  "react": "^18.0.0",
27
27
  "react-dom": "^18.0.0",
28
28
  "react-intl": "^6.4.2"
29
29
  },
30
30
  "devDependencies": {
31
- "@box/blueprint-web": "^16.14.1",
32
- "@box/blueprint-web-assets": "^5.6.1",
31
+ "@box/blueprint-web": "^16.14.2",
32
+ "@box/blueprint-web-assets": "^5.6.2",
33
33
  "@box/eslint-plugin-blueprint": "2.2.0",
34
- "@box/readable-time": "^2.2.1",
35
- "@box/storybook-utils": "^1.2.1",
36
- "@box/user-selector": "^2.2.1",
34
+ "@box/readable-time": "^2.2.2",
35
+ "@box/storybook-utils": "^1.2.2",
36
+ "@box/user-selector": "^2.2.2",
37
37
  "react": "^18.0.0",
38
38
  "react-dom": "^18.0.0"
39
39
  },