@ynput/ayon-frontend-shared 0.3.49 → 0.3.51

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/dist/Slicer.cjs.js +1 -1
  2. package/dist/Slicer.es.js +13 -11
  3. package/dist/Slicer.es.js.map +1 -1
  4. package/dist/_virtual/index.cjs10.js +1 -1
  5. package/dist/_virtual/index.cjs11.js +1 -1
  6. package/dist/_virtual/index.cjs12.js +1 -1
  7. package/dist/_virtual/index.cjs5.js +1 -1
  8. package/dist/_virtual/index.cjs6.js +1 -1
  9. package/dist/_virtual/index.es10.js +3 -3
  10. package/dist/_virtual/index.es11.js +5 -5
  11. package/dist/_virtual/index.es12.js +5 -5
  12. package/dist/_virtual/index.es5.js +5 -2
  13. package/dist/_virtual/index.es5.js.map +1 -1
  14. package/dist/_virtual/index.es6.js +2 -5
  15. package/dist/_virtual/index.es6.js.map +1 -1
  16. package/dist/components.cjs.js +1 -1
  17. package/dist/components.es.js +112 -109
  18. package/dist/components.es.js.map +1 -1
  19. package/dist/node_modules/rehype/node_modules/unified/lib/index.cjs.js +1 -1
  20. package/dist/node_modules/rehype/node_modules/unified/lib/index.es.js +2 -2
  21. package/dist/node_modules/rehype/node_modules/vfile/lib/index.cjs.js +1 -1
  22. package/dist/node_modules/rehype/node_modules/vfile/lib/index.es.js +1 -1
  23. package/dist/node_modules/rehype-parse/lib/index.cjs.js +1 -1
  24. package/dist/node_modules/rehype-parse/lib/index.es.js +1 -1
  25. package/dist/node_modules/remove-accents/index.cjs.js +1 -1
  26. package/dist/node_modules/remove-accents/index.es.js +1 -1
  27. package/dist/shared/node_modules/react-transition-group/esm/CSSTransition.cjs.js +1 -1
  28. package/dist/shared/node_modules/react-transition-group/esm/CSSTransition.es.js +1 -1
  29. package/dist/shared/node_modules/react-transition-group/esm/Transition.cjs.js +1 -1
  30. package/dist/shared/node_modules/react-transition-group/esm/Transition.es.js +1 -1
  31. package/dist/shared/node_modules/react-transition-group/esm/utils/PropTypes.cjs.js +1 -1
  32. package/dist/shared/node_modules/react-transition-group/esm/utils/PropTypes.es.js +1 -1
  33. package/dist/shared/src/api/generated/graphql.cjs.js +1 -1
  34. package/dist/shared/src/api/generated/graphql.cjs.js.map +1 -1
  35. package/dist/shared/src/api/generated/graphql.es.js +1 -1
  36. package/dist/shared/src/api/generated/graphql.es.js.map +1 -1
  37. package/dist/shared/src/api/queries/columnStats/columnStats.cjs.js +1 -1
  38. package/dist/shared/src/api/queries/columnStats/columnStats.cjs.js.map +1 -1
  39. package/dist/shared/src/api/queries/columnStats/columnStats.es.js +56 -44
  40. package/dist/shared/src/api/queries/columnStats/columnStats.es.js.map +1 -1
  41. package/dist/shared/src/api/queries/columnStats/groupCounts.cjs.js +1 -1
  42. package/dist/shared/src/api/queries/columnStats/groupCounts.cjs.js.map +1 -1
  43. package/dist/shared/src/api/queries/columnStats/groupCounts.es.js +10 -8
  44. package/dist/shared/src/api/queries/columnStats/groupCounts.es.js.map +1 -1
  45. package/dist/shared/src/components/LinksManager/LinksManager.cjs.js.map +1 -1
  46. package/dist/shared/src/components/LinksManager/LinksManager.es.js.map +1 -1
  47. package/dist/shared/src/containers/DetailsPanel/DetailsPanel.cjs.js +1 -1
  48. package/dist/shared/src/containers/DetailsPanel/DetailsPanel.cjs.js.map +1 -1
  49. package/dist/shared/src/containers/DetailsPanel/DetailsPanel.es.js +220 -216
  50. package/dist/shared/src/containers/DetailsPanel/DetailsPanel.es.js.map +1 -1
  51. package/dist/shared/src/containers/DetailsPanel/components/DetailsPanelMoreMenu/hooks/useMenuOptions.cjs.js +1 -1
  52. package/dist/shared/src/containers/DetailsPanel/components/DetailsPanelMoreMenu/hooks/useMenuOptions.cjs.js.map +1 -1
  53. package/dist/shared/src/containers/DetailsPanel/components/DetailsPanelMoreMenu/hooks/useMenuOptions.es.js +1 -1
  54. package/dist/shared/src/containers/DetailsPanel/components/DetailsPanelMoreMenu/hooks/useMenuOptions.es.js.map +1 -1
  55. package/dist/shared/src/containers/Feed/components/FeedSearchFilter.cjs.js +2 -2
  56. package/dist/shared/src/containers/Feed/components/FeedSearchFilter.cjs.js.map +1 -1
  57. package/dist/shared/src/containers/Feed/components/FeedSearchFilter.es.js +138 -127
  58. package/dist/shared/src/containers/Feed/components/FeedSearchFilter.es.js.map +1 -1
  59. package/dist/shared/src/containers/Feed/context/FeedContext.cjs.js.map +1 -1
  60. package/dist/shared/src/containers/Feed/context/FeedContext.es.js.map +1 -1
  61. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.cjs.js +1 -1
  62. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.cjs.js.map +1 -1
  63. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.es.js +56 -55
  64. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.es.js.map +1 -1
  65. package/dist/shared/src/containers/ProjectTreeTable/hooks/useFetchOverviewData.cjs.js +1 -1
  66. package/dist/shared/src/containers/ProjectTreeTable/hooks/useFetchOverviewData.cjs.js.map +1 -1
  67. package/dist/shared/src/containers/ProjectTreeTable/hooks/useFetchOverviewData.es.js +249 -254
  68. package/dist/shared/src/containers/ProjectTreeTable/hooks/useFetchOverviewData.es.js.map +1 -1
  69. package/dist/shared/src/containers/ProjectTreeTable/hooks/useGroupCounts.cjs.js.map +1 -1
  70. package/dist/shared/src/containers/ProjectTreeTable/hooks/useGroupCounts.es.js.map +1 -1
  71. package/dist/shared/src/containers/SimpleTable/SimpleTable.cjs.js +1 -1
  72. package/dist/shared/src/containers/SimpleTable/SimpleTable.cjs.js.map +1 -1
  73. package/dist/shared/src/containers/SimpleTable/SimpleTable.es.js +41 -40
  74. package/dist/shared/src/containers/SimpleTable/SimpleTable.es.js.map +1 -1
  75. package/dist/shared/src/containers/Slicer/components/Slicer.cjs.js +2 -2
  76. package/dist/shared/src/containers/Slicer/components/Slicer.cjs.js.map +1 -1
  77. package/dist/shared/src/containers/Slicer/components/Slicer.es.js +55 -47
  78. package/dist/shared/src/containers/Slicer/components/Slicer.es.js.map +1 -1
  79. package/dist/shared/src/containers/Slicer/hooks/useSlicerCounts.cjs.js +2 -0
  80. package/dist/shared/src/containers/Slicer/hooks/useSlicerCounts.cjs.js.map +1 -0
  81. package/dist/shared/src/containers/Slicer/hooks/useSlicerCounts.es.js +319 -0
  82. package/dist/shared/src/containers/Slicer/hooks/useSlicerCounts.es.js.map +1 -0
  83. package/dist/shared/src/containers/Slicer/hooks/useTableDataBySlice.cjs.js +1 -1
  84. package/dist/shared/src/containers/Slicer/hooks/useTableDataBySlice.cjs.js.map +1 -1
  85. package/dist/shared/src/containers/Slicer/hooks/useTableDataBySlice.es.js +118 -104
  86. package/dist/shared/src/containers/Slicer/hooks/useTableDataBySlice.es.js.map +1 -1
  87. package/dist/shared/src/context/DetailsPanelContext.cjs.js +1 -1
  88. package/dist/shared/src/context/DetailsPanelContext.cjs.js.map +1 -1
  89. package/dist/shared/src/context/DetailsPanelContext.es.js +57 -55
  90. package/dist/shared/src/context/DetailsPanelContext.es.js.map +1 -1
  91. package/dist/shared/src/util/confirmDelete.cjs.js +1 -1
  92. package/dist/shared/src/util/confirmDelete.cjs.js.map +1 -1
  93. package/dist/shared/src/util/confirmDelete.es.js +28 -24
  94. package/dist/shared/src/util/confirmDelete.es.js.map +1 -1
  95. package/dist/types/components/index.d.ts +1 -0
  96. package/dist/types/containers/Feed/components/FeedSearchFilter.d.ts +2 -2
  97. package/dist/types/containers/ProjectTreeTable/hooks/useGroupCounts.d.ts +2 -3
  98. package/dist/types/containers/ProjectTreeTable/types/overviewContext.d.ts +8 -0
  99. package/dist/types/containers/ProjectTreeTable/types/table.d.ts +0 -1
  100. package/dist/types/containers/SimpleTable/SimpleTable.types.d.ts +1 -0
  101. package/dist/types/containers/Slicer/components/Slicer.d.ts +2 -0
  102. package/dist/types/containers/Slicer/hooks/index.d.ts +1 -0
  103. package/dist/types/containers/Slicer/hooks/useSlicerCounts.d.ts +17 -0
  104. package/dist/types/containers/Slicer/hooks/useTableDataBySlice.d.ts +5 -1
  105. package/dist/types/util/confirmDelete.d.ts +3 -1
  106. package/dist/util.cjs.js +1 -1
  107. package/dist/util.es.js +77 -76
  108. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"DetailsPanelContext.cjs.js","sources":["../../../../src/context/DetailsPanelContext.tsx"],"sourcesContent":["import React, { ReactNode, useCallback, useContext, useEffect, useState } from 'react'\nimport { QueryFilter, UserModel, DetailsPanelEntityType } from '@shared/api'\nimport { useLocation, useNavigate, useParams, useSearchParams } from 'react-router-dom'\nimport { SavedAnnotationMetadata } from '@shared/containers'\nimport { PowerpackFeature, usePowerpack } from './PowerpackContext'\nimport { useURIContext } from './UriContext'\nimport { useSessionStorage, readLocalStorage, writeLocalStorage } from '@shared/hooks'\nimport type { SubtasksManagerProps } from '@shared/components'\nimport { DetailsPanelContext } from './DetailsPanelContextInstance'\nimport { BundleMode, getBundleModeFromUser } from '@shared/util'\n\n// High-level tabs for the details panel\nexport type DetailsPanelTab = 'feed' | 'subtasks' | 'details' | 'files'\n\n// Filters within the feed tab\nexport type FeedFilter = QueryFilter\n\nexport type SlideOut = {\n entityId: string\n entityType: DetailsPanelEntityType\n projectName: string\n}\n\nexport type DetailsPanelPip = {\n entityType: DetailsPanelEntityType\n entities: { id: string; projectName: string }[]\n scope: string\n}\n\nexport type Entities = {\n entityType: DetailsPanelEntityType\n entities: { id: string; projectName: string }[]\n entitySubTypes?: string[]\n source?: 'uri' | 'url' | 'related' // uri = ayon+entity://..., url = ?project=...&type=...&id=...\n}\n\nexport interface OpenStateByScope {\n [scope: string]: boolean\n}\n\n// Create a new interface for managing tab state by scope\nexport interface TabStateByScope {\n [scope: string]: DetailsPanelTab\n}\n\nconst DETAILS_PANEL_TABS: DetailsPanelTab[] = ['feed', 'subtasks', 'details', 'files']\n\nconst isDetailsPanelTab = (tab: unknown): tab is DetailsPanelTab =>\n typeof tab === 'string' && DETAILS_PANEL_TABS.includes(tab as DetailsPanelTab)\n\n// these props get forwarded to the details panel value\n// it's mainly redux callbacks that cannot be used in shared library\nexport interface DetailsPanelContextProps {\n dispatch?: any // this is a redux dispatch function and it's quite annoying we need to do this\n user: UserModel\n viewer?: {\n reviewableIds: string[]\n taskId?: string | null\n folderId?: string | null\n }\n // redux callback actions\n onOpenImage?: (args: any) => void\n onGoToFrame?: (frame: number) => void\n onOpenViewer?: (args: any) => void\n onUpdateEntity?: (data: { operations: any[]; entityType: string }) => void\n // route hooks\n useParams: typeof useParams\n useNavigate: typeof useNavigate\n useLocation: typeof useLocation\n useSearchParams: typeof useSearchParams\n feedAnnotationsEnabled?: boolean\n hasLicense?: boolean\n // SubtasksManager component\n SubtasksManager?: React.ComponentType<SubtasksManagerProps>\n // debugging used to simulate different values\n debug?: {\n isDeveloperMode?: boolean\n isGuest?: boolean\n hasLicense?: boolean\n }\n}\n\n// Interface for our simplified context\nexport interface DetailsPanelContextType extends DetailsPanelContextProps {\n // user\n bundleMode: BundleMode\n isGuest: boolean\n // Open state for the panel by scope\n panelOpenByScope: OpenStateByScope\n getOpenForScope: (scope: string) => boolean\n setPanelOpen: (scope: string, isOpen: boolean) => void\n setPanelOpenByScope: (newState: OpenStateByScope) => void\n\n // Tab preferences by scope\n tabsByScope: TabStateByScope\n getTabForScope: (scope: string) => DetailsPanelTab\n\n // Slide out state\n slideOut: null | SlideOut\n openSlideOut: (slideOut: SlideOut) => void\n closeSlideOut: () => void\n\n // Highlighted activities\n highlightedActivities: string[]\n setHighlightedActivities: (activities: string[]) => void\n\n // PiP state\n pip: DetailsPanelPip | null\n openPip: (pip: DetailsPanelPip) => void\n closePip: () => void\n\n // Entities state\n entities: Entities | null\n setEntities: (entities: Entities | null) => void\n\n // Annotations\n feedAnnotations: SavedAnnotationMetadata[]\n setFeedAnnotations: (annotations: SavedAnnotationMetadata[]) => void\n\n // powerpack\n onPowerFeature: (feature: PowerpackFeature) => void\n}\n\n// Provider component\nexport interface DetailsPanelProviderProps extends DetailsPanelContextProps {\n children: ReactNode\n defaultTab?: DetailsPanelTab\n}\n\nexport const DetailsPanelProvider: React.FC<DetailsPanelProviderProps> = ({\n children,\n defaultTab = 'feed',\n hasLicense: hasLicenseProp,\n debug = {},\n ...forwardedProps\n}) => {\n const user = forwardedProps.user\n const bundleMode = getBundleModeFromUser(user)\n const isGuest = 'isGuest' in debug ? (debug.isGuest as boolean) : user?.data?.isGuest\n\n // get license from powerpack or forwarded down from props\n const { powerLicense, setPowerpackDialog } = usePowerpack()\n const hasLicense =\n 'hasLicense' in debug ? (debug.hasLicense as boolean) : !!powerLicense || hasLicenseProp\n\n // keep track of the currently open panel by scope\n const [panelOpenByScope, setPanelOpenByScope] = useState<OpenStateByScope>({})\n const [feedAnnotations, setFeedAnnotations] = useState<SavedAnnotationMetadata[]>([])\n\n // get the current open state for a specific scope\n const getOpenForScope = useCallback(\n (scope: string): boolean => {\n // Check if we have a saved preference for this scope\n if (panelOpenByScope[scope]) {\n return panelOpenByScope[scope]\n }\n\n // Fall back to default\n return false\n },\n [panelOpenByScope],\n )\n // Set open state for a scope\n const setPanelOpen = useCallback(\n (scope: string, isOpen: boolean) => {\n // Create a new state object based on current open state\n const newState = { ...panelOpenByScope }\n newState[scope] = isOpen\n\n // Update the state with the new object\n setPanelOpenByScope(newState)\n },\n [panelOpenByScope],\n )\n\n // Use localStorage to persist tab preferences by scope\n const [tabsByScope, setTabByScope] = useSessionStorage<TabStateByScope>(TABS_BY_SCOPE_KEY, {})\n\n // Get the current tab for a specific scope\n const getTabForScope = useCallback(\n (scope: string): DetailsPanelTab => {\n // Check if we have a saved preference for this scope\n const tab = tabsByScope[scope]\n if (isDetailsPanelTab(tab)) {\n return tab\n }\n\n // Fall back to default\n return defaultTab\n },\n [tabsByScope, defaultTab],\n )\n\n // Set tab for a scope\n\n // is the slide out open?\n const [slideOut, setSlideOut] = useState<null | SlideOut>(null)\n\n // open the slide out\n const openSlideOut = useCallback<DetailsPanelContextType['openSlideOut']>((params) => {\n setSlideOut(params)\n }, [])\n\n // close the slide out\n const closeSlideOut = useCallback(() => {\n setSlideOut(null)\n if (slideOut) {\n setHighlightedActivities([])\n }\n }, [])\n\n // close slide out whenever the page changes\n useEffect(() => {\n closeSlideOut()\n }, [forwardedProps.useLocation().pathname])\n\n const [pip, setPip] = useState<DetailsPanelPip | null>(null)\n\n const openPip = useCallback((pip: DetailsPanelPip) => {\n setPip(pip)\n }, [])\n const closePip = useCallback(() => {\n setPip(null)\n }, [])\n\n const [entities, setEntities] = useState<Entities | null>(null)\n\n const [highlightedActivities, setHighlightedActivities] = useState<string[]>([])\n\n const { uriType, uri, entity, getUriEntities } = useURIContext()\n const [searchParams] = forwardedProps.useSearchParams()\n\n const project = searchParams.get('project')\n const type = searchParams.get('type')\n const id = searchParams.get('id')\n const activity = searchParams.get('activity')\n\n // on first load or URL param change, check if there is a uri or URL params and open details panel if present\n useEffect(() => {\n // Priority 1: Check for 'uri' parameter (ayon+entity://...)\n if (uriType === 'entity' && entity && entity.entityType !== 'product') {\n getUriEntities()\n .then((result) => {\n if (result.length === 0) return\n\n const entityUriData = result.find((r) => r.uri === uri)\n const entityData = entityUriData?.entities?.[0]\n\n if (!entityUriData || !entityData) return\n const projectName = entityData?.projectName || entity.projectName || ''\n const id =\n entityData.representationId ||\n entityData.versionId ||\n entityData.productId ||\n entityData.taskId ||\n entityData.folderId\n\n if (!projectName || !id) return\n\n const newEntities: Entities = {\n entityType: entity.entityType as DetailsPanelEntityType,\n entities: [\n {\n id: id,\n projectName: projectName,\n },\n ],\n source: 'uri',\n }\n\n setEntities(newEntities)\n })\n .catch((err) => {\n console.warn('Failed to get URI entities:', err)\n })\n return\n }\n\n // Priority 2: Check for URL params (project, type, id)\n if (project && type && id) {\n const newEntities: Entities = {\n entityType: type as DetailsPanelEntityType,\n entities: [\n {\n id,\n projectName: project,\n },\n ],\n source: 'url',\n }\n\n setEntities(newEntities)\n\n // if there is an activity param, open the feed tab (activity is shown by default)\n\n if (activity) {\n setHighlightedActivities([activity])\n setTabByScope({\n ...tabsByScope,\n overview: 'feed',\n })\n }\n }\n }, [project, type, id])\n\n const value = {\n // open state for the panel by scope\n panelOpenByScope,\n getOpenForScope,\n setPanelOpen,\n setPanelOpenByScope,\n // tab preferences\n tabsByScope,\n getTabForScope,\n // slide out state\n slideOut,\n openSlideOut,\n closeSlideOut,\n // highlighted activities\n highlightedActivities,\n setHighlightedActivities,\n // PiP state\n pip,\n openPip,\n closePip,\n // entities state\n entities,\n setEntities,\n feedAnnotations,\n setFeedAnnotations,\n bundleMode,\n isGuest,\n hasLicense,\n onPowerFeature: setPowerpackDialog,\n ...forwardedProps,\n }\n\n return <DetailsPanelContext.Provider value={value}>{children}</DetailsPanelContext.Provider>\n}\n\n// Custom hook to use the details context\nexport const useDetailsPanelContext = (): DetailsPanelContextType => {\n const context = useContext(DetailsPanelContext)\n if (context === undefined) {\n throw new Error('useDetailsPanel must be used within a DetailsPanelProvider')\n }\n return context\n}\n\nconst TABS_BY_SCOPE_KEY = 'details/tabs-by-scope'\n\nexport const setDetailsPanelTabForScope = (scope: string, tab: DetailsPanelTab) => {\n const current = readLocalStorage<TabStateByScope>(TABS_BY_SCOPE_KEY, {})\n writeLocalStorage(TABS_BY_SCOPE_KEY, { ...current, [scope]: tab })\n}\n\n// Add a specialized hook for using a panel in a specific scope\nexport const useScopedDetailsPanel = (scope: string) => {\n const { getOpenForScope, setPanelOpen, getTabForScope } = useDetailsPanelContext()\n\n const [tabsByScope, setTabsByScope] = useSessionStorage<TabStateByScope>(TABS_BY_SCOPE_KEY, {})\n\n // derived from localStorage state, which useSessionStorage keeps in sync across hook instances\n const storedTab = tabsByScope[scope]\n const currentTab = isDetailsPanelTab(storedTab) ? storedTab : getTabForScope(scope)\n\n const updateTab = useCallback(\n (newTab: DetailsPanelTab) => {\n setTabsByScope((prev) => ({ ...prev, [scope]: newTab }))\n },\n [scope, setTabsByScope],\n )\n\n const isFeed = currentTab === 'feed'\n\n return {\n isOpen: getOpenForScope(scope),\n setOpen: (isOpen: boolean) => setPanelOpen(scope, isOpen),\n currentTab,\n setTab: updateTab,\n isFeed,\n }\n}\n"],"names":["DETAILS_PANEL_TABS","isDetailsPanelTab","tab","DetailsPanelProvider","children","defaultTab","hasLicenseProp","debug","forwardedProps","user","bundleMode","getBundleModeFromUser","isGuest","powerLicense","setPowerpackDialog","usePowerpack","hasLicense","panelOpenByScope","setPanelOpenByScope","useState","feedAnnotations","setFeedAnnotations","getOpenForScope","useCallback","scope","setPanelOpen","isOpen","newState","tabsByScope","setTabByScope","useSessionStorage","TABS_BY_SCOPE_KEY","getTabForScope","slideOut","setSlideOut","openSlideOut","params","closeSlideOut","setHighlightedActivities","useEffect","pip","setPip","openPip","closePip","entities","setEntities","highlightedActivities","uriType","uri","entity","getUriEntities","useURIContext","searchParams","project","type","id","activity","result","entityUriData","r","entityData","projectName","newEntities","err","value","jsx","DetailsPanelContext","useDetailsPanelContext","context","useContext","setDetailsPanelTabForScope","current","readLocalStorage","writeLocalStorage","useScopedDetailsPanel","setTabsByScope","storedTab","currentTab","updateTab","newTab","prev","isFeed"],"mappings":"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"}
1
+ {"version":3,"file":"DetailsPanelContext.cjs.js","sources":["../../../../src/context/DetailsPanelContext.tsx"],"sourcesContent":["import React, { ReactNode, useCallback, useContext, useEffect, useState } from 'react'\nimport { QueryFilter, UserModel, DetailsPanelEntityType } from '@shared/api'\nimport { useLocation, useNavigate, useParams, useSearchParams } from 'react-router-dom'\nimport { SavedAnnotationMetadata } from '@shared/containers'\nimport { PowerpackFeature, usePowerpack } from './PowerpackContext'\nimport { useURIContext } from './UriContext'\nimport { useSessionStorage, readLocalStorage, writeLocalStorage } from '@shared/hooks'\nimport type { SubtasksManagerProps } from '@shared/components'\nimport { DetailsPanelContext } from './DetailsPanelContextInstance'\nimport { BundleMode, getBundleModeFromUser } from '@shared/util'\n\n// High-level tabs for the details panel\nexport type DetailsPanelTab = 'feed' | 'subtasks' | 'details' | 'files'\n\n// Filters within the feed tab\nexport type FeedFilter = QueryFilter\n\nexport type SlideOut = {\n entityId: string\n entityType: DetailsPanelEntityType\n projectName: string\n}\n\nexport type DetailsPanelPip = {\n entityType: DetailsPanelEntityType\n entities: { id: string; projectName: string }[]\n scope: string\n}\n\nexport type Entities = {\n entityType: DetailsPanelEntityType\n entities: { id: string; projectName: string }[]\n entitySubTypes?: string[]\n source?: 'uri' | 'url' | 'related' // uri = ayon+entity://..., url = ?project=...&type=...&id=...\n}\n\nexport interface OpenStateByScope {\n [scope: string]: boolean\n}\n\n// Create a new interface for managing tab state by scope\nexport interface TabStateByScope {\n [scope: string]: DetailsPanelTab\n}\n\nconst DETAILS_PANEL_TABS: DetailsPanelTab[] = ['feed', 'subtasks', 'details', 'files']\n\nconst isDetailsPanelTab = (tab: unknown): tab is DetailsPanelTab =>\n typeof tab === 'string' && DETAILS_PANEL_TABS.includes(tab as DetailsPanelTab)\n\n// these props get forwarded to the details panel value\n// it's mainly redux callbacks that cannot be used in shared library\nexport interface DetailsPanelContextProps {\n dispatch?: any // this is a redux dispatch function and it's quite annoying we need to do this\n user: UserModel\n viewer?: {\n reviewableIds: string[]\n taskId?: string | null\n folderId?: string | null\n }\n // redux callback actions\n onOpenImage?: (args: any) => void\n onGoToFrame?: (frame: number) => void\n onOpenViewer?: (args: any) => void\n onUpdateEntity?: (data: { operations: any[]; entityType: string }) => void\n // route hooks\n useParams: typeof useParams\n useNavigate: typeof useNavigate\n useLocation: typeof useLocation\n useSearchParams: typeof useSearchParams\n feedAnnotationsEnabled?: boolean\n hasLicense?: boolean\n // SubtasksManager component\n SubtasksManager?: React.ComponentType<SubtasksManagerProps>\n // debugging used to simulate different values\n debug?: {\n isDeveloperMode?: boolean\n isGuest?: boolean\n hasLicense?: boolean\n }\n}\n\n// Interface for our simplified context\nexport interface DetailsPanelContextType extends DetailsPanelContextProps {\n // user\n bundleMode: BundleMode\n isGuest: boolean\n // Open state for the panel by scope\n panelOpenByScope: OpenStateByScope\n getOpenForScope: (scope: string) => boolean\n setPanelOpen: (scope: string, isOpen: boolean) => void\n setPanelOpenByScope: (newState: OpenStateByScope) => void\n\n // Tab preferences by scope\n tabsByScope: TabStateByScope\n getTabForScope: (scope: string) => DetailsPanelTab\n\n // Slide out state\n slideOut: null | SlideOut\n openSlideOut: (slideOut: SlideOut) => void\n closeSlideOut: () => void\n\n // Highlighted activities\n highlightedActivities: string[]\n setHighlightedActivities: (activities: string[]) => void\n\n // PiP state\n pip: DetailsPanelPip | null\n openPip: (pip: DetailsPanelPip) => void\n closePip: () => void\n\n // Entities state\n entities: Entities | null\n setEntities: (entities: Entities | null) => void\n\n // Annotations\n feedAnnotations: SavedAnnotationMetadata[]\n setFeedAnnotations: (annotations: SavedAnnotationMetadata[]) => void\n\n // powerpack\n onPowerFeature: (feature: PowerpackFeature) => void\n}\n\n// Provider component\nexport interface DetailsPanelProviderProps extends DetailsPanelContextProps {\n children: ReactNode\n defaultTab?: DetailsPanelTab\n}\n\nexport const DetailsPanelProvider: React.FC<DetailsPanelProviderProps> = ({\n children,\n defaultTab = 'feed',\n hasLicense: hasLicenseProp,\n debug = {},\n ...forwardedProps\n}) => {\n const user = forwardedProps.user\n const bundleMode = getBundleModeFromUser(user)\n const isGuest = 'isGuest' in debug ? (debug.isGuest as boolean) : user?.data?.isGuest\n\n // get license from powerpack or forwarded down from props\n const { powerLicense, setPowerpackDialog } = usePowerpack()\n const hasLicense =\n 'hasLicense' in debug ? (debug.hasLicense as boolean) : !!powerLicense || hasLicenseProp\n\n // keep track of the currently open panel by scope\n const [panelOpenByScope, setPanelOpenByScope] = useState<OpenStateByScope>({})\n const [feedAnnotations, setFeedAnnotations] = useState<SavedAnnotationMetadata[]>([])\n\n // get the current open state for a specific scope\n const getOpenForScope = useCallback(\n (scope: string): boolean => {\n // Check if we have a saved preference for this scope\n if (panelOpenByScope[scope]) {\n return panelOpenByScope[scope]\n }\n\n // Fall back to default\n return false\n },\n [panelOpenByScope],\n )\n // Set open state for a scope\n const setPanelOpen = useCallback(\n (scope: string, isOpen: boolean) => {\n // Create a new state object based on current open state\n const newState = { ...panelOpenByScope }\n newState[scope] = isOpen\n\n // Update the state with the new object\n setPanelOpenByScope(newState)\n },\n [panelOpenByScope],\n )\n\n // Use localStorage to persist tab preferences by scope\n const [tabsByScope, setTabByScope] = useSessionStorage<TabStateByScope>(TABS_BY_SCOPE_KEY, {})\n\n // Get the current tab for a specific scope\n const getTabForScope = useCallback(\n (scope: string): DetailsPanelTab => {\n // Check if we have a saved preference for this scope\n const tab = tabsByScope[scope]\n if (isDetailsPanelTab(tab)) {\n return tab\n }\n\n // Fall back to default\n return defaultTab\n },\n [tabsByScope, defaultTab],\n )\n\n // Set tab for a scope\n\n // is the slide out open?\n const [slideOut, setSlideOut] = useState<null | SlideOut>(null)\n\n // open the slide out\n const openSlideOut = useCallback<DetailsPanelContextType['openSlideOut']>((params) => {\n setSlideOut(params)\n }, [])\n\n // close the slide out\n const closeSlideOut = useCallback(() => {\n setSlideOut(null)\n if (slideOut) {\n setHighlightedActivities([])\n }\n }, [])\n\n // close slide out whenever the page changes\n useEffect(() => {\n closeSlideOut()\n }, [forwardedProps.useLocation().pathname])\n\n const [pip, setPip] = useState<DetailsPanelPip | null>(null)\n\n const openPip = useCallback((pip: DetailsPanelPip) => {\n setPip(pip)\n }, [])\n const closePip = useCallback(() => {\n setPip(null)\n }, [])\n\n const [entities, setEntities] = useState<Entities | null>(null)\n\n const [highlightedActivities, setHighlightedActivities] = useState<string[]>([])\n\n const { uriType, uri, entity, getUriEntities } = useURIContext()\n const [searchParams] = forwardedProps.useSearchParams()\n\n const project = searchParams.get('project')\n const type = searchParams.get('type')\n const id = searchParams.get('id')\n const activity = searchParams.get('activity')\n\n // on first load or URL param change, check if there is a uri or URL params and open details panel if present\n useEffect(() => {\n // closing the panel deletes these params; bail so the stale uri state below can't reopen it\n if (!project && !type && !id) return\n\n // Priority 1: Check for 'uri' parameter (ayon+entity://...)\n if (uriType === 'entity' && entity && entity.entityType !== 'product') {\n getUriEntities()\n .then((result) => {\n if (result.length === 0) return\n\n const entityUriData = result.find((r) => r.uri === uri)\n const entityData = entityUriData?.entities?.[0]\n\n if (!entityUriData || !entityData) return\n const projectName = entityData?.projectName || entity.projectName || ''\n const id =\n entityData.representationId ||\n entityData.versionId ||\n entityData.productId ||\n entityData.taskId ||\n entityData.folderId\n\n if (!projectName || !id) return\n\n const newEntities: Entities = {\n entityType: entity.entityType as DetailsPanelEntityType,\n entities: [\n {\n id: id,\n projectName: projectName,\n },\n ],\n source: 'uri',\n }\n\n setEntities(newEntities)\n })\n .catch((err) => {\n console.warn('Failed to get URI entities:', err)\n })\n return\n }\n\n // Priority 2: Check for URL params (project, type, id)\n if (project && type && id) {\n const newEntities: Entities = {\n entityType: type as DetailsPanelEntityType,\n entities: [\n {\n id,\n projectName: project,\n },\n ],\n source: 'url',\n }\n\n setEntities(newEntities)\n\n // if there is an activity param, open the feed tab (activity is shown by default)\n\n if (activity) {\n setHighlightedActivities([activity])\n setTabByScope({\n ...tabsByScope,\n overview: 'feed',\n })\n }\n }\n }, [project, type, id])\n\n const value = {\n // open state for the panel by scope\n panelOpenByScope,\n getOpenForScope,\n setPanelOpen,\n setPanelOpenByScope,\n // tab preferences\n tabsByScope,\n getTabForScope,\n // slide out state\n slideOut,\n openSlideOut,\n closeSlideOut,\n // highlighted activities\n highlightedActivities,\n setHighlightedActivities,\n // PiP state\n pip,\n openPip,\n closePip,\n // entities state\n entities,\n setEntities,\n feedAnnotations,\n setFeedAnnotations,\n bundleMode,\n isGuest,\n hasLicense,\n onPowerFeature: setPowerpackDialog,\n ...forwardedProps,\n }\n\n return <DetailsPanelContext.Provider value={value}>{children}</DetailsPanelContext.Provider>\n}\n\n// Custom hook to use the details context\nexport const useDetailsPanelContext = (): DetailsPanelContextType => {\n const context = useContext(DetailsPanelContext)\n if (context === undefined) {\n throw new Error('useDetailsPanel must be used within a DetailsPanelProvider')\n }\n return context\n}\n\nconst TABS_BY_SCOPE_KEY = 'details/tabs-by-scope'\n\nexport const setDetailsPanelTabForScope = (scope: string, tab: DetailsPanelTab) => {\n const current = readLocalStorage<TabStateByScope>(TABS_BY_SCOPE_KEY, {})\n writeLocalStorage(TABS_BY_SCOPE_KEY, { ...current, [scope]: tab })\n}\n\n// Add a specialized hook for using a panel in a specific scope\nexport const useScopedDetailsPanel = (scope: string) => {\n const { getOpenForScope, setPanelOpen, getTabForScope } = useDetailsPanelContext()\n\n const [tabsByScope, setTabsByScope] = useSessionStorage<TabStateByScope>(TABS_BY_SCOPE_KEY, {})\n\n // derived from localStorage state, which useSessionStorage keeps in sync across hook instances\n const storedTab = tabsByScope[scope]\n const currentTab = isDetailsPanelTab(storedTab) ? storedTab : getTabForScope(scope)\n\n const updateTab = useCallback(\n (newTab: DetailsPanelTab) => {\n setTabsByScope((prev) => ({ ...prev, [scope]: newTab }))\n },\n [scope, setTabsByScope],\n )\n\n const isFeed = currentTab === 'feed'\n\n return {\n isOpen: getOpenForScope(scope),\n setOpen: (isOpen: boolean) => setPanelOpen(scope, isOpen),\n currentTab,\n setTab: updateTab,\n isFeed,\n }\n}\n"],"names":["DETAILS_PANEL_TABS","isDetailsPanelTab","tab","DetailsPanelProvider","children","defaultTab","hasLicenseProp","debug","forwardedProps","user","bundleMode","getBundleModeFromUser","isGuest","powerLicense","setPowerpackDialog","usePowerpack","hasLicense","panelOpenByScope","setPanelOpenByScope","useState","feedAnnotations","setFeedAnnotations","getOpenForScope","useCallback","scope","setPanelOpen","isOpen","newState","tabsByScope","setTabByScope","useSessionStorage","TABS_BY_SCOPE_KEY","getTabForScope","slideOut","setSlideOut","openSlideOut","params","closeSlideOut","setHighlightedActivities","useEffect","pip","setPip","openPip","closePip","entities","setEntities","highlightedActivities","uriType","uri","entity","getUriEntities","useURIContext","searchParams","project","type","id","activity","result","entityUriData","r","entityData","projectName","newEntities","err","value","jsx","DetailsPanelContext","useDetailsPanelContext","context","useContext","setDetailsPanelTabForScope","current","readLocalStorage","writeLocalStorage","useScopedDetailsPanel","setTabsByScope","storedTab","currentTab","updateTab","newTab","prev","isFeed"],"mappings":"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"}
@@ -307,7 +307,7 @@ const ct = ["feed", "subtasks", "details", "files"], U = (t) => typeof t == "str
307
307
  debug: n = {},
308
308
  ...s
309
309
  }) => {
310
- const l = s.user, d = st(l), f = "isGuest" in n ? n.isGuest : l?.data?.isGuest, { powerLicense: h, setPowerpackDialog: T } = pt(), u = "hasLicense" in n ? n.hasLicense : !!h || a, [r, w] = c({}), [_, G] = c([]), R = p(
310
+ const u = s.user, d = st(u), f = "isGuest" in n ? n.isGuest : u?.data?.isGuest, { powerLicense: O, setPowerpackDialog: v } = pt(), l = "hasLicense" in n ? n.hasLicense : !!O || a, [r, w] = c({}), [_, G] = c([]), R = p(
311
311
  (o) => r[o] ? r[o] : !1,
312
312
  [r]
313
313
  ), M = p(
@@ -316,7 +316,7 @@ const ct = ["feed", "subtasks", "details", "files"], U = (t) => typeof t == "str
316
316
  i[o] = m, w(i);
317
317
  },
318
318
  [r]
319
- ), [S, Y] = k(g, {}), H = p(
319
+ ), [S, Y] = k(b, {}), H = p(
320
320
  (o) => {
321
321
  const m = S[o];
322
322
  return U(m) ? m : e;
@@ -325,7 +325,7 @@ const ct = ["feed", "subtasks", "details", "files"], U = (t) => typeof t == "str
325
325
  ), [B, F] = c(null), K = p((o) => {
326
326
  F(o);
327
327
  }, []), L = p(() => {
328
- F(null), B && O([]);
328
+ F(null), B && E([]);
329
329
  }, []);
330
330
  C(() => {
331
331
  L();
@@ -334,45 +334,47 @@ const ct = ["feed", "subtasks", "details", "files"], U = (t) => typeof t == "str
334
334
  j(o);
335
335
  }, []), J = p(() => {
336
336
  j(null);
337
- }, []), [Q, b] = c(null), [V, O] = c([]), { uriType: W, uri: X, entity: y, getUriEntities: Z } = mt(), [P] = s.useSearchParams(), v = P.get("project"), D = P.get("type"), E = P.get("id"), x = P.get("activity");
337
+ }, []), [Q, D] = c(null), [V, E] = c([]), { uriType: W, uri: X, entity: y, getUriEntities: Z } = mt(), [P] = s.useSearchParams(), g = P.get("project"), h = P.get("type"), T = P.get("id"), x = P.get("activity");
338
338
  C(() => {
339
- if (W === "entity" && y && y.entityType !== "product") {
340
- Z().then((o) => {
341
- if (o.length === 0) return;
342
- const m = o.find((ot) => ot.uri === X), i = m?.entities?.[0];
343
- if (!m || !i) return;
344
- const A = i?.projectName || y.projectName || "", I = i.representationId || i.versionId || i.productId || i.taskId || i.folderId;
345
- if (!A || !I) return;
346
- const tt = {
347
- entityType: y.entityType,
348
- entities: [
349
- {
350
- id: I,
351
- projectName: A
352
- }
353
- ],
354
- source: "uri"
355
- };
356
- b(tt);
357
- }).catch((o) => {
358
- console.warn("Failed to get URI entities:", o);
359
- });
360
- return;
339
+ if (!(!g && !h && !T)) {
340
+ if (W === "entity" && y && y.entityType !== "product") {
341
+ Z().then((o) => {
342
+ if (o.length === 0) return;
343
+ const m = o.find((ot) => ot.uri === X), i = m?.entities?.[0];
344
+ if (!m || !i) return;
345
+ const A = i?.projectName || y.projectName || "", I = i.representationId || i.versionId || i.productId || i.taskId || i.folderId;
346
+ if (!A || !I) return;
347
+ const tt = {
348
+ entityType: y.entityType,
349
+ entities: [
350
+ {
351
+ id: I,
352
+ projectName: A
353
+ }
354
+ ],
355
+ source: "uri"
356
+ };
357
+ D(tt);
358
+ }).catch((o) => {
359
+ console.warn("Failed to get URI entities:", o);
360
+ });
361
+ return;
362
+ }
363
+ g && h && T && (D({
364
+ entityType: h,
365
+ entities: [
366
+ {
367
+ id: T,
368
+ projectName: g
369
+ }
370
+ ],
371
+ source: "url"
372
+ }), x && (E([x]), Y({
373
+ ...S,
374
+ overview: "feed"
375
+ })));
361
376
  }
362
- v && D && E && (b({
363
- entityType: D,
364
- entities: [
365
- {
366
- id: E,
367
- projectName: v
368
- }
369
- ],
370
- source: "url"
371
- }), x && (O([x]), Y({
372
- ...S,
373
- overview: "feed"
374
- })));
375
- }, [v, D, E]);
377
+ }, [g, h, T]);
376
378
  const $ = {
377
379
  // open state for the panel by scope
378
380
  panelOpenByScope: r,
@@ -388,20 +390,20 @@ const ct = ["feed", "subtasks", "details", "files"], U = (t) => typeof t == "str
388
390
  closeSlideOut: L,
389
391
  // highlighted activities
390
392
  highlightedActivities: V,
391
- setHighlightedActivities: O,
393
+ setHighlightedActivities: E,
392
394
  // PiP state
393
395
  pip: q,
394
396
  openPip: z,
395
397
  closePip: J,
396
398
  // entities state
397
399
  entities: Q,
398
- setEntities: b,
400
+ setEntities: D,
399
401
  feedAnnotations: _,
400
402
  setFeedAnnotations: G,
401
403
  bundleMode: d,
402
404
  isGuest: f,
403
- hasLicense: u,
404
- onPowerFeature: T,
405
+ hasLicense: l,
406
+ onPowerFeature: v,
405
407
  ...s
406
408
  };
407
409
  return /* @__PURE__ */ it.jsx(N.Provider, { value: $, children: t });
@@ -410,22 +412,22 @@ const ct = ["feed", "subtasks", "details", "files"], U = (t) => typeof t == "str
410
412
  if (t === void 0)
411
413
  throw new Error("useDetailsPanel must be used within a DetailsPanelProvider");
412
414
  return t;
413
- }, g = "details/tabs-by-scope", qm = (t, e) => {
414
- const a = et(g, {});
415
- nt(g, { ...a, [t]: e });
415
+ }, b = "details/tabs-by-scope", qm = (t, e) => {
416
+ const a = et(b, {});
417
+ nt(b, { ...a, [t]: e });
416
418
  }, zm = (t) => {
417
- const { getOpenForScope: e, setPanelOpen: a, getTabForScope: n } = at(), [s, l] = k(g, {}), d = s[t], f = U(d) ? d : n(t), h = p(
418
- (u) => {
419
- l((r) => ({ ...r, [t]: u }));
419
+ const { getOpenForScope: e, setPanelOpen: a, getTabForScope: n } = at(), [s, u] = k(b, {}), d = s[t], f = U(d) ? d : n(t), O = p(
420
+ (l) => {
421
+ u((r) => ({ ...r, [t]: l }));
420
422
  },
421
- [t, l]
422
- ), T = f === "feed";
423
+ [t, u]
424
+ ), v = f === "feed";
423
425
  return {
424
426
  isOpen: e(t),
425
- setOpen: (u) => a(t, u),
427
+ setOpen: (l) => a(t, l),
426
428
  currentTab: f,
427
- setTab: h,
428
- isFeed: T
429
+ setTab: O,
430
+ isFeed: v
429
431
  };
430
432
  };
431
433
  export {
@@ -1 +1 @@
1
- {"version":3,"file":"DetailsPanelContext.es.js","sources":["../../../../src/context/DetailsPanelContext.tsx"],"sourcesContent":["import React, { ReactNode, useCallback, useContext, useEffect, useState } from 'react'\nimport { QueryFilter, UserModel, DetailsPanelEntityType } from '@shared/api'\nimport { useLocation, useNavigate, useParams, useSearchParams } from 'react-router-dom'\nimport { SavedAnnotationMetadata } from '@shared/containers'\nimport { PowerpackFeature, usePowerpack } from './PowerpackContext'\nimport { useURIContext } from './UriContext'\nimport { useSessionStorage, readLocalStorage, writeLocalStorage } from '@shared/hooks'\nimport type { SubtasksManagerProps } from '@shared/components'\nimport { DetailsPanelContext } from './DetailsPanelContextInstance'\nimport { BundleMode, getBundleModeFromUser } from '@shared/util'\n\n// High-level tabs for the details panel\nexport type DetailsPanelTab = 'feed' | 'subtasks' | 'details' | 'files'\n\n// Filters within the feed tab\nexport type FeedFilter = QueryFilter\n\nexport type SlideOut = {\n entityId: string\n entityType: DetailsPanelEntityType\n projectName: string\n}\n\nexport type DetailsPanelPip = {\n entityType: DetailsPanelEntityType\n entities: { id: string; projectName: string }[]\n scope: string\n}\n\nexport type Entities = {\n entityType: DetailsPanelEntityType\n entities: { id: string; projectName: string }[]\n entitySubTypes?: string[]\n source?: 'uri' | 'url' | 'related' // uri = ayon+entity://..., url = ?project=...&type=...&id=...\n}\n\nexport interface OpenStateByScope {\n [scope: string]: boolean\n}\n\n// Create a new interface for managing tab state by scope\nexport interface TabStateByScope {\n [scope: string]: DetailsPanelTab\n}\n\nconst DETAILS_PANEL_TABS: DetailsPanelTab[] = ['feed', 'subtasks', 'details', 'files']\n\nconst isDetailsPanelTab = (tab: unknown): tab is DetailsPanelTab =>\n typeof tab === 'string' && DETAILS_PANEL_TABS.includes(tab as DetailsPanelTab)\n\n// these props get forwarded to the details panel value\n// it's mainly redux callbacks that cannot be used in shared library\nexport interface DetailsPanelContextProps {\n dispatch?: any // this is a redux dispatch function and it's quite annoying we need to do this\n user: UserModel\n viewer?: {\n reviewableIds: string[]\n taskId?: string | null\n folderId?: string | null\n }\n // redux callback actions\n onOpenImage?: (args: any) => void\n onGoToFrame?: (frame: number) => void\n onOpenViewer?: (args: any) => void\n onUpdateEntity?: (data: { operations: any[]; entityType: string }) => void\n // route hooks\n useParams: typeof useParams\n useNavigate: typeof useNavigate\n useLocation: typeof useLocation\n useSearchParams: typeof useSearchParams\n feedAnnotationsEnabled?: boolean\n hasLicense?: boolean\n // SubtasksManager component\n SubtasksManager?: React.ComponentType<SubtasksManagerProps>\n // debugging used to simulate different values\n debug?: {\n isDeveloperMode?: boolean\n isGuest?: boolean\n hasLicense?: boolean\n }\n}\n\n// Interface for our simplified context\nexport interface DetailsPanelContextType extends DetailsPanelContextProps {\n // user\n bundleMode: BundleMode\n isGuest: boolean\n // Open state for the panel by scope\n panelOpenByScope: OpenStateByScope\n getOpenForScope: (scope: string) => boolean\n setPanelOpen: (scope: string, isOpen: boolean) => void\n setPanelOpenByScope: (newState: OpenStateByScope) => void\n\n // Tab preferences by scope\n tabsByScope: TabStateByScope\n getTabForScope: (scope: string) => DetailsPanelTab\n\n // Slide out state\n slideOut: null | SlideOut\n openSlideOut: (slideOut: SlideOut) => void\n closeSlideOut: () => void\n\n // Highlighted activities\n highlightedActivities: string[]\n setHighlightedActivities: (activities: string[]) => void\n\n // PiP state\n pip: DetailsPanelPip | null\n openPip: (pip: DetailsPanelPip) => void\n closePip: () => void\n\n // Entities state\n entities: Entities | null\n setEntities: (entities: Entities | null) => void\n\n // Annotations\n feedAnnotations: SavedAnnotationMetadata[]\n setFeedAnnotations: (annotations: SavedAnnotationMetadata[]) => void\n\n // powerpack\n onPowerFeature: (feature: PowerpackFeature) => void\n}\n\n// Provider component\nexport interface DetailsPanelProviderProps extends DetailsPanelContextProps {\n children: ReactNode\n defaultTab?: DetailsPanelTab\n}\n\nexport const DetailsPanelProvider: React.FC<DetailsPanelProviderProps> = ({\n children,\n defaultTab = 'feed',\n hasLicense: hasLicenseProp,\n debug = {},\n ...forwardedProps\n}) => {\n const user = forwardedProps.user\n const bundleMode = getBundleModeFromUser(user)\n const isGuest = 'isGuest' in debug ? (debug.isGuest as boolean) : user?.data?.isGuest\n\n // get license from powerpack or forwarded down from props\n const { powerLicense, setPowerpackDialog } = usePowerpack()\n const hasLicense =\n 'hasLicense' in debug ? (debug.hasLicense as boolean) : !!powerLicense || hasLicenseProp\n\n // keep track of the currently open panel by scope\n const [panelOpenByScope, setPanelOpenByScope] = useState<OpenStateByScope>({})\n const [feedAnnotations, setFeedAnnotations] = useState<SavedAnnotationMetadata[]>([])\n\n // get the current open state for a specific scope\n const getOpenForScope = useCallback(\n (scope: string): boolean => {\n // Check if we have a saved preference for this scope\n if (panelOpenByScope[scope]) {\n return panelOpenByScope[scope]\n }\n\n // Fall back to default\n return false\n },\n [panelOpenByScope],\n )\n // Set open state for a scope\n const setPanelOpen = useCallback(\n (scope: string, isOpen: boolean) => {\n // Create a new state object based on current open state\n const newState = { ...panelOpenByScope }\n newState[scope] = isOpen\n\n // Update the state with the new object\n setPanelOpenByScope(newState)\n },\n [panelOpenByScope],\n )\n\n // Use localStorage to persist tab preferences by scope\n const [tabsByScope, setTabByScope] = useSessionStorage<TabStateByScope>(TABS_BY_SCOPE_KEY, {})\n\n // Get the current tab for a specific scope\n const getTabForScope = useCallback(\n (scope: string): DetailsPanelTab => {\n // Check if we have a saved preference for this scope\n const tab = tabsByScope[scope]\n if (isDetailsPanelTab(tab)) {\n return tab\n }\n\n // Fall back to default\n return defaultTab\n },\n [tabsByScope, defaultTab],\n )\n\n // Set tab for a scope\n\n // is the slide out open?\n const [slideOut, setSlideOut] = useState<null | SlideOut>(null)\n\n // open the slide out\n const openSlideOut = useCallback<DetailsPanelContextType['openSlideOut']>((params) => {\n setSlideOut(params)\n }, [])\n\n // close the slide out\n const closeSlideOut = useCallback(() => {\n setSlideOut(null)\n if (slideOut) {\n setHighlightedActivities([])\n }\n }, [])\n\n // close slide out whenever the page changes\n useEffect(() => {\n closeSlideOut()\n }, [forwardedProps.useLocation().pathname])\n\n const [pip, setPip] = useState<DetailsPanelPip | null>(null)\n\n const openPip = useCallback((pip: DetailsPanelPip) => {\n setPip(pip)\n }, [])\n const closePip = useCallback(() => {\n setPip(null)\n }, [])\n\n const [entities, setEntities] = useState<Entities | null>(null)\n\n const [highlightedActivities, setHighlightedActivities] = useState<string[]>([])\n\n const { uriType, uri, entity, getUriEntities } = useURIContext()\n const [searchParams] = forwardedProps.useSearchParams()\n\n const project = searchParams.get('project')\n const type = searchParams.get('type')\n const id = searchParams.get('id')\n const activity = searchParams.get('activity')\n\n // on first load or URL param change, check if there is a uri or URL params and open details panel if present\n useEffect(() => {\n // Priority 1: Check for 'uri' parameter (ayon+entity://...)\n if (uriType === 'entity' && entity && entity.entityType !== 'product') {\n getUriEntities()\n .then((result) => {\n if (result.length === 0) return\n\n const entityUriData = result.find((r) => r.uri === uri)\n const entityData = entityUriData?.entities?.[0]\n\n if (!entityUriData || !entityData) return\n const projectName = entityData?.projectName || entity.projectName || ''\n const id =\n entityData.representationId ||\n entityData.versionId ||\n entityData.productId ||\n entityData.taskId ||\n entityData.folderId\n\n if (!projectName || !id) return\n\n const newEntities: Entities = {\n entityType: entity.entityType as DetailsPanelEntityType,\n entities: [\n {\n id: id,\n projectName: projectName,\n },\n ],\n source: 'uri',\n }\n\n setEntities(newEntities)\n })\n .catch((err) => {\n console.warn('Failed to get URI entities:', err)\n })\n return\n }\n\n // Priority 2: Check for URL params (project, type, id)\n if (project && type && id) {\n const newEntities: Entities = {\n entityType: type as DetailsPanelEntityType,\n entities: [\n {\n id,\n projectName: project,\n },\n ],\n source: 'url',\n }\n\n setEntities(newEntities)\n\n // if there is an activity param, open the feed tab (activity is shown by default)\n\n if (activity) {\n setHighlightedActivities([activity])\n setTabByScope({\n ...tabsByScope,\n overview: 'feed',\n })\n }\n }\n }, [project, type, id])\n\n const value = {\n // open state for the panel by scope\n panelOpenByScope,\n getOpenForScope,\n setPanelOpen,\n setPanelOpenByScope,\n // tab preferences\n tabsByScope,\n getTabForScope,\n // slide out state\n slideOut,\n openSlideOut,\n closeSlideOut,\n // highlighted activities\n highlightedActivities,\n setHighlightedActivities,\n // PiP state\n pip,\n openPip,\n closePip,\n // entities state\n entities,\n setEntities,\n feedAnnotations,\n setFeedAnnotations,\n bundleMode,\n isGuest,\n hasLicense,\n onPowerFeature: setPowerpackDialog,\n ...forwardedProps,\n }\n\n return <DetailsPanelContext.Provider value={value}>{children}</DetailsPanelContext.Provider>\n}\n\n// Custom hook to use the details context\nexport const useDetailsPanelContext = (): DetailsPanelContextType => {\n const context = useContext(DetailsPanelContext)\n if (context === undefined) {\n throw new Error('useDetailsPanel must be used within a DetailsPanelProvider')\n }\n return context\n}\n\nconst TABS_BY_SCOPE_KEY = 'details/tabs-by-scope'\n\nexport const setDetailsPanelTabForScope = (scope: string, tab: DetailsPanelTab) => {\n const current = readLocalStorage<TabStateByScope>(TABS_BY_SCOPE_KEY, {})\n writeLocalStorage(TABS_BY_SCOPE_KEY, { ...current, [scope]: tab })\n}\n\n// Add a specialized hook for using a panel in a specific scope\nexport const useScopedDetailsPanel = (scope: string) => {\n const { getOpenForScope, setPanelOpen, getTabForScope } = useDetailsPanelContext()\n\n const [tabsByScope, setTabsByScope] = useSessionStorage<TabStateByScope>(TABS_BY_SCOPE_KEY, {})\n\n // derived from localStorage state, which useSessionStorage keeps in sync across hook instances\n const storedTab = tabsByScope[scope]\n const currentTab = isDetailsPanelTab(storedTab) ? storedTab : getTabForScope(scope)\n\n const updateTab = useCallback(\n (newTab: DetailsPanelTab) => {\n setTabsByScope((prev) => ({ ...prev, [scope]: newTab }))\n },\n [scope, setTabsByScope],\n )\n\n const isFeed = currentTab === 'feed'\n\n return {\n isOpen: getOpenForScope(scope),\n setOpen: (isOpen: boolean) => setPanelOpen(scope, isOpen),\n currentTab,\n setTab: updateTab,\n isFeed,\n }\n}\n"],"names":["DETAILS_PANEL_TABS","isDetailsPanelTab","tab","DetailsPanelProvider","children","defaultTab","hasLicenseProp","debug","forwardedProps","user","bundleMode","getBundleModeFromUser","isGuest","powerLicense","setPowerpackDialog","usePowerpack","hasLicense","panelOpenByScope","setPanelOpenByScope","useState","feedAnnotations","setFeedAnnotations","getOpenForScope","useCallback","scope","setPanelOpen","isOpen","newState","tabsByScope","setTabByScope","useSessionStorage","TABS_BY_SCOPE_KEY","getTabForScope","slideOut","setSlideOut","openSlideOut","params","closeSlideOut","setHighlightedActivities","useEffect","pip","setPip","openPip","closePip","entities","setEntities","highlightedActivities","uriType","uri","entity","getUriEntities","useURIContext","searchParams","project","type","id","activity","result","entityUriData","r","entityData","projectName","newEntities","err","value","jsx","DetailsPanelContext","useDetailsPanelContext","context","useContext","setDetailsPanelTabForScope","current","readLocalStorage","writeLocalStorage","useScopedDetailsPanel","setTabsByScope","storedTab","currentTab","updateTab","newTab","prev","isFeed"],"mappings":"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"}
1
+ {"version":3,"file":"DetailsPanelContext.es.js","sources":["../../../../src/context/DetailsPanelContext.tsx"],"sourcesContent":["import React, { ReactNode, useCallback, useContext, useEffect, useState } from 'react'\nimport { QueryFilter, UserModel, DetailsPanelEntityType } from '@shared/api'\nimport { useLocation, useNavigate, useParams, useSearchParams } from 'react-router-dom'\nimport { SavedAnnotationMetadata } from '@shared/containers'\nimport { PowerpackFeature, usePowerpack } from './PowerpackContext'\nimport { useURIContext } from './UriContext'\nimport { useSessionStorage, readLocalStorage, writeLocalStorage } from '@shared/hooks'\nimport type { SubtasksManagerProps } from '@shared/components'\nimport { DetailsPanelContext } from './DetailsPanelContextInstance'\nimport { BundleMode, getBundleModeFromUser } from '@shared/util'\n\n// High-level tabs for the details panel\nexport type DetailsPanelTab = 'feed' | 'subtasks' | 'details' | 'files'\n\n// Filters within the feed tab\nexport type FeedFilter = QueryFilter\n\nexport type SlideOut = {\n entityId: string\n entityType: DetailsPanelEntityType\n projectName: string\n}\n\nexport type DetailsPanelPip = {\n entityType: DetailsPanelEntityType\n entities: { id: string; projectName: string }[]\n scope: string\n}\n\nexport type Entities = {\n entityType: DetailsPanelEntityType\n entities: { id: string; projectName: string }[]\n entitySubTypes?: string[]\n source?: 'uri' | 'url' | 'related' // uri = ayon+entity://..., url = ?project=...&type=...&id=...\n}\n\nexport interface OpenStateByScope {\n [scope: string]: boolean\n}\n\n// Create a new interface for managing tab state by scope\nexport interface TabStateByScope {\n [scope: string]: DetailsPanelTab\n}\n\nconst DETAILS_PANEL_TABS: DetailsPanelTab[] = ['feed', 'subtasks', 'details', 'files']\n\nconst isDetailsPanelTab = (tab: unknown): tab is DetailsPanelTab =>\n typeof tab === 'string' && DETAILS_PANEL_TABS.includes(tab as DetailsPanelTab)\n\n// these props get forwarded to the details panel value\n// it's mainly redux callbacks that cannot be used in shared library\nexport interface DetailsPanelContextProps {\n dispatch?: any // this is a redux dispatch function and it's quite annoying we need to do this\n user: UserModel\n viewer?: {\n reviewableIds: string[]\n taskId?: string | null\n folderId?: string | null\n }\n // redux callback actions\n onOpenImage?: (args: any) => void\n onGoToFrame?: (frame: number) => void\n onOpenViewer?: (args: any) => void\n onUpdateEntity?: (data: { operations: any[]; entityType: string }) => void\n // route hooks\n useParams: typeof useParams\n useNavigate: typeof useNavigate\n useLocation: typeof useLocation\n useSearchParams: typeof useSearchParams\n feedAnnotationsEnabled?: boolean\n hasLicense?: boolean\n // SubtasksManager component\n SubtasksManager?: React.ComponentType<SubtasksManagerProps>\n // debugging used to simulate different values\n debug?: {\n isDeveloperMode?: boolean\n isGuest?: boolean\n hasLicense?: boolean\n }\n}\n\n// Interface for our simplified context\nexport interface DetailsPanelContextType extends DetailsPanelContextProps {\n // user\n bundleMode: BundleMode\n isGuest: boolean\n // Open state for the panel by scope\n panelOpenByScope: OpenStateByScope\n getOpenForScope: (scope: string) => boolean\n setPanelOpen: (scope: string, isOpen: boolean) => void\n setPanelOpenByScope: (newState: OpenStateByScope) => void\n\n // Tab preferences by scope\n tabsByScope: TabStateByScope\n getTabForScope: (scope: string) => DetailsPanelTab\n\n // Slide out state\n slideOut: null | SlideOut\n openSlideOut: (slideOut: SlideOut) => void\n closeSlideOut: () => void\n\n // Highlighted activities\n highlightedActivities: string[]\n setHighlightedActivities: (activities: string[]) => void\n\n // PiP state\n pip: DetailsPanelPip | null\n openPip: (pip: DetailsPanelPip) => void\n closePip: () => void\n\n // Entities state\n entities: Entities | null\n setEntities: (entities: Entities | null) => void\n\n // Annotations\n feedAnnotations: SavedAnnotationMetadata[]\n setFeedAnnotations: (annotations: SavedAnnotationMetadata[]) => void\n\n // powerpack\n onPowerFeature: (feature: PowerpackFeature) => void\n}\n\n// Provider component\nexport interface DetailsPanelProviderProps extends DetailsPanelContextProps {\n children: ReactNode\n defaultTab?: DetailsPanelTab\n}\n\nexport const DetailsPanelProvider: React.FC<DetailsPanelProviderProps> = ({\n children,\n defaultTab = 'feed',\n hasLicense: hasLicenseProp,\n debug = {},\n ...forwardedProps\n}) => {\n const user = forwardedProps.user\n const bundleMode = getBundleModeFromUser(user)\n const isGuest = 'isGuest' in debug ? (debug.isGuest as boolean) : user?.data?.isGuest\n\n // get license from powerpack or forwarded down from props\n const { powerLicense, setPowerpackDialog } = usePowerpack()\n const hasLicense =\n 'hasLicense' in debug ? (debug.hasLicense as boolean) : !!powerLicense || hasLicenseProp\n\n // keep track of the currently open panel by scope\n const [panelOpenByScope, setPanelOpenByScope] = useState<OpenStateByScope>({})\n const [feedAnnotations, setFeedAnnotations] = useState<SavedAnnotationMetadata[]>([])\n\n // get the current open state for a specific scope\n const getOpenForScope = useCallback(\n (scope: string): boolean => {\n // Check if we have a saved preference for this scope\n if (panelOpenByScope[scope]) {\n return panelOpenByScope[scope]\n }\n\n // Fall back to default\n return false\n },\n [panelOpenByScope],\n )\n // Set open state for a scope\n const setPanelOpen = useCallback(\n (scope: string, isOpen: boolean) => {\n // Create a new state object based on current open state\n const newState = { ...panelOpenByScope }\n newState[scope] = isOpen\n\n // Update the state with the new object\n setPanelOpenByScope(newState)\n },\n [panelOpenByScope],\n )\n\n // Use localStorage to persist tab preferences by scope\n const [tabsByScope, setTabByScope] = useSessionStorage<TabStateByScope>(TABS_BY_SCOPE_KEY, {})\n\n // Get the current tab for a specific scope\n const getTabForScope = useCallback(\n (scope: string): DetailsPanelTab => {\n // Check if we have a saved preference for this scope\n const tab = tabsByScope[scope]\n if (isDetailsPanelTab(tab)) {\n return tab\n }\n\n // Fall back to default\n return defaultTab\n },\n [tabsByScope, defaultTab],\n )\n\n // Set tab for a scope\n\n // is the slide out open?\n const [slideOut, setSlideOut] = useState<null | SlideOut>(null)\n\n // open the slide out\n const openSlideOut = useCallback<DetailsPanelContextType['openSlideOut']>((params) => {\n setSlideOut(params)\n }, [])\n\n // close the slide out\n const closeSlideOut = useCallback(() => {\n setSlideOut(null)\n if (slideOut) {\n setHighlightedActivities([])\n }\n }, [])\n\n // close slide out whenever the page changes\n useEffect(() => {\n closeSlideOut()\n }, [forwardedProps.useLocation().pathname])\n\n const [pip, setPip] = useState<DetailsPanelPip | null>(null)\n\n const openPip = useCallback((pip: DetailsPanelPip) => {\n setPip(pip)\n }, [])\n const closePip = useCallback(() => {\n setPip(null)\n }, [])\n\n const [entities, setEntities] = useState<Entities | null>(null)\n\n const [highlightedActivities, setHighlightedActivities] = useState<string[]>([])\n\n const { uriType, uri, entity, getUriEntities } = useURIContext()\n const [searchParams] = forwardedProps.useSearchParams()\n\n const project = searchParams.get('project')\n const type = searchParams.get('type')\n const id = searchParams.get('id')\n const activity = searchParams.get('activity')\n\n // on first load or URL param change, check if there is a uri or URL params and open details panel if present\n useEffect(() => {\n // closing the panel deletes these params; bail so the stale uri state below can't reopen it\n if (!project && !type && !id) return\n\n // Priority 1: Check for 'uri' parameter (ayon+entity://...)\n if (uriType === 'entity' && entity && entity.entityType !== 'product') {\n getUriEntities()\n .then((result) => {\n if (result.length === 0) return\n\n const entityUriData = result.find((r) => r.uri === uri)\n const entityData = entityUriData?.entities?.[0]\n\n if (!entityUriData || !entityData) return\n const projectName = entityData?.projectName || entity.projectName || ''\n const id =\n entityData.representationId ||\n entityData.versionId ||\n entityData.productId ||\n entityData.taskId ||\n entityData.folderId\n\n if (!projectName || !id) return\n\n const newEntities: Entities = {\n entityType: entity.entityType as DetailsPanelEntityType,\n entities: [\n {\n id: id,\n projectName: projectName,\n },\n ],\n source: 'uri',\n }\n\n setEntities(newEntities)\n })\n .catch((err) => {\n console.warn('Failed to get URI entities:', err)\n })\n return\n }\n\n // Priority 2: Check for URL params (project, type, id)\n if (project && type && id) {\n const newEntities: Entities = {\n entityType: type as DetailsPanelEntityType,\n entities: [\n {\n id,\n projectName: project,\n },\n ],\n source: 'url',\n }\n\n setEntities(newEntities)\n\n // if there is an activity param, open the feed tab (activity is shown by default)\n\n if (activity) {\n setHighlightedActivities([activity])\n setTabByScope({\n ...tabsByScope,\n overview: 'feed',\n })\n }\n }\n }, [project, type, id])\n\n const value = {\n // open state for the panel by scope\n panelOpenByScope,\n getOpenForScope,\n setPanelOpen,\n setPanelOpenByScope,\n // tab preferences\n tabsByScope,\n getTabForScope,\n // slide out state\n slideOut,\n openSlideOut,\n closeSlideOut,\n // highlighted activities\n highlightedActivities,\n setHighlightedActivities,\n // PiP state\n pip,\n openPip,\n closePip,\n // entities state\n entities,\n setEntities,\n feedAnnotations,\n setFeedAnnotations,\n bundleMode,\n isGuest,\n hasLicense,\n onPowerFeature: setPowerpackDialog,\n ...forwardedProps,\n }\n\n return <DetailsPanelContext.Provider value={value}>{children}</DetailsPanelContext.Provider>\n}\n\n// Custom hook to use the details context\nexport const useDetailsPanelContext = (): DetailsPanelContextType => {\n const context = useContext(DetailsPanelContext)\n if (context === undefined) {\n throw new Error('useDetailsPanel must be used within a DetailsPanelProvider')\n }\n return context\n}\n\nconst TABS_BY_SCOPE_KEY = 'details/tabs-by-scope'\n\nexport const setDetailsPanelTabForScope = (scope: string, tab: DetailsPanelTab) => {\n const current = readLocalStorage<TabStateByScope>(TABS_BY_SCOPE_KEY, {})\n writeLocalStorage(TABS_BY_SCOPE_KEY, { ...current, [scope]: tab })\n}\n\n// Add a specialized hook for using a panel in a specific scope\nexport const useScopedDetailsPanel = (scope: string) => {\n const { getOpenForScope, setPanelOpen, getTabForScope } = useDetailsPanelContext()\n\n const [tabsByScope, setTabsByScope] = useSessionStorage<TabStateByScope>(TABS_BY_SCOPE_KEY, {})\n\n // derived from localStorage state, which useSessionStorage keeps in sync across hook instances\n const storedTab = tabsByScope[scope]\n const currentTab = isDetailsPanelTab(storedTab) ? storedTab : getTabForScope(scope)\n\n const updateTab = useCallback(\n (newTab: DetailsPanelTab) => {\n setTabsByScope((prev) => ({ ...prev, [scope]: newTab }))\n },\n [scope, setTabsByScope],\n )\n\n const isFeed = currentTab === 'feed'\n\n return {\n isOpen: getOpenForScope(scope),\n setOpen: (isOpen: boolean) => setPanelOpen(scope, isOpen),\n currentTab,\n setTab: updateTab,\n isFeed,\n }\n}\n"],"names":["DETAILS_PANEL_TABS","isDetailsPanelTab","tab","DetailsPanelProvider","children","defaultTab","hasLicenseProp","debug","forwardedProps","user","bundleMode","getBundleModeFromUser","isGuest","powerLicense","setPowerpackDialog","usePowerpack","hasLicense","panelOpenByScope","setPanelOpenByScope","useState","feedAnnotations","setFeedAnnotations","getOpenForScope","useCallback","scope","setPanelOpen","isOpen","newState","tabsByScope","setTabByScope","useSessionStorage","TABS_BY_SCOPE_KEY","getTabForScope","slideOut","setSlideOut","openSlideOut","params","closeSlideOut","setHighlightedActivities","useEffect","pip","setPip","openPip","closePip","entities","setEntities","highlightedActivities","uriType","uri","entity","getUriEntities","useURIContext","searchParams","project","type","id","activity","result","entityUriData","r","entityData","projectName","newEntities","err","value","jsx","DetailsPanelContext","useDetailsPanelContext","context","useContext","setDetailsPanelTabForScope","current","readLocalStorage","writeLocalStorage","useScopedDetailsPanel","setTabsByScope","storedTab","currentTab","updateTab","newTab","prev","isFeed"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const u=require("lodash"),g=require("../../node_modules/primereact/confirmdialog/confirmdialog.esm.cjs.js"),s=require("react-toastify"),C=({label:e="",message:f="Are you sure? This cannot be undone",deleteLabel:t,accept:m=async()=>{},showToasts:o=!0,isArchive:n=!1,onSuccess:i,onError:c,...d})=>{t=t||(n?"Archive":"Delete");const l=n?"archiving":"deleting",p=n?"archived":"deleted";return g.confirmDialog({header:d.header||`${t} ${e}`,message:f,accept:async()=>{const r=o?s.toast.loading(`${u.upperFirst(l)} ${e.toLowerCase()}...`,{autoClose:!1}):null;try{await m(),o&&r&&s.toast.update(r,{render:`${e} ${p}`,type:"success",autoClose:5e3,isLoading:!1}),i&&i()}catch(a){const y=typeof a=="string"?a:a.message||`Error ${l} ${e}`;o&&r&&s.toast.update(r,{render:y,type:"error",autoClose:5e3,isLoading:!1}),c&&c(a)}},reject:()=>{},acceptLabel:u.upperFirst(t),rejectLabel:"Cancel",acceptClassName:"button-danger",style:{minWidth:400,maxWidth:600},...d})};exports.ConfirmDialog=g.ConfirmDialog;exports.confirmDelete=C;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const f=require("lodash"),s=require("../../node_modules/primereact/confirmdialog/confirmdialog.esm.cjs.js"),i=require("react-toastify"),C=s.confirmDialog,$=({label:e="",message:m="Are you sure? This cannot be undone",deleteLabel:t,accept:y=async()=>{},showToasts:o=!0,isArchive:n=!1,onSuccess:c,onError:l,onFinish:d,...u})=>{t=t||(n?"Archive":"Delete");const g=n?"archiving":"deleting",p=n?"archived":"deleted";return s.confirmDialog({header:u.header||`${t} ${e}`,message:m,accept:async()=>{const r=o?i.toast.loading(`${f.upperFirst(g)} ${e.toLowerCase()}...`,{autoClose:!1}):null;try{await y(),o&&r&&i.toast.update(r,{render:`${e} ${p}`,type:"success",autoClose:5e3,isLoading:!1}),c&&c()}catch(a){const D=typeof a=="string"?a:a.message||`Error ${g} ${e}`;o&&r&&i.toast.update(r,{render:D,type:"error",autoClose:5e3,isLoading:!1}),l&&l(a)}finally{d&&d()}},reject:()=>{},acceptLabel:f.upperFirst(t),rejectLabel:"Cancel",acceptClassName:"button-danger",style:{minWidth:400,maxWidth:600},...u})};exports.ConfirmDialog=s.ConfirmDialog;exports.confirmDelete=$;exports.confirmDeleteDialog=C;
2
2
  //# sourceMappingURL=confirmDelete.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"confirmDelete.cjs.js","sources":["../../../../src/util/confirmDelete.ts"],"sourcesContent":["import { upperFirst } from 'lodash'\nimport { confirmDialog, ConfirmDialog, ConfirmDialogOptions } from 'primereact/confirmdialog'\nimport { toast } from 'react-toastify'\n\nexport interface ConfirmDeleteOptions extends Omit<ConfirmDialogOptions, 'accept'> {\n label?: string\n message?: string | React.ReactNode\n deleteLabel?: string\n accept?: () => Promise<any>\n showToasts?: boolean\n isArchive?: boolean\n onSuccess?: () => void\n onError?: (error: any) => void\n}\n\nexport const confirmDelete = ({\n label = '',\n message = 'Are you sure? This cannot be undone',\n deleteLabel,\n accept = async () => {},\n showToasts = true,\n isArchive = false,\n onSuccess,\n onError,\n ...props\n}: ConfirmDeleteOptions): ReturnType<typeof confirmDialog> => {\n deleteLabel = deleteLabel || (isArchive ? 'Archive' : 'Delete')\n const deleteLabelPresent = isArchive ? 'archiving' : 'deleting'\n const deleteLabelPast = isArchive ? 'archived' : 'deleted'\n\n return confirmDialog({\n header: props.header || `${deleteLabel} ${label}`,\n message,\n accept: async () => {\n const toastId = showToasts\n ? toast.loading(`${upperFirst(deleteLabelPresent)} ${label.toLowerCase()}...`, {\n autoClose: false,\n })\n : null\n try {\n await accept()\n\n showToasts &&\n toastId &&\n toast.update(toastId, {\n render: `${label} ${deleteLabelPast}`,\n type: 'success',\n autoClose: 5000,\n isLoading: false,\n })\n\n onSuccess && onSuccess()\n } catch (error: any) {\n const errorMessage =\n typeof error === 'string'\n ? error\n : error.message || `Error ${deleteLabelPresent} ${label}`\n\n showToasts &&\n toastId &&\n toast.update(toastId, {\n render: errorMessage,\n type: 'error',\n autoClose: 5000,\n isLoading: false,\n })\n\n onError && onError(error)\n }\n },\n reject: () => {},\n acceptLabel: upperFirst(deleteLabel),\n rejectLabel: 'Cancel',\n acceptClassName: 'button-danger',\n style: { minWidth: 400, maxWidth: 600 },\n ...props,\n })\n}\n\nexport { ConfirmDialog }\n"],"names":["confirmDelete","label","message","deleteLabel","accept","showToasts","isArchive","onSuccess","onError","props","deleteLabelPresent","deleteLabelPast","confirmDialog","toastId","toast","upperFirst","error","errorMessage"],"mappings":"wNAeaA,EAAgB,CAAC,CAC5B,MAAAC,EAAQ,GACR,QAAAC,EAAU,sCACV,YAAAC,EACA,OAAAC,EAAS,SAAY,CAAC,EACtB,WAAAC,EAAa,GACb,UAAAC,EAAY,GACZ,UAAAC,EACA,QAAAC,EACA,GAAGC,CACL,IAA8D,CAC5DN,EAAcA,IAAgBG,EAAY,UAAY,UACtD,MAAMI,EAAqBJ,EAAY,YAAc,WAC/CK,EAAkBL,EAAY,WAAa,UAEjD,OAAOM,gBAAc,CACnB,OAAQH,EAAM,QAAU,GAAGN,CAAW,IAAIF,CAAK,GAC/C,QAAAC,EACA,OAAQ,SAAY,CAClB,MAAMW,EAAUR,EACZS,QAAM,QAAQ,GAAGC,EAAAA,WAAWL,CAAkB,CAAC,IAAIT,EAAM,YAAA,CAAa,MAAO,CAC3E,UAAW,EAAA,CACZ,EACD,KACJ,GAAI,CACF,MAAMG,EAAA,EAENC,GACEQ,GACAC,QAAM,OAAOD,EAAS,CACpB,OAAQ,GAAGZ,CAAK,IAAIU,CAAe,GACnC,KAAM,UACN,UAAW,IACX,UAAW,EAAA,CACZ,EAEHJ,GAAaA,EAAA,CACf,OAASS,EAAY,CACnB,MAAMC,EACJ,OAAOD,GAAU,SACbA,EACAA,EAAM,SAAW,SAASN,CAAkB,IAAIT,CAAK,GAE3DI,GACEQ,GACAC,QAAM,OAAOD,EAAS,CACpB,OAAQI,EACR,KAAM,QACN,UAAW,IACX,UAAW,EAAA,CACZ,EAEHT,GAAWA,EAAQQ,CAAK,CAC1B,CACF,EACA,OAAQ,IAAM,CAAC,EACf,YAAaD,EAAAA,WAAWZ,CAAW,EACnC,YAAa,SACb,gBAAiB,gBACjB,MAAO,CAAE,SAAU,IAAK,SAAU,GAAA,EAClC,GAAGM,CAAA,CACJ,CACH"}
1
+ {"version":3,"file":"confirmDelete.cjs.js","sources":["../../../../src/util/confirmDelete.ts"],"sourcesContent":["import { upperFirst } from 'lodash'\nimport { confirmDialog, ConfirmDialog, ConfirmDialogOptions } from 'primereact/confirmdialog'\nimport { toast } from 'react-toastify'\n\nexport interface ConfirmDeleteOptions extends Omit<ConfirmDialogOptions, 'accept'> {\n label?: string\n message?: string | React.ReactNode\n deleteLabel?: string\n accept?: () => Promise<any>\n showToasts?: boolean\n isArchive?: boolean\n onSuccess?: () => void\n onFinish?: () => void\n onError?: (error: any) => void\n}\n\nexport const confirmDeleteDialog = confirmDialog\n\nexport const confirmDelete = ({\n label = '',\n message = 'Are you sure? This cannot be undone',\n deleteLabel,\n accept = async () => {},\n showToasts = true,\n isArchive = false,\n onSuccess,\n onError,\n onFinish,\n ...props\n}: ConfirmDeleteOptions): ReturnType<typeof confirmDialog> => {\n deleteLabel = deleteLabel || (isArchive ? 'Archive' : 'Delete')\n const deleteLabelPresent = isArchive ? 'archiving' : 'deleting'\n const deleteLabelPast = isArchive ? 'archived' : 'deleted'\n\n return confirmDialog({\n header: props.header || `${deleteLabel} ${label}`,\n message,\n accept: async () => {\n const toastId = showToasts\n ? toast.loading(`${upperFirst(deleteLabelPresent)} ${label.toLowerCase()}...`, {\n autoClose: false,\n })\n : null\n try {\n await accept()\n\n showToasts &&\n toastId &&\n toast.update(toastId, {\n render: `${label} ${deleteLabelPast}`,\n type: 'success',\n autoClose: 5000,\n isLoading: false,\n })\n\n onSuccess && onSuccess()\n } catch (error: any) {\n const errorMessage =\n typeof error === 'string'\n ? error\n : error.message || `Error ${deleteLabelPresent} ${label}`\n\n showToasts &&\n toastId &&\n toast.update(toastId, {\n render: errorMessage,\n type: 'error',\n autoClose: 5000,\n isLoading: false,\n })\n\n onError && onError(error)\n } finally {\n onFinish && onFinish()\n }\n },\n reject: () => {},\n acceptLabel: upperFirst(deleteLabel),\n rejectLabel: 'Cancel',\n acceptClassName: 'button-danger',\n style: { minWidth: 400, maxWidth: 600 },\n ...props,\n })\n}\n\nexport { ConfirmDialog }\n"],"names":["confirmDeleteDialog","confirmDialog","confirmDelete","label","message","deleteLabel","accept","showToasts","isArchive","onSuccess","onError","onFinish","props","deleteLabelPresent","deleteLabelPast","toastId","toast","upperFirst","error","errorMessage"],"mappings":"wNAgBaA,EAAsBC,EAAAA,cAEtBC,EAAgB,CAAC,CAC5B,MAAAC,EAAQ,GACR,QAAAC,EAAU,sCACV,YAAAC,EACA,OAAAC,EAAS,SAAY,CAAC,EACtB,WAAAC,EAAa,GACb,UAAAC,EAAY,GACZ,UAAAC,EACA,QAAAC,EACA,SAAAC,EACA,GAAGC,CACL,IAA8D,CAC5DP,EAAcA,IAAgBG,EAAY,UAAY,UACtD,MAAMK,EAAqBL,EAAY,YAAc,WAC/CM,EAAkBN,EAAY,WAAa,UAEjD,OAAOP,gBAAc,CACnB,OAAQW,EAAM,QAAU,GAAGP,CAAW,IAAIF,CAAK,GAC/C,QAAAC,EACA,OAAQ,SAAY,CAClB,MAAMW,EAAUR,EACZS,QAAM,QAAQ,GAAGC,EAAAA,WAAWJ,CAAkB,CAAC,IAAIV,EAAM,YAAA,CAAa,MAAO,CAC3E,UAAW,EAAA,CACZ,EACD,KACJ,GAAI,CACF,MAAMG,EAAA,EAENC,GACEQ,GACAC,QAAM,OAAOD,EAAS,CACpB,OAAQ,GAAGZ,CAAK,IAAIW,CAAe,GACnC,KAAM,UACN,UAAW,IACX,UAAW,EAAA,CACZ,EAEHL,GAAaA,EAAA,CACf,OAASS,EAAY,CACnB,MAAMC,EACJ,OAAOD,GAAU,SACbA,EACAA,EAAM,SAAW,SAASL,CAAkB,IAAIV,CAAK,GAE3DI,GACEQ,GACAC,QAAM,OAAOD,EAAS,CACpB,OAAQI,EACR,KAAM,QACN,UAAW,IACX,UAAW,EAAA,CACZ,EAEHT,GAAWA,EAAQQ,CAAK,CAC1B,QAAA,CACEP,GAAYA,EAAA,CACd,CACF,EACA,OAAQ,IAAM,CAAC,EACf,YAAaM,EAAAA,WAAWZ,CAAW,EACnC,YAAa,SACb,gBAAiB,gBACjB,MAAO,CAAE,SAAU,IAAK,SAAU,GAAA,EAClC,GAAGO,CAAA,CACJ,CACH"}
@@ -1,56 +1,60 @@
1
- import { upperFirst as l } from "lodash";
2
- import { confirmDialog as y } from "../../node_modules/primereact/confirmdialog/confirmdialog.esm.es.js";
3
- import { ConfirmDialog as j } from "../../node_modules/primereact/confirmdialog/confirmdialog.esm.es.js";
4
- import { toast as s } from "react-toastify";
5
- const D = ({
1
+ import { upperFirst as f } from "lodash";
2
+ import { confirmDialog as p } from "../../node_modules/primereact/confirmdialog/confirmdialog.esm.es.js";
3
+ import { ConfirmDialog as W } from "../../node_modules/primereact/confirmdialog/confirmdialog.esm.es.js";
4
+ import { toast as c } from "react-toastify";
5
+ const L = p, x = ({
6
6
  label: e = "",
7
- message: p = "Are you sure? This cannot be undone",
7
+ message: u = "Are you sure? This cannot be undone",
8
8
  deleteLabel: t,
9
- accept: u = async () => {
9
+ accept: g = async () => {
10
10
  },
11
11
  showToasts: o = !0,
12
12
  isArchive: n = !1,
13
- onSuccess: c,
13
+ onSuccess: s,
14
14
  onError: i,
15
- ...d
15
+ onFinish: d,
16
+ ...l
16
17
  }) => {
17
18
  t = t || (n ? "Archive" : "Delete");
18
- const m = n ? "archiving" : "deleting", f = n ? "archived" : "deleted";
19
- return y({
20
- header: d.header || `${t} ${e}`,
21
- message: p,
19
+ const m = n ? "archiving" : "deleting", y = n ? "archived" : "deleted";
20
+ return p({
21
+ header: l.header || `${t} ${e}`,
22
+ message: u,
22
23
  accept: async () => {
23
- const r = o ? s.loading(`${l(m)} ${e.toLowerCase()}...`, {
24
+ const r = o ? c.loading(`${f(m)} ${e.toLowerCase()}...`, {
24
25
  autoClose: !1
25
26
  }) : null;
26
27
  try {
27
- await u(), o && r && s.update(r, {
28
- render: `${e} ${f}`,
28
+ await g(), o && r && c.update(r, {
29
+ render: `${e} ${y}`,
29
30
  type: "success",
30
31
  autoClose: 5e3,
31
32
  isLoading: !1
32
- }), c && c();
33
+ }), s && s();
33
34
  } catch (a) {
34
- const g = typeof a == "string" ? a : a.message || `Error ${m} ${e}`;
35
- o && r && s.update(r, {
36
- render: g,
35
+ const $ = typeof a == "string" ? a : a.message || `Error ${m} ${e}`;
36
+ o && r && c.update(r, {
37
+ render: $,
37
38
  type: "error",
38
39
  autoClose: 5e3,
39
40
  isLoading: !1
40
41
  }), i && i(a);
42
+ } finally {
43
+ d && d();
41
44
  }
42
45
  },
43
46
  reject: () => {
44
47
  },
45
- acceptLabel: l(t),
48
+ acceptLabel: f(t),
46
49
  rejectLabel: "Cancel",
47
50
  acceptClassName: "button-danger",
48
51
  style: { minWidth: 400, maxWidth: 600 },
49
- ...d
52
+ ...l
50
53
  });
51
54
  };
52
55
  export {
53
- j as ConfirmDialog,
54
- D as confirmDelete
56
+ W as ConfirmDialog,
57
+ x as confirmDelete,
58
+ L as confirmDeleteDialog
55
59
  };
56
60
  //# sourceMappingURL=confirmDelete.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"confirmDelete.es.js","sources":["../../../../src/util/confirmDelete.ts"],"sourcesContent":["import { upperFirst } from 'lodash'\nimport { confirmDialog, ConfirmDialog, ConfirmDialogOptions } from 'primereact/confirmdialog'\nimport { toast } from 'react-toastify'\n\nexport interface ConfirmDeleteOptions extends Omit<ConfirmDialogOptions, 'accept'> {\n label?: string\n message?: string | React.ReactNode\n deleteLabel?: string\n accept?: () => Promise<any>\n showToasts?: boolean\n isArchive?: boolean\n onSuccess?: () => void\n onError?: (error: any) => void\n}\n\nexport const confirmDelete = ({\n label = '',\n message = 'Are you sure? This cannot be undone',\n deleteLabel,\n accept = async () => {},\n showToasts = true,\n isArchive = false,\n onSuccess,\n onError,\n ...props\n}: ConfirmDeleteOptions): ReturnType<typeof confirmDialog> => {\n deleteLabel = deleteLabel || (isArchive ? 'Archive' : 'Delete')\n const deleteLabelPresent = isArchive ? 'archiving' : 'deleting'\n const deleteLabelPast = isArchive ? 'archived' : 'deleted'\n\n return confirmDialog({\n header: props.header || `${deleteLabel} ${label}`,\n message,\n accept: async () => {\n const toastId = showToasts\n ? toast.loading(`${upperFirst(deleteLabelPresent)} ${label.toLowerCase()}...`, {\n autoClose: false,\n })\n : null\n try {\n await accept()\n\n showToasts &&\n toastId &&\n toast.update(toastId, {\n render: `${label} ${deleteLabelPast}`,\n type: 'success',\n autoClose: 5000,\n isLoading: false,\n })\n\n onSuccess && onSuccess()\n } catch (error: any) {\n const errorMessage =\n typeof error === 'string'\n ? error\n : error.message || `Error ${deleteLabelPresent} ${label}`\n\n showToasts &&\n toastId &&\n toast.update(toastId, {\n render: errorMessage,\n type: 'error',\n autoClose: 5000,\n isLoading: false,\n })\n\n onError && onError(error)\n }\n },\n reject: () => {},\n acceptLabel: upperFirst(deleteLabel),\n rejectLabel: 'Cancel',\n acceptClassName: 'button-danger',\n style: { minWidth: 400, maxWidth: 600 },\n ...props,\n })\n}\n\nexport { ConfirmDialog }\n"],"names":["confirmDelete","label","message","deleteLabel","accept","showToasts","isArchive","onSuccess","onError","props","deleteLabelPresent","deleteLabelPast","confirmDialog","toastId","toast","upperFirst","error","errorMessage"],"mappings":";;;;AAeO,MAAMA,IAAgB,CAAC;AAAA,EAC5B,OAAAC,IAAQ;AAAA,EACR,SAAAC,IAAU;AAAA,EACV,aAAAC;AAAA,EACA,QAAAC,IAAS,YAAY;AAAA,EAAC;AAAA,EACtB,YAAAC,IAAa;AAAA,EACb,WAAAC,IAAY;AAAA,EACZ,WAAAC;AAAA,EACA,SAAAC;AAAA,EACA,GAAGC;AACL,MAA8D;AAC5D,EAAAN,IAAcA,MAAgBG,IAAY,YAAY;AACtD,QAAMI,IAAqBJ,IAAY,cAAc,YAC/CK,IAAkBL,IAAY,aAAa;AAEjD,SAAOM,EAAc;AAAA,IACnB,QAAQH,EAAM,UAAU,GAAGN,CAAW,IAAIF,CAAK;AAAA,IAC/C,SAAAC;AAAA,IACA,QAAQ,YAAY;AAClB,YAAMW,IAAUR,IACZS,EAAM,QAAQ,GAAGC,EAAWL,CAAkB,CAAC,IAAIT,EAAM,YAAA,CAAa,OAAO;AAAA,QAC3E,WAAW;AAAA,MAAA,CACZ,IACD;AACJ,UAAI;AACF,cAAMG,EAAA,GAENC,KACEQ,KACAC,EAAM,OAAOD,GAAS;AAAA,UACpB,QAAQ,GAAGZ,CAAK,IAAIU,CAAe;AAAA,UACnC,MAAM;AAAA,UACN,WAAW;AAAA,UACX,WAAW;AAAA,QAAA,CACZ,GAEHJ,KAAaA,EAAA;AAAA,MACf,SAASS,GAAY;AACnB,cAAMC,IACJ,OAAOD,KAAU,WACbA,IACAA,EAAM,WAAW,SAASN,CAAkB,IAAIT,CAAK;AAE3D,QAAAI,KACEQ,KACAC,EAAM,OAAOD,GAAS;AAAA,UACpB,QAAQI;AAAA,UACR,MAAM;AAAA,UACN,WAAW;AAAA,UACX,WAAW;AAAA,QAAA,CACZ,GAEHT,KAAWA,EAAQQ,CAAK;AAAA,MAC1B;AAAA,IACF;AAAA,IACA,QAAQ,MAAM;AAAA,IAAC;AAAA,IACf,aAAaD,EAAWZ,CAAW;AAAA,IACnC,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,OAAO,EAAE,UAAU,KAAK,UAAU,IAAA;AAAA,IAClC,GAAGM;AAAA,EAAA,CACJ;AACH;"}
1
+ {"version":3,"file":"confirmDelete.es.js","sources":["../../../../src/util/confirmDelete.ts"],"sourcesContent":["import { upperFirst } from 'lodash'\nimport { confirmDialog, ConfirmDialog, ConfirmDialogOptions } from 'primereact/confirmdialog'\nimport { toast } from 'react-toastify'\n\nexport interface ConfirmDeleteOptions extends Omit<ConfirmDialogOptions, 'accept'> {\n label?: string\n message?: string | React.ReactNode\n deleteLabel?: string\n accept?: () => Promise<any>\n showToasts?: boolean\n isArchive?: boolean\n onSuccess?: () => void\n onFinish?: () => void\n onError?: (error: any) => void\n}\n\nexport const confirmDeleteDialog = confirmDialog\n\nexport const confirmDelete = ({\n label = '',\n message = 'Are you sure? This cannot be undone',\n deleteLabel,\n accept = async () => {},\n showToasts = true,\n isArchive = false,\n onSuccess,\n onError,\n onFinish,\n ...props\n}: ConfirmDeleteOptions): ReturnType<typeof confirmDialog> => {\n deleteLabel = deleteLabel || (isArchive ? 'Archive' : 'Delete')\n const deleteLabelPresent = isArchive ? 'archiving' : 'deleting'\n const deleteLabelPast = isArchive ? 'archived' : 'deleted'\n\n return confirmDialog({\n header: props.header || `${deleteLabel} ${label}`,\n message,\n accept: async () => {\n const toastId = showToasts\n ? toast.loading(`${upperFirst(deleteLabelPresent)} ${label.toLowerCase()}...`, {\n autoClose: false,\n })\n : null\n try {\n await accept()\n\n showToasts &&\n toastId &&\n toast.update(toastId, {\n render: `${label} ${deleteLabelPast}`,\n type: 'success',\n autoClose: 5000,\n isLoading: false,\n })\n\n onSuccess && onSuccess()\n } catch (error: any) {\n const errorMessage =\n typeof error === 'string'\n ? error\n : error.message || `Error ${deleteLabelPresent} ${label}`\n\n showToasts &&\n toastId &&\n toast.update(toastId, {\n render: errorMessage,\n type: 'error',\n autoClose: 5000,\n isLoading: false,\n })\n\n onError && onError(error)\n } finally {\n onFinish && onFinish()\n }\n },\n reject: () => {},\n acceptLabel: upperFirst(deleteLabel),\n rejectLabel: 'Cancel',\n acceptClassName: 'button-danger',\n style: { minWidth: 400, maxWidth: 600 },\n ...props,\n })\n}\n\nexport { ConfirmDialog }\n"],"names":["confirmDeleteDialog","confirmDialog","confirmDelete","label","message","deleteLabel","accept","showToasts","isArchive","onSuccess","onError","onFinish","props","deleteLabelPresent","deleteLabelPast","toastId","toast","upperFirst","error","errorMessage"],"mappings":";;;;AAgBO,MAAMA,IAAsBC,GAEtBC,IAAgB,CAAC;AAAA,EAC5B,OAAAC,IAAQ;AAAA,EACR,SAAAC,IAAU;AAAA,EACV,aAAAC;AAAA,EACA,QAAAC,IAAS,YAAY;AAAA,EAAC;AAAA,EACtB,YAAAC,IAAa;AAAA,EACb,WAAAC,IAAY;AAAA,EACZ,WAAAC;AAAA,EACA,SAAAC;AAAA,EACA,UAAAC;AAAA,EACA,GAAGC;AACL,MAA8D;AAC5D,EAAAP,IAAcA,MAAgBG,IAAY,YAAY;AACtD,QAAMK,IAAqBL,IAAY,cAAc,YAC/CM,IAAkBN,IAAY,aAAa;AAEjD,SAAOP,EAAc;AAAA,IACnB,QAAQW,EAAM,UAAU,GAAGP,CAAW,IAAIF,CAAK;AAAA,IAC/C,SAAAC;AAAA,IACA,QAAQ,YAAY;AAClB,YAAMW,IAAUR,IACZS,EAAM,QAAQ,GAAGC,EAAWJ,CAAkB,CAAC,IAAIV,EAAM,YAAA,CAAa,OAAO;AAAA,QAC3E,WAAW;AAAA,MAAA,CACZ,IACD;AACJ,UAAI;AACF,cAAMG,EAAA,GAENC,KACEQ,KACAC,EAAM,OAAOD,GAAS;AAAA,UACpB,QAAQ,GAAGZ,CAAK,IAAIW,CAAe;AAAA,UACnC,MAAM;AAAA,UACN,WAAW;AAAA,UACX,WAAW;AAAA,QAAA,CACZ,GAEHL,KAAaA,EAAA;AAAA,MACf,SAASS,GAAY;AACnB,cAAMC,IACJ,OAAOD,KAAU,WACbA,IACAA,EAAM,WAAW,SAASL,CAAkB,IAAIV,CAAK;AAE3D,QAAAI,KACEQ,KACAC,EAAM,OAAOD,GAAS;AAAA,UACpB,QAAQI;AAAA,UACR,MAAM;AAAA,UACN,WAAW;AAAA,UACX,WAAW;AAAA,QAAA,CACZ,GAEHT,KAAWA,EAAQQ,CAAK;AAAA,MAC1B,UAAA;AACE,QAAAP,KAAYA,EAAA;AAAA,MACd;AAAA,IACF;AAAA,IACA,QAAQ,MAAM;AAAA,IAAC;AAAA,IACf,aAAaM,EAAWZ,CAAW;AAAA,IACnC,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,OAAO,EAAE,UAAU,KAAK,UAAU,IAAA;AAAA,IAClC,GAAGO;AAAA,EAAA,CACJ;AACH;"}
@@ -50,3 +50,4 @@ export * from './Menu';
50
50
  export * from './EntityIcon';
51
51
  export * from './ReviewablesSelector';
52
52
  export * from './ColumnHeaderMenuUI';
53
+ export * from 'primereact/confirmdialog';
@@ -1,4 +1,4 @@
1
- import { FC } from 'react';
1
+ import { SearchFilterRef } from '@ynput/ayon-react-components';
2
2
  import { QueryFilter, ActivityCategory, ChecklistCount } from '../../../api';
3
3
  import { ActivityUser } from '../helpers/groupMinorActivities';
4
4
  interface FeedSearchFilterProps {
@@ -11,5 +11,5 @@ interface FeedSearchFilterProps {
11
11
  checklistCount?: ChecklistCount | undefined;
12
12
  onSearchTextChange?: (text: string) => void;
13
13
  }
14
- declare const FeedSearchFilter: FC<FeedSearchFilterProps>;
14
+ declare const FeedSearchFilter: import('react').ForwardRefExoticComponent<FeedSearchFilterProps & import('react').RefAttributes<SearchFilterRef>>;
15
15
  export default FeedSearchFilter;
@@ -1,6 +1,6 @@
1
1
  import { GroupCountsMap } from '../../../api';
2
2
  import { TableGroupBy } from '../context';
3
- type TaskStatsArgs = {
3
+ export type TaskStatsArgs = {
4
4
  projectName: string;
5
5
  filter?: string;
6
6
  folderFilter?: string;
@@ -8,7 +8,7 @@ type TaskStatsArgs = {
8
8
  folderIds?: string[];
9
9
  taskIds?: string[];
10
10
  };
11
- type VersionStatsArgs = {
11
+ export type VersionStatsArgs = {
12
12
  projectName: string;
13
13
  versionFilter?: string;
14
14
  productFilter?: string;
@@ -36,4 +36,3 @@ export type GroupCountsResult = {
36
36
  isSupported: boolean;
37
37
  };
38
38
  export declare const useGroupCounts: (params: UseGroupCountsParams) => GroupCountsResult;
39
- export {};
@@ -48,6 +48,14 @@ export interface ProjectOverviewContextType {
48
48
  taskGroups: EntityGroup[];
49
49
  taskFilters: QueryFilterParams;
50
50
  folderFilters: QueryFilterParams;
51
+ slicerCountsArgs: {
52
+ projectName: string;
53
+ filter?: string;
54
+ folderFilter?: string;
55
+ search?: string;
56
+ folderIds?: string[];
57
+ taskIds?: string[];
58
+ };
51
59
  selectedFolders: string[];
52
60
  selectedTaskIds: string[];
53
61
  queryFilters: QueryFilterParams;
@@ -70,7 +70,6 @@ export type TableRow = {
70
70
  thumbnail?: {
71
71
  entityId: string;
72
72
  entityType: string;
73
- updatedAt: string | undefined;
74
73
  thumbnailHash?: string;
75
74
  };
76
75
  };
@@ -41,6 +41,7 @@ export type SimpleTableRow = {
41
41
  isDisabled?: boolean;
42
42
  disabledMessage?: string;
43
43
  inactive?: boolean;
44
+ badge?: string | React.ReactNode;
44
45
  };
45
46
  export type SimpleTableRowContextMenuContext = {
46
47
  rowId: string;
@@ -1,9 +1,11 @@
1
1
  import { FC } from 'react';
2
+ import { SlicerCountsSource } from '../hooks/useSlicerCounts';
2
3
  import { SliceType } from '..';
3
4
  import { SliceTypeField } from '../types';
4
5
  export interface SlicerProps {
5
6
  sliceFields: SliceTypeField[];
6
7
  entityTypes?: string[];
7
8
  pinnedSliceType?: SliceType;
9
+ countsSource?: SlicerCountsSource;
8
10
  }
9
11
  export declare const Slicer: FC<SlicerProps>;
@@ -3,6 +3,7 @@ export * from './useProjectAnatomySlices';
3
3
  export * from './useSlicerAttributesData';
4
4
  export * from './useSlicerRemotes';
5
5
  export * from './useTableDataBySlice';
6
+ export * from './useSlicerCounts';
6
7
  export * from './useUsersTable';
7
8
  export * from './useEntityListsSlice';
8
9
  export * from './useSelectedEntityIds';
@@ -0,0 +1,17 @@
1
+ import { GroupCountsMap } from '../../../api';
2
+ import { TaskStatsArgs, VersionStatsArgs } from '../..';
3
+ export type SlicerCountsSource = {
4
+ entity: 'task';
5
+ args: TaskStatsArgs;
6
+ } | {
7
+ entity: 'version';
8
+ args: VersionStatsArgs;
9
+ };
10
+ export type SlicerCounts = {
11
+ counts: GroupCountsMap | undefined;
12
+ total: number;
13
+ filled: number;
14
+ complete: boolean;
15
+ };
16
+ export declare const useSlicerCounts: (source: SlicerCountsSource | undefined, skip?: boolean) => SlicerCounts;
17
+ export default useSlicerCounts;