@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.
- package/dist/Slicer.cjs.js +1 -1
- package/dist/Slicer.es.js +13 -11
- package/dist/Slicer.es.js.map +1 -1
- 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.cjs5.js +1 -1
- package/dist/_virtual/index.cjs6.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.es5.js +5 -2
- package/dist/_virtual/index.es5.js.map +1 -1
- package/dist/_virtual/index.es6.js +2 -5
- package/dist/_virtual/index.es6.js.map +1 -1
- package/dist/components.cjs.js +1 -1
- package/dist/components.es.js +112 -109
- package/dist/components.es.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/generated/graphql.cjs.js +1 -1
- package/dist/shared/src/api/generated/graphql.cjs.js.map +1 -1
- package/dist/shared/src/api/generated/graphql.es.js +1 -1
- package/dist/shared/src/api/generated/graphql.es.js.map +1 -1
- package/dist/shared/src/api/queries/columnStats/columnStats.cjs.js +1 -1
- package/dist/shared/src/api/queries/columnStats/columnStats.cjs.js.map +1 -1
- package/dist/shared/src/api/queries/columnStats/columnStats.es.js +56 -44
- package/dist/shared/src/api/queries/columnStats/columnStats.es.js.map +1 -1
- package/dist/shared/src/api/queries/columnStats/groupCounts.cjs.js +1 -1
- package/dist/shared/src/api/queries/columnStats/groupCounts.cjs.js.map +1 -1
- package/dist/shared/src/api/queries/columnStats/groupCounts.es.js +10 -8
- package/dist/shared/src/api/queries/columnStats/groupCounts.es.js.map +1 -1
- package/dist/shared/src/components/LinksManager/LinksManager.cjs.js.map +1 -1
- package/dist/shared/src/components/LinksManager/LinksManager.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 +220 -216
- package/dist/shared/src/containers/DetailsPanel/DetailsPanel.es.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/components/DetailsPanelMoreMenu/hooks/useMenuOptions.cjs.js +1 -1
- package/dist/shared/src/containers/DetailsPanel/components/DetailsPanelMoreMenu/hooks/useMenuOptions.cjs.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/components/DetailsPanelMoreMenu/hooks/useMenuOptions.es.js +1 -1
- package/dist/shared/src/containers/DetailsPanel/components/DetailsPanelMoreMenu/hooks/useMenuOptions.es.js.map +1 -1
- package/dist/shared/src/containers/Feed/components/FeedSearchFilter.cjs.js +2 -2
- package/dist/shared/src/containers/Feed/components/FeedSearchFilter.cjs.js.map +1 -1
- package/dist/shared/src/containers/Feed/components/FeedSearchFilter.es.js +138 -127
- package/dist/shared/src/containers/Feed/components/FeedSearchFilter.es.js.map +1 -1
- package/dist/shared/src/containers/Feed/context/FeedContext.cjs.js.map +1 -1
- package/dist/shared/src/containers/Feed/context/FeedContext.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 +56 -55
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.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 +249 -254
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useFetchOverviewData.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useGroupCounts.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useGroupCounts.es.js.map +1 -1
- package/dist/shared/src/containers/SimpleTable/SimpleTable.cjs.js +1 -1
- package/dist/shared/src/containers/SimpleTable/SimpleTable.cjs.js.map +1 -1
- package/dist/shared/src/containers/SimpleTable/SimpleTable.es.js +41 -40
- package/dist/shared/src/containers/SimpleTable/SimpleTable.es.js.map +1 -1
- package/dist/shared/src/containers/Slicer/components/Slicer.cjs.js +2 -2
- package/dist/shared/src/containers/Slicer/components/Slicer.cjs.js.map +1 -1
- package/dist/shared/src/containers/Slicer/components/Slicer.es.js +55 -47
- package/dist/shared/src/containers/Slicer/components/Slicer.es.js.map +1 -1
- package/dist/shared/src/containers/Slicer/hooks/useSlicerCounts.cjs.js +2 -0
- package/dist/shared/src/containers/Slicer/hooks/useSlicerCounts.cjs.js.map +1 -0
- package/dist/shared/src/containers/Slicer/hooks/useSlicerCounts.es.js +319 -0
- package/dist/shared/src/containers/Slicer/hooks/useSlicerCounts.es.js.map +1 -0
- package/dist/shared/src/containers/Slicer/hooks/useTableDataBySlice.cjs.js +1 -1
- package/dist/shared/src/containers/Slicer/hooks/useTableDataBySlice.cjs.js.map +1 -1
- package/dist/shared/src/containers/Slicer/hooks/useTableDataBySlice.es.js +118 -104
- package/dist/shared/src/containers/Slicer/hooks/useTableDataBySlice.es.js.map +1 -1
- package/dist/shared/src/context/DetailsPanelContext.cjs.js +1 -1
- package/dist/shared/src/context/DetailsPanelContext.cjs.js.map +1 -1
- package/dist/shared/src/context/DetailsPanelContext.es.js +57 -55
- package/dist/shared/src/context/DetailsPanelContext.es.js.map +1 -1
- package/dist/shared/src/util/confirmDelete.cjs.js +1 -1
- package/dist/shared/src/util/confirmDelete.cjs.js.map +1 -1
- package/dist/shared/src/util/confirmDelete.es.js +28 -24
- package/dist/shared/src/util/confirmDelete.es.js.map +1 -1
- package/dist/types/components/index.d.ts +1 -0
- package/dist/types/containers/Feed/components/FeedSearchFilter.d.ts +2 -2
- package/dist/types/containers/ProjectTreeTable/hooks/useGroupCounts.d.ts +2 -3
- package/dist/types/containers/ProjectTreeTable/types/overviewContext.d.ts +8 -0
- package/dist/types/containers/ProjectTreeTable/types/table.d.ts +0 -1
- package/dist/types/containers/SimpleTable/SimpleTable.types.d.ts +1 -0
- package/dist/types/containers/Slicer/components/Slicer.d.ts +2 -0
- package/dist/types/containers/Slicer/hooks/index.d.ts +1 -0
- package/dist/types/containers/Slicer/hooks/useSlicerCounts.d.ts +17 -0
- package/dist/types/containers/Slicer/hooks/useTableDataBySlice.d.ts +5 -1
- package/dist/types/util/confirmDelete.d.ts +3 -1
- package/dist/util.cjs.js +1 -1
- package/dist/util.es.js +77 -76
- 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
|
|
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(
|
|
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 &&
|
|
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,
|
|
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 (
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
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
|
-
|
|
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:
|
|
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:
|
|
400
|
+
setEntities: D,
|
|
399
401
|
feedAnnotations: _,
|
|
400
402
|
setFeedAnnotations: G,
|
|
401
403
|
bundleMode: d,
|
|
402
404
|
isGuest: f,
|
|
403
|
-
hasLicense:
|
|
404
|
-
onPowerFeature:
|
|
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
|
-
},
|
|
414
|
-
const a = et(
|
|
415
|
-
nt(
|
|
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,
|
|
418
|
-
(
|
|
419
|
-
|
|
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,
|
|
422
|
-
),
|
|
423
|
+
[t, u]
|
|
424
|
+
), v = f === "feed";
|
|
423
425
|
return {
|
|
424
426
|
isOpen: e(t),
|
|
425
|
-
setOpen: (
|
|
427
|
+
setOpen: (l) => a(t, l),
|
|
426
428
|
currentTab: f,
|
|
427
|
-
setTab:
|
|
428
|
-
isFeed:
|
|
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
|
|
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","
|
|
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
|
|
2
|
-
import { confirmDialog as
|
|
3
|
-
import { ConfirmDialog as
|
|
4
|
-
import { toast as
|
|
5
|
-
const
|
|
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:
|
|
7
|
+
message: u = "Are you sure? This cannot be undone",
|
|
8
8
|
deleteLabel: t,
|
|
9
|
-
accept:
|
|
9
|
+
accept: g = async () => {
|
|
10
10
|
},
|
|
11
11
|
showToasts: o = !0,
|
|
12
12
|
isArchive: n = !1,
|
|
13
|
-
onSuccess:
|
|
13
|
+
onSuccess: s,
|
|
14
14
|
onError: i,
|
|
15
|
-
|
|
15
|
+
onFinish: d,
|
|
16
|
+
...l
|
|
16
17
|
}) => {
|
|
17
18
|
t = t || (n ? "Archive" : "Delete");
|
|
18
|
-
const m = n ? "archiving" : "deleting",
|
|
19
|
-
return
|
|
20
|
-
header:
|
|
21
|
-
message:
|
|
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 ?
|
|
24
|
+
const r = o ? c.loading(`${f(m)} ${e.toLowerCase()}...`, {
|
|
24
25
|
autoClose: !1
|
|
25
26
|
}) : null;
|
|
26
27
|
try {
|
|
27
|
-
await
|
|
28
|
-
render: `${e} ${
|
|
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
|
-
}),
|
|
33
|
+
}), s && s();
|
|
33
34
|
} catch (a) {
|
|
34
|
-
const
|
|
35
|
-
o && r &&
|
|
36
|
-
render:
|
|
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:
|
|
48
|
+
acceptLabel: f(t),
|
|
46
49
|
rejectLabel: "Cancel",
|
|
47
50
|
acceptClassName: "button-danger",
|
|
48
51
|
style: { minWidth: 400, maxWidth: 600 },
|
|
49
|
-
...
|
|
52
|
+
...l
|
|
50
53
|
});
|
|
51
54
|
};
|
|
52
55
|
export {
|
|
53
|
-
|
|
54
|
-
|
|
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","
|
|
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;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
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:
|
|
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;
|
|
@@ -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;
|