@ynput/ayon-frontend-shared 0.2.43 → 0.2.45
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/_virtual/index.cjs4.js +1 -1
- package/dist/_virtual/index.cjs5.js +1 -1
- package/dist/_virtual/index.es4.js +5 -2
- package/dist/_virtual/index.es4.js.map +1 -1
- package/dist/_virtual/index.es5.js +2 -5
- package/dist/_virtual/index.es5.js.map +1 -1
- package/dist/node_modules/remove-accents/index.cjs.js +1 -1
- package/dist/node_modules/remove-accents/index.es.js +1 -1
- package/dist/shared/node_modules/react-transition-group/esm/CSSTransition.cjs.js +1 -1
- package/dist/shared/node_modules/react-transition-group/esm/CSSTransition.es.js +1 -1
- package/dist/shared/node_modules/react-transition-group/esm/Transition.cjs.js +1 -1
- package/dist/shared/node_modules/react-transition-group/esm/Transition.es.js +1 -1
- package/dist/shared/node_modules/react-transition-group/esm/utils/PropTypes.cjs.js +1 -1
- package/dist/shared/node_modules/react-transition-group/esm/utils/PropTypes.es.js +1 -1
- package/dist/shared/src/api/queries/userDashboard/getUserDashboard.cjs.js +1 -1
- package/dist/shared/src/api/queries/userDashboard/getUserDashboard.cjs.js.map +1 -1
- package/dist/shared/src/api/queries/userDashboard/getUserDashboard.es.js +73 -68
- package/dist/shared/src/api/queries/userDashboard/getUserDashboard.es.js.map +1 -1
- package/dist/shared/src/components/Menu/MenuContainer.cjs.js +1 -1
- package/dist/shared/src/components/Menu/MenuContainer.cjs.js.map +1 -1
- package/dist/shared/src/components/Menu/MenuContainer.es.js +58 -59
- package/dist/shared/src/components/Menu/MenuContainer.es.js.map +1 -1
- package/dist/shared/src/components/Menu/MenuItem.cjs.js +1 -1
- package/dist/shared/src/components/Menu/MenuItem.cjs.js.map +1 -1
- package/dist/shared/src/components/Menu/MenuItem.es.js +21 -21
- package/dist/shared/src/components/Menu/MenuItem.es.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/DetailsPanel.cjs.js +1 -1
- package/dist/shared/src/containers/DetailsPanel/DetailsPanel.cjs.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/DetailsPanel.es.js +23 -22
- package/dist/shared/src/containers/DetailsPanel/DetailsPanel.es.js.map +1 -1
- package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityComment.cjs.js +1 -1
- package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityComment.cjs.js.map +1 -1
- package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityComment.es.js +2 -3
- package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityComment.es.js.map +1 -1
- package/dist/shared/src/context/DetailsPanelContext.cjs.js +1 -1
- package/dist/shared/src/context/DetailsPanelContext.cjs.js.map +1 -1
- package/dist/shared/src/context/DetailsPanelContext.es.js +79 -80
- package/dist/shared/src/context/DetailsPanelContext.es.js.map +1 -1
- package/dist/shared/src/context/MenuContext.cjs.js +1 -1
- package/dist/shared/src/context/MenuContext.cjs.js.map +1 -1
- package/dist/shared/src/context/MenuContext.es.js +11 -10
- package/dist/shared/src/context/MenuContext.es.js.map +1 -1
- package/dist/types/api/queries/userDashboard/getUserDashboard.d.ts +1 -0
- package/dist/types/context/MenuContext.d.ts +3 -0
- package/package.json +1 -1
package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityComment.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActivityComment.cjs.js","sources":["../../../../../../../src/containers/Feed/components/ActivityComment/ActivityComment.tsx"],"sourcesContent":["import clsx from 'clsx'\nimport { useCallback, useMemo, useRef } from 'react'\nimport ReactMarkdown from 'react-markdown'\nimport emoji from 'remark-emoji'\nimport remarkGfm from 'remark-gfm'\nimport remarkDirective from 'remark-directive'\nimport remarkDirectiveRehype from 'remark-directive-rehype'\n\nimport CommentInput from '../CommentInput/CommentInput'\nimport Reactions from '../ReactionContainer/Reactions'\nimport { Reaction } from '../ReactionContainer/types'\nimport useReferenceTooltip from '../../hooks/useReferenceTooltip'\nimport FilesGrid, { FilesGridProps } from '../FilesGrid/FilesGrid'\n\nimport { getTextRefs } from '../CommentInput/quillToMarkdown'\nimport * as Styled from './ActivityComment.styled'\nimport CommentWrapper from './CommentWrapper'\nimport { aTag, blockquoteTag, codeTag, inputTag } from './ActivityMarkdownComponents'\nimport { mapGraphQLReactions } from './mappers'\nimport { Icon } from '@ynput/ayon-react-components'\nimport ActivityStatus from '../ActivityStatus/ActivityStatus'\nimport { useFeedContext } from '../../context/FeedContext'\nimport { confirmDelete } from '../../../../util'\nimport ActivityHeader, { ActivityHeaderProps } from '../ActivityHeader/ActivityHeader'\nimport { MenuContainer } from '@shared/components'\nimport { useMenuContext } from '@shared/context'\nimport type { Status } from '../../../ProjectTreeTable/types/project'\nimport { SavedAnnotationMetadata } from '../../index'\nimport { useDetailsPanelContext } from '@shared/context'\nimport { useBlendedCategoryColor } from '../CommentInput/hooks/useBlendedCategoryColor'\nimport { CategoryTag } from '../ActivityCategorySelect/CategoryTag'\nimport ActivityCommentMenu from './ActivityCommentMenu'\n\ntype Props = {\n activity: any\n onCheckChange?: Function\n onDelete?: (activityId: string, entityId: string, refs: any) => Promise<void>\n onUpdate?: (value: any, files: any, refs?: any, data?: any) => Promise<void>\n projectInfo: any\n editProps?: {\n disabled: boolean\n isLoading: boolean\n }\n projectName: string\n entityType: string\n onReferenceClick?: ActivityHeaderProps['onReferenceClick']\n onFileExpand?: FilesGridProps['onExpand']\n showOrigin?: boolean\n isHighlighted?: boolean\n readOnly?: boolean\n isSlideOut?: boolean\n statuses: Status[]\n}\n\nconst ActivityComment = ({\n activity = {},\n onCheckChange,\n onDelete,\n onUpdate,\n projectInfo,\n editProps,\n projectName,\n entityType,\n onReferenceClick,\n onFileExpand,\n showOrigin,\n isHighlighted,\n readOnly,\n isSlideOut,\n statuses = [],\n}: Props) => {\n const { userName, createReaction, deleteReaction, editingId, setEditingId, categories, isGuest } =\n useFeedContext()\n\n const moreRef = useRef<HTMLButtonElement>(null)\n const { toggleMenuOpen, menuOpen } = useMenuContext()\n\n const { categoryData, categoryNotFound } = useMemo(() => {\n let categoryNotFound = false\n if (activity.activityData?.category) {\n const foundCategory = categories.find((cat) => cat.name === activity.activityData?.category)\n if (!foundCategory) {\n categoryNotFound = true\n }\n return {\n categoryData: foundCategory || {\n name: activity.activityData?.category,\n color: '#c5c5c5',\n },\n categoryNotFound,\n }\n } else {\n return {\n categoryData: null,\n categoryNotFound,\n }\n }\n }, [activity?.activityData?.category, categories])\n // Compute blended background color for category\n const blendedCategoryColor = useBlendedCategoryColor(categoryData?.color)\n\n let {\n body,\n authorName,\n authorFullName,\n createdAt,\n referenceType,\n entityId,\n activityId,\n author,\n isOwner,\n files = [],\n origin,\n } = activity\n if (!authorName) authorName = author?.name || ''\n if (!authorFullName) authorFullName = author?.fullName || authorName\n\n const menuId = `activity-comment-menu-${activityId}-${isSlideOut ? 'slideout' : 'normal'}`\n const isMenuOpen = menuOpen === menuId\n\n const { onGoToFrame, setHighlightedActivities } = useDetailsPanelContext()\n\n const handleEditComment = () => {\n setEditingId(activityId)\n }\n\n const handleEditCancel = () => {\n // close the edit comment\n setEditingId(null)\n }\n\n const handleSave = async (value: any, files: any, data?: any) => {\n await onUpdate?.(value, files, undefined, data)\n setEditingId(null)\n }\n\n const isEditing = editingId === activityId\n\n const isRef = referenceType !== 'origin' || showOrigin\n\n const handleDelete = async () => {\n const refs = getTextRefs(body)\n\n // if the comment is a reference, (it's origin is not the entity)\n // we need to delete the reference from the origin as well\n // add it to the refs to delete\n if (isRef && origin) {\n refs.push({ id: origin.id, type: origin.type })\n }\n\n // note: body is used to match other refs to delete\n onDelete && (await onDelete(activityId, entityId, refs))\n }\n\n const deleteConfirmation = () => {\n confirmDelete({\n title: 'Delete comment',\n message: 'Are you sure you want to delete this comment?',\n accept: async () => {\n await handleDelete()\n },\n })\n }\n\n const [, setRefTooltip] = useReferenceTooltip()\n\n const mappedReactions = useMemo(\n () => mapGraphQLReactions(activity.reactions, userName),\n [[...(activity.reactions || [])]],\n )\n\n const reactionChangeHandler = (reaction: Reaction) => {\n if (reaction.isActive) {\n createReaction({\n projectName: projectName,\n // @ts-ignore exposed endpoint doesn't need the username, we still need to pass it for the optimistic update\n userName: userName,\n activityId: activityId,\n createReactionModel: {\n reaction: reaction.type,\n },\n })\n } else {\n deleteReaction({\n projectName: projectName,\n // @ts-ignore exposed endpoint doesn't need the username, we still need to pass it for the optimistic update\n userName: userName,\n activityId: activityId,\n reaction: reaction.type,\n })\n }\n }\n\n const onAnnotationClick = useCallback(\n (file: any) => {\n if (!file.annotation) return\n // annotation frame numbers are 1-based\n onGoToFrame?.((file.annotation as SavedAnnotationMetadata).range[0])\n setHighlightedActivities([activityId])\n },\n [onGoToFrame],\n )\n\n return (\n <>\n <Styled.Comment\n className={clsx('comment', {\n isOwner,\n isEditing,\n isHighlighted,\n category: !!categoryData && !isGuest,\n menuOpen: isMenuOpen,\n })}\n id={activityId}\n $categoryPrimary={categoryData?.color}\n $categoryTertiary={blendedCategoryColor.primary}\n $categorySecondary={blendedCategoryColor.secondary}\n >\n <ActivityHeader\n name={authorName}\n fullName={authorFullName}\n date={createdAt}\n isRef={isRef}\n activity={activity}\n // projectInfo={projectInfo}\n projectName={projectName}\n entityType={entityType}\n onReferenceClick={onReferenceClick}\n onReferenceTooltip={setRefTooltip}\n children={undefined}\n />\n <Styled.Body className={clsx('comment-body', { isEditing })}>\n {!readOnly && (\n <Styled.Tools className={'tools'}>\n {isOwner && handleEditComment && (\n <Styled.ToolButton icon=\"edit_square\" onClick={handleEditComment} variant=\"text\" />\n )}\n <Styled.ToolButton\n icon=\"more_horiz\"\n ref={moreRef}\n onClick={(e) => {\n e.stopPropagation()\n toggleMenuOpen(menuId)\n }}\n className={isMenuOpen ? 'active' : ''}\n />\n </Styled.Tools>\n )}\n\n {!isEditing && !isGuest && categoryData && (\n <CategoryTag\n value={categoryData.name}\n color={categoryData.color}\n style={{\n top: -4,\n left: -4,\n }}\n isCompact\n data-tooltip={\n categoryNotFound ? 'Category not found. It may have been deleted.' : undefined\n }\n data-tooltip-delay={0}\n />\n )}\n\n {isEditing ? (\n <CommentInput\n initValue={body}\n initFiles={files}\n initCategory={categoryData?.name}\n data={activity.activityData}\n isEditing\n onClose={handleEditCancel}\n onSubmit={handleSave}\n isOpen={true}\n {...editProps}\n />\n ) : (\n <>\n <CommentWrapper>\n <ReactMarkdown\n remarkPlugins={[remarkGfm, emoji, remarkDirective, remarkDirectiveRehype]}\n urlTransform={(url) => url}\n components={{\n // a links\n // @ts-ignore\n a: (props) =>\n // @ts-ignore\n aTag(props, {\n entityId,\n projectName,\n projectInfo,\n onReferenceClick,\n onReferenceTooltip: setRefTooltip,\n activityId,\n categoryPrimary: categoryData?.color,\n categorySecondary: blendedCategoryColor.secondary,\n }),\n // checkbox inputs\n // @ts-ignore\n input: (props) => inputTag(props, { activity, onCheckChange }),\n // code syntax highlighting\n // eslint-disable-next-line\n // @ts-ignore\n code: (props) => codeTag(props),\n // @ts-ignore\n blockquote: (props) => blockquoteTag(props),\n // @ts-ignore\n tip: (props) => (\n <Styled.Tip>\n <Icon icon=\"info\" />\n {props.children}\n </Styled.Tip>\n ),\n // @ts-ignore\n status: (props) => {\n return (\n <ActivityStatus name={props.id} statuses={statuses}>\n {props.children}\n </ActivityStatus>\n )\n },\n }}\n >\n {body}\n </ReactMarkdown>\n </CommentWrapper>\n {/* file uploads */}\n {/* @ts-ignore */}\n <FilesGrid\n files={files}\n isCompact={files.length > 6}\n activityId={activityId}\n projectName={projectName}\n isDownloadable\n onExpand={onFileExpand}\n onAnnotationClick={onAnnotationClick}\n onRemove={undefined}\n />\n </>\n )}\n\n {!isEditing && (\n <div style={{ marginTop: '16px' }}>\n {mappedReactions && (\n <Reactions\n reactions={mappedReactions}\n changeHandler={reactionChangeHandler}\n readOnly={readOnly}\n category={categoryData && !isGuest ? categoryData.name : undefined}\n categoryPrimary={categoryData?.color}\n categorySecondary={blendedCategoryColor.secondary}\n categoryTertiary={blendedCategoryColor.primary}\n />\n )}\n </div>\n )}\n </Styled.Body>\n </Styled.Comment>\n\n <MenuContainer\n target={moreRef.current}\n id={menuId}\n align=\"right\"\n onClose={(e: any) => {\n e?.stopPropagation()\n toggleMenuOpen(false)\n }}\n >\n <ActivityCommentMenu\n onDelete={isOwner && onDelete ? deleteConfirmation : undefined}\n onEdit={isOwner && handleEditComment}\n activityId={activityId}\n onSelect={() => toggleMenuOpen(false)}\n projectName={projectName}\n />\n </MenuContainer>\n </>\n )\n}\n\nexport default ActivityComment\n"],"names":["ActivityComment","activity","onCheckChange","onDelete","onUpdate","projectInfo","editProps","projectName","entityType","onReferenceClick","onFileExpand","showOrigin","isHighlighted","readOnly","isSlideOut","statuses","userName","createReaction","deleteReaction","editingId","setEditingId","categories","isGuest","useFeedContext","moreRef","useRef","toggleMenuOpen","menuOpen","useMenuContext","categoryData","categoryNotFound","useMemo","foundCategory","cat","blendedCategoryColor","useBlendedCategoryColor","body","authorName","authorFullName","createdAt","referenceType","entityId","activityId","author","isOwner","files","origin","menuId","isMenuOpen","onGoToFrame","setHighlightedActivities","useDetailsPanelContext","handleEditComment","handleEditCancel","handleSave","value","data","isEditing","isRef","handleDelete","refs","getTextRefs","deleteConfirmation","confirmDelete","setRefTooltip","useReferenceTooltip","mappedReactions","mapGraphQLReactions","reactionChangeHandler","reaction","onAnnotationClick","useCallback","file","jsxs","Fragment","Styled.Comment","clsx","jsx","ActivityHeader","Styled.Body","Styled.Tools","Styled.ToolButton","CategoryTag","CommentInput","CommentWrapper","ReactMarkdown","remarkGfm","emoji","remarkDirective","remarkDirectiveRehype","url","props","aTag","inputTag","codeTag","blockquoteTag","Styled.Tip","Icon","ActivityStatus","FilesGrid","Reactions","MenuContainer","ActivityCommentMenu"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ActivityComment.cjs.js","sources":["../../../../../../../src/containers/Feed/components/ActivityComment/ActivityComment.tsx"],"sourcesContent":["import clsx from 'clsx'\nimport { useCallback, useMemo, useRef } from 'react'\nimport ReactMarkdown from 'react-markdown'\nimport emoji from 'remark-emoji'\nimport remarkGfm from 'remark-gfm'\nimport remarkDirective from 'remark-directive'\nimport remarkDirectiveRehype from 'remark-directive-rehype'\n\nimport CommentInput from '../CommentInput/CommentInput'\nimport Reactions from '../ReactionContainer/Reactions'\nimport { Reaction } from '../ReactionContainer/types'\nimport useReferenceTooltip from '../../hooks/useReferenceTooltip'\nimport FilesGrid, { FilesGridProps } from '../FilesGrid/FilesGrid'\n\nimport { getTextRefs } from '../CommentInput/quillToMarkdown'\nimport * as Styled from './ActivityComment.styled'\nimport CommentWrapper from './CommentWrapper'\nimport { aTag, blockquoteTag, codeTag, inputTag } from './ActivityMarkdownComponents'\nimport { mapGraphQLReactions } from './mappers'\nimport { Icon } from '@ynput/ayon-react-components'\nimport ActivityStatus from '../ActivityStatus/ActivityStatus'\nimport { useFeedContext } from '../../context/FeedContext'\nimport { confirmDelete } from '../../../../util'\nimport ActivityHeader, { ActivityHeaderProps } from '../ActivityHeader/ActivityHeader'\nimport { MenuContainer } from '@shared/components'\nimport { useMenuContext } from '@shared/context'\nimport type { Status } from '../../../ProjectTreeTable/types/project'\nimport { SavedAnnotationMetadata } from '../../index'\nimport { useDetailsPanelContext } from '@shared/context'\nimport { useBlendedCategoryColor } from '../CommentInput/hooks/useBlendedCategoryColor'\nimport { CategoryTag } from '../ActivityCategorySelect/CategoryTag'\nimport ActivityCommentMenu from './ActivityCommentMenu'\n\ntype Props = {\n activity: any\n onCheckChange?: Function\n onDelete?: (activityId: string, entityId: string, refs: any) => Promise<void>\n onUpdate?: (value: any, files: any, refs?: any, data?: any) => Promise<void>\n projectInfo: any\n editProps?: {\n disabled: boolean\n isLoading: boolean\n }\n projectName: string\n entityType: string\n onReferenceClick?: ActivityHeaderProps['onReferenceClick']\n onFileExpand?: FilesGridProps['onExpand']\n showOrigin?: boolean\n isHighlighted?: boolean\n readOnly?: boolean\n isSlideOut?: boolean\n statuses: Status[]\n}\n\nconst ActivityComment = ({\n activity = {},\n onCheckChange,\n onDelete,\n onUpdate,\n projectInfo,\n editProps,\n projectName,\n entityType,\n onReferenceClick,\n onFileExpand,\n showOrigin,\n isHighlighted,\n readOnly,\n isSlideOut,\n statuses = [],\n}: Props) => {\n const { userName, createReaction, deleteReaction, editingId, setEditingId, categories, isGuest } =\n useFeedContext()\n\n const moreRef = useRef<HTMLButtonElement>(null)\n const { toggleMenuOpen, menuOpen } = useMenuContext()\n\n const { categoryData, categoryNotFound } = useMemo(() => {\n let categoryNotFound = false\n if (activity.activityData?.category) {\n const foundCategory = categories.find((cat) => cat.name === activity.activityData?.category)\n if (!foundCategory) {\n categoryNotFound = true\n }\n return {\n categoryData: foundCategory || {\n name: activity.activityData?.category,\n color: '#c5c5c5',\n },\n categoryNotFound,\n }\n } else {\n return {\n categoryData: null,\n categoryNotFound,\n }\n }\n }, [activity?.activityData?.category, categories])\n // Compute blended background color for category\n const blendedCategoryColor = useBlendedCategoryColor(categoryData?.color)\n\n let {\n body,\n authorName,\n authorFullName,\n createdAt,\n referenceType,\n entityId,\n activityId,\n author,\n isOwner,\n files = [],\n origin,\n } = activity\n if (!authorName) authorName = author?.name || ''\n if (!authorFullName) authorFullName = author?.fullName || authorName\n\n const menuId = `activity-comment-menu-${activityId}-${isSlideOut ? 'slideout' : 'normal'}`\n const isMenuOpen = menuOpen === menuId\n\n const { onGoToFrame, setHighlightedActivities } = useDetailsPanelContext()\n\n const handleEditComment = () => {\n setEditingId(activityId)\n }\n\n const handleEditCancel = () => {\n // close the edit comment\n setEditingId(null)\n }\n\n const handleSave = async (value: any, files: any, data?: any) => {\n await onUpdate?.(value, files, undefined, data)\n setEditingId(null)\n }\n\n const isEditing = editingId === activityId\n\n const isRef = referenceType !== 'origin' || showOrigin\n\n const handleDelete = async () => {\n const refs = getTextRefs(body)\n\n // if the comment is a reference, (it's origin is not the entity)\n // we need to delete the reference from the origin as well\n // add it to the refs to delete\n if (isRef && origin) {\n refs.push({ id: origin.id, type: origin.type })\n }\n\n // note: body is used to match other refs to delete\n onDelete && (await onDelete(activityId, entityId, refs))\n }\n\n const deleteConfirmation = () => {\n confirmDelete({\n title: 'Delete comment',\n message: 'Are you sure you want to delete this comment?',\n accept: async () => {\n await handleDelete()\n },\n })\n }\n\n const [, setRefTooltip] = useReferenceTooltip()\n\n const mappedReactions = useMemo(\n () => mapGraphQLReactions(activity.reactions, userName),\n [[...(activity.reactions || [])]],\n )\n\n const reactionChangeHandler = (reaction: Reaction) => {\n if (reaction.isActive) {\n createReaction({\n projectName: projectName,\n // @ts-ignore exposed endpoint doesn't need the username, we still need to pass it for the optimistic update\n userName: userName,\n activityId: activityId,\n createReactionModel: {\n reaction: reaction.type,\n },\n })\n } else {\n deleteReaction({\n projectName: projectName,\n // @ts-ignore exposed endpoint doesn't need the username, we still need to pass it for the optimistic update\n userName: userName,\n activityId: activityId,\n reaction: reaction.type,\n })\n }\n }\n\n const onAnnotationClick = useCallback(\n (file: any) => {\n if (!file.annotation) return\n // annotation frame numbers are 1-based\n onGoToFrame?.((file.annotation as SavedAnnotationMetadata).range[0])\n setHighlightedActivities([activityId])\n },\n [onGoToFrame],\n )\n\n return (\n <>\n <Styled.Comment\n className={clsx('comment', {\n isOwner,\n isEditing,\n isHighlighted,\n category: !!categoryData && !isGuest,\n menuOpen: isMenuOpen,\n })}\n id={activityId}\n $categoryPrimary={categoryData?.color}\n $categoryTertiary={blendedCategoryColor.primary}\n $categorySecondary={blendedCategoryColor.secondary}\n >\n <ActivityHeader\n name={authorName}\n fullName={authorFullName}\n date={createdAt}\n isRef={isRef}\n activity={activity}\n // projectInfo={projectInfo}\n projectName={projectName}\n entityType={entityType}\n onReferenceClick={onReferenceClick}\n onReferenceTooltip={setRefTooltip}\n children={undefined}\n />\n <Styled.Body className={clsx('comment-body', { isEditing })}>\n {!readOnly && (\n <Styled.Tools className={'tools'}>\n {isOwner && handleEditComment && (\n <Styled.ToolButton icon=\"edit_square\" onClick={handleEditComment} variant=\"text\" />\n )}\n <Styled.ToolButton\n icon=\"more_horiz\"\n ref={moreRef}\n onClick={(e) => {\n e.stopPropagation()\n toggleMenuOpen(menuId)\n }}\n className={isMenuOpen ? 'active' : ''}\n />\n </Styled.Tools>\n )}\n\n {!isEditing && !isGuest && categoryData && (\n <CategoryTag\n value={categoryData.name}\n color={categoryData.color}\n style={{\n top: -4,\n left: -4,\n }}\n isCompact\n data-tooltip={\n categoryNotFound ? 'Category not found. It may have been deleted.' : undefined\n }\n data-tooltip-delay={0}\n />\n )}\n\n {isEditing ? (\n <CommentInput\n initValue={body}\n initFiles={files}\n initCategory={categoryData?.name}\n data={activity.activityData}\n isEditing\n onClose={handleEditCancel}\n onSubmit={handleSave}\n isOpen={true}\n {...editProps}\n />\n ) : (\n <>\n <CommentWrapper>\n <ReactMarkdown\n remarkPlugins={[remarkGfm, emoji, remarkDirective, remarkDirectiveRehype]}\n urlTransform={(url) => url}\n components={{\n // a links\n // @ts-ignore\n a: (props) =>\n // @ts-ignore\n aTag(props, {\n entityId,\n projectName,\n projectInfo,\n onReferenceClick,\n onReferenceTooltip: setRefTooltip,\n activityId,\n categoryPrimary: categoryData?.color,\n categorySecondary: blendedCategoryColor.secondary,\n }),\n // checkbox inputs\n // @ts-ignore\n input: (props) => inputTag(props, { activity, onCheckChange }),\n // code syntax highlighting\n // eslint-disable-next-line\n // @ts-ignore\n code: (props) => codeTag(props),\n // @ts-ignore\n blockquote: (props) => blockquoteTag(props),\n // @ts-ignore\n tip: (props) => (\n <Styled.Tip>\n <Icon icon=\"info\" />\n {props.children}\n </Styled.Tip>\n ),\n // @ts-ignore\n status: (props) => {\n return (\n <ActivityStatus name={props.id} statuses={statuses}>\n {props.children}\n </ActivityStatus>\n )\n },\n }}\n >\n {body}\n </ReactMarkdown>\n </CommentWrapper>\n {/* file uploads */}\n {/* @ts-ignore */}\n <FilesGrid\n files={files}\n isCompact={files.length > 6}\n activityId={activityId}\n projectName={projectName}\n isDownloadable\n onExpand={onFileExpand}\n onAnnotationClick={onAnnotationClick}\n onRemove={undefined}\n />\n </>\n )}\n\n {!isEditing && (\n <div style={{ marginTop: '16px' }}>\n {mappedReactions && (\n <Reactions\n reactions={mappedReactions}\n changeHandler={reactionChangeHandler}\n readOnly={readOnly}\n category={categoryData && !isGuest ? categoryData.name : undefined}\n categoryPrimary={categoryData?.color}\n categorySecondary={blendedCategoryColor.secondary}\n categoryTertiary={blendedCategoryColor.primary}\n />\n )}\n </div>\n )}\n </Styled.Body>\n </Styled.Comment>\n\n <MenuContainer\n target={moreRef.current}\n id={menuId}\n align=\"right\"\n onClose={(e: any) => {\n e?.stopPropagation()\n toggleMenuOpen(false)\n }}\n >\n <ActivityCommentMenu\n onDelete={isOwner && onDelete ? deleteConfirmation : undefined}\n onEdit={isOwner && handleEditComment}\n activityId={activityId}\n onSelect={() => toggleMenuOpen(false)}\n projectName={projectName}\n />\n </MenuContainer>\n </>\n )\n}\n\nexport default ActivityComment\n"],"names":["ActivityComment","activity","onCheckChange","onDelete","onUpdate","projectInfo","editProps","projectName","entityType","onReferenceClick","onFileExpand","showOrigin","isHighlighted","readOnly","isSlideOut","statuses","userName","createReaction","deleteReaction","editingId","setEditingId","categories","isGuest","useFeedContext","moreRef","useRef","toggleMenuOpen","menuOpen","useMenuContext","categoryData","categoryNotFound","useMemo","foundCategory","cat","blendedCategoryColor","useBlendedCategoryColor","body","authorName","authorFullName","createdAt","referenceType","entityId","activityId","author","isOwner","files","origin","menuId","isMenuOpen","onGoToFrame","setHighlightedActivities","useDetailsPanelContext","handleEditComment","handleEditCancel","handleSave","value","data","isEditing","isRef","handleDelete","refs","getTextRefs","deleteConfirmation","confirmDelete","setRefTooltip","useReferenceTooltip","mappedReactions","mapGraphQLReactions","reactionChangeHandler","reaction","onAnnotationClick","useCallback","file","jsxs","Fragment","Styled.Comment","clsx","jsx","ActivityHeader","Styled.Body","Styled.Tools","Styled.ToolButton","CategoryTag","CommentInput","CommentWrapper","ReactMarkdown","remarkGfm","emoji","remarkDirective","remarkDirectiveRehype","url","props","aTag","inputTag","codeTag","blockquoteTag","Styled.Tip","Icon","ActivityStatus","FilesGrid","Reactions","MenuContainer","ActivityCommentMenu"],"mappings":"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"}
|
|
@@ -195,7 +195,6 @@ import "../../../ProjectTreeTable/widgets/LoadMoreWidget.es.js";
|
|
|
195
195
|
import "../../../ProjectTreeTable/components/HeaderActionButton.es.js";
|
|
196
196
|
import "../../../ProjectTreeTable/components/ColumnHeaderMenu.es.js";
|
|
197
197
|
import "../../../EntityPickerDialog/EntityPickerDialog.es.js";
|
|
198
|
-
import "react-router-dom";
|
|
199
198
|
import "../../../DetailsPanel/DetailsPanel.styled.es.js";
|
|
200
199
|
import "../../../DetailsPanel/FeedFilters/FeedFilters.styled.es.js";
|
|
201
200
|
import "../../../DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.styled.es.js";
|
|
@@ -250,7 +249,7 @@ import "../../../../components/LegacyBadge/LegacyBadge.es.js";
|
|
|
250
249
|
import "../../../../components/Menu/Menu.styled.es.js";
|
|
251
250
|
import "../../../../components/Menu/MenuItem.es.js";
|
|
252
251
|
import { MenuContainer as Ho } from "../../../../components/Menu/MenuContainer.es.js";
|
|
253
|
-
const
|
|
252
|
+
const Tp = ({
|
|
254
253
|
activity: m = {},
|
|
255
254
|
onCheckChange: O,
|
|
256
255
|
onDelete: l,
|
|
@@ -508,6 +507,6 @@ const Rp = ({
|
|
|
508
507
|
] });
|
|
509
508
|
};
|
|
510
509
|
export {
|
|
511
|
-
|
|
510
|
+
Tp as default
|
|
512
511
|
};
|
|
513
512
|
//# sourceMappingURL=ActivityComment.es.js.map
|
package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityComment.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActivityComment.es.js","sources":["../../../../../../../src/containers/Feed/components/ActivityComment/ActivityComment.tsx"],"sourcesContent":["import clsx from 'clsx'\nimport { useCallback, useMemo, useRef } from 'react'\nimport ReactMarkdown from 'react-markdown'\nimport emoji from 'remark-emoji'\nimport remarkGfm from 'remark-gfm'\nimport remarkDirective from 'remark-directive'\nimport remarkDirectiveRehype from 'remark-directive-rehype'\n\nimport CommentInput from '../CommentInput/CommentInput'\nimport Reactions from '../ReactionContainer/Reactions'\nimport { Reaction } from '../ReactionContainer/types'\nimport useReferenceTooltip from '../../hooks/useReferenceTooltip'\nimport FilesGrid, { FilesGridProps } from '../FilesGrid/FilesGrid'\n\nimport { getTextRefs } from '../CommentInput/quillToMarkdown'\nimport * as Styled from './ActivityComment.styled'\nimport CommentWrapper from './CommentWrapper'\nimport { aTag, blockquoteTag, codeTag, inputTag } from './ActivityMarkdownComponents'\nimport { mapGraphQLReactions } from './mappers'\nimport { Icon } from '@ynput/ayon-react-components'\nimport ActivityStatus from '../ActivityStatus/ActivityStatus'\nimport { useFeedContext } from '../../context/FeedContext'\nimport { confirmDelete } from '../../../../util'\nimport ActivityHeader, { ActivityHeaderProps } from '../ActivityHeader/ActivityHeader'\nimport { MenuContainer } from '@shared/components'\nimport { useMenuContext } from '@shared/context'\nimport type { Status } from '../../../ProjectTreeTable/types/project'\nimport { SavedAnnotationMetadata } from '../../index'\nimport { useDetailsPanelContext } from '@shared/context'\nimport { useBlendedCategoryColor } from '../CommentInput/hooks/useBlendedCategoryColor'\nimport { CategoryTag } from '../ActivityCategorySelect/CategoryTag'\nimport ActivityCommentMenu from './ActivityCommentMenu'\n\ntype Props = {\n activity: any\n onCheckChange?: Function\n onDelete?: (activityId: string, entityId: string, refs: any) => Promise<void>\n onUpdate?: (value: any, files: any, refs?: any, data?: any) => Promise<void>\n projectInfo: any\n editProps?: {\n disabled: boolean\n isLoading: boolean\n }\n projectName: string\n entityType: string\n onReferenceClick?: ActivityHeaderProps['onReferenceClick']\n onFileExpand?: FilesGridProps['onExpand']\n showOrigin?: boolean\n isHighlighted?: boolean\n readOnly?: boolean\n isSlideOut?: boolean\n statuses: Status[]\n}\n\nconst ActivityComment = ({\n activity = {},\n onCheckChange,\n onDelete,\n onUpdate,\n projectInfo,\n editProps,\n projectName,\n entityType,\n onReferenceClick,\n onFileExpand,\n showOrigin,\n isHighlighted,\n readOnly,\n isSlideOut,\n statuses = [],\n}: Props) => {\n const { userName, createReaction, deleteReaction, editingId, setEditingId, categories, isGuest } =\n useFeedContext()\n\n const moreRef = useRef<HTMLButtonElement>(null)\n const { toggleMenuOpen, menuOpen } = useMenuContext()\n\n const { categoryData, categoryNotFound } = useMemo(() => {\n let categoryNotFound = false\n if (activity.activityData?.category) {\n const foundCategory = categories.find((cat) => cat.name === activity.activityData?.category)\n if (!foundCategory) {\n categoryNotFound = true\n }\n return {\n categoryData: foundCategory || {\n name: activity.activityData?.category,\n color: '#c5c5c5',\n },\n categoryNotFound,\n }\n } else {\n return {\n categoryData: null,\n categoryNotFound,\n }\n }\n }, [activity?.activityData?.category, categories])\n // Compute blended background color for category\n const blendedCategoryColor = useBlendedCategoryColor(categoryData?.color)\n\n let {\n body,\n authorName,\n authorFullName,\n createdAt,\n referenceType,\n entityId,\n activityId,\n author,\n isOwner,\n files = [],\n origin,\n } = activity\n if (!authorName) authorName = author?.name || ''\n if (!authorFullName) authorFullName = author?.fullName || authorName\n\n const menuId = `activity-comment-menu-${activityId}-${isSlideOut ? 'slideout' : 'normal'}`\n const isMenuOpen = menuOpen === menuId\n\n const { onGoToFrame, setHighlightedActivities } = useDetailsPanelContext()\n\n const handleEditComment = () => {\n setEditingId(activityId)\n }\n\n const handleEditCancel = () => {\n // close the edit comment\n setEditingId(null)\n }\n\n const handleSave = async (value: any, files: any, data?: any) => {\n await onUpdate?.(value, files, undefined, data)\n setEditingId(null)\n }\n\n const isEditing = editingId === activityId\n\n const isRef = referenceType !== 'origin' || showOrigin\n\n const handleDelete = async () => {\n const refs = getTextRefs(body)\n\n // if the comment is a reference, (it's origin is not the entity)\n // we need to delete the reference from the origin as well\n // add it to the refs to delete\n if (isRef && origin) {\n refs.push({ id: origin.id, type: origin.type })\n }\n\n // note: body is used to match other refs to delete\n onDelete && (await onDelete(activityId, entityId, refs))\n }\n\n const deleteConfirmation = () => {\n confirmDelete({\n title: 'Delete comment',\n message: 'Are you sure you want to delete this comment?',\n accept: async () => {\n await handleDelete()\n },\n })\n }\n\n const [, setRefTooltip] = useReferenceTooltip()\n\n const mappedReactions = useMemo(\n () => mapGraphQLReactions(activity.reactions, userName),\n [[...(activity.reactions || [])]],\n )\n\n const reactionChangeHandler = (reaction: Reaction) => {\n if (reaction.isActive) {\n createReaction({\n projectName: projectName,\n // @ts-ignore exposed endpoint doesn't need the username, we still need to pass it for the optimistic update\n userName: userName,\n activityId: activityId,\n createReactionModel: {\n reaction: reaction.type,\n },\n })\n } else {\n deleteReaction({\n projectName: projectName,\n // @ts-ignore exposed endpoint doesn't need the username, we still need to pass it for the optimistic update\n userName: userName,\n activityId: activityId,\n reaction: reaction.type,\n })\n }\n }\n\n const onAnnotationClick = useCallback(\n (file: any) => {\n if (!file.annotation) return\n // annotation frame numbers are 1-based\n onGoToFrame?.((file.annotation as SavedAnnotationMetadata).range[0])\n setHighlightedActivities([activityId])\n },\n [onGoToFrame],\n )\n\n return (\n <>\n <Styled.Comment\n className={clsx('comment', {\n isOwner,\n isEditing,\n isHighlighted,\n category: !!categoryData && !isGuest,\n menuOpen: isMenuOpen,\n })}\n id={activityId}\n $categoryPrimary={categoryData?.color}\n $categoryTertiary={blendedCategoryColor.primary}\n $categorySecondary={blendedCategoryColor.secondary}\n >\n <ActivityHeader\n name={authorName}\n fullName={authorFullName}\n date={createdAt}\n isRef={isRef}\n activity={activity}\n // projectInfo={projectInfo}\n projectName={projectName}\n entityType={entityType}\n onReferenceClick={onReferenceClick}\n onReferenceTooltip={setRefTooltip}\n children={undefined}\n />\n <Styled.Body className={clsx('comment-body', { isEditing })}>\n {!readOnly && (\n <Styled.Tools className={'tools'}>\n {isOwner && handleEditComment && (\n <Styled.ToolButton icon=\"edit_square\" onClick={handleEditComment} variant=\"text\" />\n )}\n <Styled.ToolButton\n icon=\"more_horiz\"\n ref={moreRef}\n onClick={(e) => {\n e.stopPropagation()\n toggleMenuOpen(menuId)\n }}\n className={isMenuOpen ? 'active' : ''}\n />\n </Styled.Tools>\n )}\n\n {!isEditing && !isGuest && categoryData && (\n <CategoryTag\n value={categoryData.name}\n color={categoryData.color}\n style={{\n top: -4,\n left: -4,\n }}\n isCompact\n data-tooltip={\n categoryNotFound ? 'Category not found. It may have been deleted.' : undefined\n }\n data-tooltip-delay={0}\n />\n )}\n\n {isEditing ? (\n <CommentInput\n initValue={body}\n initFiles={files}\n initCategory={categoryData?.name}\n data={activity.activityData}\n isEditing\n onClose={handleEditCancel}\n onSubmit={handleSave}\n isOpen={true}\n {...editProps}\n />\n ) : (\n <>\n <CommentWrapper>\n <ReactMarkdown\n remarkPlugins={[remarkGfm, emoji, remarkDirective, remarkDirectiveRehype]}\n urlTransform={(url) => url}\n components={{\n // a links\n // @ts-ignore\n a: (props) =>\n // @ts-ignore\n aTag(props, {\n entityId,\n projectName,\n projectInfo,\n onReferenceClick,\n onReferenceTooltip: setRefTooltip,\n activityId,\n categoryPrimary: categoryData?.color,\n categorySecondary: blendedCategoryColor.secondary,\n }),\n // checkbox inputs\n // @ts-ignore\n input: (props) => inputTag(props, { activity, onCheckChange }),\n // code syntax highlighting\n // eslint-disable-next-line\n // @ts-ignore\n code: (props) => codeTag(props),\n // @ts-ignore\n blockquote: (props) => blockquoteTag(props),\n // @ts-ignore\n tip: (props) => (\n <Styled.Tip>\n <Icon icon=\"info\" />\n {props.children}\n </Styled.Tip>\n ),\n // @ts-ignore\n status: (props) => {\n return (\n <ActivityStatus name={props.id} statuses={statuses}>\n {props.children}\n </ActivityStatus>\n )\n },\n }}\n >\n {body}\n </ReactMarkdown>\n </CommentWrapper>\n {/* file uploads */}\n {/* @ts-ignore */}\n <FilesGrid\n files={files}\n isCompact={files.length > 6}\n activityId={activityId}\n projectName={projectName}\n isDownloadable\n onExpand={onFileExpand}\n onAnnotationClick={onAnnotationClick}\n onRemove={undefined}\n />\n </>\n )}\n\n {!isEditing && (\n <div style={{ marginTop: '16px' }}>\n {mappedReactions && (\n <Reactions\n reactions={mappedReactions}\n changeHandler={reactionChangeHandler}\n readOnly={readOnly}\n category={categoryData && !isGuest ? categoryData.name : undefined}\n categoryPrimary={categoryData?.color}\n categorySecondary={blendedCategoryColor.secondary}\n categoryTertiary={blendedCategoryColor.primary}\n />\n )}\n </div>\n )}\n </Styled.Body>\n </Styled.Comment>\n\n <MenuContainer\n target={moreRef.current}\n id={menuId}\n align=\"right\"\n onClose={(e: any) => {\n e?.stopPropagation()\n toggleMenuOpen(false)\n }}\n >\n <ActivityCommentMenu\n onDelete={isOwner && onDelete ? deleteConfirmation : undefined}\n onEdit={isOwner && handleEditComment}\n activityId={activityId}\n onSelect={() => toggleMenuOpen(false)}\n projectName={projectName}\n />\n </MenuContainer>\n </>\n )\n}\n\nexport default ActivityComment\n"],"names":["ActivityComment","activity","onCheckChange","onDelete","onUpdate","projectInfo","editProps","projectName","entityType","onReferenceClick","onFileExpand","showOrigin","isHighlighted","readOnly","isSlideOut","statuses","userName","createReaction","deleteReaction","editingId","setEditingId","categories","isGuest","useFeedContext","moreRef","useRef","toggleMenuOpen","menuOpen","useMenuContext","categoryData","categoryNotFound","useMemo","foundCategory","cat","blendedCategoryColor","useBlendedCategoryColor","body","authorName","authorFullName","createdAt","referenceType","entityId","activityId","author","isOwner","files","origin","menuId","isMenuOpen","onGoToFrame","setHighlightedActivities","useDetailsPanelContext","handleEditComment","handleEditCancel","handleSave","value","data","isEditing","isRef","handleDelete","refs","getTextRefs","deleteConfirmation","confirmDelete","setRefTooltip","useReferenceTooltip","mappedReactions","mapGraphQLReactions","reactionChangeHandler","reaction","onAnnotationClick","useCallback","file","jsxs","Fragment","Styled.Comment","clsx","jsx","ActivityHeader","Styled.Body","Styled.Tools","Styled.ToolButton","e","CategoryTag","CommentInput","CommentWrapper","ReactMarkdown","remarkGfm","emoji","remarkDirective","remarkDirectiveRehype","url","props","aTag","inputTag","codeTag","blockquoteTag","Styled.Tip","Icon","ActivityStatus","FilesGrid","Reactions","MenuContainer","ActivityCommentMenu"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ActivityComment.es.js","sources":["../../../../../../../src/containers/Feed/components/ActivityComment/ActivityComment.tsx"],"sourcesContent":["import clsx from 'clsx'\nimport { useCallback, useMemo, useRef } from 'react'\nimport ReactMarkdown from 'react-markdown'\nimport emoji from 'remark-emoji'\nimport remarkGfm from 'remark-gfm'\nimport remarkDirective from 'remark-directive'\nimport remarkDirectiveRehype from 'remark-directive-rehype'\n\nimport CommentInput from '../CommentInput/CommentInput'\nimport Reactions from '../ReactionContainer/Reactions'\nimport { Reaction } from '../ReactionContainer/types'\nimport useReferenceTooltip from '../../hooks/useReferenceTooltip'\nimport FilesGrid, { FilesGridProps } from '../FilesGrid/FilesGrid'\n\nimport { getTextRefs } from '../CommentInput/quillToMarkdown'\nimport * as Styled from './ActivityComment.styled'\nimport CommentWrapper from './CommentWrapper'\nimport { aTag, blockquoteTag, codeTag, inputTag } from './ActivityMarkdownComponents'\nimport { mapGraphQLReactions } from './mappers'\nimport { Icon } from '@ynput/ayon-react-components'\nimport ActivityStatus from '../ActivityStatus/ActivityStatus'\nimport { useFeedContext } from '../../context/FeedContext'\nimport { confirmDelete } from '../../../../util'\nimport ActivityHeader, { ActivityHeaderProps } from '../ActivityHeader/ActivityHeader'\nimport { MenuContainer } from '@shared/components'\nimport { useMenuContext } from '@shared/context'\nimport type { Status } from '../../../ProjectTreeTable/types/project'\nimport { SavedAnnotationMetadata } from '../../index'\nimport { useDetailsPanelContext } from '@shared/context'\nimport { useBlendedCategoryColor } from '../CommentInput/hooks/useBlendedCategoryColor'\nimport { CategoryTag } from '../ActivityCategorySelect/CategoryTag'\nimport ActivityCommentMenu from './ActivityCommentMenu'\n\ntype Props = {\n activity: any\n onCheckChange?: Function\n onDelete?: (activityId: string, entityId: string, refs: any) => Promise<void>\n onUpdate?: (value: any, files: any, refs?: any, data?: any) => Promise<void>\n projectInfo: any\n editProps?: {\n disabled: boolean\n isLoading: boolean\n }\n projectName: string\n entityType: string\n onReferenceClick?: ActivityHeaderProps['onReferenceClick']\n onFileExpand?: FilesGridProps['onExpand']\n showOrigin?: boolean\n isHighlighted?: boolean\n readOnly?: boolean\n isSlideOut?: boolean\n statuses: Status[]\n}\n\nconst ActivityComment = ({\n activity = {},\n onCheckChange,\n onDelete,\n onUpdate,\n projectInfo,\n editProps,\n projectName,\n entityType,\n onReferenceClick,\n onFileExpand,\n showOrigin,\n isHighlighted,\n readOnly,\n isSlideOut,\n statuses = [],\n}: Props) => {\n const { userName, createReaction, deleteReaction, editingId, setEditingId, categories, isGuest } =\n useFeedContext()\n\n const moreRef = useRef<HTMLButtonElement>(null)\n const { toggleMenuOpen, menuOpen } = useMenuContext()\n\n const { categoryData, categoryNotFound } = useMemo(() => {\n let categoryNotFound = false\n if (activity.activityData?.category) {\n const foundCategory = categories.find((cat) => cat.name === activity.activityData?.category)\n if (!foundCategory) {\n categoryNotFound = true\n }\n return {\n categoryData: foundCategory || {\n name: activity.activityData?.category,\n color: '#c5c5c5',\n },\n categoryNotFound,\n }\n } else {\n return {\n categoryData: null,\n categoryNotFound,\n }\n }\n }, [activity?.activityData?.category, categories])\n // Compute blended background color for category\n const blendedCategoryColor = useBlendedCategoryColor(categoryData?.color)\n\n let {\n body,\n authorName,\n authorFullName,\n createdAt,\n referenceType,\n entityId,\n activityId,\n author,\n isOwner,\n files = [],\n origin,\n } = activity\n if (!authorName) authorName = author?.name || ''\n if (!authorFullName) authorFullName = author?.fullName || authorName\n\n const menuId = `activity-comment-menu-${activityId}-${isSlideOut ? 'slideout' : 'normal'}`\n const isMenuOpen = menuOpen === menuId\n\n const { onGoToFrame, setHighlightedActivities } = useDetailsPanelContext()\n\n const handleEditComment = () => {\n setEditingId(activityId)\n }\n\n const handleEditCancel = () => {\n // close the edit comment\n setEditingId(null)\n }\n\n const handleSave = async (value: any, files: any, data?: any) => {\n await onUpdate?.(value, files, undefined, data)\n setEditingId(null)\n }\n\n const isEditing = editingId === activityId\n\n const isRef = referenceType !== 'origin' || showOrigin\n\n const handleDelete = async () => {\n const refs = getTextRefs(body)\n\n // if the comment is a reference, (it's origin is not the entity)\n // we need to delete the reference from the origin as well\n // add it to the refs to delete\n if (isRef && origin) {\n refs.push({ id: origin.id, type: origin.type })\n }\n\n // note: body is used to match other refs to delete\n onDelete && (await onDelete(activityId, entityId, refs))\n }\n\n const deleteConfirmation = () => {\n confirmDelete({\n title: 'Delete comment',\n message: 'Are you sure you want to delete this comment?',\n accept: async () => {\n await handleDelete()\n },\n })\n }\n\n const [, setRefTooltip] = useReferenceTooltip()\n\n const mappedReactions = useMemo(\n () => mapGraphQLReactions(activity.reactions, userName),\n [[...(activity.reactions || [])]],\n )\n\n const reactionChangeHandler = (reaction: Reaction) => {\n if (reaction.isActive) {\n createReaction({\n projectName: projectName,\n // @ts-ignore exposed endpoint doesn't need the username, we still need to pass it for the optimistic update\n userName: userName,\n activityId: activityId,\n createReactionModel: {\n reaction: reaction.type,\n },\n })\n } else {\n deleteReaction({\n projectName: projectName,\n // @ts-ignore exposed endpoint doesn't need the username, we still need to pass it for the optimistic update\n userName: userName,\n activityId: activityId,\n reaction: reaction.type,\n })\n }\n }\n\n const onAnnotationClick = useCallback(\n (file: any) => {\n if (!file.annotation) return\n // annotation frame numbers are 1-based\n onGoToFrame?.((file.annotation as SavedAnnotationMetadata).range[0])\n setHighlightedActivities([activityId])\n },\n [onGoToFrame],\n )\n\n return (\n <>\n <Styled.Comment\n className={clsx('comment', {\n isOwner,\n isEditing,\n isHighlighted,\n category: !!categoryData && !isGuest,\n menuOpen: isMenuOpen,\n })}\n id={activityId}\n $categoryPrimary={categoryData?.color}\n $categoryTertiary={blendedCategoryColor.primary}\n $categorySecondary={blendedCategoryColor.secondary}\n >\n <ActivityHeader\n name={authorName}\n fullName={authorFullName}\n date={createdAt}\n isRef={isRef}\n activity={activity}\n // projectInfo={projectInfo}\n projectName={projectName}\n entityType={entityType}\n onReferenceClick={onReferenceClick}\n onReferenceTooltip={setRefTooltip}\n children={undefined}\n />\n <Styled.Body className={clsx('comment-body', { isEditing })}>\n {!readOnly && (\n <Styled.Tools className={'tools'}>\n {isOwner && handleEditComment && (\n <Styled.ToolButton icon=\"edit_square\" onClick={handleEditComment} variant=\"text\" />\n )}\n <Styled.ToolButton\n icon=\"more_horiz\"\n ref={moreRef}\n onClick={(e) => {\n e.stopPropagation()\n toggleMenuOpen(menuId)\n }}\n className={isMenuOpen ? 'active' : ''}\n />\n </Styled.Tools>\n )}\n\n {!isEditing && !isGuest && categoryData && (\n <CategoryTag\n value={categoryData.name}\n color={categoryData.color}\n style={{\n top: -4,\n left: -4,\n }}\n isCompact\n data-tooltip={\n categoryNotFound ? 'Category not found. It may have been deleted.' : undefined\n }\n data-tooltip-delay={0}\n />\n )}\n\n {isEditing ? (\n <CommentInput\n initValue={body}\n initFiles={files}\n initCategory={categoryData?.name}\n data={activity.activityData}\n isEditing\n onClose={handleEditCancel}\n onSubmit={handleSave}\n isOpen={true}\n {...editProps}\n />\n ) : (\n <>\n <CommentWrapper>\n <ReactMarkdown\n remarkPlugins={[remarkGfm, emoji, remarkDirective, remarkDirectiveRehype]}\n urlTransform={(url) => url}\n components={{\n // a links\n // @ts-ignore\n a: (props) =>\n // @ts-ignore\n aTag(props, {\n entityId,\n projectName,\n projectInfo,\n onReferenceClick,\n onReferenceTooltip: setRefTooltip,\n activityId,\n categoryPrimary: categoryData?.color,\n categorySecondary: blendedCategoryColor.secondary,\n }),\n // checkbox inputs\n // @ts-ignore\n input: (props) => inputTag(props, { activity, onCheckChange }),\n // code syntax highlighting\n // eslint-disable-next-line\n // @ts-ignore\n code: (props) => codeTag(props),\n // @ts-ignore\n blockquote: (props) => blockquoteTag(props),\n // @ts-ignore\n tip: (props) => (\n <Styled.Tip>\n <Icon icon=\"info\" />\n {props.children}\n </Styled.Tip>\n ),\n // @ts-ignore\n status: (props) => {\n return (\n <ActivityStatus name={props.id} statuses={statuses}>\n {props.children}\n </ActivityStatus>\n )\n },\n }}\n >\n {body}\n </ReactMarkdown>\n </CommentWrapper>\n {/* file uploads */}\n {/* @ts-ignore */}\n <FilesGrid\n files={files}\n isCompact={files.length > 6}\n activityId={activityId}\n projectName={projectName}\n isDownloadable\n onExpand={onFileExpand}\n onAnnotationClick={onAnnotationClick}\n onRemove={undefined}\n />\n </>\n )}\n\n {!isEditing && (\n <div style={{ marginTop: '16px' }}>\n {mappedReactions && (\n <Reactions\n reactions={mappedReactions}\n changeHandler={reactionChangeHandler}\n readOnly={readOnly}\n category={categoryData && !isGuest ? categoryData.name : undefined}\n categoryPrimary={categoryData?.color}\n categorySecondary={blendedCategoryColor.secondary}\n categoryTertiary={blendedCategoryColor.primary}\n />\n )}\n </div>\n )}\n </Styled.Body>\n </Styled.Comment>\n\n <MenuContainer\n target={moreRef.current}\n id={menuId}\n align=\"right\"\n onClose={(e: any) => {\n e?.stopPropagation()\n toggleMenuOpen(false)\n }}\n >\n <ActivityCommentMenu\n onDelete={isOwner && onDelete ? deleteConfirmation : undefined}\n onEdit={isOwner && handleEditComment}\n activityId={activityId}\n onSelect={() => toggleMenuOpen(false)}\n projectName={projectName}\n />\n </MenuContainer>\n </>\n )\n}\n\nexport default ActivityComment\n"],"names":["ActivityComment","activity","onCheckChange","onDelete","onUpdate","projectInfo","editProps","projectName","entityType","onReferenceClick","onFileExpand","showOrigin","isHighlighted","readOnly","isSlideOut","statuses","userName","createReaction","deleteReaction","editingId","setEditingId","categories","isGuest","useFeedContext","moreRef","useRef","toggleMenuOpen","menuOpen","useMenuContext","categoryData","categoryNotFound","useMemo","foundCategory","cat","blendedCategoryColor","useBlendedCategoryColor","body","authorName","authorFullName","createdAt","referenceType","entityId","activityId","author","isOwner","files","origin","menuId","isMenuOpen","onGoToFrame","setHighlightedActivities","useDetailsPanelContext","handleEditComment","handleEditCancel","handleSave","value","data","isEditing","isRef","handleDelete","refs","getTextRefs","deleteConfirmation","confirmDelete","setRefTooltip","useReferenceTooltip","mappedReactions","mapGraphQLReactions","reactionChangeHandler","reaction","onAnnotationClick","useCallback","file","jsxs","Fragment","Styled.Comment","clsx","jsx","ActivityHeader","Styled.Body","Styled.Tools","Styled.ToolButton","e","CategoryTag","CommentInput","CommentWrapper","ReactMarkdown","remarkGfm","emoji","remarkDirective","remarkDirectiveRehype","url","props","aTag","inputTag","codeTag","blockquoteTag","Styled.Tip","Icon","ActivityStatus","FilesGrid","Reactions","MenuContainer","ActivityCommentMenu"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const $=require("../../../_virtual/jsx-runtime.cjs.js"),e=require("react"),L=require("../hooks/useLocalStorage.cjs.js");require("./RemoteModulesContext.cjs.js");require("../../../_virtual/runtime.cjs.js");require("../../../_virtual/semver.cjs.js");require("../api/base/client.cjs.js");require("../api/generated/graphql.cjs.js");require("../api/generated/graphqlLinks.cjs.js");require("../api/generated/access.cjs.js");require("../api/generated/actions.cjs.js");require("../api/generated/activityFeed.cjs.js");require("../api/generated/addons.cjs.js");require("../api/generated/anatomy.cjs.js");require("../api/generated/attributes.cjs.js");require("../api/generated/authentication.cjs.js");require("../api/generated/bundles.cjs.js");require("../api/generated/configuration.cjs.js");require("../api/generated/desktop.cjs.js");require("../api/generated/entityLists.cjs.js");require("../api/generated/events.cjs.js");require("../api/generated/files.cjs.js");require("../api/generated/folders.cjs.js");require("../api/generated/inbox.cjs.js");require("../api/generated/links.cjs.js");require("../api/generated/market.cjs.js");require("../api/generated/onboarding.cjs.js");require("../api/generated/operations.cjs.js");require("../api/generated/products.cjs.js");require("../api/generated/projectDashboard.cjs.js");require("../api/generated/projects.cjs.js");require("../api/generated/reviewables.cjs.js");require("../api/generated/services.cjs.js");require("../api/generated/system.cjs.js");require("../api/generated/tasks.cjs.js");require("../api/generated/teams.cjs.js");require("../api/generated/thumbnails.cjs.js");require("../api/generated/uRIs.cjs.js");require("../api/generated/users.cjs.js");require("../api/generated/versions.cjs.js");require("../api/generated/workfiles.cjs.js");require("../api/generated/ynputCloud.cjs.js");require("../api/generated/grouping.cjs.js");require("../api/generated/views.cjs.js");require("../api/queries/actions/getActions.cjs.js");require("../api/queries/activities/getActivities.cjs.js");require("../api/queries/activities/updateActivities.cjs.js");require("../api/queries/activities/updateReaction.cjs.js");require("../api/queries/activities/getMentions.cjs.js");require("../api/queries/activities/getCategories.cjs.js");require("../api/queries/addons/getAddons.cjs.js");require("../api/queries/addons/updateAddons.cjs.js");require("../api/queries/attributes/getAttributes.cjs.js");require("../api/queries/attributes/updateAttributes.cjs.js");require("../api/queries/authentication/getAuthentication.cjs.js");require("../api/queries/cloud/cloud.cjs.js");require("../api/queries/config/getConfig.cjs.js");require("../api/queries/config/updateConfig.cjs.js");require("../api/queries/entities/getEntity.cjs.js");require("../api/queries/entities/getEntityPanel.cjs.js");require("../api/queries/entities/updateEntity.cjs.js");require("../api/queries/entityLists/getLists.cjs.js");require("../api/queries/entityLists/updateLists.cjs.js");require("../api/queries/entityLists/getListsAttributes.cjs.js");require("../api/queries/entityLists/updateListsAttributes.cjs.js");require("../api/queries/entityLists/listFolders.cjs.js");require("../api/queries/folders/getFolders.cjs.js");require("../api/queries/grouping/getGrouping.cjs.js");require("../api/queries/links/updateLinks.cjs.js");require("../api/queries/links/getLinks.cjs.js");require("../api/queries/links/getEntityLinks.cjs.js");require("../api/queries/overview/getOverview.cjs.js");require("../api/queries/overview/updateOverview.cjs.js");require("../api/queries/versions/getVersionsProducts.cjs.js");require("../api/queries/permissions/getPermissions.cjs.js");require("../api/queries/products/createProduct.cjs.js");require("../api/queries/project/getProject.cjs.js");require("../api/queries/project/updateProject.cjs.js");require("../api/queries/review/getReview.cjs.js");require("../api/queries/review/updateReview.cjs.js");require("../api/queries/share/share.cjs.js");require("../api/queries/system/getSystem.cjs.js");require("../api/queries/userDashboard/getUserDashboard.cjs.js");require("../api/queries/users/getUsers.cjs.js");require("../api/queries/users/updateUsers.cjs.js");require("../api/queries/users/guests.cjs.js");require("../api/queries/versions/updateVersions.cjs.js");require("../api/queries/views/getViews.cjs.js");require("../api/queries/views/updateViews.cjs.js");require("../api/queries/watchers/getWatchers.cjs.js");require("../api/queries/uris/getUris.cjs.js");require("lodash");require("react-toastify");require("./ThumbnailUploaderContext.cjs.js");require("./SettingsPanelContext.cjs.js");require("./pip/PiPProvider.cjs.js");require("react-dom");require("./pip/PiPWrapper.cjs.js");require("./AddonProjectContext.cjs.js");require("./AddonContext.cjs.js");const ee=require("./PowerpackContext.cjs.js");require("./MoveEntityContext.cjs.js");require("./MenuContext.cjs.js");require("./WebsocketContext.cjs.js");require("./GlobalContext.cjs.js");require("./ProjectContext.cjs.js");require("./ProjectFoldersContext.cjs.js");const re=require("./UriContext.cjs.js");require("react-redux");require("custom-protocol-check");require("../containers/ProjectTreeTable/components/GroupSettingsFallback.cjs.js");const F=e.createContext(void 0),te=({children:t,defaultTab:l="activity",hasLicense:v,debug:u={},...s})=>{const o=s.user,P="isDeveloperMode"in u?u.isDeveloperMode:o?.attrib?.developerMode??!1,b="isGuest"in u?u.isGuest:o?.data?.isGuest,{powerLicense:h,setPowerpackDialog:p}=ee.usePowerpack(),f="hasLicense"in u?u.hasLicense:!!h||v,[i,D]=e.useState({}),[B,M]=e.useState([]),R=e.useCallback(r=>i[r]?i[r]:!1,[i]),U=e.useCallback((r,S)=>{const a={...i};a[r]=S,D(a)},[i]),[c,A]=L.useLocalStorage("details/tabs-by-scope",{}),G=e.useCallback(r=>c[r]?c[r]:l,[c,l]),[k,m]=e.useState(null),N=e.useCallback(r=>{m(r)},[]),x=e.useCallback(()=>{m(null),k&&C([])},[]);e.useEffect(()=>{x()},[s.useLocation().pathname]);const[H,O]=e.useState(null),z=e.useCallback(r=>{O(r)},[]),J=e.useCallback(()=>{O(null)},[]),[K,g]=e.useState(null),[Q,C]=e.useState([]),{uriType:V,uri:W,entity:d,getUriEntities:X}=re.useURIContext(),[y]=s.useSearchParams();e.useEffect(()=>{if(V==="entity"&&d&&d.entityType!=="product"){X().then(q=>{if(q.length===0)return;const j=q.find(_=>_.uri===W),n=j?.entities?.[0];if(!j||!n)return;const w=n?.projectName||d.projectName||"",E=n.representationId||n.versionId||n.productId||n.taskId||n.folderId;if(!w||!E)return;const Z={entityType:d.entityType,entities:[{id:E,projectName:w}],source:"uri"};g(Z)}).catch(q=>{console.warn("Failed to get URI entities:",q)});return}const r=y.get("project"),S=y.get("type"),a=y.get("id"),T=y.get("activity");r&&S&&a&&(g({entityType:S,entities:[{id:a,projectName:r}],source:"url"}),T&&(C([T]),A({...c,overview:"activity"})))},[]);const Y={panelOpenByScope:i,getOpenForScope:R,setPanelOpen:U,setPanelOpenByScope:D,tabsByScope:c,getTabForScope:G,slideOut:k,openSlideOut:N,closeSlideOut:x,highlightedActivities:Q,setHighlightedActivities:C,pip:H,openPip:z,closePip:J,entities:K,setEntities:g,feedAnnotations:B,setFeedAnnotations:M,isDeveloperMode:P,isGuest:b,hasLicense:f,onPowerFeature:p,...s};return $.jsxRuntimeExports.jsx(F.Provider,{value:Y,children:t})},I=()=>{const t=e.useContext(F);if(t===void 0)throw new Error("useDetailsPanel must be used within a DetailsPanelProvider");return t},ie=t=>{const{getOpenForScope:l,setPanelOpen:v,getTabForScope:u}=I(),[s,o]=L.useLocalStorage("details/tabs-by-scope",{}),[P,b]=e.useState(()=>s[t]??u(t)),h=e.useCallback(i=>{b(i),o({...s,[t]:i})},[t,o]),p=P,f=["activity","comments","versions","checklists"].includes(p);return{isOpen:l(t),setOpen:i=>v(t,i),currentTab:p,setTab:h,isFeed:f}};exports.DetailsPanelProvider=te;exports.useDetailsPanelContext=I;exports.useScopedDetailsPanel=ie;
|
|
2
2
|
//# sourceMappingURL=DetailsPanelContext.cjs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DetailsPanelContext.cjs.js","sources":["../../../../src/context/DetailsPanelContext.tsx"],"sourcesContent":["import React, {\n createContext,\n ReactNode,\n useCallback,\n useContext,\n useEffect,\n useState,\n} from 'react'\nimport { useLocalStorage } from '@shared/hooks'\nimport type { UserModel } from '@shared/api'\nimport { DetailsPanelEntityType } from '@shared/api'\nimport { useLocation, useNavigate, useParams, useSearchParams } from 'react-router-dom'\nimport { SavedAnnotationMetadata } from '@shared/containers'\nimport { PowerpackFeature, usePowerpack } from './PowerpackContext'\nimport { useGlobalContext } from './GlobalContext'\nimport { useURIContext } from './UriContext'\n\nexport type FeedFilters = 'activity' | 'comments' | 'versions' | 'checklists'\n\nexport type DetailsPanelTab = FeedFilters | 'details' | 'files'\n\nexport type SlideOut = {\n entityId: string\n entityType: DetailsPanelEntityType\n projectName: string\n}\n\nexport type DetailsPanelPip = {\n entityType: DetailsPanelEntityType\n entities: { id: string; projectName: string }[]\n scope: string\n}\n\nexport type Entities = {\n entityType: DetailsPanelEntityType\n entities: { id: string; projectName: string }[]\n entitySubTypes?: string[]\n source?: 'uri' | 'url' | 'related' // uri = ayon+entity://..., url = ?project=...&type=...&id=...\n}\n\nexport interface OpenStateByScope {\n [scope: string]: boolean\n}\n\n// Create a new interface for managing tab state by scope\nexport interface TabStateByScope {\n [scope: string]: DetailsPanelTab\n}\n\n// these props get forwarded to the details panel value\n// it's mainly redux callbacks that cannot be used in shared library\nexport interface DetailsPanelContextProps {\n dispatch?: any // this is a redux dispatch function and it's quite annoying we need to do this\n user: UserModel\n viewer?: {\n reviewableIds: string[]\n taskId?: string | null\n folderId?: string | null\n }\n // redux callback actions\n onOpenImage?: (args: any) => void\n onGoToFrame?: (frame: number) => void\n onOpenViewer?: (args: any) => void\n onUpdateEntity?: (data: { operations: any[]; entityType: string }) => void\n // route hooks\n useParams: typeof useParams\n useNavigate: typeof useNavigate\n useLocation: typeof useLocation\n useSearchParams: typeof useSearchParams\n feedAnnotationsEnabled?: boolean\n hasLicense?: boolean\n // debugging used to simulate different values\n debug?: {\n isDeveloperMode?: boolean\n isGuest?: boolean\n hasLicense?: boolean\n }\n}\n\n// Interface for our simplified context\nexport interface DetailsPanelContextType extends DetailsPanelContextProps {\n // user\n isDeveloperMode: boolean\n isGuest: boolean\n // Open state for the panel by scope\n panelOpenByScope: OpenStateByScope\n getOpenForScope: (scope: string) => boolean\n setPanelOpen: (scope: string, isOpen: boolean) => void\n setPanelOpenByScope: (newState: OpenStateByScope) => void\n\n // Tab preferences by scope\n tabsByScope: TabStateByScope\n getTabForScope: (scope: string) => DetailsPanelTab\n\n // Slide out state\n slideOut: null | SlideOut\n openSlideOut: (slideOut: SlideOut) => void\n closeSlideOut: () => void\n\n // Highlighted activities\n highlightedActivities: string[]\n setHighlightedActivities: (activities: string[]) => void\n\n // PiP state\n pip: DetailsPanelPip | null\n openPip: (pip: DetailsPanelPip) => void\n closePip: () => void\n\n // Entities state\n entities: Entities | null\n setEntities: (entities: Entities | null) => void\n\n // Annotations\n feedAnnotations: SavedAnnotationMetadata[]\n setFeedAnnotations: (annotations: SavedAnnotationMetadata[]) => void\n\n // powerpack\n onPowerFeature: (feature: PowerpackFeature) => void\n}\n\n// Create the context\nconst DetailsPanelContext = createContext<DetailsPanelContextType | undefined>(undefined)\n\n// Provider component\nexport interface DetailsPanelProviderProps extends DetailsPanelContextProps {\n children: ReactNode\n defaultTab?: DetailsPanelTab\n}\n\nexport const DetailsPanelProvider: React.FC<DetailsPanelProviderProps> = ({\n children,\n defaultTab = 'activity',\n hasLicense: hasLicenseProp,\n debug = {},\n ...forwardedProps\n}) => {\n // get current user\n const { user: currentUser } = useGlobalContext()\n const isDeveloperMode =\n 'isDeveloperMode' in debug\n ? (debug.isDeveloperMode as boolean)\n : currentUser?.attrib?.developerMode ?? false\n const isGuest = 'isGuest' in debug ? (debug.isGuest as boolean) : currentUser?.data?.isGuest\n\n // get license from powerpack or forwarded down from props\n const { powerLicense, setPowerpackDialog } = usePowerpack()\n const hasLicense =\n 'hasLicense' in debug ? (debug.hasLicense as boolean) : !!powerLicense || hasLicenseProp\n\n // keep track of the currently open panel by scope\n const [panelOpenByScope, setPanelOpenByScope] = useState<OpenStateByScope>({})\n const [feedAnnotations, setFeedAnnotations] = useState<SavedAnnotationMetadata[]>([])\n\n // get the current open state for a specific scope\n const getOpenForScope = useCallback(\n (scope: string): boolean => {\n // Check if we have a saved preference for this scope\n if (panelOpenByScope[scope]) {\n return panelOpenByScope[scope]\n }\n\n // Fall back to default\n return false\n },\n [panelOpenByScope],\n )\n // Set open state for a scope\n const setPanelOpen = useCallback(\n (scope: string, isOpen: boolean) => {\n // Create a new state object based on current open state\n const newState = { ...panelOpenByScope }\n newState[scope] = isOpen\n\n // Update the state with the new object\n setPanelOpenByScope(newState)\n },\n [panelOpenByScope],\n )\n\n // Use localStorage to persist tab preferences by scope\n const [tabsByScope, setTabByScope] = useLocalStorage<TabStateByScope>('details/tabs-by-scope', {})\n\n // Get the current tab for a specific scope\n const getTabForScope = useCallback(\n (scope: string): DetailsPanelTab => {\n // Check if we have a saved preference for this scope\n if (tabsByScope[scope]) {\n return tabsByScope[scope]\n }\n\n // Fall back to default\n return defaultTab\n },\n [tabsByScope, defaultTab],\n )\n\n // Set tab for a scope\n\n // is the slide out open?\n const [slideOut, setSlideOut] = useState<null | SlideOut>(null)\n\n // open the slide out\n const openSlideOut = useCallback<DetailsPanelContextType['openSlideOut']>((params) => {\n setSlideOut(params)\n }, [])\n\n // close the slide out\n const closeSlideOut = useCallback(() => {\n setSlideOut(null)\n if (slideOut) {\n setHighlightedActivities([])\n }\n }, [])\n\n // close slide out whenever the page changes\n useEffect(() => {\n closeSlideOut()\n }, [useLocation().pathname])\n\n const [pip, setPip] = useState<DetailsPanelPip | null>(null)\n\n const openPip = useCallback((pip: DetailsPanelPip) => {\n setPip(pip)\n }, [])\n const closePip = useCallback(() => {\n setPip(null)\n }, [])\n\n const [entities, setEntities] = useState<Entities | null>(null)\n\n const [highlightedActivities, setHighlightedActivities] = useState<string[]>([])\n\n const { uriType, uri, entity, getUriEntities } = useURIContext()\n const [searchParams] = useSearchParams()\n\n // on first load, check if there is a uri or URL params and open details panel if present\n useEffect(() => {\n // Priority 1: Check for 'uri' parameter (ayon+entity://...)\n if (uriType === 'entity' && entity && entity.entityType !== 'product') {\n getUriEntities()\n .then((result) => {\n if (result.length === 0) return\n\n const entityUriData = result.find((r) => r.uri === uri)\n const entityData = entityUriData?.entities?.[0]\n\n if (!entityUriData || !entityData) return\n const projectName = entityData?.projectName || entity.projectName || ''\n const id =\n entityData.representationId ||\n entityData.versionId ||\n entityData.productId ||\n entityData.taskId ||\n entityData.folderId\n\n if (!projectName || !id) return\n\n const newEntities: Entities = {\n entityType: entity.entityType as DetailsPanelEntityType,\n entities: [\n {\n id: id,\n projectName: projectName,\n },\n ],\n source: 'uri',\n }\n\n setEntities(newEntities)\n })\n .catch((err) => {\n console.warn('Failed to get URI entities:', err)\n })\n return\n }\n\n // Priority 2: Check for URL params (project, type, id)\n const project = searchParams.get('project')\n const type = searchParams.get('type')\n const id = searchParams.get('id')\n const activity = searchParams.get('activity')\n\n if (project && type && id) {\n const newEntities: Entities = {\n entityType: type as DetailsPanelEntityType,\n entities: [\n {\n id,\n projectName: project,\n },\n ],\n source: 'url',\n }\n\n setEntities(newEntities)\n\n // if there is an activity param, open the activity tab\n\n if (activity) {\n setHighlightedActivities([activity])\n setTabByScope({\n ...tabsByScope,\n overview: 'activity',\n })\n }\n }\n }, [])\n\n const value = {\n // open state for the panel by scope\n panelOpenByScope,\n getOpenForScope,\n setPanelOpen,\n setPanelOpenByScope,\n // tab preferences\n tabsByScope,\n getTabForScope,\n // slide out state\n slideOut,\n openSlideOut,\n closeSlideOut,\n // highlighted activities\n highlightedActivities,\n setHighlightedActivities,\n // PiP state\n pip,\n openPip,\n closePip,\n // entities state\n entities,\n setEntities,\n feedAnnotations,\n setFeedAnnotations,\n isDeveloperMode,\n isGuest,\n hasLicense,\n onPowerFeature: setPowerpackDialog,\n ...forwardedProps,\n }\n\n return <DetailsPanelContext.Provider value={value}>{children}</DetailsPanelContext.Provider>\n}\n\n// Custom hook to use the details context\nexport const useDetailsPanelContext = (): DetailsPanelContextType => {\n const context = useContext(DetailsPanelContext)\n if (context === undefined) {\n throw new Error('useDetailsPanel must be used within a DetailsProvider')\n }\n return context\n}\n\n// Add a specialized hook for using a panel in a specific scope\nexport const useScopedDetailsPanel = (scope: string) => {\n const { getOpenForScope, setPanelOpen, getTabForScope } = useDetailsPanelContext()\n\n const [tabsByScope, setTabsByScope] = useLocalStorage<TabStateByScope>(\n 'details/tabs-by-scope',\n {},\n )\n\n const [tab, setTab] = useState<DetailsPanelTab>(() => tabsByScope[scope] ?? getTabForScope(scope))\n\n // Keep localStorage and local state in sync\n const updateTab = useCallback(\n (newTab: DetailsPanelTab) => {\n setTab(newTab)\n setTabsByScope({ ...tabsByScope, [scope]: newTab })\n },\n [scope, setTabsByScope],\n )\n\n const currentTab = tab\n const isFeed = ['activity', 'comments', 'versions', 'checklists'].includes(currentTab)\n\n return {\n isOpen: getOpenForScope(scope),\n setOpen: (isOpen: boolean) => setPanelOpen(scope, isOpen),\n currentTab,\n setTab: updateTab,\n isFeed,\n }\n}\n"],"names":["DetailsPanelContext","createContext","DetailsPanelProvider","children","defaultTab","hasLicenseProp","debug","forwardedProps","currentUser","useGlobalContext","isDeveloperMode","isGuest","powerLicense","setPowerpackDialog","usePowerpack","hasLicense","panelOpenByScope","setPanelOpenByScope","useState","feedAnnotations","setFeedAnnotations","getOpenForScope","useCallback","scope","setPanelOpen","isOpen","newState","tabsByScope","setTabByScope","useLocalStorage","getTabForScope","slideOut","setSlideOut","openSlideOut","params","closeSlideOut","setHighlightedActivities","useEffect","useLocation","pip","setPip","openPip","closePip","entities","setEntities","highlightedActivities","uriType","uri","entity","getUriEntities","useURIContext","searchParams","useSearchParams","result","entityUriData","r","entityData","projectName","id","newEntities","err","project","type","activity","value","jsx","useDetailsPanelContext","context","useContext","useScopedDetailsPanel","setTabsByScope","tab","setTab","updateTab","newTab","currentTab","isFeed"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DetailsPanelContext.cjs.js","sources":["../../../../src/context/DetailsPanelContext.tsx"],"sourcesContent":["import React, {\n createContext,\n ReactNode,\n useCallback,\n useContext,\n useEffect,\n useState,\n} from 'react'\nimport { useLocalStorage } from '@shared/hooks'\nimport type { UserModel } from '@shared/api'\nimport { DetailsPanelEntityType } from '@shared/api'\nimport { useLocation, useNavigate, useParams, useSearchParams } from 'react-router-dom'\nimport { SavedAnnotationMetadata } from '@shared/containers'\nimport { PowerpackFeature, usePowerpack } from './PowerpackContext'\nimport { useURIContext } from './UriContext'\n\nexport type FeedFilters = 'activity' | 'comments' | 'versions' | 'checklists'\n\nexport type DetailsPanelTab = FeedFilters | 'details' | 'files'\n\nexport type SlideOut = {\n entityId: string\n entityType: DetailsPanelEntityType\n projectName: string\n}\n\nexport type DetailsPanelPip = {\n entityType: DetailsPanelEntityType\n entities: { id: string; projectName: string }[]\n scope: string\n}\n\nexport type Entities = {\n entityType: DetailsPanelEntityType\n entities: { id: string; projectName: string }[]\n entitySubTypes?: string[]\n source?: 'uri' | 'url' | 'related' // uri = ayon+entity://..., url = ?project=...&type=...&id=...\n}\n\nexport interface OpenStateByScope {\n [scope: string]: boolean\n}\n\n// Create a new interface for managing tab state by scope\nexport interface TabStateByScope {\n [scope: string]: DetailsPanelTab\n}\n\n// these props get forwarded to the details panel value\n// it's mainly redux callbacks that cannot be used in shared library\nexport interface DetailsPanelContextProps {\n dispatch?: any // this is a redux dispatch function and it's quite annoying we need to do this\n user: UserModel\n viewer?: {\n reviewableIds: string[]\n taskId?: string | null\n folderId?: string | null\n }\n // redux callback actions\n onOpenImage?: (args: any) => void\n onGoToFrame?: (frame: number) => void\n onOpenViewer?: (args: any) => void\n onUpdateEntity?: (data: { operations: any[]; entityType: string }) => void\n // route hooks\n useParams: typeof useParams\n useNavigate: typeof useNavigate\n useLocation: typeof useLocation\n useSearchParams: typeof useSearchParams\n feedAnnotationsEnabled?: boolean\n hasLicense?: boolean\n // debugging used to simulate different values\n debug?: {\n isDeveloperMode?: boolean\n isGuest?: boolean\n hasLicense?: boolean\n }\n}\n\n// Interface for our simplified context\nexport interface DetailsPanelContextType extends DetailsPanelContextProps {\n // user\n isDeveloperMode: boolean\n isGuest: boolean\n // Open state for the panel by scope\n panelOpenByScope: OpenStateByScope\n getOpenForScope: (scope: string) => boolean\n setPanelOpen: (scope: string, isOpen: boolean) => void\n setPanelOpenByScope: (newState: OpenStateByScope) => void\n\n // Tab preferences by scope\n tabsByScope: TabStateByScope\n getTabForScope: (scope: string) => DetailsPanelTab\n\n // Slide out state\n slideOut: null | SlideOut\n openSlideOut: (slideOut: SlideOut) => void\n closeSlideOut: () => void\n\n // Highlighted activities\n highlightedActivities: string[]\n setHighlightedActivities: (activities: string[]) => void\n\n // PiP state\n pip: DetailsPanelPip | null\n openPip: (pip: DetailsPanelPip) => void\n closePip: () => void\n\n // Entities state\n entities: Entities | null\n setEntities: (entities: Entities | null) => void\n\n // Annotations\n feedAnnotations: SavedAnnotationMetadata[]\n setFeedAnnotations: (annotations: SavedAnnotationMetadata[]) => void\n\n // powerpack\n onPowerFeature: (feature: PowerpackFeature) => void\n}\n\n// Create the context\nconst DetailsPanelContext = createContext<DetailsPanelContextType | undefined>(undefined)\n\n// Provider component\nexport interface DetailsPanelProviderProps extends DetailsPanelContextProps {\n children: ReactNode\n defaultTab?: DetailsPanelTab\n}\n\nexport const DetailsPanelProvider: React.FC<DetailsPanelProviderProps> = ({\n children,\n defaultTab = 'activity',\n hasLicense: hasLicenseProp,\n debug = {},\n ...forwardedProps\n}) => {\n const user = forwardedProps.user\n const isDeveloperMode =\n 'isDeveloperMode' in debug\n ? (debug.isDeveloperMode as boolean)\n : user?.attrib?.developerMode ?? false\n const isGuest = 'isGuest' in debug ? (debug.isGuest as boolean) : user?.data?.isGuest\n\n // get license from powerpack or forwarded down from props\n const { powerLicense, setPowerpackDialog } = usePowerpack()\n const hasLicense =\n 'hasLicense' in debug ? (debug.hasLicense as boolean) : !!powerLicense || hasLicenseProp\n\n // keep track of the currently open panel by scope\n const [panelOpenByScope, setPanelOpenByScope] = useState<OpenStateByScope>({})\n const [feedAnnotations, setFeedAnnotations] = useState<SavedAnnotationMetadata[]>([])\n\n // get the current open state for a specific scope\n const getOpenForScope = useCallback(\n (scope: string): boolean => {\n // Check if we have a saved preference for this scope\n if (panelOpenByScope[scope]) {\n return panelOpenByScope[scope]\n }\n\n // Fall back to default\n return false\n },\n [panelOpenByScope],\n )\n // Set open state for a scope\n const setPanelOpen = useCallback(\n (scope: string, isOpen: boolean) => {\n // Create a new state object based on current open state\n const newState = { ...panelOpenByScope }\n newState[scope] = isOpen\n\n // Update the state with the new object\n setPanelOpenByScope(newState)\n },\n [panelOpenByScope],\n )\n\n // Use localStorage to persist tab preferences by scope\n const [tabsByScope, setTabByScope] = useLocalStorage<TabStateByScope>('details/tabs-by-scope', {})\n\n // Get the current tab for a specific scope\n const getTabForScope = useCallback(\n (scope: string): DetailsPanelTab => {\n // Check if we have a saved preference for this scope\n if (tabsByScope[scope]) {\n return tabsByScope[scope]\n }\n\n // Fall back to default\n return defaultTab\n },\n [tabsByScope, defaultTab],\n )\n\n // Set tab for a scope\n\n // is the slide out open?\n const [slideOut, setSlideOut] = useState<null | SlideOut>(null)\n\n // open the slide out\n const openSlideOut = useCallback<DetailsPanelContextType['openSlideOut']>((params) => {\n setSlideOut(params)\n }, [])\n\n // close the slide out\n const closeSlideOut = useCallback(() => {\n setSlideOut(null)\n if (slideOut) {\n setHighlightedActivities([])\n }\n }, [])\n\n // close slide out whenever the page changes\n useEffect(() => {\n closeSlideOut()\n }, [forwardedProps.useLocation().pathname])\n\n const [pip, setPip] = useState<DetailsPanelPip | null>(null)\n\n const openPip = useCallback((pip: DetailsPanelPip) => {\n setPip(pip)\n }, [])\n const closePip = useCallback(() => {\n setPip(null)\n }, [])\n\n const [entities, setEntities] = useState<Entities | null>(null)\n\n const [highlightedActivities, setHighlightedActivities] = useState<string[]>([])\n\n const { uriType, uri, entity, getUriEntities } = useURIContext()\n const [searchParams] = forwardedProps.useSearchParams()\n\n // on first load, check if there is a uri or URL params and open details panel if present\n useEffect(() => {\n // Priority 1: Check for 'uri' parameter (ayon+entity://...)\n if (uriType === 'entity' && entity && entity.entityType !== 'product') {\n getUriEntities()\n .then((result) => {\n if (result.length === 0) return\n\n const entityUriData = result.find((r) => r.uri === uri)\n const entityData = entityUriData?.entities?.[0]\n\n if (!entityUriData || !entityData) return\n const projectName = entityData?.projectName || entity.projectName || ''\n const id =\n entityData.representationId ||\n entityData.versionId ||\n entityData.productId ||\n entityData.taskId ||\n entityData.folderId\n\n if (!projectName || !id) return\n\n const newEntities: Entities = {\n entityType: entity.entityType as DetailsPanelEntityType,\n entities: [\n {\n id: id,\n projectName: projectName,\n },\n ],\n source: 'uri',\n }\n\n setEntities(newEntities)\n })\n .catch((err) => {\n console.warn('Failed to get URI entities:', err)\n })\n return\n }\n\n // Priority 2: Check for URL params (project, type, id)\n const project = searchParams.get('project')\n const type = searchParams.get('type')\n const id = searchParams.get('id')\n const activity = searchParams.get('activity')\n\n if (project && type && id) {\n const newEntities: Entities = {\n entityType: type as DetailsPanelEntityType,\n entities: [\n {\n id,\n projectName: project,\n },\n ],\n source: 'url',\n }\n\n setEntities(newEntities)\n\n // if there is an activity param, open the activity tab\n\n if (activity) {\n setHighlightedActivities([activity])\n setTabByScope({\n ...tabsByScope,\n overview: 'activity',\n })\n }\n }\n }, [])\n\n const value = {\n // open state for the panel by scope\n panelOpenByScope,\n getOpenForScope,\n setPanelOpen,\n setPanelOpenByScope,\n // tab preferences\n tabsByScope,\n getTabForScope,\n // slide out state\n slideOut,\n openSlideOut,\n closeSlideOut,\n // highlighted activities\n highlightedActivities,\n setHighlightedActivities,\n // PiP state\n pip,\n openPip,\n closePip,\n // entities state\n entities,\n setEntities,\n feedAnnotations,\n setFeedAnnotations,\n isDeveloperMode,\n isGuest,\n hasLicense,\n onPowerFeature: setPowerpackDialog,\n ...forwardedProps,\n }\n\n return <DetailsPanelContext.Provider value={value}>{children}</DetailsPanelContext.Provider>\n}\n\n// Custom hook to use the details context\nexport const useDetailsPanelContext = (): DetailsPanelContextType => {\n const context = useContext(DetailsPanelContext)\n if (context === undefined) {\n throw new Error('useDetailsPanel must be used within a DetailsPanelProvider')\n }\n return context\n}\n\n// Add a specialized hook for using a panel in a specific scope\nexport const useScopedDetailsPanel = (scope: string) => {\n const { getOpenForScope, setPanelOpen, getTabForScope } = useDetailsPanelContext()\n\n const [tabsByScope, setTabsByScope] = useLocalStorage<TabStateByScope>(\n 'details/tabs-by-scope',\n {},\n )\n\n const [tab, setTab] = useState<DetailsPanelTab>(() => tabsByScope[scope] ?? getTabForScope(scope))\n\n // Keep localStorage and local state in sync\n const updateTab = useCallback(\n (newTab: DetailsPanelTab) => {\n setTab(newTab)\n setTabsByScope({ ...tabsByScope, [scope]: newTab })\n },\n [scope, setTabsByScope],\n )\n\n const currentTab = tab\n const isFeed = ['activity', 'comments', 'versions', 'checklists'].includes(currentTab)\n\n return {\n isOpen: getOpenForScope(scope),\n setOpen: (isOpen: boolean) => setPanelOpen(scope, isOpen),\n currentTab,\n setTab: updateTab,\n isFeed,\n }\n}\n"],"names":["DetailsPanelContext","createContext","DetailsPanelProvider","children","defaultTab","hasLicenseProp","debug","forwardedProps","user","isDeveloperMode","isGuest","powerLicense","setPowerpackDialog","usePowerpack","hasLicense","panelOpenByScope","setPanelOpenByScope","useState","feedAnnotations","setFeedAnnotations","getOpenForScope","useCallback","scope","setPanelOpen","isOpen","newState","tabsByScope","setTabByScope","useLocalStorage","getTabForScope","slideOut","setSlideOut","openSlideOut","params","closeSlideOut","setHighlightedActivities","useEffect","pip","setPip","openPip","closePip","entities","setEntities","highlightedActivities","uriType","uri","entity","getUriEntities","useURIContext","searchParams","result","entityUriData","r","entityData","projectName","id","newEntities","err","project","type","activity","value","jsx","useDetailsPanelContext","context","useContext","useScopedDetailsPanel","setTabsByScope","tab","setTab","updateTab","newTab","currentTab","isFeed"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { j as tt } from "../../../_virtual/jsx-runtime.es.js";
|
|
2
|
-
import { createContext as
|
|
2
|
+
import { createContext as it, useContext as ot, useState as s, useCallback as r, useEffect as C } from "react";
|
|
3
3
|
import { useLocalStorage as k } from "../hooks/useLocalStorage.es.js";
|
|
4
4
|
import "./RemoteModulesContext.es.js";
|
|
5
5
|
import "../../../_virtual/runtime.es.js";
|
|
@@ -102,143 +102,142 @@ import { usePowerpack as et } from "./PowerpackContext.es.js";
|
|
|
102
102
|
import "./MoveEntityContext.es.js";
|
|
103
103
|
import "./MenuContext.es.js";
|
|
104
104
|
import "./WebsocketContext.es.js";
|
|
105
|
-
import
|
|
105
|
+
import "./GlobalContext.es.js";
|
|
106
106
|
import "./ProjectContext.es.js";
|
|
107
107
|
import "./ProjectFoldersContext.es.js";
|
|
108
|
-
import { useURIContext as
|
|
108
|
+
import { useURIContext as rt } from "./UriContext.es.js";
|
|
109
109
|
import "react-redux";
|
|
110
110
|
import "custom-protocol-check";
|
|
111
111
|
import "../containers/ProjectTreeTable/components/GroupSettingsFallback.es.js";
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
hasLicense: P,
|
|
112
|
+
const A = it(void 0), co = ({
|
|
113
|
+
children: i,
|
|
114
|
+
defaultTab: u = "activity",
|
|
115
|
+
hasLicense: h,
|
|
117
116
|
debug: e = {},
|
|
118
|
-
...
|
|
117
|
+
...p
|
|
119
118
|
}) => {
|
|
120
|
-
const
|
|
121
|
-
(t) =>
|
|
122
|
-
[
|
|
123
|
-
),
|
|
124
|
-
(t,
|
|
125
|
-
const
|
|
126
|
-
|
|
119
|
+
const m = p.user, S = "isDeveloperMode" in e ? e.isDeveloperMode : m?.attrib?.developerMode ?? !1, P = "isGuest" in e ? e.isGuest : m?.data?.isGuest, { powerLicense: g, setPowerpackDialog: d } = et(), D = "hasLicense" in e ? e.hasLicense : !!g || h, [o, T] = s({}), [G, M] = s([]), N = r(
|
|
120
|
+
(t) => o[t] ? o[t] : !1,
|
|
121
|
+
[o]
|
|
122
|
+
), U = r(
|
|
123
|
+
(t, f) => {
|
|
124
|
+
const a = { ...o };
|
|
125
|
+
a[t] = f, T(a);
|
|
127
126
|
},
|
|
128
|
-
[
|
|
129
|
-
), [
|
|
130
|
-
(t) =>
|
|
131
|
-
[
|
|
132
|
-
), [x,
|
|
133
|
-
|
|
134
|
-
}, []),
|
|
135
|
-
|
|
127
|
+
[o]
|
|
128
|
+
), [c, R] = k("details/tabs-by-scope", {}), H = r(
|
|
129
|
+
(t) => c[t] ? c[t] : u,
|
|
130
|
+
[c, u]
|
|
131
|
+
), [x, j] = s(null), q = r((t) => {
|
|
132
|
+
j(t);
|
|
133
|
+
}, []), w = r(() => {
|
|
134
|
+
j(null), x && b([]);
|
|
136
135
|
}, []);
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
}, [
|
|
136
|
+
C(() => {
|
|
137
|
+
w();
|
|
138
|
+
}, [p.useLocation().pathname]);
|
|
140
139
|
const [z, E] = s(null), J = r((t) => {
|
|
141
140
|
E(t);
|
|
142
141
|
}, []), K = r(() => {
|
|
143
142
|
E(null);
|
|
144
|
-
}, []), [Q,
|
|
145
|
-
|
|
143
|
+
}, []), [Q, O] = s(null), [V, b] = s([]), { uriType: W, uri: X, entity: y, getUriEntities: Y } = rt(), [v] = p.useSearchParams();
|
|
144
|
+
C(() => {
|
|
146
145
|
if (W === "entity" && y && y.entityType !== "product") {
|
|
147
|
-
Y().then((
|
|
148
|
-
if (
|
|
149
|
-
const
|
|
150
|
-
if (!
|
|
151
|
-
const
|
|
152
|
-
if (!
|
|
146
|
+
Y().then((l) => {
|
|
147
|
+
if (l.length === 0) return;
|
|
148
|
+
const I = l.find(($) => $.uri === X), n = I?.entities?.[0];
|
|
149
|
+
if (!I || !n) return;
|
|
150
|
+
const L = n?.projectName || y.projectName || "", B = n.representationId || n.versionId || n.productId || n.taskId || n.folderId;
|
|
151
|
+
if (!L || !B) return;
|
|
153
152
|
const _ = {
|
|
154
153
|
entityType: y.entityType,
|
|
155
154
|
entities: [
|
|
156
155
|
{
|
|
157
|
-
id:
|
|
158
|
-
projectName:
|
|
156
|
+
id: B,
|
|
157
|
+
projectName: L
|
|
159
158
|
}
|
|
160
159
|
],
|
|
161
160
|
source: "uri"
|
|
162
161
|
};
|
|
163
|
-
|
|
164
|
-
}).catch((
|
|
165
|
-
console.warn("Failed to get URI entities:",
|
|
162
|
+
O(_);
|
|
163
|
+
}).catch((l) => {
|
|
164
|
+
console.warn("Failed to get URI entities:", l);
|
|
166
165
|
});
|
|
167
166
|
return;
|
|
168
167
|
}
|
|
169
|
-
const t =
|
|
170
|
-
t &&
|
|
171
|
-
entityType:
|
|
168
|
+
const t = v.get("project"), f = v.get("type"), a = v.get("id"), F = v.get("activity");
|
|
169
|
+
t && f && a && (O({
|
|
170
|
+
entityType: f,
|
|
172
171
|
entities: [
|
|
173
172
|
{
|
|
174
|
-
id:
|
|
173
|
+
id: a,
|
|
175
174
|
projectName: t
|
|
176
175
|
}
|
|
177
176
|
],
|
|
178
177
|
source: "url"
|
|
179
|
-
}), F && (
|
|
180
|
-
...
|
|
178
|
+
}), F && (b([F]), R({
|
|
179
|
+
...c,
|
|
181
180
|
overview: "activity"
|
|
182
181
|
})));
|
|
183
182
|
}, []);
|
|
184
183
|
const Z = {
|
|
185
184
|
// open state for the panel by scope
|
|
186
|
-
panelOpenByScope:
|
|
187
|
-
getOpenForScope:
|
|
188
|
-
setPanelOpen:
|
|
189
|
-
setPanelOpenByScope:
|
|
185
|
+
panelOpenByScope: o,
|
|
186
|
+
getOpenForScope: N,
|
|
187
|
+
setPanelOpen: U,
|
|
188
|
+
setPanelOpenByScope: T,
|
|
190
189
|
// tab preferences
|
|
191
|
-
tabsByScope:
|
|
190
|
+
tabsByScope: c,
|
|
192
191
|
getTabForScope: H,
|
|
193
192
|
// slide out state
|
|
194
193
|
slideOut: x,
|
|
195
194
|
openSlideOut: q,
|
|
196
|
-
closeSlideOut:
|
|
195
|
+
closeSlideOut: w,
|
|
197
196
|
// highlighted activities
|
|
198
197
|
highlightedActivities: V,
|
|
199
|
-
setHighlightedActivities:
|
|
198
|
+
setHighlightedActivities: b,
|
|
200
199
|
// PiP state
|
|
201
200
|
pip: z,
|
|
202
201
|
openPip: J,
|
|
203
202
|
closePip: K,
|
|
204
203
|
// entities state
|
|
205
204
|
entities: Q,
|
|
206
|
-
setEntities:
|
|
207
|
-
feedAnnotations:
|
|
208
|
-
setFeedAnnotations:
|
|
209
|
-
isDeveloperMode:
|
|
210
|
-
isGuest:
|
|
211
|
-
hasLicense:
|
|
205
|
+
setEntities: O,
|
|
206
|
+
feedAnnotations: G,
|
|
207
|
+
setFeedAnnotations: M,
|
|
208
|
+
isDeveloperMode: S,
|
|
209
|
+
isGuest: P,
|
|
210
|
+
hasLicense: D,
|
|
212
211
|
onPowerFeature: d,
|
|
213
|
-
...
|
|
212
|
+
...p
|
|
214
213
|
};
|
|
215
|
-
return /* @__PURE__ */ tt.jsx(
|
|
216
|
-
},
|
|
217
|
-
const
|
|
218
|
-
if (
|
|
219
|
-
throw new Error("useDetailsPanel must be used within a
|
|
220
|
-
return
|
|
221
|
-
},
|
|
222
|
-
const { getOpenForScope:
|
|
214
|
+
return /* @__PURE__ */ tt.jsx(A.Provider, { value: Z, children: i });
|
|
215
|
+
}, pt = () => {
|
|
216
|
+
const i = ot(A);
|
|
217
|
+
if (i === void 0)
|
|
218
|
+
throw new Error("useDetailsPanel must be used within a DetailsPanelProvider");
|
|
219
|
+
return i;
|
|
220
|
+
}, ao = (i) => {
|
|
221
|
+
const { getOpenForScope: u, setPanelOpen: h, getTabForScope: e } = pt(), [p, m] = k(
|
|
223
222
|
"details/tabs-by-scope",
|
|
224
223
|
{}
|
|
225
|
-
), [
|
|
226
|
-
(
|
|
227
|
-
|
|
224
|
+
), [S, P] = s(() => p[i] ?? e(i)), g = r(
|
|
225
|
+
(o) => {
|
|
226
|
+
P(o), m({ ...p, [i]: o });
|
|
228
227
|
},
|
|
229
|
-
[
|
|
230
|
-
), d =
|
|
228
|
+
[i, m]
|
|
229
|
+
), d = S, D = ["activity", "comments", "versions", "checklists"].includes(d);
|
|
231
230
|
return {
|
|
232
|
-
isOpen:
|
|
233
|
-
setOpen: (
|
|
231
|
+
isOpen: u(i),
|
|
232
|
+
setOpen: (o) => h(i, o),
|
|
234
233
|
currentTab: d,
|
|
235
|
-
setTab:
|
|
236
|
-
isFeed:
|
|
234
|
+
setTab: g,
|
|
235
|
+
isFeed: D
|
|
237
236
|
};
|
|
238
237
|
};
|
|
239
238
|
export {
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
239
|
+
co as DetailsPanelProvider,
|
|
240
|
+
pt as useDetailsPanelContext,
|
|
241
|
+
ao as useScopedDetailsPanel
|
|
243
242
|
};
|
|
244
243
|
//# sourceMappingURL=DetailsPanelContext.es.js.map
|