@ynput/ayon-frontend-shared 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_virtual/index.cjs10.js +1 -1
- package/dist/_virtual/index.cjs11.js +1 -1
- package/dist/_virtual/index.cjs12.js +1 -1
- package/dist/_virtual/index.cjs4.js +1 -1
- package/dist/_virtual/index.cjs5.js +1 -1
- package/dist/_virtual/index.es10.js +3 -3
- package/dist/_virtual/index.es11.js +5 -5
- package/dist/_virtual/index.es12.js +5 -5
- package/dist/_virtual/index.es4.js +2 -5
- package/dist/_virtual/index.es4.js.map +1 -1
- package/dist/_virtual/index.es5.js +5 -2
- package/dist/_virtual/index.es5.js.map +1 -1
- package/dist/node_modules/rehype/node_modules/unified/lib/index.cjs.js +1 -1
- package/dist/node_modules/rehype/node_modules/unified/lib/index.es.js +2 -2
- package/dist/node_modules/rehype/node_modules/vfile/lib/index.cjs.js +1 -1
- package/dist/node_modules/rehype/node_modules/vfile/lib/index.es.js +1 -1
- package/dist/node_modules/rehype-parse/lib/index.cjs.js +1 -1
- package/dist/node_modules/rehype-parse/lib/index.es.js +1 -1
- package/dist/node_modules/remove-accents/index.cjs.js +1 -1
- package/dist/node_modules/remove-accents/index.es.js +1 -1
- package/dist/shared/node_modules/react-transition-group/esm/CSSTransition.cjs.js +1 -1
- package/dist/shared/node_modules/react-transition-group/esm/CSSTransition.es.js +1 -1
- package/dist/shared/node_modules/react-transition-group/esm/Transition.cjs.js +1 -1
- package/dist/shared/node_modules/react-transition-group/esm/Transition.es.js +1 -1
- package/dist/shared/node_modules/react-transition-group/esm/utils/PropTypes.cjs.js +1 -1
- package/dist/shared/node_modules/react-transition-group/esm/utils/PropTypes.es.js +1 -1
- package/dist/shared/src/api/queries/overview/getOverview.cjs.js +1 -1
- package/dist/shared/src/api/queries/overview/getOverview.cjs.js.map +1 -1
- package/dist/shared/src/api/queries/overview/getOverview.es.js +95 -95
- package/dist/shared/src/api/queries/overview/getOverview.es.js.map +1 -1
- package/dist/shared/src/components/RemotePage/RemotePageWrapper.cjs.js +1 -1
- package/dist/shared/src/components/RemotePage/RemotePageWrapper.cjs.js.map +1 -1
- package/dist/shared/src/components/RemotePage/RemotePageWrapper.es.js +14 -11
- package/dist/shared/src/components/RemotePage/RemotePageWrapper.es.js.map +1 -1
- package/dist/shared/src/components/SearchFilter/useBuildFilterOptions.cjs.js +1 -1
- package/dist/shared/src/components/SearchFilter/useBuildFilterOptions.cjs.js.map +1 -1
- package/dist/shared/src/components/SearchFilter/useBuildFilterOptions.es.js +42 -41
- package/dist/shared/src/components/SearchFilter/useBuildFilterOptions.es.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/DetailsPanel.cjs.js +1 -1
- package/dist/shared/src/containers/DetailsPanel/DetailsPanel.cjs.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/DetailsPanel.es.js +23 -23
- package/dist/shared/src/containers/DetailsPanel/DetailsPanel.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.es.js +65 -64
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.es.js +16 -16
- package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/context/ClipboardContext.cjs.js +3 -3
- package/dist/shared/src/containers/ProjectTreeTable/context/ClipboardContext.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/context/ClipboardContext.es.js +142 -146
- package/dist/shared/src/containers/ProjectTreeTable/context/ClipboardContext.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.es.js +24 -24
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useFetchOverviewData.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useFetchOverviewData.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useFetchOverviewData.es.js +141 -132
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useFetchOverviewData.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useQueryFilters.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useQueryFilters.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useQueryFilters.es.js +35 -28
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useQueryFilters.es.js.map +1 -1
- package/dist/shared/src/containers/Views/hooks/pages/useOverviewViewSettings.cjs.js.map +1 -1
- package/dist/shared/src/containers/Views/hooks/pages/useOverviewViewSettings.es.js.map +1 -1
- package/dist/shared/src/context/AddonContext.cjs.js.map +1 -1
- package/dist/shared/src/context/AddonContext.es.js.map +1 -1
- package/dist/shared/src/context/ProjectFoldersContext.cjs.js +1 -1
- package/dist/shared/src/context/ProjectFoldersContext.cjs.js.map +1 -1
- package/dist/shared/src/context/ProjectFoldersContext.es.js +62 -49
- package/dist/shared/src/context/ProjectFoldersContext.es.js.map +1 -1
- package/dist/types/api/queries/overview/getOverview.d.ts +1 -0
- package/dist/types/components/RemotePage/RemotePageWrapper.d.ts +1 -0
- package/dist/types/components/SearchFilter/useBuildFilterOptions.d.ts +1 -0
- package/dist/types/containers/ProjectTreeTable/hooks/useFetchOverviewData.d.ts +2 -1
- package/dist/types/containers/ProjectTreeTable/hooks/useQueryFilters.d.ts +4 -1
- package/dist/types/context/AddonContext.d.ts +1 -0
- package/dist/types/context/ProjectFoldersContext.d.ts +1 -0
- package/package.json +1 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("../../../../_virtual/jsx-runtime.cjs.js"),z=require("@ynput/ayon-react-components"),n=require("react"),he=require("./hooks/useDetailsPanelURLSync.cjs.js"),v=require("./DetailsPanel.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");const ge=require("../../api/queries/entities/getEntityPanel.cjs.js"),Te=require("../../api/queries/entities/transformDetailsPanelData.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("../../components/AddonLoadingScreen/AddonLoadingScreen.cjs.js");require("../../../../node_modules/match-sorter/dist/match-sorter.esm.cjs.js");require("../../components/AccessSearchInput/AccessSearchInput.styled.cjs.js");require("../../components/AccessUser/AccessUser.cjs.js");require("clsx");require("lodash");require("../../components/AttributeEditor/components/MinMaxField.cjs.js");require("react-dom");require("@dnd-kit/core");require("@dnd-kit/sortable");require("../../components/EnumEditor/EnumEditor.styled.cjs.js");require("../../components/Badge/Badge.cjs.js");require("../../components/Chips/Chips.cjs.js");require("react-toastify");require("../../components/DetailsPanelAttributes/DetailsPanelAttributesEditor.cjs.js");const De=require("../../components/DetailsPanelDetails/DetailsPanelDetails.cjs.js");require("../../components/DetailsPanelDetails/DetailsSection.cjs.js");require("../../components/DetailsPanelDetails/FieldLabel.cjs.js");require("../../components/EarlyPreview/EarlyPreview.cjs.js");require("../../components/EmptyPlaceholder/EmptyPlaceholder.cjs.js");require("../../components/EmptyPlaceholder/EmptyPlaceholderFlex.styled.cjs.js");require("../ContextMenu/ContextMenuContext.cjs.js");;/* empty css */require("../Feed/context/FeedContext.cjs.js");require("../Feed/components/Tooltips/UserTooltip/UserTooltip.styled.cjs.js");require("../Feed/components/Tooltips/EntityTooltip/EntityTooltip.styled.cjs.js");require("../../context/RemoteModulesContext.cjs.js");const b=require("../../context/DetailsPanelContext.cjs.js");require("../../context/ThumbnailUploaderContext.cjs.js");require("../../context/SettingsPanelContext.cjs.js");const Re=require("../../context/pip/PiPProvider.cjs.js");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");require("../../context/MenuContext.cjs.js");require("../../context/WebsocketContext.cjs.js");require("../../context/GlobalContext.cjs.js");const Ne=require("../../context/ProjectContext.cjs.js");require("../../context/ProjectFoldersContext.cjs.js");const ve=require("../../context/UriContext.cjs.js");require("../Feed/components/FileUploadPreview/FileUploadPreview.styled.cjs.js");require("../Feed/components/FileUploadPreview/Mimes/TextMime.cjs.js");require("react-markdown");require("remark-emoji");require("remark-gfm");require("remark-directive");require("remark-directive-rehype");require("../Feed/components/CommentInput/CommentInput.cjs.js");require("../Feed/components/ReactionContainer/Reactions.styled.cjs.js");require("../Feed/components/FilesGrid/FilesGrid.styled.cjs.js");require("../Feed/components/FileUploadCard/FileUploadCard.styled.cjs.js");require("../Feed/components/CommentInput/quillToMarkdown.cjs.js");require("../Feed/components/ActivityComment/ActivityComment.styled.cjs.js");require("../Feed/components/ActivityCheckbox/ActivityCheckbox.styled.cjs.js");require("../Feed/components/ActivityReference/ActivityReference.styled.cjs.js");require("uuid");const be=require("../../util/extractEntityHierarchyFromParents.cjs.js");require("../../util/pubsub.cjs.js");require("react-router-dom");require("../Feed/components/ActivityStatus/ActivityStatus.cjs.js");require("../Feed/components/ActivityHeader/ActivityHeader.styled.cjs.js");require("../Feed/components/ActivityDate.cjs.js");require("../Feed/components/ActivityCategorySelect/CategoryTag.cjs.js");require("../Feed/components/ActivityStatusChange/ActivityStatusChange.styled.cjs.js");require("../Feed/components/ActivityAssigneeChange/ActivityAssigneeChange.styled.cjs.js");require("../Feed/components/ActivityVersions/ActivityVersions.styled.cjs.js");require("../Feed/components/ActivityGroup/ActivityGroup.styled.cjs.js");require("../Feed/Feed.styled.cjs.js");require("date-fns");require("../Feed/components/ActivityCategorySelect/ActivityCategorySelect.cjs.js");require("../Feed/components/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("../SimpleTable/SimpleTable.styled.cjs.js");require("@tanstack/match-sorter-utils");require("../SimpleTable/context/SimpleTableContext.cjs.js");require("../SimpleTable/SimpleTableRowTemplate.cjs.js");require("../Slicer/hooks/useTableDataBySlice.cjs.js");require("../Slicer/components/SlicerSearch.cjs.js");require("../Slicer/context/SlicerContext.cjs.js");const Ce=require("./DetailsPanelHeader/DetailsPanelHeader.cjs.js"),we=require("./DetailsPanelFiles/DetailsPanelFiles.cjs.js"),Fe=require("./hooks/useGetEntityPath.cjs.js"),Se=require("./helpers/getAllProjectsStatuses.cjs.js"),ke=require("./FeedWrapper.cjs.js"),Le=require("./FeedContextWrapper.cjs.js"),We=require("./helpers/mergeProjectInfo.cjs.js");require("./DetailsPanelHeader/DetailsPanelHeader.styled.cjs.js");require("./DetailsPanelSlideOut/DetailsPanelSlideOut.styled.cjs.js");require("./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("axios");require("../../components/ReviewablesList/ReviewablesList.styled.cjs.js");require("../../components/ReviewablesList/ReviewablesUpload.styled.cjs.js");const Ie=require("../../components/EntityPath/EntityPath.cjs.js");require("../../components/FeaturedVersionOrder/FeaturedVersionOrder.cjs.js");require("../../components/Feedback/FeedbackContext.cjs.js");require("../../components/Feedback/SupportBubble.cjs.js");require("../../components/FileThumbnail/FileThumbnail.cjs.js");require("../../components/LegacyBadge/LegacyBadge.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/ProjectTableSettings/ProjectTableSettings.cjs.js");require("../../components/SizeSlider/SizeSlider.cjs.js");require("../../components/ReviewableCard/ReviewableCard.cjs.js");require("../../components/ReviewableProgressCard/ReviewableProgressCard.styled.cjs.js");require("../../components/SearchFilter/filterDates.cjs.js");require("../../components/SettingsPanel/SettingsPanel.cjs.js");require("../../components/SettingsPanel/SettingsPanelItemTemplate.cjs.js");require("../../components/ShareOptionIcon/ShareOptionIcon.cjs.js");require("../../components/SimpleFormDialog/SimpleFormDialog.cjs.js");require("../../components/SortingSetting/SortingSetting.styled.cjs.js");require("../../components/StyledLink/StyledLink.cjs.js");require("../../components/TableGridSwitch/TableGridSwitch.cjs.js");require("../../components/Thumbnail/Thumbnail.styled.cjs.js");require("../../components/Thumbnail/StackedThumbnails.cjs.js");require("../../components/ThumbnailSimple/ThumbnailSimple.cjs.js");require("../../components/VersionUploader/components/UploadVersionDialog.cjs.js");require("../../components/VersionUploader/context/VersionUploadContext.cjs.js");const Ue=require("../../components/Watchers/Watchers.cjs.js");require("../../components/Menu/Menu.styled.cjs.js");require("../../components/Menu/MenuItem.cjs.js");const J=["product","representation"],He=({entityType:h,entitySubTypes:x=[],entitiesData:g=[],entities:q=[],tagsOptions:Y=[],disabledStatuses:Z,projectUsers:C,disabledProjectUsers:$,activeProjectUsers:w,projectsInfo:E={},projectNames:ee=[],isSlideOut:d=!1,style:_e={},scope:o,isCompact:re=!1,onClose:T,onWatchersUpdate:F,onOpenViewer:ie,onEntityFocus:te,onOpen:S,onUriOpen:k,annotations:L,removeAnnotation:W,exportAnnotationComposite:I,entityListId:U,guestCategories:ue={}})=>{const{closeSlideOut:H,openPip:se,user:O,isGuest:ne,entities:u,setEntities:D,slideOut:_,useSearchParams:qe}=b.useDetailsPanelContext(),{currentTab:a,setTab:m,isFeed:ae}=b.useScopedDetailsPanel(o),[Ae,oe]=qe(),A=n.useRef(!1),i=u?.entityType??h,G=u?.entities??q,ce=u?.entitySubTypes??x,le=u?.entities?[]:g,c=u?.entities?u.entities.map(e=>e.projectName):ee;n.useEffect(()=>{S&&!A.current&&(A.current=!0,S())},[]),n.useEffect(()=>{J.includes(i)&&a!=="details"&&m("details")},[i,a,m]),n.useEffect(()=>{q.length&&u&&D(null)},[q,u,D]);const j=n.useMemo(()=>We(E,c),[E,c]),M=n.useMemo(()=>({task:j.taskTypes.filter(e=>!!e.icon).reduce((e,r)=>({...e,[r.name]:r.icon}),{}),folder:j.folderTypes.filter(e=>!!e.icon).reduce((e,r)=>({...e,[r.name]:r.icon}),{}),product:j.productTypes.filter(e=>!!e.icon).reduce((e,r)=>({...e,[r.name]:r.icon}),{})}),[j]);n.useEffect(()=>{a==="files"&&i!=="version"&&m("activity")},[i,a,o]);let l=G.length?G.map(e=>({id:e.id,projectName:e.projectName})):le.map(e=>({id:e.id,projectName:e.projectName}));l=l.filter(e=>e.id);const{data:s=[],isFetching:p,isError:pe,originalArgs:de}=ge.useGetEntitiesDetailsPanelQuery({entityType:i,entities:l},{skip:!l.length||!Te.detailsPanelEntityTypes.includes(i)});n.useEffect(()=>{d||H()},[de,d]),n.useEffect(()=>{if(!p&&u?.source&&["uri","url"].includes(u.source)&&u?.entities?.length&&k){const e=s.find(r=>r.id===u.entities[0].id);if(!e)return;k(e)}},[s,p]);const V=Se(E),y=c[0],B=E[y]||{},ye=s[0]||{},P=s[s.length-1],R=c[c.length-1],[Q,me]=Fe({entity:ye,entityType:i,projectName:y,isLoading:p}),{setEntityUri:fe,setUri:xe}=ve.useURIContext();n.useEffect(()=>{if(!P?.parents||!R)return;const{folderPath:e,taskName:r,versionName:f,productName:X}=be.extractEntityHierarchyFromParents(P.parents,i,P.name);return fe({projectName:R,folderPath:e,taskName:r,productName:X,versionName:f}),()=>{xe("")}},[s,c,i]),he({entityData:P,project:R,activeEntityType:i,entitiesToQuery:l});const Ee=()=>{oe(e=>{const r=new URLSearchParams(e);return r.delete("project"),r.delete("type"),r.delete("id"),r},{replace:!0})},N=()=>{T?.(),D(null),Ee(),H()};n.useEffect(()=>{const e=r=>{if(r.key==="Escape"&&T){const f=r.target;if(["INPUT","TEXTAREA","SELECT"].includes(f.tagName)||f.isContentEditable||d===!1&&(f.closest("#viewer-dialog")||_))return;N()}};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[N,d,_]);const{requestPipWindow:je}=Re.usePiPWindow(),Pe=()=>{se({entityType:i,entities:l,scope:o}),je(500,500)},K=()=>!(c.length>1||ne&&(!U||!Object.prototype.hasOwnProperty.call(ue,O.attrib?.email||"")));return t.jsxRuntimeExports.jsx(t.jsxRuntimeExports.Fragment,{children:t.jsxRuntimeExports.jsxs(v.Panel,{className:"details-panel",children:[t.jsxRuntimeExports.jsxs(v.Toolbar,{children:[t.jsxRuntimeExports.jsx(Ie.EntityPath,{segments:Q,versions:me,projectName:y,hideProjectName:d,isLoading:p||!Q.length,entityType:i,scope:o,entityTypeIcons:M}),t.jsxRuntimeExports.jsxs(v.RightTools,{className:"right-tools",children:[t.jsxRuntimeExports.jsx(Ue.Watchers,{entities:l,entityType:i,options:C||[],onWatchersUpdate:F&&F,userName:O.name}),t.jsxRuntimeExports.jsx(z.Button,{icon:"picture_in_picture",variant:"text","data-tooltip":"Picture in Picture",onClick:Pe}),(T||q)&&t.jsxRuntimeExports.jsx(z.Button,{icon:"close",variant:"text",onClick:N,"data-shortcut":"Escape"})]})]}),t.jsxRuntimeExports.jsx(Ce,{entityType:i,entitySubTypes:ce,entities:s,users:C,disabledAssignees:$,disabledStatuses:Z,tagsOptions:Y,isFetching:p,isCompact:re,currentTab:a,onTabChange:m,entityTypeIcons:M,onOpenViewer:e=>ie?.(e),onEntityFocus:te}),t.jsxRuntimeExports.jsxs(Ne.ProjectContextProvider,{projectName:y,children:[ae&&!pe&&t.jsxRuntimeExports.jsx(ke,{entityType:i,entities:s,activeUsers:w||[],projectInfo:B,projectName:y,disabled:!K(),scope:o,statuses:V,readOnly:!1,entityListId:U,annotations:L,removeAnnotation:W,exportAnnotationComposite:I,currentTab:a,setCurrentTab:m,isSlideOut:d}),a==="files"&&t.jsxRuntimeExports.jsx(we,{entities:s,scope:o,isLoadingVersion:p}),a==="details"&&t.jsxRuntimeExports.jsx(Le,{entityType:i,entities:s,activeUsers:w||[],projectInfo:B,projectName:y,disabled:!K(),scope:o,statuses:V,readOnly:!1,annotations:L,removeAnnotation:W,exportAnnotationComposite:I,children:t.jsxRuntimeExports.jsx(De.DetailsPanelDetails,{entities:s,isLoading:p})})]})]})})},Oe=({isOpen:h,entityType:x,...g})=>{const{entities:q}=b.useDetailsPanelContext();return!h&&!q||!x&&!q?null:t.jsxRuntimeExports.jsx(He,{...g,entityType:x||q?.entityType})};exports.DetailsPanel=Oe;exports.entitiesWithoutFeed=J;
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("../../../../_virtual/jsx-runtime.cjs.js"),z=require("@ynput/ayon-react-components"),n=require("react"),he=require("./hooks/useDetailsPanelURLSync.cjs.js"),v=require("./DetailsPanel.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");const ge=require("../../api/queries/entities/getEntityPanel.cjs.js"),Te=require("../../api/queries/entities/transformDetailsPanelData.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("../../components/AddonLoadingScreen/AddonLoadingScreen.cjs.js");require("../../../../node_modules/match-sorter/dist/match-sorter.esm.cjs.js");require("../../components/AccessSearchInput/AccessSearchInput.styled.cjs.js");require("../../components/AccessUser/AccessUser.cjs.js");require("clsx");require("lodash");require("../../components/AttributeEditor/components/MinMaxField.cjs.js");require("react-dom");require("@dnd-kit/core");require("@dnd-kit/sortable");require("../../components/EnumEditor/EnumEditor.styled.cjs.js");require("../../components/Badge/Badge.cjs.js");require("../../components/Chips/Chips.cjs.js");require("react-toastify");require("../../components/DetailsPanelAttributes/DetailsPanelAttributesEditor.cjs.js");const De=require("../../components/DetailsPanelDetails/DetailsPanelDetails.cjs.js");require("../../components/DetailsPanelDetails/DetailsSection.cjs.js");require("../../components/DetailsPanelDetails/FieldLabel.cjs.js");require("../../components/EarlyPreview/EarlyPreview.cjs.js");require("../../components/EmptyPlaceholder/EmptyPlaceholder.cjs.js");require("../../components/EmptyPlaceholder/EmptyPlaceholderFlex.styled.cjs.js");require("../ContextMenu/ContextMenuContext.cjs.js");;/* empty css */require("../Feed/context/FeedContext.cjs.js");require("../Feed/components/Tooltips/UserTooltip/UserTooltip.styled.cjs.js");require("../Feed/components/Tooltips/EntityTooltip/EntityTooltip.styled.cjs.js");require("../../context/RemoteModulesContext.cjs.js");const b=require("../../context/DetailsPanelContext.cjs.js");require("../../context/ThumbnailUploaderContext.cjs.js");require("../../context/SettingsPanelContext.cjs.js");const Re=require("../../context/pip/PiPProvider.cjs.js");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");require("../../context/MenuContext.cjs.js");require("../../context/WebsocketContext.cjs.js");require("../../context/GlobalContext.cjs.js");const Ne=require("../../context/ProjectContext.cjs.js");require("../../context/ProjectFoldersContext.cjs.js");const ve=require("../../context/UriContext.cjs.js");require("../Feed/components/FileUploadPreview/FileUploadPreview.styled.cjs.js");require("../Feed/components/FileUploadPreview/Mimes/TextMime.cjs.js");require("react-markdown");require("remark-emoji");require("remark-gfm");require("remark-directive");require("remark-directive-rehype");require("../Feed/components/CommentInput/CommentInput.cjs.js");require("../Feed/components/ReactionContainer/Reactions.styled.cjs.js");require("../Feed/components/FilesGrid/FilesGrid.styled.cjs.js");require("../Feed/components/FileUploadCard/FileUploadCard.styled.cjs.js");require("../Feed/components/CommentInput/quillToMarkdown.cjs.js");require("../Feed/components/ActivityComment/ActivityComment.styled.cjs.js");require("../Feed/components/ActivityCheckbox/ActivityCheckbox.styled.cjs.js");require("../Feed/components/ActivityReference/ActivityReference.styled.cjs.js");require("uuid");const be=require("../../util/extractEntityHierarchyFromParents.cjs.js");require("../../util/pubsub.cjs.js");require("react-router-dom");require("../Feed/components/ActivityStatus/ActivityStatus.cjs.js");require("../Feed/components/ActivityHeader/ActivityHeader.styled.cjs.js");require("../Feed/components/ActivityDate.cjs.js");require("../Feed/components/ActivityCategorySelect/CategoryTag.cjs.js");require("../Feed/components/ActivityStatusChange/ActivityStatusChange.styled.cjs.js");require("../Feed/components/ActivityAssigneeChange/ActivityAssigneeChange.styled.cjs.js");require("../Feed/components/ActivityVersions/ActivityVersions.styled.cjs.js");require("../Feed/components/ActivityGroup/ActivityGroup.styled.cjs.js");require("../Feed/Feed.styled.cjs.js");require("date-fns");require("../Feed/components/ActivityCategorySelect/ActivityCategorySelect.cjs.js");require("../Feed/components/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("../SimpleTable/SimpleTable.styled.cjs.js");require("@tanstack/match-sorter-utils");require("../SimpleTable/context/SimpleTableContext.cjs.js");require("../SimpleTable/SimpleTableRowTemplate.cjs.js");require("../Slicer/hooks/useTableDataBySlice.cjs.js");require("../Slicer/components/SlicerSearch.cjs.js");require("../Slicer/context/SlicerContext.cjs.js");const Ce=require("./DetailsPanelHeader/DetailsPanelHeader.cjs.js"),we=require("./DetailsPanelFiles/DetailsPanelFiles.cjs.js"),Fe=require("./hooks/useGetEntityPath.cjs.js"),Se=require("./helpers/getAllProjectsStatuses.cjs.js"),ke=require("./FeedWrapper.cjs.js"),Le=require("./FeedContextWrapper.cjs.js"),We=require("./helpers/mergeProjectInfo.cjs.js");require("./DetailsPanelHeader/DetailsPanelHeader.styled.cjs.js");require("./DetailsPanelSlideOut/DetailsPanelSlideOut.styled.cjs.js");require("./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("axios");require("../../components/ReviewablesList/ReviewablesList.styled.cjs.js");require("../../components/ReviewablesList/ReviewablesUpload.styled.cjs.js");const Ie=require("../../components/EntityPath/EntityPath.cjs.js");require("../../components/FeaturedVersionOrder/FeaturedVersionOrder.cjs.js");require("../../components/Feedback/FeedbackContext.cjs.js");require("../../components/Feedback/SupportBubble.cjs.js");require("../../components/FileThumbnail/FileThumbnail.cjs.js");require("../../components/LegacyBadge/LegacyBadge.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/ProjectTableSettings/ProjectTableSettings.cjs.js");require("../../components/SizeSlider/SizeSlider.cjs.js");require("../../components/ReviewableCard/ReviewableCard.cjs.js");require("../../components/ReviewableProgressCard/ReviewableProgressCard.styled.cjs.js");require("../../components/SearchFilter/filterDates.cjs.js");require("../../components/SettingsPanel/SettingsPanel.cjs.js");require("../../components/SettingsPanel/SettingsPanelItemTemplate.cjs.js");require("../../components/ShareOptionIcon/ShareOptionIcon.cjs.js");require("../../components/SimpleFormDialog/SimpleFormDialog.cjs.js");require("../../components/SortingSetting/SortingSetting.styled.cjs.js");require("../../components/StyledLink/StyledLink.cjs.js");require("../../components/TableGridSwitch/TableGridSwitch.cjs.js");require("../../components/Thumbnail/Thumbnail.styled.cjs.js");require("../../components/Thumbnail/StackedThumbnails.cjs.js");require("../../components/ThumbnailSimple/ThumbnailSimple.cjs.js");require("../../components/VersionUploader/components/UploadVersionDialog.cjs.js");require("../../components/VersionUploader/context/VersionUploadContext.cjs.js");const Ue=require("../../components/Watchers/Watchers.cjs.js");require("../../components/Menu/Menu.styled.cjs.js");require("../../components/Menu/MenuItem.cjs.js");const J=["product","representation"],He=({entityType:h,entitySubTypes:x=[],entitiesData:g=[],entities:a=[],tagsOptions:Y=[],disabledStatuses:Z,projectUsers:C,disabledProjectUsers:$,activeProjectUsers:w,projectsInfo:E={},projectNames:ee=[],isSlideOut:d=!1,style:_e={},scope:o,isCompact:re=!1,onClose:T,onWatchersUpdate:F,onOpenViewer:ie,onEntityFocus:te,onOpen:S,onUriOpen:k,annotations:L,removeAnnotation:W,exportAnnotationComposite:I,entityListId:U,guestCategories:ue={}})=>{const{closeSlideOut:H,openPip:se,user:O,isGuest:ne,entities:u,setEntities:D,slideOut:_,useSearchParams:qe}=b.useDetailsPanelContext(),{currentTab:q,setTab:m,isFeed:ae}=b.useScopedDetailsPanel(o),[Ae,oe]=qe(),A=n.useRef(!1),i=u?.entityType??h,G=u?.entities??a,ce=u?.entitySubTypes??x,le=u?.entities?[]:g,c=u?.entities?u.entities.map(e=>e.projectName):ee;n.useEffect(()=>{S&&!A.current&&(A.current=!0,S())},[]),n.useEffect(()=>{J.includes(i)&&q!=="details"&&m("details")},[i,q,m]),n.useEffect(()=>{a.length&&u&&D(null)},[a,u,D]);const j=n.useMemo(()=>We(E,c),[E,c]),M=n.useMemo(()=>({task:j.taskTypes.filter(e=>!!e.icon).reduce((e,r)=>({...e,[r.name]:r.icon}),{}),folder:j.folderTypes.filter(e=>!!e.icon).reduce((e,r)=>({...e,[r.name]:r.icon}),{}),product:j.productTypes.filter(e=>!!e.icon).reduce((e,r)=>({...e,[r.name]:r.icon}),{})}),[j]);n.useEffect(()=>{q==="files"&&i!=="version"&&m("activity")},[i,q,o]);let l=G.length?G.map(e=>({id:e.id,projectName:e.projectName})):le.map(e=>({id:e.id,projectName:e.projectName}));l=l.filter(e=>e.id);const{data:s=[],isFetching:p,isError:pe,originalArgs:de}=ge.useGetEntitiesDetailsPanelQuery({entityType:i,entities:l},{skip:!l.length||!Te.detailsPanelEntityTypes.includes(i)});n.useEffect(()=>{d||H()},[de,d]),n.useEffect(()=>{if(!p&&u?.source&&["uri","url"].includes(u.source)&&u?.entities?.length&&k){const e=s.find(r=>r.id===u.entities[0].id);if(!e)return;k(e)}},[s,p]);const V=Se(E),y=c[0],B=E[y]||{},ye=s[0]||{},P=s[s.length-1],R=c[c.length-1],[Q,me]=Fe({entity:ye,entityType:i,projectName:y,isLoading:p}),{setEntityUri:fe,setUri:xe}=ve.useURIContext();n.useEffect(()=>{if(!P?.parents||!R)return;const{folderPath:e,taskName:r,versionName:f,productName:X}=be.extractEntityHierarchyFromParents(P.parents,i,P.name);return fe({projectName:R,folderPath:e,taskName:r,productName:X,versionName:f}),()=>{xe("")}},[s,c,i]),he({entityData:P,project:R,activeEntityType:i,entitiesToQuery:l});const Ee=()=>{oe(e=>{const r=new URLSearchParams(e);return r.delete("project"),r.delete("type"),r.delete("id"),r},{replace:!0})},N=()=>{T?.(),D(null),Ee(),H()};n.useEffect(()=>{const e=r=>{if(r.key==="Escape"&&T){const f=r.target;if(["INPUT","TEXTAREA","SELECT"].includes(f.tagName)||f.isContentEditable||d===!1&&(f.closest("#viewer-dialog")||_))return;N()}};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[N,d,_]);const{requestPipWindow:je}=Re.usePiPWindow(),Pe=()=>{se({entityType:i,entities:l,scope:o}),je(500,500)},K=()=>!(c.length>1||ne&&(!U||!Object.prototype.hasOwnProperty.call(ue,O.attrib?.email||"")));return t.jsxRuntimeExports.jsx(t.jsxRuntimeExports.Fragment,{children:t.jsxRuntimeExports.jsxs(v.Panel,{className:"details-panel",children:[t.jsxRuntimeExports.jsxs(v.Toolbar,{children:[t.jsxRuntimeExports.jsx(Ie.EntityPath,{segments:Q,versions:me,projectName:y,hideProjectName:d,isLoading:p||!Q.length,entityType:i,scope:o,entityTypeIcons:M}),t.jsxRuntimeExports.jsxs(v.RightTools,{className:"right-tools",children:[t.jsxRuntimeExports.jsx(Ue.Watchers,{entities:l,entityType:i,options:C||[],onWatchersUpdate:F&&F,userName:O.name}),t.jsxRuntimeExports.jsx(z.Button,{icon:"picture_in_picture",variant:"text","data-tooltip":"Picture in Picture",onClick:Pe}),T&&t.jsxRuntimeExports.jsx(z.Button,{icon:"close",variant:"text",onClick:N,"data-shortcut":"Escape"})]})]}),t.jsxRuntimeExports.jsx(Ce,{entityType:i,entitySubTypes:ce,entities:s,users:C,disabledAssignees:$,disabledStatuses:Z,tagsOptions:Y,isFetching:p,isCompact:re,currentTab:q,onTabChange:m,entityTypeIcons:M,onOpenViewer:e=>ie?.(e),onEntityFocus:te}),t.jsxRuntimeExports.jsxs(Ne.ProjectContextProvider,{projectName:y,children:[ae&&!pe&&t.jsxRuntimeExports.jsx(ke,{entityType:i,entities:s,activeUsers:w||[],projectInfo:B,projectName:y,disabled:!K(),scope:o,statuses:V,readOnly:!1,entityListId:U,annotations:L,removeAnnotation:W,exportAnnotationComposite:I,currentTab:q,setCurrentTab:m,isSlideOut:d}),q==="files"&&t.jsxRuntimeExports.jsx(we,{entities:s,scope:o,isLoadingVersion:p}),q==="details"&&t.jsxRuntimeExports.jsx(Le,{entityType:i,entities:s,activeUsers:w||[],projectInfo:B,projectName:y,disabled:!K(),scope:o,statuses:V,readOnly:!1,annotations:L,removeAnnotation:W,exportAnnotationComposite:I,children:t.jsxRuntimeExports.jsx(De.DetailsPanelDetails,{entities:s,isLoading:p})})]})]})})},Oe=({isOpen:h,entityType:x,...g})=>{const{entities:a}=b.useDetailsPanelContext();return!h&&!a||!x&&!a?null:t.jsxRuntimeExports.jsx(He,{...g,entityType:x||a?.entityType})};exports.DetailsPanel=Oe;exports.entitiesWithoutFeed=J;
|
|
2
2
|
//# sourceMappingURL=DetailsPanel.cjs.js.map
|
|
@@ -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 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
|
+
{"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) && (\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,6 +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 Et, useEffect as
|
|
3
|
+
import { useRef as Et, useEffect as n, useMemo as X } from "react";
|
|
4
4
|
import Tt from "./hooks/useDetailsPanelURLSync.es.js";
|
|
5
5
|
import { Panel as xt, Toolbar as Nt, RightTools as Dt } from "./DetailsPanel.styled.es.js";
|
|
6
6
|
import "../../api/base/client.es.js";
|
|
@@ -264,7 +264,7 @@ const _t = ["product", "representation"], Qt = ({
|
|
|
264
264
|
// entities is data we already have from kanban
|
|
265
265
|
entitiesData: x = [],
|
|
266
266
|
// entityIds are used to get the full details data for the entities
|
|
267
|
-
entities:
|
|
267
|
+
entities: s = [],
|
|
268
268
|
tagsOptions: J = [],
|
|
269
269
|
disabledStatuses: Y,
|
|
270
270
|
projectUsers: w,
|
|
@@ -299,14 +299,14 @@ const _t = ["product", "representation"], Qt = ({
|
|
|
299
299
|
setEntities: D,
|
|
300
300
|
slideOut: A,
|
|
301
301
|
useSearchParams: pt
|
|
302
|
-
} = z(), { currentTab:
|
|
303
|
-
|
|
302
|
+
} = z(), { currentTab: p, setTab: y, isFeed: nt } = Ct(a), [Bt, st] = pt(), G = Et(!1), r = e?.entityType ?? T, O = e?.entities ?? s, at = e?.entitySubTypes ?? P, ct = e?.entities ? [] : x, c = e?.entities ? e.entities.map((t) => t.projectName) : $;
|
|
303
|
+
n(() => {
|
|
304
304
|
S && !G.current && (G.current = !0, S());
|
|
305
|
-
}, []),
|
|
306
|
-
_t.includes(r) &&
|
|
307
|
-
}, [r,
|
|
308
|
-
|
|
309
|
-
}, [
|
|
305
|
+
}, []), n(() => {
|
|
306
|
+
_t.includes(r) && p !== "details" && y("details");
|
|
307
|
+
}, [r, p, y]), n(() => {
|
|
308
|
+
s.length && e && D(null);
|
|
309
|
+
}, [s, e, D]);
|
|
310
310
|
const g = X(
|
|
311
311
|
() => Gt(j, c),
|
|
312
312
|
[j, c]
|
|
@@ -318,9 +318,9 @@ const _t = ["product", "representation"], Qt = ({
|
|
|
318
318
|
}),
|
|
319
319
|
[g]
|
|
320
320
|
);
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
}, [r,
|
|
321
|
+
n(() => {
|
|
322
|
+
p === "files" && r !== "version" && y("activity");
|
|
323
|
+
}, [r, p, a]);
|
|
324
324
|
let l = O.length ? O.map((t) => ({ id: t.id, projectName: t.projectName })) : (
|
|
325
325
|
// @ts-expect-error = not sure what's going on with activeEntitiesData, we should try and remove it
|
|
326
326
|
ct.map((t) => ({ id: t.id, projectName: t.projectName }))
|
|
@@ -337,9 +337,9 @@ const _t = ["product", "representation"], Qt = ({
|
|
|
337
337
|
skip: !l.length || !bt.includes(r)
|
|
338
338
|
}
|
|
339
339
|
);
|
|
340
|
-
|
|
340
|
+
n(() => {
|
|
341
341
|
d || W();
|
|
342
|
-
}, [ut, d]),
|
|
342
|
+
}, [ut, d]), n(() => {
|
|
343
343
|
if (!u && e?.source && ["uri", "url"].includes(e.source) && e?.entities?.length && k) {
|
|
344
344
|
const t = m.find(
|
|
345
345
|
(i) => i.id === e.entities[0].id
|
|
@@ -354,7 +354,7 @@ const _t = ["product", "representation"], Qt = ({
|
|
|
354
354
|
projectName: f,
|
|
355
355
|
isLoading: u
|
|
356
356
|
}), { setEntityUri: yt, setUri: ht } = kt();
|
|
357
|
-
|
|
357
|
+
n(() => {
|
|
358
358
|
if (!E?.parents || !v) return;
|
|
359
359
|
const { folderPath: t, taskName: i, versionName: h, productName: K } = Lt(
|
|
360
360
|
E.parents,
|
|
@@ -387,7 +387,7 @@ const _t = ["product", "representation"], Qt = ({
|
|
|
387
387
|
}, b = () => {
|
|
388
388
|
N?.(), D(null), Pt(), W();
|
|
389
389
|
};
|
|
390
|
-
|
|
390
|
+
n(() => {
|
|
391
391
|
const t = (i) => {
|
|
392
392
|
if (i.key === "Escape" && N) {
|
|
393
393
|
const h = i.target;
|
|
@@ -442,7 +442,7 @@ const _t = ["product", "representation"], Qt = ({
|
|
|
442
442
|
onClick: gt
|
|
443
443
|
}
|
|
444
444
|
),
|
|
445
|
-
|
|
445
|
+
N && /* @__PURE__ */ o.jsx(
|
|
446
446
|
M,
|
|
447
447
|
{
|
|
448
448
|
icon: "close",
|
|
@@ -465,7 +465,7 @@ const _t = ["product", "representation"], Qt = ({
|
|
|
465
465
|
tagsOptions: J,
|
|
466
466
|
isFetching: u,
|
|
467
467
|
isCompact: tt,
|
|
468
|
-
currentTab:
|
|
468
|
+
currentTab: p,
|
|
469
469
|
onTabChange: y,
|
|
470
470
|
entityTypeIcons: V,
|
|
471
471
|
onOpenViewer: (t) => it?.(t),
|
|
@@ -489,12 +489,12 @@ const _t = ["product", "representation"], Qt = ({
|
|
|
489
489
|
annotations: L,
|
|
490
490
|
removeAnnotation: I,
|
|
491
491
|
exportAnnotationComposite: R,
|
|
492
|
-
currentTab:
|
|
492
|
+
currentTab: p,
|
|
493
493
|
setCurrentTab: y,
|
|
494
494
|
isSlideOut: d
|
|
495
495
|
}
|
|
496
496
|
),
|
|
497
|
-
|
|
497
|
+
p === "files" && /* @__PURE__ */ o.jsx(
|
|
498
498
|
Rt,
|
|
499
499
|
{
|
|
500
500
|
entities: m,
|
|
@@ -502,7 +502,7 @@ const _t = ["product", "representation"], Qt = ({
|
|
|
502
502
|
isLoadingVersion: u
|
|
503
503
|
}
|
|
504
504
|
),
|
|
505
|
-
|
|
505
|
+
p === "details" && /* @__PURE__ */ o.jsx(
|
|
506
506
|
At,
|
|
507
507
|
{
|
|
508
508
|
entityType: r,
|
|
@@ -533,8 +533,8 @@ const _t = ["product", "representation"], Qt = ({
|
|
|
533
533
|
entityType: P,
|
|
534
534
|
...x
|
|
535
535
|
}) => {
|
|
536
|
-
const { entities:
|
|
537
|
-
return !T && !
|
|
536
|
+
const { entities: s } = z();
|
|
537
|
+
return !T && !s || !P && !s ? null : /* @__PURE__ */ o.jsx(Qt, { ...x, entityType: P || s?.entityType });
|
|
538
538
|
};
|
|
539
539
|
export {
|
|
540
540
|
Hm as DetailsPanel,
|
|
@@ -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 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
|
+
{"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) && (\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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"}
|