@ynput/ayon-frontend-shared 0.2.43 → 0.2.44

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/dist/_virtual/index.cjs10.js +1 -1
  2. package/dist/_virtual/index.cjs11.js +1 -1
  3. package/dist/_virtual/index.cjs12.js +1 -1
  4. package/dist/_virtual/index.es10.js +3 -3
  5. package/dist/_virtual/index.es11.js +5 -5
  6. package/dist/_virtual/index.es12.js +5 -5
  7. package/dist/node_modules/rehype/node_modules/unified/lib/index.cjs.js +1 -1
  8. package/dist/node_modules/rehype/node_modules/unified/lib/index.es.js +2 -2
  9. package/dist/node_modules/rehype/node_modules/vfile/lib/index.cjs.js +1 -1
  10. package/dist/node_modules/rehype/node_modules/vfile/lib/index.es.js +1 -1
  11. package/dist/node_modules/rehype-parse/lib/index.cjs.js +1 -1
  12. package/dist/node_modules/rehype-parse/lib/index.es.js +1 -1
  13. package/dist/shared/src/components/Menu/MenuContainer.cjs.js +1 -1
  14. package/dist/shared/src/components/Menu/MenuContainer.cjs.js.map +1 -1
  15. package/dist/shared/src/components/Menu/MenuContainer.es.js +58 -59
  16. package/dist/shared/src/components/Menu/MenuContainer.es.js.map +1 -1
  17. package/dist/shared/src/containers/DetailsPanel/DetailsPanel.cjs.js +1 -1
  18. package/dist/shared/src/containers/DetailsPanel/DetailsPanel.cjs.js.map +1 -1
  19. package/dist/shared/src/containers/DetailsPanel/DetailsPanel.es.js +23 -22
  20. package/dist/shared/src/containers/DetailsPanel/DetailsPanel.es.js.map +1 -1
  21. package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityComment.cjs.js +1 -1
  22. package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityComment.cjs.js.map +1 -1
  23. package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityComment.es.js +2 -3
  24. package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityComment.es.js.map +1 -1
  25. package/dist/shared/src/context/DetailsPanelContext.cjs.js +1 -1
  26. package/dist/shared/src/context/DetailsPanelContext.cjs.js.map +1 -1
  27. package/dist/shared/src/context/DetailsPanelContext.es.js +79 -80
  28. package/dist/shared/src/context/DetailsPanelContext.es.js.map +1 -1
  29. package/dist/shared/src/context/MenuContext.cjs.js +1 -1
  30. package/dist/shared/src/context/MenuContext.cjs.js.map +1 -1
  31. package/dist/shared/src/context/MenuContext.es.js +11 -10
  32. package/dist/shared/src/context/MenuContext.es.js.map +1 -1
  33. package/dist/types/context/MenuContext.d.ts +3 -0
  34. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"DetailsPanel.cjs.js","sources":["../../../../../src/containers/DetailsPanel/DetailsPanel.tsx"],"sourcesContent":["import { Button } from '@ynput/ayon-react-components'\nimport React, { useEffect, useMemo, useRef } from 'react'\nimport { useSearchParams } from 'react-router-dom'\nimport useDetailsPanelURLSync from './hooks/useDetailsPanelURLSync'\nimport * as Styled from './DetailsPanel.styled'\n\n// shared\nimport { useGetEntitiesDetailsPanelQuery, detailsPanelEntityTypes } from '@shared/api'\nimport type { Tag, DetailsPanelEntityType, DetailsPanelEntityData } from '@shared/api'\nimport { DetailsPanelDetails, EntityPath, Watchers } from '@shared/components'\nimport { usePiPWindow } from '@shared/context/pip/PiPProvider'\nimport { extractEntityHierarchyFromParents } from '@shared/util'\nimport {\n ProjectContextProvider,\n ProjectModelWithProducts,\n useDetailsPanelContext,\n useScopedDetailsPanel,\n useURIContext,\n} from '@shared/context'\n\nimport DetailsPanelHeader from './DetailsPanelHeader/DetailsPanelHeader'\nimport DetailsPanelFiles from './DetailsPanelFiles'\nimport useGetEntityPath from './hooks/useGetEntityPath'\nimport getAllProjectStatuses from './helpers/getAllProjectsStatuses'\nimport FeedWrapper from './FeedWrapper'\nimport FeedContextWrapper from './FeedContextWrapper'\nimport mergeProjectInfo from './helpers/mergeProjectInfo'\n\nexport const entitiesWithoutFeed = ['product', 'representation']\n\ntype User = { avatarUrl: string; name: string; fullName?: string }\n\nexport type DetailsPanelProps = {\n entityType: DetailsPanelEntityType\n entitySubTypes?: string[] // used to get actions before the entity has loaded\n entitiesData?: { id: string; label: string; type: DetailsPanelEntityType }[]\n entities?: { id: string; projectName: string }[]\n tagsOptions?: Tag[]\n disabledStatuses?: string[]\n projectUsers?: User[]\n disabledProjectUsers?: string[]\n activeProjectUsers?: string[]\n projectsInfo?: Record<string, ProjectModelWithProducts>\n projectNames?: string[]\n isSlideOut?: boolean\n style?: React.CSSProperties\n scope: string\n isCompact?: boolean\n onClose?: () => void\n onWatchersUpdate?: (added: any[], removed: any[]) => void\n onOpenViewer?: (entity: any) => void\n onEntityFocus?: (id: string, entityType: DetailsPanelEntityType) => void\n onOpen?: () => void\n onUriOpen?: (entity: DetailsPanelEntityData) => void\n // annotations\n annotations?: any\n removeAnnotation?: (id: string) => void\n exportAnnotationComposite?: (id: string) => Promise<Blob | null>\n entityListId?: string\n guestCategories?: Record<string, string> // only used for guests to find if they have access to any categories\n // optional tab state for independent tab management\n}\n\nconst DetailsPanelInner = ({\n entityType,\n entitySubTypes = [],\n // entities is data we already have from kanban\n entitiesData = [],\n // entityIds are used to get the full details data for the entities\n entities = [],\n tagsOptions = [],\n disabledStatuses,\n projectUsers,\n disabledProjectUsers,\n activeProjectUsers,\n projectsInfo = {},\n projectNames = [],\n isSlideOut = false,\n style = {},\n scope,\n isCompact = false,\n onClose,\n onWatchersUpdate,\n onOpenViewer,\n onEntityFocus,\n onOpen,\n onUriOpen, // when the details panel is opened from uri\n // annotations\n annotations,\n removeAnnotation,\n exportAnnotationComposite,\n entityListId,\n guestCategories = {},\n}: // optional tab state for independent tab management\nDetailsPanelProps) => {\n const {\n closeSlideOut,\n openPip,\n user,\n isGuest,\n entities: contextEntities,\n setEntities,\n slideOut,\n } = useDetailsPanelContext()\n const { currentTab, setTab, isFeed } = useScopedDetailsPanel(scope)\n const [_searchParams, setSearchParams] = useSearchParams()\n const hasCalledOnOpen = useRef(false)\n\n // Use context entities if available, otherwise use props\n const activeEntityType = contextEntities?.entityType ?? entityType\n const activeEntities = contextEntities?.entities ?? entities\n const activeEntitySubTypes = contextEntities?.entitySubTypes ?? entitySubTypes\n const activeEntitiesData = contextEntities?.entities ? [] : entitiesData\n const activeProjectNames = contextEntities?.entities\n ? contextEntities.entities.map((e) => e.projectName)\n : projectNames\n\n // Fire onOpen callback once when component mounts and renders\n useEffect(() => {\n if (onOpen && !hasCalledOnOpen.current) {\n hasCalledOnOpen.current = true\n onOpen()\n }\n }, [])\n\n // Force details tab for specific entity types\n useEffect(() => {\n if (entitiesWithoutFeed.includes(activeEntityType) && currentTab !== 'details') {\n setTab('details')\n }\n }, [activeEntityType, currentTab, setTab])\n\n // once component is provided with specific entities, remove context entities to avoid conflicts\n useEffect(() => {\n if (entities.length && contextEntities) {\n setEntities(null)\n }\n }, [entities, contextEntities, setEntities])\n\n // reduce projectsInfo to selected projects and into one\n const projectInfo = useMemo(\n () => mergeProjectInfo(projectsInfo, activeProjectNames),\n [projectsInfo, activeProjectNames],\n )\n\n // build icons for entity types\n const entityTypeIcons = useMemo(\n () => ({\n task: projectInfo.taskTypes\n .filter((task) => !!task.icon)\n .reduce((acc, task) => ({ ...acc, [task.name]: task.icon }), {}),\n folder: projectInfo.folderTypes\n .filter((folder) => !!folder.icon)\n .reduce((acc, folder) => ({ ...acc, [folder.name]: folder.icon }), {}),\n product: projectInfo.productTypes\n .filter((product) => !!product.icon)\n .reduce((acc, product) => ({ ...acc, [product.name]: product.icon }), {}),\n }),\n [projectInfo],\n )\n\n // check if tab needs to be updated when entity type changes\n // for example when switching from version to task, task doesn't have reps tab\n // if reps tab was selected, set default to feed\n useEffect(() => {\n if (currentTab === 'files') {\n // check entity type is still version\n if (activeEntityType !== 'version') {\n setTab('activity')\n }\n }\n }, [activeEntityType, currentTab, scope])\n\n // now we get the full details data for selected entities\n let entitiesToQuery = activeEntities.length\n ? activeEntities.map((entity) => ({ id: entity.id, projectName: entity.projectName }))\n : // @ts-expect-error = not sure what's going on with activeEntitiesData, we should try and remove it\n activeEntitiesData.map((entity) => ({ id: entity.id, projectName: entity.projectName }))\n\n entitiesToQuery = entitiesToQuery.filter((entity) => entity.id)\n\n const {\n data: entityDetailsData = [],\n isFetching: isFetchingEntitiesDetails,\n isError,\n originalArgs,\n } = useGetEntitiesDetailsPanelQuery(\n { entityType: activeEntityType, entities: entitiesToQuery },\n {\n skip: !entitiesToQuery.length || !detailsPanelEntityTypes.includes(activeEntityType),\n },\n )\n\n // the entity changes then we close the slide out\n useEffect(() => {\n if (!isSlideOut) {\n closeSlideOut()\n }\n }, [originalArgs, isSlideOut])\n\n // if the details panel is opened vair the uri, run callback\n useEffect(() => {\n if (isFetchingEntitiesDetails) return\n\n if (\n contextEntities?.source &&\n ['uri', 'url'].includes(contextEntities.source) &&\n contextEntities?.entities?.length &&\n !!onUriOpen\n ) {\n const uriEntity = entityDetailsData.find(\n (entity) => entity.id === contextEntities.entities[0].id,\n )\n if (!uriEntity) return\n\n onUriOpen(uriEntity)\n }\n }, [entityDetailsData, isFetchingEntitiesDetails])\n\n // TODO: merge current entities data with fresh details data\n\n const allStatuses = getAllProjectStatuses(projectsInfo)\n\n // get the first project name and info to be used in the feed.\n const firstProject = activeProjectNames[0]\n const firstProjectInfo = projectsInfo[firstProject] || {}\n const firstEntityData = entityDetailsData[0] || {}\n // Use the last entity for URI sync\n const lastEntityData = entityDetailsData[entityDetailsData.length - 1]\n const lastProject = activeProjectNames[activeProjectNames.length - 1]\n\n // build the full entity path for the first entity\n const [entityPathSegments, entityPathVersions] = useGetEntityPath({\n entity: firstEntityData,\n entityType: activeEntityType,\n projectName: firstProject,\n isLoading: isFetchingEntitiesDetails,\n })\n\n const { setEntityUri, setUri } = useURIContext()\n // sync the uri when entity changes\n useEffect(() => {\n if (!lastEntityData?.parents) return\n if (!lastProject) return\n const { folderPath, taskName, versionName, productName } = extractEntityHierarchyFromParents(\n lastEntityData.parents,\n activeEntityType,\n lastEntityData.name,\n )\n\n setEntityUri({\n projectName: lastProject,\n folderPath: folderPath,\n taskName: taskName,\n productName: productName,\n versionName: versionName,\n })\n\n // unmount cleanup: clear uri\n return () => {\n setUri('')\n }\n }, [entityDetailsData, activeProjectNames, activeEntityType])\n\n // sync the details panel url (panel) with entity\n useDetailsPanelURLSync({\n entityData: lastEntityData,\n project: lastProject,\n activeEntityType,\n entitiesToQuery,\n })\n\n const clearSearchUrl = () => {\n // remove URL params when closing\n setSearchParams(\n (prev) => {\n const newParams = new URLSearchParams(prev)\n newParams.delete('project')\n newParams.delete('type')\n newParams.delete('id')\n return newParams\n },\n { replace: true },\n )\n }\n\n const handleClose = () => {\n onClose?.()\n // also remove any entities in context\n setEntities(null)\n clearSearchUrl()\n closeSlideOut()\n }\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && onClose) {\n // Don't trigger if we're in an input element\n const target = e.target as HTMLElement\n const isInputElement =\n ['INPUT', 'TEXTAREA', 'SELECT'].includes(target.tagName) || target.isContentEditable\n\n if (isInputElement) return\n\n // don't trigger if the viewer is open and panel not in slideout mode\n if (isSlideOut === false && (target.closest('#viewer-dialog') || !!slideOut)) return\n\n handleClose()\n }\n }\n\n window.addEventListener('keydown', handleKeyDown)\n return () => window.removeEventListener('keydown', handleKeyDown)\n }, [handleClose, isSlideOut, slideOut])\n\n const { requestPipWindow } = usePiPWindow()\n\n const handleOpenPip = () => {\n openPip({\n entityType: activeEntityType,\n entities: entitiesToQuery,\n scope: scope,\n })\n requestPipWindow(500, 500)\n }\n\n const isCommentingEnabled = () => {\n // cannot comment on multiple projects\n if (activeProjectNames.length > 1) return false\n if (isGuest) {\n // Guest can only comment in review sessions (for now)\n if (!entityListId) return false\n // Guest must have at least one category set for list\n const guestHasCategory = Object.prototype.hasOwnProperty.call(\n guestCategories,\n user.attrib?.email || '',\n )\n if (!guestHasCategory) return false\n }\n return true\n }\n\n return (\n <>\n <Styled.Panel className=\"details-panel\">\n <Styled.Toolbar>\n {/* TODO FIX PATH */}\n <EntityPath\n segments={entityPathSegments}\n versions={entityPathVersions}\n projectName={firstProject}\n hideProjectName={isSlideOut}\n isLoading={isFetchingEntitiesDetails || !entityPathSegments.length}\n entityType={activeEntityType}\n scope={scope}\n // @ts-ignore\n entityTypeIcons={entityTypeIcons}\n />\n <Styled.RightTools className=\"right-tools\">\n <Watchers\n entities={entitiesToQuery}\n entityType={activeEntityType}\n options={projectUsers || []}\n onWatchersUpdate={onWatchersUpdate && onWatchersUpdate}\n userName={user.name}\n />\n <Button\n icon=\"picture_in_picture\"\n variant={'text'}\n data-tooltip=\"Picture in Picture\"\n onClick={handleOpenPip}\n />\n\n {(onClose || entities) && (\n <Button\n icon=\"close\"\n variant={'text'}\n onClick={handleClose}\n data-shortcut={'Escape'}\n />\n )}\n </Styled.RightTools>\n </Styled.Toolbar>\n\n <DetailsPanelHeader\n entityType={activeEntityType}\n entitySubTypes={activeEntitySubTypes}\n entities={entityDetailsData}\n users={projectUsers}\n disabledAssignees={disabledProjectUsers}\n disabledStatuses={disabledStatuses}\n tagsOptions={tagsOptions}\n isFetching={isFetchingEntitiesDetails}\n isCompact={isCompact}\n currentTab={currentTab}\n onTabChange={setTab}\n entityTypeIcons={entityTypeIcons}\n onOpenViewer={(args) => onOpenViewer?.(args)}\n onEntityFocus={onEntityFocus}\n />\n <ProjectContextProvider projectName={firstProject}>\n {isFeed && !isError && (\n <FeedWrapper\n entityType={activeEntityType}\n entities={entityDetailsData}\n activeUsers={activeProjectUsers || []}\n projectInfo={firstProjectInfo}\n projectName={firstProject}\n disabled={!isCommentingEnabled()}\n scope={scope}\n statuses={allStatuses}\n readOnly={false}\n entityListId={entityListId}\n annotations={annotations}\n removeAnnotation={removeAnnotation}\n exportAnnotationComposite={exportAnnotationComposite}\n currentTab={currentTab}\n setCurrentTab={setTab}\n isSlideOut={isSlideOut}\n />\n )}\n {currentTab === 'files' && (\n <DetailsPanelFiles\n entities={entityDetailsData}\n scope={scope}\n isLoadingVersion={isFetchingEntitiesDetails}\n />\n )}\n {currentTab === 'details' && (\n <FeedContextWrapper\n entityType={activeEntityType}\n entities={entityDetailsData}\n activeUsers={activeProjectUsers || []}\n projectInfo={firstProjectInfo}\n projectName={firstProject}\n disabled={!isCommentingEnabled()}\n scope={scope}\n statuses={allStatuses}\n readOnly={false}\n annotations={annotations}\n removeAnnotation={removeAnnotation}\n exportAnnotationComposite={exportAnnotationComposite}\n >\n <DetailsPanelDetails\n entities={entityDetailsData}\n isLoading={isFetchingEntitiesDetails}\n />\n </FeedContextWrapper>\n )}\n </ProjectContextProvider>\n </Styled.Panel>\n </>\n )\n}\n\n// create a wrapper that checks if the details panel should be open or not based on isOpen prop and entities state\nexport const DetailsPanel = ({\n isOpen,\n entityType,\n ...props\n}: Omit<DetailsPanelProps, 'entityType'> & {\n entityType?: DetailsPanelEntityType\n isOpen: boolean\n}) => {\n const { entities } = useDetailsPanelContext()\n\n if (!isOpen && !entities) return null\n if (!entityType && !entities) return null\n\n // @ts-expect-error - entityType could be undefined but we check for entities above\n return <DetailsPanelInner {...props} entityType={entityType || entities?.entityType} />\n}\n"],"names":["entitiesWithoutFeed","DetailsPanelInner","entityType","entitySubTypes","entitiesData","entities","tagsOptions","disabledStatuses","projectUsers","disabledProjectUsers","activeProjectUsers","projectsInfo","projectNames","isSlideOut","style","scope","isCompact","onClose","onWatchersUpdate","onOpenViewer","onEntityFocus","onOpen","onUriOpen","annotations","removeAnnotation","exportAnnotationComposite","entityListId","guestCategories","closeSlideOut","openPip","user","isGuest","contextEntities","setEntities","slideOut","useDetailsPanelContext","currentTab","setTab","isFeed","useScopedDetailsPanel","_searchParams","setSearchParams","useSearchParams","hasCalledOnOpen","useRef","activeEntityType","activeEntities","activeEntitySubTypes","activeEntitiesData","activeProjectNames","useEffect","projectInfo","useMemo","mergeProjectInfo","entityTypeIcons","task","acc","folder","product","entitiesToQuery","entity","entityDetailsData","isFetchingEntitiesDetails","isError","originalArgs","useGetEntitiesDetailsPanelQuery","detailsPanelEntityTypes","uriEntity","allStatuses","getAllProjectStatuses","firstProject","firstProjectInfo","firstEntityData","lastEntityData","lastProject","entityPathSegments","entityPathVersions","useGetEntityPath","setEntityUri","setUri","useURIContext","folderPath","taskName","versionName","productName","extractEntityHierarchyFromParents","useDetailsPanelURLSync","clearSearchUrl","prev","newParams","handleClose","handleKeyDown","e","target","requestPipWindow","usePiPWindow","handleOpenPip","isCommentingEnabled","jsxs","Styled.Panel","Styled.Toolbar","jsx","EntityPath","Styled.RightTools","Watchers","Button","DetailsPanelHeader","args","ProjectContextProvider","FeedWrapper","DetailsPanelFiles","FeedContextWrapper","DetailsPanelDetails","DetailsPanel","isOpen","props"],"mappings":"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"}
1
+ {"version":3,"file":"DetailsPanel.cjs.js","sources":["../../../../../src/containers/DetailsPanel/DetailsPanel.tsx"],"sourcesContent":["import { Button } from '@ynput/ayon-react-components'\nimport React, { useEffect, useMemo, useRef } from 'react'\nimport useDetailsPanelURLSync from './hooks/useDetailsPanelURLSync'\nimport * as Styled from './DetailsPanel.styled'\n\n// shared\nimport { useGetEntitiesDetailsPanelQuery, detailsPanelEntityTypes } from '@shared/api'\nimport type { Tag, DetailsPanelEntityType, DetailsPanelEntityData } from '@shared/api'\nimport { DetailsPanelDetails, EntityPath, Watchers } from '@shared/components'\nimport { usePiPWindow } from '@shared/context/pip/PiPProvider'\nimport { extractEntityHierarchyFromParents } from '@shared/util'\nimport {\n ProjectContextProvider,\n ProjectModelWithProducts,\n useDetailsPanelContext,\n useScopedDetailsPanel,\n useURIContext,\n} from '@shared/context'\n\nimport DetailsPanelHeader from './DetailsPanelHeader/DetailsPanelHeader'\nimport DetailsPanelFiles from './DetailsPanelFiles'\nimport useGetEntityPath from './hooks/useGetEntityPath'\nimport getAllProjectStatuses from './helpers/getAllProjectsStatuses'\nimport FeedWrapper from './FeedWrapper'\nimport FeedContextWrapper from './FeedContextWrapper'\nimport mergeProjectInfo from './helpers/mergeProjectInfo'\n\nexport const entitiesWithoutFeed = ['product', 'representation']\n\ntype User = { avatarUrl: string; name: string; fullName?: string }\n\nexport type DetailsPanelProps = {\n entityType: DetailsPanelEntityType\n entitySubTypes?: string[] // used to get actions before the entity has loaded\n entitiesData?: { id: string; label: string; type: DetailsPanelEntityType }[]\n entities?: { id: string; projectName: string }[]\n tagsOptions?: Tag[]\n disabledStatuses?: string[]\n projectUsers?: User[]\n disabledProjectUsers?: string[]\n activeProjectUsers?: string[]\n projectsInfo?: Record<string, ProjectModelWithProducts>\n projectNames?: string[]\n isSlideOut?: boolean\n style?: React.CSSProperties\n scope: string\n isCompact?: boolean\n onClose?: () => void\n onWatchersUpdate?: (added: any[], removed: any[]) => void\n onOpenViewer?: (entity: any) => void\n onEntityFocus?: (id: string, entityType: DetailsPanelEntityType) => void\n onOpen?: () => void\n onUriOpen?: (entity: DetailsPanelEntityData) => void\n // annotations\n annotations?: any\n removeAnnotation?: (id: string) => void\n exportAnnotationComposite?: (id: string) => Promise<Blob | null>\n entityListId?: string\n guestCategories?: Record<string, string> // only used for guests to find if they have access to any categories\n // optional tab state for independent tab management\n}\n\nconst DetailsPanelInner = ({\n entityType,\n entitySubTypes = [],\n // entities is data we already have from kanban\n entitiesData = [],\n // entityIds are used to get the full details data for the entities\n entities = [],\n tagsOptions = [],\n disabledStatuses,\n projectUsers,\n disabledProjectUsers,\n activeProjectUsers,\n projectsInfo = {},\n projectNames = [],\n isSlideOut = false,\n style = {},\n scope,\n isCompact = false,\n onClose,\n onWatchersUpdate,\n onOpenViewer,\n onEntityFocus,\n onOpen,\n onUriOpen, // when the details panel is opened from uri\n // annotations\n annotations,\n removeAnnotation,\n exportAnnotationComposite,\n entityListId,\n guestCategories = {},\n}: // optional tab state for independent tab management\nDetailsPanelProps) => {\n const {\n closeSlideOut,\n openPip,\n user,\n isGuest,\n entities: contextEntities,\n setEntities,\n slideOut,\n useSearchParams,\n } = useDetailsPanelContext()\n const { currentTab, setTab, isFeed } = useScopedDetailsPanel(scope)\n const [_searchParams, setSearchParams] = useSearchParams()\n const hasCalledOnOpen = useRef(false)\n\n // Use context entities if available, otherwise use props\n const activeEntityType = contextEntities?.entityType ?? entityType\n const activeEntities = contextEntities?.entities ?? entities\n const activeEntitySubTypes = contextEntities?.entitySubTypes ?? entitySubTypes\n const activeEntitiesData = contextEntities?.entities ? [] : entitiesData\n const activeProjectNames = contextEntities?.entities\n ? contextEntities.entities.map((e) => e.projectName)\n : projectNames\n\n // Fire onOpen callback once when component mounts and renders\n useEffect(() => {\n if (onOpen && !hasCalledOnOpen.current) {\n hasCalledOnOpen.current = true\n onOpen()\n }\n }, [])\n\n // Force details tab for specific entity types\n useEffect(() => {\n if (entitiesWithoutFeed.includes(activeEntityType) && currentTab !== 'details') {\n setTab('details')\n }\n }, [activeEntityType, currentTab, setTab])\n\n // once component is provided with specific entities, remove context entities to avoid conflicts\n useEffect(() => {\n if (entities.length && contextEntities) {\n setEntities(null)\n }\n }, [entities, contextEntities, setEntities])\n\n // reduce projectsInfo to selected projects and into one\n const projectInfo = useMemo(\n () => mergeProjectInfo(projectsInfo, activeProjectNames),\n [projectsInfo, activeProjectNames],\n )\n\n // build icons for entity types\n const entityTypeIcons = useMemo(\n () => ({\n task: projectInfo.taskTypes\n .filter((task) => !!task.icon)\n .reduce((acc, task) => ({ ...acc, [task.name]: task.icon }), {}),\n folder: projectInfo.folderTypes\n .filter((folder) => !!folder.icon)\n .reduce((acc, folder) => ({ ...acc, [folder.name]: folder.icon }), {}),\n product: projectInfo.productTypes\n .filter((product) => !!product.icon)\n .reduce((acc, product) => ({ ...acc, [product.name]: product.icon }), {}),\n }),\n [projectInfo],\n )\n\n // check if tab needs to be updated when entity type changes\n // for example when switching from version to task, task doesn't have reps tab\n // if reps tab was selected, set default to feed\n useEffect(() => {\n if (currentTab === 'files') {\n // check entity type is still version\n if (activeEntityType !== 'version') {\n setTab('activity')\n }\n }\n }, [activeEntityType, currentTab, scope])\n\n // now we get the full details data for selected entities\n let entitiesToQuery = activeEntities.length\n ? activeEntities.map((entity) => ({ id: entity.id, projectName: entity.projectName }))\n : // @ts-expect-error = not sure what's going on with activeEntitiesData, we should try and remove it\n activeEntitiesData.map((entity) => ({ id: entity.id, projectName: entity.projectName }))\n\n entitiesToQuery = entitiesToQuery.filter((entity) => entity.id)\n\n const {\n data: entityDetailsData = [],\n isFetching: isFetchingEntitiesDetails,\n isError,\n originalArgs,\n } = useGetEntitiesDetailsPanelQuery(\n { entityType: activeEntityType, entities: entitiesToQuery },\n {\n skip: !entitiesToQuery.length || !detailsPanelEntityTypes.includes(activeEntityType),\n },\n )\n\n // the entity changes then we close the slide out\n useEffect(() => {\n if (!isSlideOut) {\n closeSlideOut()\n }\n }, [originalArgs, isSlideOut])\n\n // if the details panel is opened vair the uri, run callback\n useEffect(() => {\n if (isFetchingEntitiesDetails) return\n\n if (\n contextEntities?.source &&\n ['uri', 'url'].includes(contextEntities.source) &&\n contextEntities?.entities?.length &&\n !!onUriOpen\n ) {\n const uriEntity = entityDetailsData.find(\n (entity) => entity.id === contextEntities.entities[0].id,\n )\n if (!uriEntity) return\n\n onUriOpen(uriEntity)\n }\n }, [entityDetailsData, isFetchingEntitiesDetails])\n\n // TODO: merge current entities data with fresh details data\n\n const allStatuses = getAllProjectStatuses(projectsInfo)\n\n // get the first project name and info to be used in the feed.\n const firstProject = activeProjectNames[0]\n const firstProjectInfo = projectsInfo[firstProject] || {}\n const firstEntityData = entityDetailsData[0] || {}\n // Use the last entity for URI sync\n const lastEntityData = entityDetailsData[entityDetailsData.length - 1]\n const lastProject = activeProjectNames[activeProjectNames.length - 1]\n\n // build the full entity path for the first entity\n const [entityPathSegments, entityPathVersions] = useGetEntityPath({\n entity: firstEntityData,\n entityType: activeEntityType,\n projectName: firstProject,\n isLoading: isFetchingEntitiesDetails,\n })\n\n const { setEntityUri, setUri } = useURIContext()\n // sync the uri when entity changes\n useEffect(() => {\n if (!lastEntityData?.parents) return\n if (!lastProject) return\n const { folderPath, taskName, versionName, productName } = extractEntityHierarchyFromParents(\n lastEntityData.parents,\n activeEntityType,\n lastEntityData.name,\n )\n\n setEntityUri({\n projectName: lastProject,\n folderPath: folderPath,\n taskName: taskName,\n productName: productName,\n versionName: versionName,\n })\n\n // unmount cleanup: clear uri\n return () => {\n setUri('')\n }\n }, [entityDetailsData, activeProjectNames, activeEntityType])\n\n // sync the details panel url (panel) with entity\n useDetailsPanelURLSync({\n entityData: lastEntityData,\n project: lastProject,\n activeEntityType,\n entitiesToQuery,\n })\n\n const clearSearchUrl = () => {\n // remove URL params when closing\n setSearchParams(\n (prev) => {\n const newParams = new URLSearchParams(prev)\n newParams.delete('project')\n newParams.delete('type')\n newParams.delete('id')\n return newParams\n },\n { replace: true },\n )\n }\n\n const handleClose = () => {\n onClose?.()\n // also remove any entities in context\n setEntities(null)\n clearSearchUrl()\n closeSlideOut()\n }\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && onClose) {\n // Don't trigger if we're in an input element\n const target = e.target as HTMLElement\n const isInputElement =\n ['INPUT', 'TEXTAREA', 'SELECT'].includes(target.tagName) || target.isContentEditable\n\n if (isInputElement) return\n\n // don't trigger if the viewer is open and panel not in slideout mode\n if (isSlideOut === false && (target.closest('#viewer-dialog') || !!slideOut)) return\n\n handleClose()\n }\n }\n\n window.addEventListener('keydown', handleKeyDown)\n return () => window.removeEventListener('keydown', handleKeyDown)\n }, [handleClose, isSlideOut, slideOut])\n\n const { requestPipWindow } = usePiPWindow()\n\n const handleOpenPip = () => {\n openPip({\n entityType: activeEntityType,\n entities: entitiesToQuery,\n scope: scope,\n })\n requestPipWindow(500, 500)\n }\n\n const isCommentingEnabled = () => {\n // cannot comment on multiple projects\n if (activeProjectNames.length > 1) return false\n if (isGuest) {\n // Guest can only comment in review sessions (for now)\n if (!entityListId) return false\n // Guest must have at least one category set for list\n const guestHasCategory = Object.prototype.hasOwnProperty.call(\n guestCategories,\n user.attrib?.email || '',\n )\n if (!guestHasCategory) return false\n }\n return true\n }\n\n return (\n <>\n <Styled.Panel className=\"details-panel\">\n <Styled.Toolbar>\n {/* TODO FIX PATH */}\n <EntityPath\n segments={entityPathSegments}\n versions={entityPathVersions}\n projectName={firstProject}\n hideProjectName={isSlideOut}\n isLoading={isFetchingEntitiesDetails || !entityPathSegments.length}\n entityType={activeEntityType}\n scope={scope}\n // @ts-ignore\n entityTypeIcons={entityTypeIcons}\n />\n <Styled.RightTools className=\"right-tools\">\n <Watchers\n entities={entitiesToQuery}\n entityType={activeEntityType}\n options={projectUsers || []}\n onWatchersUpdate={onWatchersUpdate && onWatchersUpdate}\n userName={user.name}\n />\n <Button\n icon=\"picture_in_picture\"\n variant={'text'}\n data-tooltip=\"Picture in Picture\"\n onClick={handleOpenPip}\n />\n\n {(onClose || entities) && (\n <Button\n icon=\"close\"\n variant={'text'}\n onClick={handleClose}\n data-shortcut={'Escape'}\n />\n )}\n </Styled.RightTools>\n </Styled.Toolbar>\n\n <DetailsPanelHeader\n entityType={activeEntityType}\n entitySubTypes={activeEntitySubTypes}\n entities={entityDetailsData}\n users={projectUsers}\n disabledAssignees={disabledProjectUsers}\n disabledStatuses={disabledStatuses}\n tagsOptions={tagsOptions}\n isFetching={isFetchingEntitiesDetails}\n isCompact={isCompact}\n currentTab={currentTab}\n onTabChange={setTab}\n entityTypeIcons={entityTypeIcons}\n onOpenViewer={(args) => onOpenViewer?.(args)}\n onEntityFocus={onEntityFocus}\n />\n <ProjectContextProvider projectName={firstProject}>\n {isFeed && !isError && (\n <FeedWrapper\n entityType={activeEntityType}\n entities={entityDetailsData}\n activeUsers={activeProjectUsers || []}\n projectInfo={firstProjectInfo}\n projectName={firstProject}\n disabled={!isCommentingEnabled()}\n scope={scope}\n statuses={allStatuses}\n readOnly={false}\n entityListId={entityListId}\n annotations={annotations}\n removeAnnotation={removeAnnotation}\n exportAnnotationComposite={exportAnnotationComposite}\n currentTab={currentTab}\n setCurrentTab={setTab}\n isSlideOut={isSlideOut}\n />\n )}\n {currentTab === 'files' && (\n <DetailsPanelFiles\n entities={entityDetailsData}\n scope={scope}\n isLoadingVersion={isFetchingEntitiesDetails}\n />\n )}\n {currentTab === 'details' && (\n <FeedContextWrapper\n entityType={activeEntityType}\n entities={entityDetailsData}\n activeUsers={activeProjectUsers || []}\n projectInfo={firstProjectInfo}\n projectName={firstProject}\n disabled={!isCommentingEnabled()}\n scope={scope}\n statuses={allStatuses}\n readOnly={false}\n annotations={annotations}\n removeAnnotation={removeAnnotation}\n exportAnnotationComposite={exportAnnotationComposite}\n >\n <DetailsPanelDetails\n entities={entityDetailsData}\n isLoading={isFetchingEntitiesDetails}\n />\n </FeedContextWrapper>\n )}\n </ProjectContextProvider>\n </Styled.Panel>\n </>\n )\n}\n\n// create a wrapper that checks if the details panel should be open or not based on isOpen prop and entities state\nexport const DetailsPanel = ({\n isOpen,\n entityType,\n ...props\n}: Omit<DetailsPanelProps, 'entityType'> & {\n entityType?: DetailsPanelEntityType\n isOpen: boolean\n}) => {\n const { entities } = useDetailsPanelContext()\n\n if (!isOpen && !entities) return null\n if (!entityType && !entities) return null\n\n // @ts-expect-error - entityType could be undefined but we check for entities above\n return <DetailsPanelInner {...props} entityType={entityType || entities?.entityType} />\n}\n"],"names":["entitiesWithoutFeed","DetailsPanelInner","entityType","entitySubTypes","entitiesData","entities","tagsOptions","disabledStatuses","projectUsers","disabledProjectUsers","activeProjectUsers","projectsInfo","projectNames","isSlideOut","style","scope","isCompact","onClose","onWatchersUpdate","onOpenViewer","onEntityFocus","onOpen","onUriOpen","annotations","removeAnnotation","exportAnnotationComposite","entityListId","guestCategories","closeSlideOut","openPip","user","isGuest","contextEntities","setEntities","slideOut","useSearchParams","useDetailsPanelContext","currentTab","setTab","isFeed","useScopedDetailsPanel","_searchParams","setSearchParams","hasCalledOnOpen","useRef","activeEntityType","activeEntities","activeEntitySubTypes","activeEntitiesData","activeProjectNames","useEffect","projectInfo","useMemo","mergeProjectInfo","entityTypeIcons","task","acc","folder","product","entitiesToQuery","entity","entityDetailsData","isFetchingEntitiesDetails","isError","originalArgs","useGetEntitiesDetailsPanelQuery","detailsPanelEntityTypes","uriEntity","allStatuses","getAllProjectStatuses","firstProject","firstProjectInfo","firstEntityData","lastEntityData","lastProject","entityPathSegments","entityPathVersions","useGetEntityPath","setEntityUri","setUri","useURIContext","folderPath","taskName","versionName","productName","extractEntityHierarchyFromParents","useDetailsPanelURLSync","clearSearchUrl","prev","newParams","handleClose","handleKeyDown","e","target","requestPipWindow","usePiPWindow","handleOpenPip","isCommentingEnabled","jsxs","Styled.Panel","Styled.Toolbar","jsx","EntityPath","Styled.RightTools","Watchers","Button","DetailsPanelHeader","args","ProjectContextProvider","FeedWrapper","DetailsPanelFiles","FeedContextWrapper","DetailsPanelDetails","DetailsPanel","isOpen","props"],"mappings":"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"}
@@ -1,7 +1,6 @@
1
1
  import { j as o } from "../../../../_virtual/jsx-runtime.es.js";
2
2
  import { Button as M } from "@ynput/ayon-react-components";
3
- import { useRef as gt, useEffect as s, useMemo as X } from "react";
4
- import { useSearchParams as Et } from "react-router-dom";
3
+ import { useRef as Et, useEffect as s, useMemo as X } from "react";
5
4
  import Tt from "./hooks/useDetailsPanelURLSync.es.js";
6
5
  import { Panel as xt, Toolbar as Nt, RightTools as Dt } from "./DetailsPanel.styled.es.js";
7
6
  import "../../api/base/client.es.js";
@@ -147,6 +146,7 @@ import "../Feed/components/CommentInput/quillToMarkdown.es.js";
147
146
  import "../Feed/components/ActivityComment/ActivityComment.styled.es.js";
148
147
  import "../Feed/components/ActivityCheckbox/ActivityCheckbox.styled.es.js";
149
148
  import "../Feed/components/ActivityReference/ActivityReference.styled.es.js";
149
+ import "react-router-dom";
150
150
  import "../Feed/components/ActivityStatus/ActivityStatus.es.js";
151
151
  import "../Feed/components/ActivityHeader/ActivityHeader.styled.es.js";
152
152
  import "../Feed/components/ActivityDate.es.js";
@@ -290,8 +290,9 @@ const _t = ["product", "representation"], Qt = ({
290
290
  isGuest: mt,
291
291
  entities: e,
292
292
  setEntities: D,
293
- slideOut: A
294
- } = z(), { currentTab: n, setTab: y, isFeed: pt } = Ct(a), [Bt, nt] = Et(), G = gt(!1), r = e?.entityType ?? T, O = e?.entities ?? p, st = e?.entitySubTypes ?? P, at = e?.entities ? [] : x, c = e?.entities ? e.entities.map((t) => t.projectName) : $;
293
+ slideOut: A,
294
+ useSearchParams: pt
295
+ } = z(), { currentTab: n, setTab: y, isFeed: nt } = Ct(a), [Bt, st] = pt(), G = Et(!1), r = e?.entityType ?? T, O = e?.entities ?? p, at = e?.entitySubTypes ?? P, ct = e?.entities ? [] : x, c = e?.entities ? e.entities.map((t) => t.projectName) : $;
295
296
  s(() => {
296
297
  S && !G.current && (G.current = !0, S());
297
298
  }, []), s(() => {
@@ -315,14 +316,14 @@ const _t = ["product", "representation"], Qt = ({
315
316
  }, [r, n, a]);
316
317
  let l = O.length ? O.map((t) => ({ id: t.id, projectName: t.projectName })) : (
317
318
  // @ts-expect-error = not sure what's going on with activeEntitiesData, we should try and remove it
318
- at.map((t) => ({ id: t.id, projectName: t.projectName }))
319
+ ct.map((t) => ({ id: t.id, projectName: t.projectName }))
319
320
  );
320
321
  l = l.filter((t) => t.id);
321
322
  const {
322
323
  data: m = [],
323
324
  isFetching: u,
324
- isError: ct,
325
- originalArgs: lt
325
+ isError: lt,
326
+ originalArgs: ut
326
327
  } = vt(
327
328
  { entityType: r, entities: l },
328
329
  {
@@ -331,7 +332,7 @@ const _t = ["product", "representation"], Qt = ({
331
332
  );
332
333
  s(() => {
333
334
  d || W();
334
- }, [lt, d]), s(() => {
335
+ }, [ut, d]), s(() => {
335
336
  if (!u && e?.source && ["uri", "url"].includes(e.source) && e?.entities?.length && k) {
336
337
  const t = m.find(
337
338
  (i) => i.id === e.entities[0].id
@@ -340,12 +341,12 @@ const _t = ["product", "representation"], Qt = ({
340
341
  k(t);
341
342
  }
342
343
  }, [m, u]);
343
- const _ = Ut(j), f = c[0], Q = j[f] || {}, ut = m[0] || {}, E = m[m.length - 1], v = c[c.length - 1], [q, dt] = Rt({
344
- entity: ut,
344
+ const _ = Ut(j), f = c[0], Q = j[f] || {}, dt = m[0] || {}, E = m[m.length - 1], v = c[c.length - 1], [q, ft] = Rt({
345
+ entity: dt,
345
346
  entityType: r,
346
347
  projectName: f,
347
348
  isLoading: u
348
- }), { setEntityUri: ft, setUri: yt } = kt();
349
+ }), { setEntityUri: yt, setUri: ht } = kt();
349
350
  s(() => {
350
351
  if (!E?.parents || !v) return;
351
352
  const { folderPath: t, taskName: i, versionName: h, productName: K } = wt(
@@ -353,14 +354,14 @@ const _t = ["product", "representation"], Qt = ({
353
354
  r,
354
355
  E.name
355
356
  );
356
- return ft({
357
+ return yt({
357
358
  projectName: v,
358
359
  folderPath: t,
359
360
  taskName: i,
360
361
  productName: K,
361
362
  versionName: h
362
363
  }), () => {
363
- yt("");
364
+ ht("");
364
365
  };
365
366
  }, [m, c, r]), Tt({
366
367
  entityData: E,
@@ -368,8 +369,8 @@ const _t = ["product", "representation"], Qt = ({
368
369
  activeEntityType: r,
369
370
  entitiesToQuery: l
370
371
  });
371
- const ht = () => {
372
- nt(
372
+ const Pt = () => {
373
+ st(
373
374
  (t) => {
374
375
  const i = new URLSearchParams(t);
375
376
  return i.delete("project"), i.delete("type"), i.delete("id"), i;
@@ -377,7 +378,7 @@ const _t = ["product", "representation"], Qt = ({
377
378
  { replace: !0 }
378
379
  );
379
380
  }, b = () => {
380
- N?.(), D(null), ht(), W();
381
+ N?.(), D(null), Pt(), W();
381
382
  };
382
383
  s(() => {
383
384
  const t = (i) => {
@@ -389,12 +390,12 @@ const _t = ["product", "representation"], Qt = ({
389
390
  };
390
391
  return window.addEventListener("keydown", t), () => window.removeEventListener("keydown", t);
391
392
  }, [b, d, A]);
392
- const { requestPipWindow: Pt } = Ft(), jt = () => {
393
+ const { requestPipWindow: jt } = Ft(), gt = () => {
393
394
  et({
394
395
  entityType: r,
395
396
  entities: l,
396
397
  scope: a
397
- }), Pt(500, 500);
398
+ }), jt(500, 500);
398
399
  }, B = () => !(c.length > 1 || mt && (!U || !Object.prototype.hasOwnProperty.call(
399
400
  ot,
400
401
  H.attrib?.email || ""
@@ -405,7 +406,7 @@ const _t = ["product", "representation"], Qt = ({
405
406
  Gt,
406
407
  {
407
408
  segments: q,
408
- versions: dt,
409
+ versions: ft,
409
410
  projectName: f,
410
411
  hideProjectName: d,
411
412
  isLoading: u || !q.length,
@@ -431,7 +432,7 @@ const _t = ["product", "representation"], Qt = ({
431
432
  icon: "picture_in_picture",
432
433
  variant: "text",
433
434
  "data-tooltip": "Picture in Picture",
434
- onClick: jt
435
+ onClick: gt
435
436
  }
436
437
  ),
437
438
  (N || p) && /* @__PURE__ */ o.jsx(
@@ -449,7 +450,7 @@ const _t = ["product", "representation"], Qt = ({
449
450
  Lt,
450
451
  {
451
452
  entityType: r,
452
- entitySubTypes: st,
453
+ entitySubTypes: at,
453
454
  entities: m,
454
455
  users: w,
455
456
  disabledAssignees: Z,
@@ -465,7 +466,7 @@ const _t = ["product", "representation"], Qt = ({
465
466
  }
466
467
  ),
467
468
  /* @__PURE__ */ o.jsxs(St, { projectName: f, children: [
468
- pt && !ct && /* @__PURE__ */ o.jsx(
469
+ nt && !lt && /* @__PURE__ */ o.jsx(
469
470
  Wt,
470
471
  {
471
472
  entityType: r,
@@ -1 +1 @@
1
- {"version":3,"file":"DetailsPanel.es.js","sources":["../../../../../src/containers/DetailsPanel/DetailsPanel.tsx"],"sourcesContent":["import { Button } from '@ynput/ayon-react-components'\nimport React, { useEffect, useMemo, useRef } from 'react'\nimport { useSearchParams } from 'react-router-dom'\nimport useDetailsPanelURLSync from './hooks/useDetailsPanelURLSync'\nimport * as Styled from './DetailsPanel.styled'\n\n// shared\nimport { useGetEntitiesDetailsPanelQuery, detailsPanelEntityTypes } from '@shared/api'\nimport type { Tag, DetailsPanelEntityType, DetailsPanelEntityData } from '@shared/api'\nimport { DetailsPanelDetails, EntityPath, Watchers } from '@shared/components'\nimport { usePiPWindow } from '@shared/context/pip/PiPProvider'\nimport { extractEntityHierarchyFromParents } from '@shared/util'\nimport {\n ProjectContextProvider,\n ProjectModelWithProducts,\n useDetailsPanelContext,\n useScopedDetailsPanel,\n useURIContext,\n} from '@shared/context'\n\nimport DetailsPanelHeader from './DetailsPanelHeader/DetailsPanelHeader'\nimport DetailsPanelFiles from './DetailsPanelFiles'\nimport useGetEntityPath from './hooks/useGetEntityPath'\nimport getAllProjectStatuses from './helpers/getAllProjectsStatuses'\nimport FeedWrapper from './FeedWrapper'\nimport FeedContextWrapper from './FeedContextWrapper'\nimport mergeProjectInfo from './helpers/mergeProjectInfo'\n\nexport const entitiesWithoutFeed = ['product', 'representation']\n\ntype User = { avatarUrl: string; name: string; fullName?: string }\n\nexport type DetailsPanelProps = {\n entityType: DetailsPanelEntityType\n entitySubTypes?: string[] // used to get actions before the entity has loaded\n entitiesData?: { id: string; label: string; type: DetailsPanelEntityType }[]\n entities?: { id: string; projectName: string }[]\n tagsOptions?: Tag[]\n disabledStatuses?: string[]\n projectUsers?: User[]\n disabledProjectUsers?: string[]\n activeProjectUsers?: string[]\n projectsInfo?: Record<string, ProjectModelWithProducts>\n projectNames?: string[]\n isSlideOut?: boolean\n style?: React.CSSProperties\n scope: string\n isCompact?: boolean\n onClose?: () => void\n onWatchersUpdate?: (added: any[], removed: any[]) => void\n onOpenViewer?: (entity: any) => void\n onEntityFocus?: (id: string, entityType: DetailsPanelEntityType) => void\n onOpen?: () => void\n onUriOpen?: (entity: DetailsPanelEntityData) => void\n // annotations\n annotations?: any\n removeAnnotation?: (id: string) => void\n exportAnnotationComposite?: (id: string) => Promise<Blob | null>\n entityListId?: string\n guestCategories?: Record<string, string> // only used for guests to find if they have access to any categories\n // optional tab state for independent tab management\n}\n\nconst DetailsPanelInner = ({\n entityType,\n entitySubTypes = [],\n // entities is data we already have from kanban\n entitiesData = [],\n // entityIds are used to get the full details data for the entities\n entities = [],\n tagsOptions = [],\n disabledStatuses,\n projectUsers,\n disabledProjectUsers,\n activeProjectUsers,\n projectsInfo = {},\n projectNames = [],\n isSlideOut = false,\n style = {},\n scope,\n isCompact = false,\n onClose,\n onWatchersUpdate,\n onOpenViewer,\n onEntityFocus,\n onOpen,\n onUriOpen, // when the details panel is opened from uri\n // annotations\n annotations,\n removeAnnotation,\n exportAnnotationComposite,\n entityListId,\n guestCategories = {},\n}: // optional tab state for independent tab management\nDetailsPanelProps) => {\n const {\n closeSlideOut,\n openPip,\n user,\n isGuest,\n entities: contextEntities,\n setEntities,\n slideOut,\n } = useDetailsPanelContext()\n const { currentTab, setTab, isFeed } = useScopedDetailsPanel(scope)\n const [_searchParams, setSearchParams] = useSearchParams()\n const hasCalledOnOpen = useRef(false)\n\n // Use context entities if available, otherwise use props\n const activeEntityType = contextEntities?.entityType ?? entityType\n const activeEntities = contextEntities?.entities ?? entities\n const activeEntitySubTypes = contextEntities?.entitySubTypes ?? entitySubTypes\n const activeEntitiesData = contextEntities?.entities ? [] : entitiesData\n const activeProjectNames = contextEntities?.entities\n ? contextEntities.entities.map((e) => e.projectName)\n : projectNames\n\n // Fire onOpen callback once when component mounts and renders\n useEffect(() => {\n if (onOpen && !hasCalledOnOpen.current) {\n hasCalledOnOpen.current = true\n onOpen()\n }\n }, [])\n\n // Force details tab for specific entity types\n useEffect(() => {\n if (entitiesWithoutFeed.includes(activeEntityType) && currentTab !== 'details') {\n setTab('details')\n }\n }, [activeEntityType, currentTab, setTab])\n\n // once component is provided with specific entities, remove context entities to avoid conflicts\n useEffect(() => {\n if (entities.length && contextEntities) {\n setEntities(null)\n }\n }, [entities, contextEntities, setEntities])\n\n // reduce projectsInfo to selected projects and into one\n const projectInfo = useMemo(\n () => mergeProjectInfo(projectsInfo, activeProjectNames),\n [projectsInfo, activeProjectNames],\n )\n\n // build icons for entity types\n const entityTypeIcons = useMemo(\n () => ({\n task: projectInfo.taskTypes\n .filter((task) => !!task.icon)\n .reduce((acc, task) => ({ ...acc, [task.name]: task.icon }), {}),\n folder: projectInfo.folderTypes\n .filter((folder) => !!folder.icon)\n .reduce((acc, folder) => ({ ...acc, [folder.name]: folder.icon }), {}),\n product: projectInfo.productTypes\n .filter((product) => !!product.icon)\n .reduce((acc, product) => ({ ...acc, [product.name]: product.icon }), {}),\n }),\n [projectInfo],\n )\n\n // check if tab needs to be updated when entity type changes\n // for example when switching from version to task, task doesn't have reps tab\n // if reps tab was selected, set default to feed\n useEffect(() => {\n if (currentTab === 'files') {\n // check entity type is still version\n if (activeEntityType !== 'version') {\n setTab('activity')\n }\n }\n }, [activeEntityType, currentTab, scope])\n\n // now we get the full details data for selected entities\n let entitiesToQuery = activeEntities.length\n ? activeEntities.map((entity) => ({ id: entity.id, projectName: entity.projectName }))\n : // @ts-expect-error = not sure what's going on with activeEntitiesData, we should try and remove it\n activeEntitiesData.map((entity) => ({ id: entity.id, projectName: entity.projectName }))\n\n entitiesToQuery = entitiesToQuery.filter((entity) => entity.id)\n\n const {\n data: entityDetailsData = [],\n isFetching: isFetchingEntitiesDetails,\n isError,\n originalArgs,\n } = useGetEntitiesDetailsPanelQuery(\n { entityType: activeEntityType, entities: entitiesToQuery },\n {\n skip: !entitiesToQuery.length || !detailsPanelEntityTypes.includes(activeEntityType),\n },\n )\n\n // the entity changes then we close the slide out\n useEffect(() => {\n if (!isSlideOut) {\n closeSlideOut()\n }\n }, [originalArgs, isSlideOut])\n\n // if the details panel is opened vair the uri, run callback\n useEffect(() => {\n if (isFetchingEntitiesDetails) return\n\n if (\n contextEntities?.source &&\n ['uri', 'url'].includes(contextEntities.source) &&\n contextEntities?.entities?.length &&\n !!onUriOpen\n ) {\n const uriEntity = entityDetailsData.find(\n (entity) => entity.id === contextEntities.entities[0].id,\n )\n if (!uriEntity) return\n\n onUriOpen(uriEntity)\n }\n }, [entityDetailsData, isFetchingEntitiesDetails])\n\n // TODO: merge current entities data with fresh details data\n\n const allStatuses = getAllProjectStatuses(projectsInfo)\n\n // get the first project name and info to be used in the feed.\n const firstProject = activeProjectNames[0]\n const firstProjectInfo = projectsInfo[firstProject] || {}\n const firstEntityData = entityDetailsData[0] || {}\n // Use the last entity for URI sync\n const lastEntityData = entityDetailsData[entityDetailsData.length - 1]\n const lastProject = activeProjectNames[activeProjectNames.length - 1]\n\n // build the full entity path for the first entity\n const [entityPathSegments, entityPathVersions] = useGetEntityPath({\n entity: firstEntityData,\n entityType: activeEntityType,\n projectName: firstProject,\n isLoading: isFetchingEntitiesDetails,\n })\n\n const { setEntityUri, setUri } = useURIContext()\n // sync the uri when entity changes\n useEffect(() => {\n if (!lastEntityData?.parents) return\n if (!lastProject) return\n const { folderPath, taskName, versionName, productName } = extractEntityHierarchyFromParents(\n lastEntityData.parents,\n activeEntityType,\n lastEntityData.name,\n )\n\n setEntityUri({\n projectName: lastProject,\n folderPath: folderPath,\n taskName: taskName,\n productName: productName,\n versionName: versionName,\n })\n\n // unmount cleanup: clear uri\n return () => {\n setUri('')\n }\n }, [entityDetailsData, activeProjectNames, activeEntityType])\n\n // sync the details panel url (panel) with entity\n useDetailsPanelURLSync({\n entityData: lastEntityData,\n project: lastProject,\n activeEntityType,\n entitiesToQuery,\n })\n\n const clearSearchUrl = () => {\n // remove URL params when closing\n setSearchParams(\n (prev) => {\n const newParams = new URLSearchParams(prev)\n newParams.delete('project')\n newParams.delete('type')\n newParams.delete('id')\n return newParams\n },\n { replace: true },\n )\n }\n\n const handleClose = () => {\n onClose?.()\n // also remove any entities in context\n setEntities(null)\n clearSearchUrl()\n closeSlideOut()\n }\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && onClose) {\n // Don't trigger if we're in an input element\n const target = e.target as HTMLElement\n const isInputElement =\n ['INPUT', 'TEXTAREA', 'SELECT'].includes(target.tagName) || target.isContentEditable\n\n if (isInputElement) return\n\n // don't trigger if the viewer is open and panel not in slideout mode\n if (isSlideOut === false && (target.closest('#viewer-dialog') || !!slideOut)) return\n\n handleClose()\n }\n }\n\n window.addEventListener('keydown', handleKeyDown)\n return () => window.removeEventListener('keydown', handleKeyDown)\n }, [handleClose, isSlideOut, slideOut])\n\n const { requestPipWindow } = usePiPWindow()\n\n const handleOpenPip = () => {\n openPip({\n entityType: activeEntityType,\n entities: entitiesToQuery,\n scope: scope,\n })\n requestPipWindow(500, 500)\n }\n\n const isCommentingEnabled = () => {\n // cannot comment on multiple projects\n if (activeProjectNames.length > 1) return false\n if (isGuest) {\n // Guest can only comment in review sessions (for now)\n if (!entityListId) return false\n // Guest must have at least one category set for list\n const guestHasCategory = Object.prototype.hasOwnProperty.call(\n guestCategories,\n user.attrib?.email || '',\n )\n if (!guestHasCategory) return false\n }\n return true\n }\n\n return (\n <>\n <Styled.Panel className=\"details-panel\">\n <Styled.Toolbar>\n {/* TODO FIX PATH */}\n <EntityPath\n segments={entityPathSegments}\n versions={entityPathVersions}\n projectName={firstProject}\n hideProjectName={isSlideOut}\n isLoading={isFetchingEntitiesDetails || !entityPathSegments.length}\n entityType={activeEntityType}\n scope={scope}\n // @ts-ignore\n entityTypeIcons={entityTypeIcons}\n />\n <Styled.RightTools className=\"right-tools\">\n <Watchers\n entities={entitiesToQuery}\n entityType={activeEntityType}\n options={projectUsers || []}\n onWatchersUpdate={onWatchersUpdate && onWatchersUpdate}\n userName={user.name}\n />\n <Button\n icon=\"picture_in_picture\"\n variant={'text'}\n data-tooltip=\"Picture in Picture\"\n onClick={handleOpenPip}\n />\n\n {(onClose || entities) && (\n <Button\n icon=\"close\"\n variant={'text'}\n onClick={handleClose}\n data-shortcut={'Escape'}\n />\n )}\n </Styled.RightTools>\n </Styled.Toolbar>\n\n <DetailsPanelHeader\n entityType={activeEntityType}\n entitySubTypes={activeEntitySubTypes}\n entities={entityDetailsData}\n users={projectUsers}\n disabledAssignees={disabledProjectUsers}\n disabledStatuses={disabledStatuses}\n tagsOptions={tagsOptions}\n isFetching={isFetchingEntitiesDetails}\n isCompact={isCompact}\n currentTab={currentTab}\n onTabChange={setTab}\n entityTypeIcons={entityTypeIcons}\n onOpenViewer={(args) => onOpenViewer?.(args)}\n onEntityFocus={onEntityFocus}\n />\n <ProjectContextProvider projectName={firstProject}>\n {isFeed && !isError && (\n <FeedWrapper\n entityType={activeEntityType}\n entities={entityDetailsData}\n activeUsers={activeProjectUsers || []}\n projectInfo={firstProjectInfo}\n projectName={firstProject}\n disabled={!isCommentingEnabled()}\n scope={scope}\n statuses={allStatuses}\n readOnly={false}\n entityListId={entityListId}\n annotations={annotations}\n removeAnnotation={removeAnnotation}\n exportAnnotationComposite={exportAnnotationComposite}\n currentTab={currentTab}\n setCurrentTab={setTab}\n isSlideOut={isSlideOut}\n />\n )}\n {currentTab === 'files' && (\n <DetailsPanelFiles\n entities={entityDetailsData}\n scope={scope}\n isLoadingVersion={isFetchingEntitiesDetails}\n />\n )}\n {currentTab === 'details' && (\n <FeedContextWrapper\n entityType={activeEntityType}\n entities={entityDetailsData}\n activeUsers={activeProjectUsers || []}\n projectInfo={firstProjectInfo}\n projectName={firstProject}\n disabled={!isCommentingEnabled()}\n scope={scope}\n statuses={allStatuses}\n readOnly={false}\n annotations={annotations}\n removeAnnotation={removeAnnotation}\n exportAnnotationComposite={exportAnnotationComposite}\n >\n <DetailsPanelDetails\n entities={entityDetailsData}\n isLoading={isFetchingEntitiesDetails}\n />\n </FeedContextWrapper>\n )}\n </ProjectContextProvider>\n </Styled.Panel>\n </>\n )\n}\n\n// create a wrapper that checks if the details panel should be open or not based on isOpen prop and entities state\nexport const DetailsPanel = ({\n isOpen,\n entityType,\n ...props\n}: Omit<DetailsPanelProps, 'entityType'> & {\n entityType?: DetailsPanelEntityType\n isOpen: boolean\n}) => {\n const { entities } = useDetailsPanelContext()\n\n if (!isOpen && !entities) return null\n if (!entityType && !entities) return null\n\n // @ts-expect-error - entityType could be undefined but we check for entities above\n return <DetailsPanelInner {...props} entityType={entityType || entities?.entityType} />\n}\n"],"names":["entitiesWithoutFeed","DetailsPanelInner","entityType","entitySubTypes","entitiesData","entities","tagsOptions","disabledStatuses","projectUsers","disabledProjectUsers","activeProjectUsers","projectsInfo","projectNames","isSlideOut","style","scope","isCompact","onClose","onWatchersUpdate","onOpenViewer","onEntityFocus","onOpen","onUriOpen","annotations","removeAnnotation","exportAnnotationComposite","entityListId","guestCategories","closeSlideOut","openPip","user","isGuest","contextEntities","setEntities","slideOut","useDetailsPanelContext","currentTab","setTab","isFeed","useScopedDetailsPanel","_searchParams","setSearchParams","useSearchParams","hasCalledOnOpen","useRef","activeEntityType","activeEntities","activeEntitySubTypes","activeEntitiesData","activeProjectNames","e","useEffect","projectInfo","useMemo","mergeProjectInfo","entityTypeIcons","task","acc","folder","product","entitiesToQuery","entity","entityDetailsData","isFetchingEntitiesDetails","isError","originalArgs","useGetEntitiesDetailsPanelQuery","detailsPanelEntityTypes","uriEntity","allStatuses","getAllProjectStatuses","firstProject","firstProjectInfo","firstEntityData","lastEntityData","lastProject","entityPathSegments","entityPathVersions","useGetEntityPath","setEntityUri","setUri","useURIContext","folderPath","taskName","versionName","productName","extractEntityHierarchyFromParents","useDetailsPanelURLSync","clearSearchUrl","prev","newParams","handleClose","handleKeyDown","target","requestPipWindow","usePiPWindow","handleOpenPip","isCommentingEnabled","jsxs","Styled.Panel","Styled.Toolbar","jsx","EntityPath","Styled.RightTools","Watchers","Button","DetailsPanelHeader","args","ProjectContextProvider","FeedWrapper","DetailsPanelFiles","FeedContextWrapper","DetailsPanelDetails","DetailsPanel","isOpen","props"],"mappings":"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"}
1
+ {"version":3,"file":"DetailsPanel.es.js","sources":["../../../../../src/containers/DetailsPanel/DetailsPanel.tsx"],"sourcesContent":["import { Button } from '@ynput/ayon-react-components'\nimport React, { useEffect, useMemo, useRef } from 'react'\nimport useDetailsPanelURLSync from './hooks/useDetailsPanelURLSync'\nimport * as Styled from './DetailsPanel.styled'\n\n// shared\nimport { useGetEntitiesDetailsPanelQuery, detailsPanelEntityTypes } from '@shared/api'\nimport type { Tag, DetailsPanelEntityType, DetailsPanelEntityData } from '@shared/api'\nimport { DetailsPanelDetails, EntityPath, Watchers } from '@shared/components'\nimport { usePiPWindow } from '@shared/context/pip/PiPProvider'\nimport { extractEntityHierarchyFromParents } from '@shared/util'\nimport {\n ProjectContextProvider,\n ProjectModelWithProducts,\n useDetailsPanelContext,\n useScopedDetailsPanel,\n useURIContext,\n} from '@shared/context'\n\nimport DetailsPanelHeader from './DetailsPanelHeader/DetailsPanelHeader'\nimport DetailsPanelFiles from './DetailsPanelFiles'\nimport useGetEntityPath from './hooks/useGetEntityPath'\nimport getAllProjectStatuses from './helpers/getAllProjectsStatuses'\nimport FeedWrapper from './FeedWrapper'\nimport FeedContextWrapper from './FeedContextWrapper'\nimport mergeProjectInfo from './helpers/mergeProjectInfo'\n\nexport const entitiesWithoutFeed = ['product', 'representation']\n\ntype User = { avatarUrl: string; name: string; fullName?: string }\n\nexport type DetailsPanelProps = {\n entityType: DetailsPanelEntityType\n entitySubTypes?: string[] // used to get actions before the entity has loaded\n entitiesData?: { id: string; label: string; type: DetailsPanelEntityType }[]\n entities?: { id: string; projectName: string }[]\n tagsOptions?: Tag[]\n disabledStatuses?: string[]\n projectUsers?: User[]\n disabledProjectUsers?: string[]\n activeProjectUsers?: string[]\n projectsInfo?: Record<string, ProjectModelWithProducts>\n projectNames?: string[]\n isSlideOut?: boolean\n style?: React.CSSProperties\n scope: string\n isCompact?: boolean\n onClose?: () => void\n onWatchersUpdate?: (added: any[], removed: any[]) => void\n onOpenViewer?: (entity: any) => void\n onEntityFocus?: (id: string, entityType: DetailsPanelEntityType) => void\n onOpen?: () => void\n onUriOpen?: (entity: DetailsPanelEntityData) => void\n // annotations\n annotations?: any\n removeAnnotation?: (id: string) => void\n exportAnnotationComposite?: (id: string) => Promise<Blob | null>\n entityListId?: string\n guestCategories?: Record<string, string> // only used for guests to find if they have access to any categories\n // optional tab state for independent tab management\n}\n\nconst DetailsPanelInner = ({\n entityType,\n entitySubTypes = [],\n // entities is data we already have from kanban\n entitiesData = [],\n // entityIds are used to get the full details data for the entities\n entities = [],\n tagsOptions = [],\n disabledStatuses,\n projectUsers,\n disabledProjectUsers,\n activeProjectUsers,\n projectsInfo = {},\n projectNames = [],\n isSlideOut = false,\n style = {},\n scope,\n isCompact = false,\n onClose,\n onWatchersUpdate,\n onOpenViewer,\n onEntityFocus,\n onOpen,\n onUriOpen, // when the details panel is opened from uri\n // annotations\n annotations,\n removeAnnotation,\n exportAnnotationComposite,\n entityListId,\n guestCategories = {},\n}: // optional tab state for independent tab management\nDetailsPanelProps) => {\n const {\n closeSlideOut,\n openPip,\n user,\n isGuest,\n entities: contextEntities,\n setEntities,\n slideOut,\n useSearchParams,\n } = useDetailsPanelContext()\n const { currentTab, setTab, isFeed } = useScopedDetailsPanel(scope)\n const [_searchParams, setSearchParams] = useSearchParams()\n const hasCalledOnOpen = useRef(false)\n\n // Use context entities if available, otherwise use props\n const activeEntityType = contextEntities?.entityType ?? entityType\n const activeEntities = contextEntities?.entities ?? entities\n const activeEntitySubTypes = contextEntities?.entitySubTypes ?? entitySubTypes\n const activeEntitiesData = contextEntities?.entities ? [] : entitiesData\n const activeProjectNames = contextEntities?.entities\n ? contextEntities.entities.map((e) => e.projectName)\n : projectNames\n\n // Fire onOpen callback once when component mounts and renders\n useEffect(() => {\n if (onOpen && !hasCalledOnOpen.current) {\n hasCalledOnOpen.current = true\n onOpen()\n }\n }, [])\n\n // Force details tab for specific entity types\n useEffect(() => {\n if (entitiesWithoutFeed.includes(activeEntityType) && currentTab !== 'details') {\n setTab('details')\n }\n }, [activeEntityType, currentTab, setTab])\n\n // once component is provided with specific entities, remove context entities to avoid conflicts\n useEffect(() => {\n if (entities.length && contextEntities) {\n setEntities(null)\n }\n }, [entities, contextEntities, setEntities])\n\n // reduce projectsInfo to selected projects and into one\n const projectInfo = useMemo(\n () => mergeProjectInfo(projectsInfo, activeProjectNames),\n [projectsInfo, activeProjectNames],\n )\n\n // build icons for entity types\n const entityTypeIcons = useMemo(\n () => ({\n task: projectInfo.taskTypes\n .filter((task) => !!task.icon)\n .reduce((acc, task) => ({ ...acc, [task.name]: task.icon }), {}),\n folder: projectInfo.folderTypes\n .filter((folder) => !!folder.icon)\n .reduce((acc, folder) => ({ ...acc, [folder.name]: folder.icon }), {}),\n product: projectInfo.productTypes\n .filter((product) => !!product.icon)\n .reduce((acc, product) => ({ ...acc, [product.name]: product.icon }), {}),\n }),\n [projectInfo],\n )\n\n // check if tab needs to be updated when entity type changes\n // for example when switching from version to task, task doesn't have reps tab\n // if reps tab was selected, set default to feed\n useEffect(() => {\n if (currentTab === 'files') {\n // check entity type is still version\n if (activeEntityType !== 'version') {\n setTab('activity')\n }\n }\n }, [activeEntityType, currentTab, scope])\n\n // now we get the full details data for selected entities\n let entitiesToQuery = activeEntities.length\n ? activeEntities.map((entity) => ({ id: entity.id, projectName: entity.projectName }))\n : // @ts-expect-error = not sure what's going on with activeEntitiesData, we should try and remove it\n activeEntitiesData.map((entity) => ({ id: entity.id, projectName: entity.projectName }))\n\n entitiesToQuery = entitiesToQuery.filter((entity) => entity.id)\n\n const {\n data: entityDetailsData = [],\n isFetching: isFetchingEntitiesDetails,\n isError,\n originalArgs,\n } = useGetEntitiesDetailsPanelQuery(\n { entityType: activeEntityType, entities: entitiesToQuery },\n {\n skip: !entitiesToQuery.length || !detailsPanelEntityTypes.includes(activeEntityType),\n },\n )\n\n // the entity changes then we close the slide out\n useEffect(() => {\n if (!isSlideOut) {\n closeSlideOut()\n }\n }, [originalArgs, isSlideOut])\n\n // if the details panel is opened vair the uri, run callback\n useEffect(() => {\n if (isFetchingEntitiesDetails) return\n\n if (\n contextEntities?.source &&\n ['uri', 'url'].includes(contextEntities.source) &&\n contextEntities?.entities?.length &&\n !!onUriOpen\n ) {\n const uriEntity = entityDetailsData.find(\n (entity) => entity.id === contextEntities.entities[0].id,\n )\n if (!uriEntity) return\n\n onUriOpen(uriEntity)\n }\n }, [entityDetailsData, isFetchingEntitiesDetails])\n\n // TODO: merge current entities data with fresh details data\n\n const allStatuses = getAllProjectStatuses(projectsInfo)\n\n // get the first project name and info to be used in the feed.\n const firstProject = activeProjectNames[0]\n const firstProjectInfo = projectsInfo[firstProject] || {}\n const firstEntityData = entityDetailsData[0] || {}\n // Use the last entity for URI sync\n const lastEntityData = entityDetailsData[entityDetailsData.length - 1]\n const lastProject = activeProjectNames[activeProjectNames.length - 1]\n\n // build the full entity path for the first entity\n const [entityPathSegments, entityPathVersions] = useGetEntityPath({\n entity: firstEntityData,\n entityType: activeEntityType,\n projectName: firstProject,\n isLoading: isFetchingEntitiesDetails,\n })\n\n const { setEntityUri, setUri } = useURIContext()\n // sync the uri when entity changes\n useEffect(() => {\n if (!lastEntityData?.parents) return\n if (!lastProject) return\n const { folderPath, taskName, versionName, productName } = extractEntityHierarchyFromParents(\n lastEntityData.parents,\n activeEntityType,\n lastEntityData.name,\n )\n\n setEntityUri({\n projectName: lastProject,\n folderPath: folderPath,\n taskName: taskName,\n productName: productName,\n versionName: versionName,\n })\n\n // unmount cleanup: clear uri\n return () => {\n setUri('')\n }\n }, [entityDetailsData, activeProjectNames, activeEntityType])\n\n // sync the details panel url (panel) with entity\n useDetailsPanelURLSync({\n entityData: lastEntityData,\n project: lastProject,\n activeEntityType,\n entitiesToQuery,\n })\n\n const clearSearchUrl = () => {\n // remove URL params when closing\n setSearchParams(\n (prev) => {\n const newParams = new URLSearchParams(prev)\n newParams.delete('project')\n newParams.delete('type')\n newParams.delete('id')\n return newParams\n },\n { replace: true },\n )\n }\n\n const handleClose = () => {\n onClose?.()\n // also remove any entities in context\n setEntities(null)\n clearSearchUrl()\n closeSlideOut()\n }\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && onClose) {\n // Don't trigger if we're in an input element\n const target = e.target as HTMLElement\n const isInputElement =\n ['INPUT', 'TEXTAREA', 'SELECT'].includes(target.tagName) || target.isContentEditable\n\n if (isInputElement) return\n\n // don't trigger if the viewer is open and panel not in slideout mode\n if (isSlideOut === false && (target.closest('#viewer-dialog') || !!slideOut)) return\n\n handleClose()\n }\n }\n\n window.addEventListener('keydown', handleKeyDown)\n return () => window.removeEventListener('keydown', handleKeyDown)\n }, [handleClose, isSlideOut, slideOut])\n\n const { requestPipWindow } = usePiPWindow()\n\n const handleOpenPip = () => {\n openPip({\n entityType: activeEntityType,\n entities: entitiesToQuery,\n scope: scope,\n })\n requestPipWindow(500, 500)\n }\n\n const isCommentingEnabled = () => {\n // cannot comment on multiple projects\n if (activeProjectNames.length > 1) return false\n if (isGuest) {\n // Guest can only comment in review sessions (for now)\n if (!entityListId) return false\n // Guest must have at least one category set for list\n const guestHasCategory = Object.prototype.hasOwnProperty.call(\n guestCategories,\n user.attrib?.email || '',\n )\n if (!guestHasCategory) return false\n }\n return true\n }\n\n return (\n <>\n <Styled.Panel className=\"details-panel\">\n <Styled.Toolbar>\n {/* TODO FIX PATH */}\n <EntityPath\n segments={entityPathSegments}\n versions={entityPathVersions}\n projectName={firstProject}\n hideProjectName={isSlideOut}\n isLoading={isFetchingEntitiesDetails || !entityPathSegments.length}\n entityType={activeEntityType}\n scope={scope}\n // @ts-ignore\n entityTypeIcons={entityTypeIcons}\n />\n <Styled.RightTools className=\"right-tools\">\n <Watchers\n entities={entitiesToQuery}\n entityType={activeEntityType}\n options={projectUsers || []}\n onWatchersUpdate={onWatchersUpdate && onWatchersUpdate}\n userName={user.name}\n />\n <Button\n icon=\"picture_in_picture\"\n variant={'text'}\n data-tooltip=\"Picture in Picture\"\n onClick={handleOpenPip}\n />\n\n {(onClose || entities) && (\n <Button\n icon=\"close\"\n variant={'text'}\n onClick={handleClose}\n data-shortcut={'Escape'}\n />\n )}\n </Styled.RightTools>\n </Styled.Toolbar>\n\n <DetailsPanelHeader\n entityType={activeEntityType}\n entitySubTypes={activeEntitySubTypes}\n entities={entityDetailsData}\n users={projectUsers}\n disabledAssignees={disabledProjectUsers}\n disabledStatuses={disabledStatuses}\n tagsOptions={tagsOptions}\n isFetching={isFetchingEntitiesDetails}\n isCompact={isCompact}\n currentTab={currentTab}\n onTabChange={setTab}\n entityTypeIcons={entityTypeIcons}\n onOpenViewer={(args) => onOpenViewer?.(args)}\n onEntityFocus={onEntityFocus}\n />\n <ProjectContextProvider projectName={firstProject}>\n {isFeed && !isError && (\n <FeedWrapper\n entityType={activeEntityType}\n entities={entityDetailsData}\n activeUsers={activeProjectUsers || []}\n projectInfo={firstProjectInfo}\n projectName={firstProject}\n disabled={!isCommentingEnabled()}\n scope={scope}\n statuses={allStatuses}\n readOnly={false}\n entityListId={entityListId}\n annotations={annotations}\n removeAnnotation={removeAnnotation}\n exportAnnotationComposite={exportAnnotationComposite}\n currentTab={currentTab}\n setCurrentTab={setTab}\n isSlideOut={isSlideOut}\n />\n )}\n {currentTab === 'files' && (\n <DetailsPanelFiles\n entities={entityDetailsData}\n scope={scope}\n isLoadingVersion={isFetchingEntitiesDetails}\n />\n )}\n {currentTab === 'details' && (\n <FeedContextWrapper\n entityType={activeEntityType}\n entities={entityDetailsData}\n activeUsers={activeProjectUsers || []}\n projectInfo={firstProjectInfo}\n projectName={firstProject}\n disabled={!isCommentingEnabled()}\n scope={scope}\n statuses={allStatuses}\n readOnly={false}\n annotations={annotations}\n removeAnnotation={removeAnnotation}\n exportAnnotationComposite={exportAnnotationComposite}\n >\n <DetailsPanelDetails\n entities={entityDetailsData}\n isLoading={isFetchingEntitiesDetails}\n />\n </FeedContextWrapper>\n )}\n </ProjectContextProvider>\n </Styled.Panel>\n </>\n )\n}\n\n// create a wrapper that checks if the details panel should be open or not based on isOpen prop and entities state\nexport const DetailsPanel = ({\n isOpen,\n entityType,\n ...props\n}: Omit<DetailsPanelProps, 'entityType'> & {\n entityType?: DetailsPanelEntityType\n isOpen: boolean\n}) => {\n const { entities } = useDetailsPanelContext()\n\n if (!isOpen && !entities) return null\n if (!entityType && !entities) return null\n\n // @ts-expect-error - entityType could be undefined but we check for entities above\n return <DetailsPanelInner {...props} entityType={entityType || entities?.entityType} />\n}\n"],"names":["entitiesWithoutFeed","DetailsPanelInner","entityType","entitySubTypes","entitiesData","entities","tagsOptions","disabledStatuses","projectUsers","disabledProjectUsers","activeProjectUsers","projectsInfo","projectNames","isSlideOut","style","scope","isCompact","onClose","onWatchersUpdate","onOpenViewer","onEntityFocus","onOpen","onUriOpen","annotations","removeAnnotation","exportAnnotationComposite","entityListId","guestCategories","closeSlideOut","openPip","user","isGuest","contextEntities","setEntities","slideOut","useSearchParams","useDetailsPanelContext","currentTab","setTab","isFeed","useScopedDetailsPanel","_searchParams","setSearchParams","hasCalledOnOpen","useRef","activeEntityType","activeEntities","activeEntitySubTypes","activeEntitiesData","activeProjectNames","e","useEffect","projectInfo","useMemo","mergeProjectInfo","entityTypeIcons","task","acc","folder","product","entitiesToQuery","entity","entityDetailsData","isFetchingEntitiesDetails","isError","originalArgs","useGetEntitiesDetailsPanelQuery","detailsPanelEntityTypes","uriEntity","allStatuses","getAllProjectStatuses","firstProject","firstProjectInfo","firstEntityData","lastEntityData","lastProject","entityPathSegments","entityPathVersions","useGetEntityPath","setEntityUri","setUri","useURIContext","folderPath","taskName","versionName","productName","extractEntityHierarchyFromParents","useDetailsPanelURLSync","clearSearchUrl","prev","newParams","handleClose","handleKeyDown","target","requestPipWindow","usePiPWindow","handleOpenPip","isCommentingEnabled","jsxs","Styled.Panel","Styled.Toolbar","jsx","EntityPath","Styled.RightTools","Watchers","Button","DetailsPanelHeader","args","ProjectContextProvider","FeedWrapper","DetailsPanelFiles","FeedContextWrapper","DetailsPanelDetails","DetailsPanel","isOpen","props"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";const r=require("../../../../../../_virtual/jsx-runtime.cjs.js"),B=require("clsx"),m=require("react"),qe=require("react-markdown"),se=require("remark-emoji"),ae=require("remark-gfm"),ce=require("remark-directive"),le=require("remark-directive-rehype"),me=require("../CommentInput/CommentInput.cjs.js"),de=require("../ReactionContainer/Reactions.cjs.js"),xe=require("../../hooks/useReferenceTooltip.cjs.js"),ye=require("../FilesGrid/FilesGrid.cjs.js"),pe=require("../CommentInput/quillToMarkdown.cjs.js"),n=require("./ActivityComment.styled.cjs.js"),ge=require("./CommentWrapper.cjs.js"),d=require("./ActivityMarkdownComponents.cjs.js"),Re=require("./mappers.cjs.js"),je=require("@ynput/ayon-react-components"),Ce=require("../ActivityStatus/ActivityStatus.cjs.js"),fe=require("../../context/FeedContext.cjs.js"),he=require("../../../../util/confirmDelete.cjs.js");require("react-toastify");require("uuid");require("lodash");require("../../../../util/pubsub.cjs.js");const Ee=require("../ActivityHeader/ActivityHeader.cjs.js");require("../../../../components/AddonLoadingScreen/AddonLoadingScreen.cjs.js");require("../../../../components/ThumbnailSimple/ThumbnailSimple.cjs.js");require("../../../../components/EmptyPlaceholder/EmptyPlaceholder.cjs.js");require("../../../../components/EmptyPlaceholder/EmptyPlaceholderFlex.styled.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("@dnd-kit/core");require("@dnd-kit/sortable");require("../../../../components/ReviewablesList/ReviewablesList.styled.cjs.js");require("../../../ContextMenu/ContextMenuContext.cjs.js");;/* empty css */require("../../../../components/ReviewablesList/ReviewablesUpload.styled.cjs.js");require("axios");require("../../../../context/RemoteModulesContext.cjs.js");const Te=require("../../../../context/DetailsPanelContext.cjs.js");require("../../../../context/ThumbnailUploaderContext.cjs.js");require("../../../../context/SettingsPanelContext.cjs.js");require("../../../../context/pip/PiPProvider.cjs.js");require("react-dom");require("../../../../context/pip/PiPWrapper.cjs.js");require("../../../../context/AddonProjectContext.cjs.js");require("../../../../context/AddonContext.cjs.js");require("../../../../context/PowerpackContext.cjs.js");require("../../../../context/MoveEntityContext.cjs.js");const ve=require("../../../../context/MenuContext.cjs.js");require("../../../../context/WebsocketContext.cjs.js");require("../../../../context/GlobalContext.cjs.js");require("../../../../context/ProjectContext.cjs.js");require("../../../../context/ProjectFoldersContext.cjs.js");require("../../../../context/UriContext.cjs.js");require("../../../../components/ReviewableCard/ReviewableCard.cjs.js");require("../../../../components/ReviewableProgressCard/ReviewableProgressCard.styled.cjs.js");require("../../../../components/FileThumbnail/FileThumbnail.cjs.js");require("../../../../components/Thumbnail/Thumbnail.styled.cjs.js");require("../../../../components/Thumbnail/StackedThumbnails.cjs.js");require("../Tooltips/UserTooltip/UserTooltip.styled.cjs.js");require("../Tooltips/EntityTooltip/EntityTooltip.styled.cjs.js");require("../FileUploadPreview/FileUploadPreview.styled.cjs.js");require("../FileUploadPreview/Mimes/TextMime.cjs.js");const De=require("../CommentInput/hooks/useBlendedCategoryColor.cjs.js"),Me=require("../ActivityCategorySelect/CategoryTag.cjs.js"),ke=require("./ActivityCommentMenu.cjs.js");require("../ActivityStatusChange/ActivityStatusChange.styled.cjs.js");require("../ActivityDate.cjs.js");require("../ActivityAssigneeChange/ActivityAssigneeChange.styled.cjs.js");require("../ActivityVersions/ActivityVersions.styled.cjs.js");require("../ActivityGroup/ActivityGroup.styled.cjs.js");require("../../Feed.styled.cjs.js");require("date-fns");require("../ActivityCategorySelect/ActivityCategorySelect.cjs.js");require("../ActivityCategorySelect/CategoryDropdownItem.cjs.js");require("@tanstack/react-virtual");require("@tanstack/react-table");require("../../../ProjectTreeTable/widgets/CollapsedWidget.cjs.js");require("../../../ProjectTreeTable/widgets/DateWidget.cjs.js");require("../../../ProjectTreeTable/widgets/EnumWidget.cjs.js");require("../../../ProjectTreeTable/widgets/TextWidget.cjs.js");require("../../../ProjectTreeTable/widgets/BooleanWidget.cjs.js");require("../../../ProjectTreeTable/widgets/CellWidget.cjs.js");require("../../../ProjectTreeTable/widgets/EntityNameWidget.cjs.js");require("../../../ProjectTreeTable/widgets/GroupHeaderWidget.cjs.js");require("../../../ProjectTreeTable/widgets/ThumbnailWidget.cjs.js");require("../../../../components/LinksManager/CellEditingDialog.cjs.js");require("../../../ProjectTreeTable/context/DetailsPanelEntityContext.cjs.js");require("../../../ProjectTreeTable/context/SelectedRowsContext.cjs.js");require("../../../../components/LinksManager/LinksManager.styled.cjs.js");require("../../../ProjectTreeTable/widgets/EmptyWidget.cjs.js");require("../../../ProjectTreeTable/widgets/ErrorWidget.cjs.js");require("../../../ProjectTreeTable/context/CellEditingContext.cjs.js");require("short-uuid");require("../../../ProjectTreeTable/context/SelectionCellsContext.cjs.js");require("../../../ProjectTreeTable/context/ProjectTableQueriesContext.cjs.js");require("../../../ProjectTreeTable/context/ProjectTableContext.cjs.js");require("../../../ProjectTreeTable/context/ClipboardContext.cjs.js");require("../../../ProjectTreeTable/context/ColumnSettingsContext.cjs.js");require("../../../ProjectTreeTable/context/ProjectDataContext.cjs.js");require("../../../../../../_virtual/runtime.cjs.js");require("../../../../../../_virtual/semver.cjs.js");require("react-redux");require("custom-protocol-check");require("../../../ProjectTreeTable/components/GroupSettingsFallback.cjs.js");require("../../../ProjectTreeTable/ProjectTreeTable.styled.cjs.js");require("../../../ProjectTreeTable/components/SelectionCell.cjs.js");require("../../../ProjectTreeTable/components/RowSelectionHeader.cjs.js");require("../../../ProjectTreeTable/widgets/LoadMoreWidget.cjs.js");require("../../../ProjectTreeTable/components/HeaderActionButton.cjs.js");require("../../../ProjectTreeTable/components/ColumnHeaderMenu.cjs.js");require("../../../EntityPickerDialog/EntityPickerDialog.cjs.js");require("react-router-dom");require("../../../DetailsPanel/DetailsPanel.styled.cjs.js");require("../../../DetailsPanel/FeedFilters/FeedFilters.styled.cjs.js");require("../../../DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.styled.cjs.js");require("../../../../components/PlayableIcon/PlayableIcon.cjs.js");require("../../../DetailsPanel/DetailsPanelFiles/DetailsPanelFiles.cjs.js");require("../../../DetailsPanel/DetailsPanelSlideOut/DetailsPanelSlideOut.styled.cjs.js");require("../../../DetailsPanel/DetailsPanelFloating/DetailsPanelFloating.styled.cjs.js");require("../../../Actions/Actions.styled.cjs.js");require("../../../Actions/ActionsDropdown/ActionsDropdown.cjs.js");require("../../../Actions/ActionIcon.cjs.js");require("../../../Views/context/ViewsContext.cjs.js");require("../../../Views/Views.styled.cjs.js");require("../../../Views/ViewsMenuContainer/ViewsMenuContainer.cjs.js");require("../../../Views/ViewsMenu/ViewsMenu.cjs.js");require("../../../../components/EntityPanelUploader/EntityPanelUploader.styled.cjs.js");require("../../../../components/SimpleFormDialog/SimpleFormDialog.cjs.js");require("../../../../components/EntityPath/EntityPath.styled.cjs.js");require("../../../../components/EntityPath/SegmentProvider.cjs.js");require("../../../../components/DetailsPanelAttributes/DetailsPanelAttributesEditor.cjs.js");require("../../../../components/DetailsPanelDetails/DetailsPanelDetails.cjs.js");require("../../../../components/DetailsPanelDetails/DetailsSection.cjs.js");require("../../../../components/DetailsPanelDetails/FieldLabel.cjs.js");require("../../../../components/Watchers/Watchers.cjs.js");require("../../../../components/ProjectTableSettings/ProjectTableSettings.cjs.js");require("../../../../components/Powerpack/PowerpackButton.cjs.js");require("../../../../components/Powerpack/PricingLink.cjs.js");require("../../../../components/Powerpack/PowerpackDialog.styled.cjs.js");require("../../../../components/Powerpack/CTAButton.cjs.js");require("../../../../components/Powerpack/RequiredAddonVersion.cjs.js");require("../../../../components/SizeSlider/SizeSlider.cjs.js");require("../../../../components/SettingsPanel/SettingsPanel.cjs.js");require("../../../../components/SettingsPanel/SettingsPanelItemTemplate.cjs.js");require("../../../../components/AttributeEditor/components/MinMaxField.cjs.js");require("../../../../components/EnumEditor/EnumEditor.styled.cjs.js");require("../../../../components/SearchFilter/filterDates.cjs.js");require("../../../../components/FeaturedVersionOrder/FeaturedVersionOrder.cjs.js");require("../../../../components/Badge/Badge.cjs.js");require("../../../../components/VersionUploader/components/UploadVersionDialog.cjs.js");require("../../../../components/VersionUploader/context/VersionUploadContext.cjs.js");require("../../../../components/Feedback/FeedbackContext.cjs.js");require("../../../../components/Feedback/SupportBubble.cjs.js");require("../../../../components/Chips/Chips.cjs.js");require("../../../../components/StyledLink/StyledLink.cjs.js");require("../../../../components/ShareOptionIcon/ShareOptionIcon.cjs.js");require("../../../../components/AccessUser/AccessUser.cjs.js");require("../../../../../../node_modules/match-sorter/dist/match-sorter.esm.cjs.js");require("../../../../components/AccessSearchInput/AccessSearchInput.styled.cjs.js");require("../../../../components/TableGridSwitch/TableGridSwitch.cjs.js");require("../../../../components/SortingSetting/SortingSetting.styled.cjs.js");require("../../../../components/EarlyPreview/EarlyPreview.cjs.js");require("../../../../components/LegacyBadge/LegacyBadge.cjs.js");require("../../../../components/Menu/Menu.styled.cjs.js");require("../../../../components/Menu/MenuItem.cjs.js");const Fe=require("../../../../components/Menu/MenuContainer.cjs.js"),Ae=({activity:t={},onCheckChange:G,onDelete:x,onUpdate:O,projectInfo:be,editProps:$,projectName:o,entityType:H,onReferenceClick:D,onFileExpand:_,showOrigin:z,isHighlighted:L,readOnly:M,isSlideOut:Q,statuses:V=[]})=>{const{userName:y,createReaction:W,deleteReaction:J,editingId:K,setEditingId:p,categories:k,isGuest:g}=fe.useFeedContext(),F=m.useRef(null),{toggleMenuOpen:R,menuOpen:U}=ve.useMenuContext(),{categoryData:i,categoryNotFound:X}=m.useMemo(()=>{let e=!1;if(t.activityData?.category){const l=k.find(v=>v.name===t.activityData?.category);return l||(e=!0),{categoryData:l||{name:t.activityData?.category,color:"#c5c5c5"},categoryNotFound:e}}else return{categoryData:null,categoryNotFound:e}},[t?.activityData?.category,k]),q=De.useBlendedCategoryColor(i?.color);let{body:j,authorName:a,authorFullName:C,createdAt:Y,referenceType:Z,entityId:A,activityId:u,author:b,isOwner:c,files:f=[],origin:h}=t;a||(a=b?.name||""),C||(C=b?.fullName||a);const E=`activity-comment-menu-${u}-${Q?"slideout":"normal"}`,w=U===E,{onGoToFrame:I,setHighlightedActivities:ee}=Te.useDetailsPanelContext(),T=()=>{p(u)},re=()=>{p(null)},ie=async(e,l,v)=>{await O?.(e,l,void 0,v),p(null)},s=K===u,N=Z!=="origin"||z,ue=async()=>{const e=pe.getTextRefs(j);N&&h&&e.push({id:h.id,type:h.type}),x&&await x(u,A,e)},te=()=>{he.confirmDelete({title:"Delete comment",message:"Are you sure you want to delete this comment?",accept:async()=>{await ue()}})},[,P]=xe(),S=m.useMemo(()=>Re.mapGraphQLReactions(t.reactions,y),[[...t.reactions||[]]]),oe=e=>{e.isActive?W({projectName:o,userName:y,activityId:u,createReactionModel:{reaction:e.type}}):J({projectName:o,userName:y,activityId:u,reaction:e.type})},ne=m.useCallback(e=>{e.annotation&&(I?.(e.annotation.range[0]),ee([u]))},[I]);return r.jsxRuntimeExports.jsxs(r.jsxRuntimeExports.Fragment,{children:[r.jsxRuntimeExports.jsxs(n.Comment,{className:B("comment",{isOwner:c,isEditing:s,isHighlighted:L,category:!!i&&!g,menuOpen:w}),id:u,$categoryPrimary:i?.color,$categoryTertiary:q.primary,$categorySecondary:q.secondary,children:[r.jsxRuntimeExports.jsx(Ee,{name:a,fullName:C,date:Y,isRef:N,activity:t,projectName:o,entityType:H,onReferenceClick:D,onReferenceTooltip:P,children:void 0}),r.jsxRuntimeExports.jsxs(n.Body,{className:B("comment-body",{isEditing:s}),children:[!M&&r.jsxRuntimeExports.jsxs(n.Tools,{className:"tools",children:[c&&T&&r.jsxRuntimeExports.jsx(n.ToolButton,{icon:"edit_square",onClick:T,variant:"text"}),r.jsxRuntimeExports.jsx(n.ToolButton,{icon:"more_horiz",ref:F,onClick:e=>{e.stopPropagation(),R(E)},className:w?"active":""})]}),!s&&!g&&i&&r.jsxRuntimeExports.jsx(Me.CategoryTag,{value:i.name,color:i.color,style:{top:-4,left:-4},isCompact:!0,"data-tooltip":X?"Category not found. It may have been deleted.":void 0,"data-tooltip-delay":0}),s?r.jsxRuntimeExports.jsx(me.default,{initValue:j,initFiles:f,initCategory:i?.name,data:t.activityData,isEditing:!0,onClose:re,onSubmit:ie,isOpen:!0,...$}):r.jsxRuntimeExports.jsxs(r.jsxRuntimeExports.Fragment,{children:[r.jsxRuntimeExports.jsx(ge,{children:r.jsxRuntimeExports.jsx(qe,{remarkPlugins:[ae,se,ce,le],urlTransform:e=>e,components:{a:e=>d.aTag(e,{entityId:A,projectName:o,onReferenceClick:D,onReferenceTooltip:P,activityId:u,categoryPrimary:i?.color,categorySecondary:q.secondary}),input:e=>d.inputTag(e,{activity:t,onCheckChange:G}),code:e=>d.codeTag(e),blockquote:e=>d.blockquoteTag(e),tip:e=>r.jsxRuntimeExports.jsxs(n.Tip,{children:[r.jsxRuntimeExports.jsx(je.Icon,{icon:"info"}),e.children]}),status:e=>r.jsxRuntimeExports.jsx(Ce,{name:e.id,statuses:V,children:e.children})},children:j})}),r.jsxRuntimeExports.jsx(ye,{files:f,isCompact:f.length>6,activityId:u,projectName:o,isDownloadable:!0,onExpand:_,onAnnotationClick:ne,onRemove:void 0})]}),!s&&r.jsxRuntimeExports.jsx("div",{style:{marginTop:"16px"},children:S&&r.jsxRuntimeExports.jsx(de,{reactions:S,changeHandler:oe,readOnly:M,category:i&&!g?i.name:void 0,categoryPrimary:i?.color,categorySecondary:q.secondary,categoryTertiary:q.primary})})]})]}),r.jsxRuntimeExports.jsx(Fe.MenuContainer,{target:F.current,id:E,align:"right",onClose:e=>{e?.stopPropagation(),R(!1)},children:r.jsxRuntimeExports.jsx(ke,{onDelete:c&&x?te:void 0,onEdit:c&&T,activityId:u,onSelect:()=>R(!1),projectName:o})})]})};module.exports=Ae;
1
+ "use strict";const r=require("../../../../../../_virtual/jsx-runtime.cjs.js"),B=require("clsx"),m=require("react"),qe=require("react-markdown"),se=require("remark-emoji"),ae=require("remark-gfm"),ce=require("remark-directive"),le=require("remark-directive-rehype"),me=require("../CommentInput/CommentInput.cjs.js"),de=require("../ReactionContainer/Reactions.cjs.js"),xe=require("../../hooks/useReferenceTooltip.cjs.js"),ye=require("../FilesGrid/FilesGrid.cjs.js"),pe=require("../CommentInput/quillToMarkdown.cjs.js"),n=require("./ActivityComment.styled.cjs.js"),ge=require("./CommentWrapper.cjs.js"),d=require("./ActivityMarkdownComponents.cjs.js"),Re=require("./mappers.cjs.js"),je=require("@ynput/ayon-react-components"),Ce=require("../ActivityStatus/ActivityStatus.cjs.js"),fe=require("../../context/FeedContext.cjs.js"),he=require("../../../../util/confirmDelete.cjs.js");require("react-toastify");require("uuid");require("lodash");require("../../../../util/pubsub.cjs.js");const Ee=require("../ActivityHeader/ActivityHeader.cjs.js");require("../../../../components/AddonLoadingScreen/AddonLoadingScreen.cjs.js");require("../../../../components/ThumbnailSimple/ThumbnailSimple.cjs.js");require("../../../../components/EmptyPlaceholder/EmptyPlaceholder.cjs.js");require("../../../../components/EmptyPlaceholder/EmptyPlaceholderFlex.styled.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("@dnd-kit/core");require("@dnd-kit/sortable");require("../../../../components/ReviewablesList/ReviewablesList.styled.cjs.js");require("../../../ContextMenu/ContextMenuContext.cjs.js");;/* empty css */require("../../../../components/ReviewablesList/ReviewablesUpload.styled.cjs.js");require("axios");require("../../../../context/RemoteModulesContext.cjs.js");const Te=require("../../../../context/DetailsPanelContext.cjs.js");require("../../../../context/ThumbnailUploaderContext.cjs.js");require("../../../../context/SettingsPanelContext.cjs.js");require("../../../../context/pip/PiPProvider.cjs.js");require("react-dom");require("../../../../context/pip/PiPWrapper.cjs.js");require("../../../../context/AddonProjectContext.cjs.js");require("../../../../context/AddonContext.cjs.js");require("../../../../context/PowerpackContext.cjs.js");require("../../../../context/MoveEntityContext.cjs.js");const ve=require("../../../../context/MenuContext.cjs.js");require("../../../../context/WebsocketContext.cjs.js");require("../../../../context/GlobalContext.cjs.js");require("../../../../context/ProjectContext.cjs.js");require("../../../../context/ProjectFoldersContext.cjs.js");require("../../../../context/UriContext.cjs.js");require("../../../../components/ReviewableCard/ReviewableCard.cjs.js");require("../../../../components/ReviewableProgressCard/ReviewableProgressCard.styled.cjs.js");require("../../../../components/FileThumbnail/FileThumbnail.cjs.js");require("../../../../components/Thumbnail/Thumbnail.styled.cjs.js");require("../../../../components/Thumbnail/StackedThumbnails.cjs.js");require("../Tooltips/UserTooltip/UserTooltip.styled.cjs.js");require("../Tooltips/EntityTooltip/EntityTooltip.styled.cjs.js");require("../FileUploadPreview/FileUploadPreview.styled.cjs.js");require("../FileUploadPreview/Mimes/TextMime.cjs.js");const De=require("../CommentInput/hooks/useBlendedCategoryColor.cjs.js"),Me=require("../ActivityCategorySelect/CategoryTag.cjs.js"),ke=require("./ActivityCommentMenu.cjs.js");require("../ActivityStatusChange/ActivityStatusChange.styled.cjs.js");require("../ActivityDate.cjs.js");require("../ActivityAssigneeChange/ActivityAssigneeChange.styled.cjs.js");require("../ActivityVersions/ActivityVersions.styled.cjs.js");require("../ActivityGroup/ActivityGroup.styled.cjs.js");require("../../Feed.styled.cjs.js");require("date-fns");require("../ActivityCategorySelect/ActivityCategorySelect.cjs.js");require("../ActivityCategorySelect/CategoryDropdownItem.cjs.js");require("@tanstack/react-virtual");require("@tanstack/react-table");require("../../../ProjectTreeTable/widgets/CollapsedWidget.cjs.js");require("../../../ProjectTreeTable/widgets/DateWidget.cjs.js");require("../../../ProjectTreeTable/widgets/EnumWidget.cjs.js");require("../../../ProjectTreeTable/widgets/TextWidget.cjs.js");require("../../../ProjectTreeTable/widgets/BooleanWidget.cjs.js");require("../../../ProjectTreeTable/widgets/CellWidget.cjs.js");require("../../../ProjectTreeTable/widgets/EntityNameWidget.cjs.js");require("../../../ProjectTreeTable/widgets/GroupHeaderWidget.cjs.js");require("../../../ProjectTreeTable/widgets/ThumbnailWidget.cjs.js");require("../../../../components/LinksManager/CellEditingDialog.cjs.js");require("../../../ProjectTreeTable/context/DetailsPanelEntityContext.cjs.js");require("../../../ProjectTreeTable/context/SelectedRowsContext.cjs.js");require("../../../../components/LinksManager/LinksManager.styled.cjs.js");require("../../../ProjectTreeTable/widgets/EmptyWidget.cjs.js");require("../../../ProjectTreeTable/widgets/ErrorWidget.cjs.js");require("../../../ProjectTreeTable/context/CellEditingContext.cjs.js");require("short-uuid");require("../../../ProjectTreeTable/context/SelectionCellsContext.cjs.js");require("../../../ProjectTreeTable/context/ProjectTableQueriesContext.cjs.js");require("../../../ProjectTreeTable/context/ProjectTableContext.cjs.js");require("../../../ProjectTreeTable/context/ClipboardContext.cjs.js");require("../../../ProjectTreeTable/context/ColumnSettingsContext.cjs.js");require("../../../ProjectTreeTable/context/ProjectDataContext.cjs.js");require("../../../../../../_virtual/runtime.cjs.js");require("../../../../../../_virtual/semver.cjs.js");require("react-redux");require("custom-protocol-check");require("../../../ProjectTreeTable/components/GroupSettingsFallback.cjs.js");require("../../../ProjectTreeTable/ProjectTreeTable.styled.cjs.js");require("../../../ProjectTreeTable/components/SelectionCell.cjs.js");require("../../../ProjectTreeTable/components/RowSelectionHeader.cjs.js");require("../../../ProjectTreeTable/widgets/LoadMoreWidget.cjs.js");require("../../../ProjectTreeTable/components/HeaderActionButton.cjs.js");require("../../../ProjectTreeTable/components/ColumnHeaderMenu.cjs.js");require("../../../EntityPickerDialog/EntityPickerDialog.cjs.js");require("../../../DetailsPanel/DetailsPanel.styled.cjs.js");require("../../../DetailsPanel/FeedFilters/FeedFilters.styled.cjs.js");require("../../../DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.styled.cjs.js");require("../../../../components/PlayableIcon/PlayableIcon.cjs.js");require("../../../DetailsPanel/DetailsPanelFiles/DetailsPanelFiles.cjs.js");require("../../../DetailsPanel/DetailsPanelSlideOut/DetailsPanelSlideOut.styled.cjs.js");require("../../../DetailsPanel/DetailsPanelFloating/DetailsPanelFloating.styled.cjs.js");require("../../../Actions/Actions.styled.cjs.js");require("../../../Actions/ActionsDropdown/ActionsDropdown.cjs.js");require("../../../Actions/ActionIcon.cjs.js");require("../../../Views/context/ViewsContext.cjs.js");require("../../../Views/Views.styled.cjs.js");require("../../../Views/ViewsMenuContainer/ViewsMenuContainer.cjs.js");require("../../../Views/ViewsMenu/ViewsMenu.cjs.js");require("../../../../components/EntityPanelUploader/EntityPanelUploader.styled.cjs.js");require("../../../../components/SimpleFormDialog/SimpleFormDialog.cjs.js");require("../../../../components/EntityPath/EntityPath.styled.cjs.js");require("../../../../components/EntityPath/SegmentProvider.cjs.js");require("../../../../components/DetailsPanelAttributes/DetailsPanelAttributesEditor.cjs.js");require("../../../../components/DetailsPanelDetails/DetailsPanelDetails.cjs.js");require("../../../../components/DetailsPanelDetails/DetailsSection.cjs.js");require("../../../../components/DetailsPanelDetails/FieldLabel.cjs.js");require("../../../../components/Watchers/Watchers.cjs.js");require("../../../../components/ProjectTableSettings/ProjectTableSettings.cjs.js");require("../../../../components/Powerpack/PowerpackButton.cjs.js");require("../../../../components/Powerpack/PricingLink.cjs.js");require("../../../../components/Powerpack/PowerpackDialog.styled.cjs.js");require("../../../../components/Powerpack/CTAButton.cjs.js");require("../../../../components/Powerpack/RequiredAddonVersion.cjs.js");require("../../../../components/SizeSlider/SizeSlider.cjs.js");require("../../../../components/SettingsPanel/SettingsPanel.cjs.js");require("../../../../components/SettingsPanel/SettingsPanelItemTemplate.cjs.js");require("../../../../components/AttributeEditor/components/MinMaxField.cjs.js");require("../../../../components/EnumEditor/EnumEditor.styled.cjs.js");require("../../../../components/SearchFilter/filterDates.cjs.js");require("../../../../components/FeaturedVersionOrder/FeaturedVersionOrder.cjs.js");require("../../../../components/Badge/Badge.cjs.js");require("../../../../components/VersionUploader/components/UploadVersionDialog.cjs.js");require("../../../../components/VersionUploader/context/VersionUploadContext.cjs.js");require("../../../../components/Feedback/FeedbackContext.cjs.js");require("../../../../components/Feedback/SupportBubble.cjs.js");require("../../../../components/Chips/Chips.cjs.js");require("../../../../components/StyledLink/StyledLink.cjs.js");require("../../../../components/ShareOptionIcon/ShareOptionIcon.cjs.js");require("../../../../components/AccessUser/AccessUser.cjs.js");require("../../../../../../node_modules/match-sorter/dist/match-sorter.esm.cjs.js");require("../../../../components/AccessSearchInput/AccessSearchInput.styled.cjs.js");require("../../../../components/TableGridSwitch/TableGridSwitch.cjs.js");require("../../../../components/SortingSetting/SortingSetting.styled.cjs.js");require("../../../../components/EarlyPreview/EarlyPreview.cjs.js");require("../../../../components/LegacyBadge/LegacyBadge.cjs.js");require("../../../../components/Menu/Menu.styled.cjs.js");require("../../../../components/Menu/MenuItem.cjs.js");const Fe=require("../../../../components/Menu/MenuContainer.cjs.js"),Ae=({activity:t={},onCheckChange:G,onDelete:x,onUpdate:O,projectInfo:be,editProps:$,projectName:o,entityType:H,onReferenceClick:D,onFileExpand:_,showOrigin:z,isHighlighted:L,readOnly:M,isSlideOut:Q,statuses:V=[]})=>{const{userName:y,createReaction:W,deleteReaction:J,editingId:K,setEditingId:p,categories:k,isGuest:g}=fe.useFeedContext(),F=m.useRef(null),{toggleMenuOpen:R,menuOpen:U}=ve.useMenuContext(),{categoryData:i,categoryNotFound:X}=m.useMemo(()=>{let e=!1;if(t.activityData?.category){const l=k.find(v=>v.name===t.activityData?.category);return l||(e=!0),{categoryData:l||{name:t.activityData?.category,color:"#c5c5c5"},categoryNotFound:e}}else return{categoryData:null,categoryNotFound:e}},[t?.activityData?.category,k]),q=De.useBlendedCategoryColor(i?.color);let{body:j,authorName:a,authorFullName:C,createdAt:Y,referenceType:Z,entityId:A,activityId:u,author:b,isOwner:c,files:f=[],origin:h}=t;a||(a=b?.name||""),C||(C=b?.fullName||a);const E=`activity-comment-menu-${u}-${Q?"slideout":"normal"}`,w=U===E,{onGoToFrame:I,setHighlightedActivities:ee}=Te.useDetailsPanelContext(),T=()=>{p(u)},re=()=>{p(null)},ie=async(e,l,v)=>{await O?.(e,l,void 0,v),p(null)},s=K===u,N=Z!=="origin"||z,ue=async()=>{const e=pe.getTextRefs(j);N&&h&&e.push({id:h.id,type:h.type}),x&&await x(u,A,e)},te=()=>{he.confirmDelete({title:"Delete comment",message:"Are you sure you want to delete this comment?",accept:async()=>{await ue()}})},[,P]=xe(),S=m.useMemo(()=>Re.mapGraphQLReactions(t.reactions,y),[[...t.reactions||[]]]),oe=e=>{e.isActive?W({projectName:o,userName:y,activityId:u,createReactionModel:{reaction:e.type}}):J({projectName:o,userName:y,activityId:u,reaction:e.type})},ne=m.useCallback(e=>{e.annotation&&(I?.(e.annotation.range[0]),ee([u]))},[I]);return r.jsxRuntimeExports.jsxs(r.jsxRuntimeExports.Fragment,{children:[r.jsxRuntimeExports.jsxs(n.Comment,{className:B("comment",{isOwner:c,isEditing:s,isHighlighted:L,category:!!i&&!g,menuOpen:w}),id:u,$categoryPrimary:i?.color,$categoryTertiary:q.primary,$categorySecondary:q.secondary,children:[r.jsxRuntimeExports.jsx(Ee,{name:a,fullName:C,date:Y,isRef:N,activity:t,projectName:o,entityType:H,onReferenceClick:D,onReferenceTooltip:P,children:void 0}),r.jsxRuntimeExports.jsxs(n.Body,{className:B("comment-body",{isEditing:s}),children:[!M&&r.jsxRuntimeExports.jsxs(n.Tools,{className:"tools",children:[c&&T&&r.jsxRuntimeExports.jsx(n.ToolButton,{icon:"edit_square",onClick:T,variant:"text"}),r.jsxRuntimeExports.jsx(n.ToolButton,{icon:"more_horiz",ref:F,onClick:e=>{e.stopPropagation(),R(E)},className:w?"active":""})]}),!s&&!g&&i&&r.jsxRuntimeExports.jsx(Me.CategoryTag,{value:i.name,color:i.color,style:{top:-4,left:-4},isCompact:!0,"data-tooltip":X?"Category not found. It may have been deleted.":void 0,"data-tooltip-delay":0}),s?r.jsxRuntimeExports.jsx(me.default,{initValue:j,initFiles:f,initCategory:i?.name,data:t.activityData,isEditing:!0,onClose:re,onSubmit:ie,isOpen:!0,...$}):r.jsxRuntimeExports.jsxs(r.jsxRuntimeExports.Fragment,{children:[r.jsxRuntimeExports.jsx(ge,{children:r.jsxRuntimeExports.jsx(qe,{remarkPlugins:[ae,se,ce,le],urlTransform:e=>e,components:{a:e=>d.aTag(e,{entityId:A,projectName:o,onReferenceClick:D,onReferenceTooltip:P,activityId:u,categoryPrimary:i?.color,categorySecondary:q.secondary}),input:e=>d.inputTag(e,{activity:t,onCheckChange:G}),code:e=>d.codeTag(e),blockquote:e=>d.blockquoteTag(e),tip:e=>r.jsxRuntimeExports.jsxs(n.Tip,{children:[r.jsxRuntimeExports.jsx(je.Icon,{icon:"info"}),e.children]}),status:e=>r.jsxRuntimeExports.jsx(Ce,{name:e.id,statuses:V,children:e.children})},children:j})}),r.jsxRuntimeExports.jsx(ye,{files:f,isCompact:f.length>6,activityId:u,projectName:o,isDownloadable:!0,onExpand:_,onAnnotationClick:ne,onRemove:void 0})]}),!s&&r.jsxRuntimeExports.jsx("div",{style:{marginTop:"16px"},children:S&&r.jsxRuntimeExports.jsx(de,{reactions:S,changeHandler:oe,readOnly:M,category:i&&!g?i.name:void 0,categoryPrimary:i?.color,categorySecondary:q.secondary,categoryTertiary:q.primary})})]})]}),r.jsxRuntimeExports.jsx(Fe.MenuContainer,{target:F.current,id:E,align:"right",onClose:e=>{e?.stopPropagation(),R(!1)},children:r.jsxRuntimeExports.jsx(ke,{onDelete:c&&x?te:void 0,onEdit:c&&T,activityId:u,onSelect:()=>R(!1),projectName:o})})]})};module.exports=Ae;
2
2
  //# sourceMappingURL=ActivityComment.cjs.js.map