@osdk/react-components 0.2.0-beta.24 → 0.2.0-beta.26
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/AGENTS.md +4 -0
- package/CHANGELOG.md +38 -0
- package/build/browser/action-form/ActionForm.js +15 -11
- package/build/browser/action-form/ActionForm.js.map +1 -1
- package/build/browser/action-form/FormFieldApi.js.map +1 -1
- package/build/browser/action-form/fields/{TextInputField.module.css → BaseInput.module.css} +2 -2
- package/build/browser/action-form/fields/BaseInput.module.css.js +6 -0
- package/build/browser/action-form/fields/CustomField.js +30 -0
- package/build/browser/action-form/fields/CustomField.js.map +1 -0
- package/build/browser/action-form/fields/FormFieldRenderer.js +26 -16
- package/build/browser/action-form/fields/FormFieldRenderer.js.map +1 -1
- package/build/browser/action-form/fields/RadioButtonsField.js +57 -0
- package/build/browser/action-form/fields/RadioButtonsField.js.map +1 -0
- package/build/browser/action-form/fields/RadioButtonsField.module.css +83 -0
- package/build/browser/action-form/fields/RadioButtonsField.module.css.js +10 -0
- package/build/browser/action-form/fields/TextAreaField.js +50 -0
- package/build/browser/action-form/fields/TextAreaField.js.map +1 -0
- package/build/browser/action-form/fields/TextInputField.js +3 -3
- package/build/browser/action-form/fields/TextInputField.js.map +1 -1
- package/build/browser/action-form/utils/getDefaultFieldDefinitions.js +97 -10
- package/build/browser/action-form/utils/getDefaultFieldDefinitions.js.map +1 -1
- package/build/browser/base-components/dialog/Dialog.js +4 -2
- package/build/browser/base-components/dialog/Dialog.js.map +1 -1
- package/build/browser/object-table/ObjectTableApi.js.map +1 -1
- package/build/browser/object-table/hooks/useFunctionColumnsData.js +57 -192
- package/build/browser/object-table/hooks/useFunctionColumnsData.js.map +1 -1
- package/build/browser/pdf-viewer/PdfViewer.js +49 -8
- package/build/browser/pdf-viewer/PdfViewer.js.map +1 -1
- package/build/browser/pdf-viewer/PdfViewerContext.js +108 -0
- package/build/browser/pdf-viewer/PdfViewerContext.js.map +1 -0
- package/build/browser/pdf-viewer/components/PdfViewerAnnotationLayer.js +85 -18
- package/build/browser/pdf-viewer/components/PdfViewerAnnotationLayer.js.map +1 -1
- package/build/browser/pdf-viewer/components/PdfViewerAnnotationLayer.module.css +18 -0
- package/build/browser/pdf-viewer/components/PdfViewerAnnotationLayer.module.css.js +1 -0
- package/build/browser/pdf-viewer/components/PdfViewerContent.js +15 -3
- package/build/browser/pdf-viewer/components/PdfViewerContent.js.map +1 -1
- package/build/browser/pdf-viewer/components/PdfViewerOutlineSidebar.module.css +1 -1
- package/build/browser/pdf-viewer/components/PdfViewerSidebar.module.css +1 -1
- package/build/browser/pdf-viewer/components/PdfViewerSidebarHeader.module.css +1 -1
- package/build/browser/pdf-viewer/components/PdfViewerToolbar.js +29 -2
- package/build/browser/pdf-viewer/components/PdfViewerToolbar.js.map +1 -1
- package/build/browser/pdf-viewer/components/PdfViewerToolbar.module.css +5 -0
- package/build/browser/pdf-viewer/components/PdfViewerToolbar.module.css.js +1 -0
- package/build/browser/pdf-viewer/constants.js +2 -1
- package/build/browser/pdf-viewer/constants.js.map +1 -1
- package/build/browser/pdf-viewer/hooks/usePdfAnnotationsByPage.js +30 -0
- package/build/browser/pdf-viewer/hooks/usePdfAnnotationsByPage.js.map +1 -0
- package/build/browser/pdf-viewer/hooks/usePdfFormFields.js +341 -0
- package/build/browser/pdf-viewer/hooks/usePdfFormFields.js.map +1 -0
- package/build/browser/pdf-viewer/hooks/usePdfHighlightMode.js +227 -0
- package/build/browser/pdf-viewer/hooks/usePdfHighlightMode.js.map +1 -0
- package/build/browser/pdf-viewer/hooks/usePdfViewer.js +16 -10
- package/build/browser/pdf-viewer/hooks/usePdfViewer.js.map +1 -1
- package/build/browser/pdf-viewer/hooks/usePdfViewerCore.js +3 -3
- package/build/browser/pdf-viewer/hooks/usePdfViewerCore.js.map +1 -1
- package/build/browser/pdf-viewer/hooks/usePdfViewerSearch.js +3 -3
- package/build/browser/pdf-viewer/hooks/usePdfViewerSearch.js.map +1 -1
- package/build/browser/pdf-viewer/hooks/usePdfViewerState.js +3 -3
- package/build/browser/pdf-viewer/hooks/usePdfViewerState.js.map +1 -1
- package/build/browser/pdf-viewer/types.js.map +1 -1
- package/build/browser/public/experimental.js +5 -0
- package/build/browser/public/experimental.js.map +1 -1
- package/build/browser/styles.css +144 -35
- package/build/cjs/{chunk-GT6IV6LV.cjs → chunk-MRRRZN44.cjs} +6 -4
- package/build/cjs/chunk-MRRRZN44.cjs.map +1 -0
- package/build/cjs/public/experimental.cjs +1981 -1314
- package/build/cjs/public/experimental.cjs.map +1 -1
- package/build/cjs/public/experimental.css +82 -5
- package/build/cjs/public/experimental.css.map +1 -1
- package/build/cjs/public/experimental.d.cts +267 -26
- package/build/cjs/public/primitives.cjs +5 -5
- package/build/cjs/public/primitives.d.cts +3 -2
- package/build/esm/action-form/ActionForm.js +15 -11
- package/build/esm/action-form/ActionForm.js.map +1 -1
- package/build/esm/action-form/FormFieldApi.js.map +1 -1
- package/build/esm/action-form/fields/{TextInputField.module.css → BaseInput.module.css} +2 -2
- package/build/esm/action-form/fields/CustomField.js +30 -0
- package/build/esm/action-form/fields/CustomField.js.map +1 -0
- package/build/esm/action-form/fields/FormFieldRenderer.js +26 -16
- package/build/esm/action-form/fields/FormFieldRenderer.js.map +1 -1
- package/build/esm/action-form/fields/RadioButtonsField.js +57 -0
- package/build/esm/action-form/fields/RadioButtonsField.js.map +1 -0
- package/build/esm/action-form/fields/RadioButtonsField.module.css +83 -0
- package/build/esm/action-form/fields/TextAreaField.js +50 -0
- package/build/esm/action-form/fields/TextAreaField.js.map +1 -0
- package/build/esm/action-form/fields/TextInputField.js +3 -3
- package/build/esm/action-form/fields/TextInputField.js.map +1 -1
- package/build/esm/action-form/utils/getDefaultFieldDefinitions.js +97 -10
- package/build/esm/action-form/utils/getDefaultFieldDefinitions.js.map +1 -1
- package/build/esm/base-components/dialog/Dialog.js +4 -2
- package/build/esm/base-components/dialog/Dialog.js.map +1 -1
- package/build/esm/object-table/ObjectTableApi.js.map +1 -1
- package/build/esm/object-table/hooks/useFunctionColumnsData.js +57 -192
- package/build/esm/object-table/hooks/useFunctionColumnsData.js.map +1 -1
- package/build/esm/pdf-viewer/PdfViewer.js +49 -8
- package/build/esm/pdf-viewer/PdfViewer.js.map +1 -1
- package/build/esm/pdf-viewer/PdfViewerContext.js +108 -0
- package/build/esm/pdf-viewer/PdfViewerContext.js.map +1 -0
- package/build/esm/pdf-viewer/components/PdfViewerAnnotationLayer.js +85 -18
- package/build/esm/pdf-viewer/components/PdfViewerAnnotationLayer.js.map +1 -1
- package/build/esm/pdf-viewer/components/PdfViewerAnnotationLayer.module.css +18 -0
- package/build/esm/pdf-viewer/components/PdfViewerContent.js +15 -3
- package/build/esm/pdf-viewer/components/PdfViewerContent.js.map +1 -1
- package/build/esm/pdf-viewer/components/PdfViewerOutlineSidebar.module.css +1 -1
- package/build/esm/pdf-viewer/components/PdfViewerSidebar.module.css +1 -1
- package/build/esm/pdf-viewer/components/PdfViewerSidebarHeader.module.css +1 -1
- package/build/esm/pdf-viewer/components/PdfViewerToolbar.js +29 -2
- package/build/esm/pdf-viewer/components/PdfViewerToolbar.js.map +1 -1
- package/build/esm/pdf-viewer/components/PdfViewerToolbar.module.css +5 -0
- package/build/esm/pdf-viewer/constants.js +2 -1
- package/build/esm/pdf-viewer/constants.js.map +1 -1
- package/build/esm/pdf-viewer/hooks/usePdfAnnotationsByPage.js +30 -0
- package/build/esm/pdf-viewer/hooks/usePdfAnnotationsByPage.js.map +1 -0
- package/build/esm/pdf-viewer/hooks/usePdfFormFields.js +341 -0
- package/build/esm/pdf-viewer/hooks/usePdfFormFields.js.map +1 -0
- package/build/esm/pdf-viewer/hooks/usePdfHighlightMode.js +227 -0
- package/build/esm/pdf-viewer/hooks/usePdfHighlightMode.js.map +1 -0
- package/build/esm/pdf-viewer/hooks/usePdfViewer.js +16 -10
- package/build/esm/pdf-viewer/hooks/usePdfViewer.js.map +1 -1
- package/build/esm/pdf-viewer/hooks/usePdfViewerCore.js +3 -3
- package/build/esm/pdf-viewer/hooks/usePdfViewerCore.js.map +1 -1
- package/build/esm/pdf-viewer/hooks/usePdfViewerSearch.js +3 -3
- package/build/esm/pdf-viewer/hooks/usePdfViewerSearch.js.map +1 -1
- package/build/esm/pdf-viewer/hooks/usePdfViewerState.js +3 -3
- package/build/esm/pdf-viewer/hooks/usePdfViewerState.js.map +1 -1
- package/build/esm/pdf-viewer/types.js.map +1 -1
- package/build/esm/public/experimental.js +5 -0
- package/build/esm/public/experimental.js.map +1 -1
- package/build/types/action-form/FormFieldApi.d.ts +11 -5
- package/build/types/action-form/FormFieldApi.d.ts.map +1 -1
- package/build/types/action-form/fields/CustomField.d.ts +9 -0
- package/build/types/action-form/fields/CustomField.d.ts.map +1 -0
- package/build/types/action-form/fields/FormFieldRenderer.d.ts.map +1 -1
- package/build/types/action-form/fields/RadioButtonsField.d.ts +3 -0
- package/build/types/action-form/fields/RadioButtonsField.d.ts.map +1 -0
- package/build/types/action-form/fields/TextAreaField.d.ts +3 -0
- package/build/types/action-form/fields/TextAreaField.d.ts.map +1 -0
- package/build/types/action-form/utils/getDefaultFieldDefinitions.d.ts +7 -4
- package/build/types/action-form/utils/getDefaultFieldDefinitions.d.ts.map +1 -1
- package/build/types/base-components/dialog/Dialog.d.ts +3 -2
- package/build/types/base-components/dialog/Dialog.d.ts.map +1 -1
- package/build/types/object-table/ObjectTableApi.d.ts +4 -3
- package/build/types/object-table/ObjectTableApi.d.ts.map +1 -1
- package/build/types/object-table/hooks/useFunctionColumnsData.d.ts.map +1 -1
- package/build/types/pdf-viewer/PdfViewer.d.ts +2 -2
- package/build/types/pdf-viewer/PdfViewer.d.ts.map +1 -1
- package/build/types/pdf-viewer/PdfViewerContext.d.ts +64 -0
- package/build/types/pdf-viewer/PdfViewerContext.d.ts.map +1 -0
- package/build/types/pdf-viewer/components/PdfViewerAnnotationLayer.d.ts.map +1 -1
- package/build/types/pdf-viewer/components/PdfViewerContent.d.ts +8 -4
- package/build/types/pdf-viewer/components/PdfViewerContent.d.ts.map +1 -1
- package/build/types/pdf-viewer/components/PdfViewerToolbar.d.ts +6 -1
- package/build/types/pdf-viewer/components/PdfViewerToolbar.d.ts.map +1 -1
- package/build/types/pdf-viewer/constants.d.ts +1 -1
- package/build/types/pdf-viewer/constants.d.ts.map +1 -1
- package/build/types/pdf-viewer/hooks/usePdfAnnotationsByPage.d.ts +5 -0
- package/build/types/pdf-viewer/hooks/usePdfAnnotationsByPage.d.ts.map +1 -0
- package/build/types/pdf-viewer/hooks/usePdfFormFields.d.ts +24 -0
- package/build/types/pdf-viewer/hooks/usePdfFormFields.d.ts.map +1 -0
- package/build/types/pdf-viewer/hooks/usePdfHighlightMode.d.ts +36 -0
- package/build/types/pdf-viewer/hooks/usePdfHighlightMode.d.ts.map +1 -0
- package/build/types/pdf-viewer/hooks/usePdfViewer.d.ts.map +1 -1
- package/build/types/pdf-viewer/types.d.ts +137 -13
- package/build/types/pdf-viewer/types.d.ts.map +1 -1
- package/build/types/public/experimental.d.ts +6 -1
- package/build/types/public/experimental.d.ts.map +1 -1
- package/package.json +6 -6
- package/build/browser/action-form/fields/TextInputField.module.css.js +0 -6
- package/build/browser/action-form/utils/getDefaultFieldComponent.js +0 -56
- package/build/browser/action-form/utils/getDefaultFieldComponent.js.map +0 -1
- package/build/cjs/chunk-GT6IV6LV.cjs.map +0 -1
- package/build/esm/action-form/utils/getDefaultFieldComponent.js +0 -56
- package/build/esm/action-form/utils/getDefaultFieldComponent.js.map +0 -1
- package/build/types/action-form/utils/getDefaultFieldComponent.d.ts +0 -6
- package/build/types/action-form/utils/getDefaultFieldComponent.d.ts.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFunctionColumnsData.js","names":["useOsdkClient","useEffect","useMemo","useRef","useState","createAsyncCellData","useFunctionColumnsData","objectSet","objects","columnDefinitions","client","data","setData","abortControllerRef","functionColumnConfigs","getFunctionColumnConfigs","stableObjects","useStableObjects","stableObjectSet","JSON","stringify","length","current","abort","abortController","AbortController","initializeFunctionColumnData","queryResult","executeQueriesGenerator","signal","aborted","config","result","error","processQueryResult","configsByApiName","Map","forEach","colDef","locator","type","apiName","queryDefinition","existingConfig","get","columnIds","push","columnId","String","id","getValue","getKey","set","getParams","getFunctionParams","Array","from","values","map","item","$apiName","$primaryKey","sort","a","b","localeCompare","queryPromises","createQueryPromise","pendingPromises","Promise","race","promise","index","then","splice","resolve","params","executeFunction","catch","Error","prev","newData","obj","key","isLoading","columnGetKey","customKey","rawData","cellData"],"sources":["useFunctionColumnsData.ts"],"sourcesContent":["/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n ObjectOrInterfaceDefinition,\n ObjectSet,\n Osdk,\n PropertyKeys,\n QueryDefinition,\n SimplePropertyDef,\n} from \"@osdk/api\";\nimport { useOsdkClient } from \"@osdk/react\";\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport type {\n ColumnDefinition,\n ExtractQueryParameters,\n FunctionColumnLocator,\n} from \"../ObjectTableApi.js\";\nimport {\n type AsyncCellData,\n createAsyncCellData,\n} from \"../utils/AsyncCellData.js\";\n\nexport interface FunctionColumnData {\n [columnId: string]: {\n [objectPrimaryKey: string]: AsyncCellData;\n };\n}\n\ntype FunctionColumnConfig<\n Q extends ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = Record<string, never>,\n FunctionColumns extends Record<string, QueryDefinition<{}>> = Record<\n string,\n never\n >,\n> = {\n queryDefinition: QueryDefinition<any>;\n getParams: (\n objectSet: ObjectSet<Q>,\n ) => ExtractQueryParameters<FunctionColumns[keyof FunctionColumns]>;\n columnIds: Array<{\n columnId: string;\n getValue?: (cellData: unknown) => unknown;\n getKey: (\n object: Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>,\n ) => string;\n }>;\n};\n\ntype QueryResult<\n Q extends ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = Record<string, never>,\n FunctionColumns extends Record<string, QueryDefinition<{}>> = Record<\n string,\n never\n >,\n> = {\n config: FunctionColumnConfig<Q, RDPs, FunctionColumns>;\n result: Record<string, unknown> | null;\n error: Error | null;\n aborted?: boolean;\n};\n\nexport function useFunctionColumnsData<\n Q extends ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = Record<string, never>,\n FunctionColumns extends Record<string, QueryDefinition<{}>> = Record<\n string,\n never\n >,\n>(\n objectSet: ObjectSet<Q, RDPs> | undefined,\n objects:\n | Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>[]\n | undefined,\n columnDefinitions?: Array<ColumnDefinition<Q, RDPs, FunctionColumns>>,\n): FunctionColumnData {\n const client = useOsdkClient();\n const [data, setData] = useState<FunctionColumnData>({});\n const abortControllerRef = useRef<AbortController | null>(null);\n\n // Function column configurations grouped by unique query definition\n const functionColumnConfigs = useMemo(\n () => getFunctionColumnConfigs(columnDefinitions),\n [columnDefinitions],\n );\n\n const stableObjects = useStableObjects(objects);\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const stableObjectSet = useMemo(() => objectSet, [JSON.stringify(objectSet)]);\n\n useEffect(() => {\n if (\n !stableObjects || stableObjects.length === 0\n || functionColumnConfigs.length === 0 || !stableObjectSet\n ) {\n return;\n }\n\n // Cancel previous requests\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n\n const abortController = new AbortController();\n abortControllerRef.current = abortController;\n\n const executeQueries = async () => {\n if (!stableObjectSet) {\n return;\n }\n\n initializeFunctionColumnData(\n functionColumnConfigs,\n stableObjects,\n setData,\n );\n\n // Process query results as they complete\n for await (\n const queryResult of executeQueriesGenerator(\n functionColumnConfigs,\n stableObjectSet as ObjectSet<Q>,\n client,\n abortController.signal,\n )\n ) {\n if (abortController.signal.aborted) {\n break;\n }\n\n const { config, result, error, aborted } = queryResult;\n if (!aborted) {\n processQueryResult(config, result, error, stableObjects, setData);\n }\n }\n };\n\n void executeQueries();\n\n return () => {\n abortController.abort();\n abortControllerRef.current = null;\n };\n }, [functionColumnConfigs, stableObjects, stableObjectSet, client]);\n\n return data;\n}\n\nfunction getFunctionColumnConfigs<\n Q extends ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = Record<string, never>,\n FunctionColumns extends Record<string, QueryDefinition<{}>> = Record<\n string,\n never\n >,\n>(\n columnDefinitions?: Array<ColumnDefinition<Q, RDPs, FunctionColumns>>,\n): Array<FunctionColumnConfig<Q, RDPs, FunctionColumns>> {\n if (!columnDefinitions) return [];\n\n // Group columns by their query definition apiName\n const configsByApiName = new Map<\n string,\n FunctionColumnConfig<Q, RDPs, FunctionColumns>\n >();\n\n columnDefinitions.forEach((colDef) => {\n if (colDef.locator.type === \"function\") {\n const locator = colDef.locator as FunctionColumnLocator<\n Q,\n RDPs,\n FunctionColumns\n >;\n\n const apiName = locator.queryDefinition.apiName;\n const existingConfig = configsByApiName.get(apiName);\n\n if (existingConfig) {\n // Add this column to the existing config\n existingConfig.columnIds.push({\n columnId: String(locator.id),\n getValue: locator.getValue,\n getKey: locator.getKey,\n });\n } else {\n // Create new config\n configsByApiName.set(apiName, {\n queryDefinition: locator.queryDefinition,\n getParams: locator.getFunctionParams,\n columnIds: [{\n columnId: String(locator.id),\n getValue: locator.getValue,\n getKey: locator.getKey,\n }],\n });\n }\n }\n });\n\n return Array.from(configsByApiName.values());\n}\n\nconst useStableObjects = <\n Q extends ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = Record<string, never>,\n>(\n objects:\n | Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>[]\n | undefined,\n):\n | Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>[]\n | undefined =>\n{\n // eslint-disable-next-line react-hooks/exhaustive-deps\n return useMemo(() => objects, [\n // eslint-disable-next-line react-hooks/exhaustive-deps\n JSON.stringify(\n (objects ?? []).map(item => ({\n $apiName: item.$apiName,\n $primaryKey: item.$primaryKey,\n })).sort((a, b) => {\n if (a.$apiName !== b.$apiName) {\n return a.$apiName.localeCompare(b.$apiName);\n }\n return String(a.$primaryKey).localeCompare(String(b.$primaryKey));\n }),\n ),\n ]);\n};\n\n/**\n * Generator that yields query results as they complete\n */\nasync function* executeQueriesGenerator<\n Q extends ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = Record<string, never>,\n FunctionColumns extends Record<string, QueryDefinition<{}>> = Record<\n string,\n never\n >,\n>(\n functionColumnConfigs: Array<FunctionColumnConfig<Q, RDPs, FunctionColumns>>,\n objectSet: ObjectSet<Q>,\n client: ReturnType<typeof useOsdkClient>,\n signal?: AbortSignal,\n): AsyncGenerator<QueryResult<Q, RDPs, FunctionColumns>, void, unknown> {\n // Start all queries in parallel\n const queryPromises = functionColumnConfigs.map(config =>\n createQueryPromise(config, objectSet, client, signal)\n ) as Array<Promise<QueryResult<Q, RDPs, FunctionColumns>>>;\n const pendingPromises = [...queryPromises];\n\n // Yield results as they complete using Promise.race\n while (pendingPromises.length > 0) {\n const result = await Promise.race(\n pendingPromises.map((promise, index) =>\n promise.then(result => ({ result, index }))\n ),\n );\n\n yield result.result;\n\n // Remove the completed promise from the pending list\n void pendingPromises.splice(result.index, 1);\n }\n}\n\n/**\n * Create a promise that executes a function column query\n */\nfunction createQueryPromise<\n Q extends ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = Record<string, never>,\n FunctionColumns extends Record<string, QueryDefinition<{}>> = Record<\n string,\n never\n >,\n>(\n config: FunctionColumnConfig<Q, RDPs, FunctionColumns>,\n objectSet: ObjectSet<Q>,\n client: ReturnType<typeof useOsdkClient>,\n signal?: AbortSignal,\n): Promise<QueryResult<Q, RDPs, FunctionColumns>> {\n return new Promise((resolve) => {\n if (signal?.aborted) {\n resolve({ config, result: null, error: null, aborted: true });\n return;\n }\n\n const params = config.getParams(objectSet as ObjectSet<Q>);\n\n client(config.queryDefinition)\n .executeFunction(params)\n .then((result: Record<string, unknown>) => {\n // Check if aborted during execution\n if (signal?.aborted) {\n resolve({ config, result: null, error: null, aborted: true });\n } else {\n resolve({ config, result, error: null });\n }\n })\n .catch((error: unknown) => {\n // Check if aborted during error handling\n if (signal?.aborted) {\n resolve({ config, result: null, error: null, aborted: true });\n } else {\n resolve({\n config,\n result: null,\n error: error instanceof Error ? error : new Error(String(error)),\n });\n }\n });\n });\n}\n\n/**\n * Initialize function column data with isLoading state for all columns and objects\n */\nfunction initializeFunctionColumnData<\n Q extends ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = Record<string, never>,\n FunctionColumns extends Record<string, QueryDefinition<{}>> = Record<\n string,\n never\n >,\n>(\n functionColumnConfigs: Array<FunctionColumnConfig<Q, RDPs, FunctionColumns>>,\n objects: Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>[],\n setData: React.Dispatch<React.SetStateAction<FunctionColumnData>>,\n): void {\n setData(prev => {\n const newData = { ...prev };\n\n functionColumnConfigs.forEach(config => {\n config.columnIds.forEach(({ columnId }) => {\n // Initialize column if it doesn't exist\n if (!newData[columnId]) {\n newData[columnId] = {};\n }\n\n objects.forEach(obj => {\n const key = String(obj.$primaryKey);\n // Only set isLoading state if this object's data doesn't already exist\n if (!newData[columnId][key]) {\n newData[columnId][key] = createAsyncCellData({\n isLoading: true,\n });\n }\n });\n });\n });\n\n return newData;\n });\n}\n\nfunction processQueryResult<\n Q extends ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = Record<string, never>,\n FunctionColumns extends Record<string, QueryDefinition<{}>> = Record<\n string,\n never\n >,\n>(\n config: FunctionColumnConfig<Q, RDPs, FunctionColumns>,\n result: Record<string, unknown> | null,\n error: Error | null,\n objects: Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>[],\n setData: React.Dispatch<React.SetStateAction<FunctionColumnData>>,\n): void {\n // Batch all updates into a single setState call\n setData(prev => {\n const newData = { ...prev };\n\n if (error) {\n // Set error for all objects in all columns that use this query\n config.columnIds.forEach(({ columnId }) => {\n if (!newData[columnId]) {\n newData[columnId] = {};\n }\n\n objects.forEach(obj => {\n const key = String(obj.$primaryKey);\n newData[columnId][key] = createAsyncCellData({\n error: error instanceof Error\n ? error\n : new Error(String(error)),\n isLoading: false,\n });\n });\n });\n } else if (result) {\n // Process the FunctionsMap result\n objects.forEach(obj => {\n const key = String(obj.$primaryKey);\n\n // Process each column that uses this query result\n config.columnIds.forEach(\n ({ columnId, getValue, getKey: columnGetKey }) => {\n if (!newData[columnId]) {\n newData[columnId] = {};\n }\n\n const customKey = columnGetKey(obj);\n const rawData = result[customKey];\n const cellData = getValue ? getValue(rawData) : rawData;\n\n newData[columnId][key] = createAsyncCellData({\n data: cellData,\n isLoading: false,\n });\n },\n );\n });\n }\n\n return newData;\n });\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"useFunctionColumnsData.js","names":["useOsdkFunctions","useMemo","createAsyncCellData","useFunctionColumnsData","objectSet","objects","columnDefinitions","functionColumnConfigs","getFunctionColumnConfigs","stableObjects","useStableObjects","stableObjectSet","JSON","stringify","disabled","length","queries","map","config","queryDefinition","options","params","getParams","results","enabled","data","columnData","forEach","result","index","functionsMap","columnIds","columnId","getValue","getKey","columnGetKey","obj","key","String","$primaryKey","isLoading","error","customKey","rawData","cellData","configsByApiName","Map","colDef","locator","type","apiName","existingConfig","get","push","id","set","getFunctionParams","Array","from","values","item","$apiName","sort","a","b","localeCompare"],"sources":["useFunctionColumnsData.ts"],"sourcesContent":["/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n ObjectOrInterfaceDefinition,\n ObjectSet,\n Osdk,\n PropertyKeys,\n QueryDefinition,\n SimplePropertyDef,\n} from \"@osdk/api\";\nimport {\n type FunctionQueryParams,\n useOsdkFunctions,\n} from \"@osdk/react/unstable-do-not-use\";\n\nimport { useMemo } from \"react\";\nimport type {\n ColumnDefinition,\n FunctionColumnLocator,\n} from \"../ObjectTableApi.js\";\nimport {\n type AsyncCellData,\n createAsyncCellData,\n} from \"../utils/AsyncCellData.js\";\n\nexport interface FunctionColumnData {\n [columnId: string]: {\n [objectPrimaryKey: string]: AsyncCellData;\n };\n}\n\ntype FunctionColumnConfig<\n Q extends ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = Record<string, never>,\n> = {\n queryDefinition: QueryDefinition<unknown>;\n getParams: (\n objectSet: ObjectSet<Q, RDPs>,\n ) => unknown;\n columnIds: Array<{\n columnId: string;\n getValue?: (cellData: unknown) => unknown;\n getKey: (\n object: Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>,\n ) => string;\n }>;\n};\n\nexport function useFunctionColumnsData<\n Q extends ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = Record<string, never>,\n FunctionColumns extends Record<string, QueryDefinition<{}>> = Record<\n string,\n never\n >,\n>(\n objectSet: ObjectSet<Q, RDPs> | undefined,\n objects:\n | Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>[]\n | undefined,\n columnDefinitions?: Array<ColumnDefinition<Q, RDPs, FunctionColumns>>,\n): FunctionColumnData {\n // Function column configurations grouped by unique query definition\n const functionColumnConfigs = useMemo(\n () => getFunctionColumnConfigs(columnDefinitions),\n [columnDefinitions],\n );\n\n const stableObjects = useStableObjects(objects);\n\n // TODO: replace with useDeepEqual when it's added\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const stableObjectSet = useMemo(() => objectSet, [JSON.stringify(objectSet)]);\n\n const disabled = !stableObjectSet || !stableObjects?.length\n || functionColumnConfigs.length === 0;\n\n // Prepare queries for useOsdkFunctions\n const queries = useMemo(\n () => {\n if (disabled) {\n return [];\n }\n\n return functionColumnConfigs.map(\n (config): FunctionQueryParams<QueryDefinition<unknown>> => ({\n queryDefinition: config.queryDefinition,\n options: {\n params: config.getParams(stableObjectSet),\n } as FunctionQueryParams<QueryDefinition<unknown>>[\"options\"],\n }),\n );\n },\n [disabled, functionColumnConfigs, stableObjectSet],\n );\n\n const results = useOsdkFunctions(\n {\n queries,\n enabled: !disabled,\n },\n );\n\n const data = useMemo(() => {\n const columnData: FunctionColumnData = {};\n\n if (disabled || !stableObjects) return columnData;\n\n results.forEach((result, index) => {\n const config = functionColumnConfigs[index];\n if (!config) return;\n\n const functionsMap = result.data as Record<string, unknown> | undefined;\n\n config.columnIds.forEach(\n ({ columnId, getValue, getKey: columnGetKey }) => {\n if (!columnData[columnId]) {\n columnData[columnId] = {};\n }\n\n stableObjects.forEach(obj => {\n const key = String(obj.$primaryKey);\n\n if (result.isLoading) {\n columnData[columnId][key] = createAsyncCellData({\n isLoading: true,\n });\n } else if (result.error) {\n columnData[columnId][key] = createAsyncCellData({\n error: result.error,\n isLoading: false,\n });\n } else if (functionsMap) {\n const customKey = columnGetKey(obj);\n const rawData = functionsMap[customKey];\n const cellData = getValue ? getValue(rawData) : rawData;\n columnData[columnId][key] = createAsyncCellData({\n data: cellData,\n isLoading: false,\n });\n }\n });\n },\n );\n });\n\n return columnData;\n }, [results, functionColumnConfigs, stableObjects, disabled]);\n\n return data;\n}\n\nfunction getFunctionColumnConfigs<\n Q extends ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = Record<string, never>,\n FunctionColumns extends Record<string, QueryDefinition<{}>> = Record<\n string,\n never\n >,\n>(\n columnDefinitions?: Array<ColumnDefinition<Q, RDPs, FunctionColumns>>,\n): Array<FunctionColumnConfig<Q, RDPs>> {\n if (!columnDefinitions) return [];\n\n // Group columns by their query definition apiName\n const configsByApiName = new Map<\n string,\n FunctionColumnConfig<Q, RDPs>\n >();\n\n columnDefinitions.forEach((colDef) => {\n if (colDef.locator.type === \"function\") {\n const locator = colDef.locator as FunctionColumnLocator<\n Q,\n RDPs,\n FunctionColumns\n >;\n\n const apiName = locator.queryDefinition.apiName;\n const existingConfig = configsByApiName.get(apiName);\n\n if (existingConfig) {\n // Add this column to the existing config\n existingConfig.columnIds.push({\n columnId: String(locator.id),\n getValue: locator.getValue,\n getKey: locator.getKey,\n });\n } else {\n // Create new config\n configsByApiName.set(apiName, {\n queryDefinition: locator.queryDefinition,\n getParams: locator.getFunctionParams,\n columnIds: [{\n columnId: String(locator.id),\n getValue: locator.getValue,\n getKey: locator.getKey,\n }],\n });\n }\n }\n });\n\n return Array.from(configsByApiName.values());\n}\n\nconst useStableObjects = <\n Q extends ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = Record<string, never>,\n>(\n objects:\n | Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>[]\n | undefined,\n):\n | Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>[]\n | undefined =>\n{\n // eslint-disable-next-line react-hooks/exhaustive-deps\n return useMemo(() => objects, [\n // eslint-disable-next-line react-hooks/exhaustive-deps\n JSON.stringify(\n (objects ?? []).map(item => ({\n $apiName: item.$apiName,\n $primaryKey: item.$primaryKey,\n })).sort((a, b) => {\n if (a.$apiName !== b.$apiName) {\n return a.$apiName.localeCompare(b.$apiName);\n }\n return String(a.$primaryKey).localeCompare(String(b.$primaryKey));\n }),\n ),\n ]);\n};\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -17,21 +17,30 @@
|
|
|
17
17
|
import { Error as ErrorIcon, Spin } from "@blueprintjs/icons";
|
|
18
18
|
import classnames from "classnames";
|
|
19
19
|
import "pdfjs-dist/web/pdf_viewer.css";
|
|
20
|
-
import React from "react";
|
|
20
|
+
import React, { forwardRef, useImperativeHandle } from "react";
|
|
21
21
|
import { createPortal } from "react-dom";
|
|
22
22
|
import { PdfViewerAnnotationLayer } from "./components/PdfViewerAnnotationLayer.js";
|
|
23
23
|
import { PdfViewerOutlineSidebar } from "./components/PdfViewerOutlineSidebar.js";
|
|
24
24
|
import { PdfViewerSearchBar } from "./components/PdfViewerSearchBar.js";
|
|
25
25
|
import { PdfViewerSidebar } from "./components/PdfViewerSidebar.js";
|
|
26
26
|
import { PdfViewerToolbar } from "./components/PdfViewerToolbar.js";
|
|
27
|
-
import { EMPTY_ANNOTATION_ARRAY
|
|
27
|
+
import { EMPTY_ANNOTATION_ARRAY } from "./constants.js";
|
|
28
|
+
import { usePdfAnnotationsByPage } from "./hooks/usePdfAnnotationsByPage.js";
|
|
29
|
+
import { usePdfFormFields } from "./hooks/usePdfFormFields.js";
|
|
30
|
+
import { usePdfHighlightMode } from "./hooks/usePdfHighlightMode.js";
|
|
28
31
|
import { usePdfViewerState } from "./hooks/usePdfViewerState.js";
|
|
29
32
|
import styles from "./PdfViewer.module.css.js";
|
|
30
|
-
export
|
|
33
|
+
export const BasePdfViewer = /*#__PURE__*/forwardRef(function ({
|
|
31
34
|
src,
|
|
32
|
-
annotations =
|
|
35
|
+
annotations = EMPTY_ANNOTATION_ARRAY,
|
|
33
36
|
onAnnotationClick,
|
|
34
37
|
onDownload,
|
|
38
|
+
enableHighlight = false,
|
|
39
|
+
onTextHighlight,
|
|
40
|
+
onHighlightDelete,
|
|
41
|
+
formData,
|
|
42
|
+
onFormSubmit,
|
|
43
|
+
onFormChange,
|
|
35
44
|
initialPage = 1,
|
|
36
45
|
initialScale = 1.0,
|
|
37
46
|
initialSidebarOpen = false,
|
|
@@ -39,7 +48,7 @@ export function BasePdfViewer({
|
|
|
39
48
|
sidebarMode: sidebarModeProp = "thumbnails",
|
|
40
49
|
outlineIcons,
|
|
41
50
|
className
|
|
42
|
-
}) {
|
|
51
|
+
}, ref) {
|
|
43
52
|
const viewer = usePdfViewerState({
|
|
44
53
|
src,
|
|
45
54
|
initialPage,
|
|
@@ -48,6 +57,33 @@ export function BasePdfViewer({
|
|
|
48
57
|
sidebarMode: sidebarModeProp,
|
|
49
58
|
onDownload
|
|
50
59
|
});
|
|
60
|
+
const {
|
|
61
|
+
highlightModeActive,
|
|
62
|
+
toggleHighlightMode,
|
|
63
|
+
deleteHighlight
|
|
64
|
+
} = usePdfHighlightMode({
|
|
65
|
+
pdfViewerRef: viewer.pdfViewerRef,
|
|
66
|
+
document: viewer.document,
|
|
67
|
+
enabled: enableHighlight,
|
|
68
|
+
onTextHighlight,
|
|
69
|
+
onHighlightDelete
|
|
70
|
+
});
|
|
71
|
+
useImperativeHandle(ref, () => ({
|
|
72
|
+
scrollToPage: viewer.scrollToPage,
|
|
73
|
+
deleteHighlight
|
|
74
|
+
}), [viewer.scrollToPage, deleteHighlight]);
|
|
75
|
+
const {
|
|
76
|
+
hasFormFields,
|
|
77
|
+
submitFormData
|
|
78
|
+
} = usePdfFormFields({
|
|
79
|
+
pdfViewerRef: viewer.pdfViewerRef,
|
|
80
|
+
eventBusRef: viewer.eventBusRef,
|
|
81
|
+
document: viewer.document,
|
|
82
|
+
formData,
|
|
83
|
+
onFormSubmit,
|
|
84
|
+
onFormChange
|
|
85
|
+
});
|
|
86
|
+
const annotationsByPage = usePdfAnnotationsByPage(annotations);
|
|
51
87
|
const rootClassName = classnames(styles.pdfViewer, className);
|
|
52
88
|
if (viewer.loading) {
|
|
53
89
|
return /*#__PURE__*/React.createElement("div", {
|
|
@@ -88,7 +124,12 @@ export function BasePdfViewer({
|
|
|
88
124
|
onDownload: viewer.download,
|
|
89
125
|
enableDownload: enableDownload,
|
|
90
126
|
onRotateLeft: viewer.rotateLeft,
|
|
91
|
-
onRotateRight: viewer.rotateRight
|
|
127
|
+
onRotateRight: viewer.rotateRight,
|
|
128
|
+
enableHighlight: enableHighlight,
|
|
129
|
+
highlightModeActive: highlightModeActive,
|
|
130
|
+
onHighlightToggle: toggleHighlightMode,
|
|
131
|
+
enableFormSave: onFormSubmit != null && hasFormFields,
|
|
132
|
+
onFormSave: submitFormData
|
|
92
133
|
}), viewer.search.isSearchOpen && /*#__PURE__*/React.createElement(PdfViewerSearchBar, {
|
|
93
134
|
query: viewer.search.query,
|
|
94
135
|
totalMatches: viewer.search.totalMatches,
|
|
@@ -122,7 +163,7 @@ export function BasePdfViewer({
|
|
|
122
163
|
ref: viewer.viewerRef,
|
|
123
164
|
className: "pdfViewer"
|
|
124
165
|
}), viewer.portalTargets.map(target => {
|
|
125
|
-
const pageAnnotations =
|
|
166
|
+
const pageAnnotations = annotationsByPage[target.pageNumber] ?? EMPTY_ANNOTATION_ARRAY;
|
|
126
167
|
if (pageAnnotations.length === 0) {
|
|
127
168
|
return null;
|
|
128
169
|
}
|
|
@@ -134,5 +175,5 @@ export function BasePdfViewer({
|
|
|
134
175
|
onAnnotationClick: onAnnotationClick
|
|
135
176
|
}), target.container);
|
|
136
177
|
})))));
|
|
137
|
-
}
|
|
178
|
+
});
|
|
138
179
|
//# sourceMappingURL=PdfViewer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PdfViewer.js","names":["Error","ErrorIcon","Spin","classnames","React","createPortal","PdfViewerAnnotationLayer","PdfViewerOutlineSidebar","PdfViewerSearchBar","PdfViewerSidebar","PdfViewerToolbar","EMPTY_ANNOTATION_ARRAY","EMPTY_ANNOTATIONS","usePdfViewerState","styles","BasePdfViewer","src","annotations","onAnnotationClick","onDownload","initialPage","initialScale","initialSidebarOpen","enableDownload","sidebarMode","sidebarModeProp","outlineIcons","className","viewer","rootClassName","pdfViewer","loading","createElement","loadingContainer","spinnerIcon","error","errorContainer","errorIcon","message","document","currentPage","numPages","scale","sidebarOpen","onPageChange","scrollToPage","onScaleChange","setScale","onSearchOpen","search","openSearch","onSidebarToggle","toggleSidebar","download","onRotateLeft","rotateLeft","onRotateRight","rotateRight","isSearchOpen","query","totalMatches","currentMatchIndex","onQueryChange","setQuery","onNext","nextMatch","onPrev","prevMatch","onClose","closeSearch","contentArea","onPageClick","onSidebarModeChange","setSidebarMode","outlineItems","onItemClick","scrollContainerWrapper","ref","containerRef","scrollContainer","viewerRef","portalTargets","map","target","pageAnnotations","pageNumber","length","key","pageHeight","container"],"sources":["PdfViewer.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Error as ErrorIcon, Spin } from \"@blueprintjs/icons\";\nimport classnames from \"classnames\";\nimport \"pdfjs-dist/web/pdf_viewer.css\";\nimport React from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { PdfViewerAnnotationLayer } from \"./components/PdfViewerAnnotationLayer.js\";\nimport { PdfViewerOutlineSidebar } from \"./components/PdfViewerOutlineSidebar.js\";\nimport { PdfViewerSearchBar } from \"./components/PdfViewerSearchBar.js\";\nimport { PdfViewerSidebar } from \"./components/PdfViewerSidebar.js\";\nimport { PdfViewerToolbar } from \"./components/PdfViewerToolbar.js\";\nimport { EMPTY_ANNOTATION_ARRAY, EMPTY_ANNOTATIONS } from \"./constants.js\";\nimport { usePdfViewerState } from \"./hooks/usePdfViewerState.js\";\nimport styles from \"./PdfViewer.module.css\";\nimport type { PdfViewerProps } from \"./types.js\";\n\nexport function BasePdfViewer({\n src,\n annotations = EMPTY_ANNOTATIONS,\n onAnnotationClick,\n onDownload,\n initialPage = 1,\n initialScale = 1.0,\n initialSidebarOpen = false,\n enableDownload = false,\n sidebarMode: sidebarModeProp = \"thumbnails\",\n outlineIcons,\n className,\n}: PdfViewerProps): React.ReactElement {\n const viewer = usePdfViewerState({\n src,\n initialPage,\n initialScale,\n initialSidebarOpen,\n sidebarMode: sidebarModeProp,\n onDownload,\n });\n\n const rootClassName = classnames(styles.pdfViewer, className);\n\n if (viewer.loading) {\n return (\n <div className={rootClassName}>\n <div className={styles.loadingContainer}>\n <Spin className={styles.spinnerIcon} />\n Loading…\n </div>\n </div>\n );\n }\n\n if (viewer.error != null) {\n return (\n <div className={rootClassName}>\n <div className={styles.errorContainer}>\n <ErrorIcon className={styles.errorIcon} />\n Failed to load PDF: {viewer.error.message}\n </div>\n </div>\n );\n }\n\n if (viewer.document == null) {\n return (\n <div className={rootClassName}>\n <div className={styles.loadingContainer}>No document</div>\n </div>\n );\n }\n\n return (\n <div className={rootClassName}>\n <PdfViewerToolbar\n currentPage={viewer.currentPage}\n numPages={viewer.numPages}\n scale={viewer.scale}\n sidebarOpen={viewer.sidebarOpen}\n onPageChange={viewer.scrollToPage}\n onScaleChange={viewer.setScale}\n onSearchOpen={viewer.search.openSearch}\n onSidebarToggle={viewer.toggleSidebar}\n onDownload={viewer.download}\n enableDownload={enableDownload}\n onRotateLeft={viewer.rotateLeft}\n onRotateRight={viewer.rotateRight}\n />\n {viewer.search.isSearchOpen && (\n <PdfViewerSearchBar\n query={viewer.search.query}\n totalMatches={viewer.search.totalMatches}\n currentMatchIndex={viewer.search.currentMatchIndex}\n onQueryChange={viewer.search.setQuery}\n onNext={viewer.search.nextMatch}\n onPrev={viewer.search.prevMatch}\n onClose={viewer.search.closeSearch}\n />\n )}\n <div className={styles.contentArea}>\n {viewer.sidebarOpen && viewer.sidebarMode === \"thumbnails\" && (\n <PdfViewerSidebar\n document={viewer.document}\n numPages={viewer.numPages}\n currentPage={viewer.currentPage}\n onPageClick={viewer.scrollToPage}\n sidebarMode={viewer.sidebarMode}\n onSidebarModeChange={viewer.setSidebarMode}\n />\n )}\n {viewer.sidebarOpen && viewer.sidebarMode === \"outline\" && (\n <PdfViewerOutlineSidebar\n outlineItems={viewer.outlineItems}\n currentPage={viewer.currentPage}\n onItemClick={viewer.scrollToPage}\n sidebarMode={viewer.sidebarMode}\n onSidebarModeChange={viewer.setSidebarMode}\n outlineIcons={outlineIcons}\n />\n )}\n <div className={styles.scrollContainerWrapper}>\n <div ref={viewer.containerRef} className={styles.scrollContainer}>\n <div ref={viewer.viewerRef} className=\"pdfViewer\" />\n {viewer.portalTargets.map((target) => {\n const pageAnnotations = annotations[target.pageNumber]\n ?? EMPTY_ANNOTATION_ARRAY;\n if (pageAnnotations.length === 0) {\n return null;\n }\n return createPortal(\n <PdfViewerAnnotationLayer\n key={target.pageNumber}\n annotations={pageAnnotations}\n pageHeight={target.pageHeight}\n scale={target.scale}\n onAnnotationClick={onAnnotationClick}\n />,\n target.container,\n );\n })}\n </div>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"PdfViewer.js","names":["Error","ErrorIcon","Spin","classnames","React","forwardRef","useImperativeHandle","createPortal","PdfViewerAnnotationLayer","PdfViewerOutlineSidebar","PdfViewerSearchBar","PdfViewerSidebar","PdfViewerToolbar","EMPTY_ANNOTATION_ARRAY","usePdfAnnotationsByPage","usePdfFormFields","usePdfHighlightMode","usePdfViewerState","styles","BasePdfViewer","src","annotations","onAnnotationClick","onDownload","enableHighlight","onTextHighlight","onHighlightDelete","formData","onFormSubmit","onFormChange","initialPage","initialScale","initialSidebarOpen","enableDownload","sidebarMode","sidebarModeProp","outlineIcons","className","ref","viewer","highlightModeActive","toggleHighlightMode","deleteHighlight","pdfViewerRef","document","enabled","scrollToPage","hasFormFields","submitFormData","eventBusRef","annotationsByPage","rootClassName","pdfViewer","loading","createElement","loadingContainer","spinnerIcon","error","errorContainer","errorIcon","message","currentPage","numPages","scale","sidebarOpen","onPageChange","onScaleChange","setScale","onSearchOpen","search","openSearch","onSidebarToggle","toggleSidebar","download","onRotateLeft","rotateLeft","onRotateRight","rotateRight","onHighlightToggle","enableFormSave","onFormSave","isSearchOpen","query","totalMatches","currentMatchIndex","onQueryChange","setQuery","onNext","nextMatch","onPrev","prevMatch","onClose","closeSearch","contentArea","onPageClick","onSidebarModeChange","setSidebarMode","outlineItems","onItemClick","scrollContainerWrapper","containerRef","scrollContainer","viewerRef","portalTargets","map","target","pageAnnotations","pageNumber","length","key","pageHeight","container"],"sources":["PdfViewer.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Error as ErrorIcon, Spin } from \"@blueprintjs/icons\";\nimport classnames from \"classnames\";\nimport \"pdfjs-dist/web/pdf_viewer.css\";\nimport React, { forwardRef, useImperativeHandle } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { PdfViewerAnnotationLayer } from \"./components/PdfViewerAnnotationLayer.js\";\nimport { PdfViewerOutlineSidebar } from \"./components/PdfViewerOutlineSidebar.js\";\nimport { PdfViewerSearchBar } from \"./components/PdfViewerSearchBar.js\";\nimport { PdfViewerSidebar } from \"./components/PdfViewerSidebar.js\";\nimport { PdfViewerToolbar } from \"./components/PdfViewerToolbar.js\";\nimport { EMPTY_ANNOTATION_ARRAY } from \"./constants.js\";\nimport { usePdfAnnotationsByPage } from \"./hooks/usePdfAnnotationsByPage.js\";\nimport { usePdfFormFields } from \"./hooks/usePdfFormFields.js\";\nimport { usePdfHighlightMode } from \"./hooks/usePdfHighlightMode.js\";\nimport { usePdfViewerState } from \"./hooks/usePdfViewerState.js\";\nimport styles from \"./PdfViewer.module.css\";\nimport type { PdfViewerHandle, PdfViewerProps } from \"./types.js\";\n\nexport const BasePdfViewer: React.ForwardRefExoticComponent<\n PdfViewerProps & React.RefAttributes<PdfViewerHandle>\n> = forwardRef<PdfViewerHandle, PdfViewerProps>(\n function BasePdfViewer({\n src,\n annotations = EMPTY_ANNOTATION_ARRAY,\n onAnnotationClick,\n onDownload,\n enableHighlight = false,\n onTextHighlight,\n onHighlightDelete,\n formData,\n onFormSubmit,\n onFormChange,\n initialPage = 1,\n initialScale = 1.0,\n initialSidebarOpen = false,\n enableDownload = false,\n sidebarMode: sidebarModeProp = \"thumbnails\",\n outlineIcons,\n className,\n }, ref) {\n const viewer = usePdfViewerState({\n src,\n initialPage,\n initialScale,\n initialSidebarOpen,\n sidebarMode: sidebarModeProp,\n onDownload,\n });\n\n const { highlightModeActive, toggleHighlightMode, deleteHighlight } =\n usePdfHighlightMode({\n pdfViewerRef: viewer.pdfViewerRef,\n document: viewer.document,\n enabled: enableHighlight,\n onTextHighlight,\n onHighlightDelete,\n });\n\n useImperativeHandle(ref, () => ({\n scrollToPage: viewer.scrollToPage,\n deleteHighlight,\n }), [viewer.scrollToPage, deleteHighlight]);\n\n const { hasFormFields, submitFormData } = usePdfFormFields({\n pdfViewerRef: viewer.pdfViewerRef,\n eventBusRef: viewer.eventBusRef,\n document: viewer.document,\n formData,\n onFormSubmit,\n onFormChange,\n });\n\n const annotationsByPage = usePdfAnnotationsByPage(annotations);\n\n const rootClassName = classnames(styles.pdfViewer, className);\n\n if (viewer.loading) {\n return (\n <div className={rootClassName}>\n <div className={styles.loadingContainer}>\n <Spin className={styles.spinnerIcon} />\n Loading…\n </div>\n </div>\n );\n }\n\n if (viewer.error != null) {\n return (\n <div className={rootClassName}>\n <div className={styles.errorContainer}>\n <ErrorIcon className={styles.errorIcon} />\n Failed to load PDF: {viewer.error.message}\n </div>\n </div>\n );\n }\n\n if (viewer.document == null) {\n return (\n <div className={rootClassName}>\n <div className={styles.loadingContainer}>No document</div>\n </div>\n );\n }\n\n return (\n <div className={rootClassName}>\n <PdfViewerToolbar\n currentPage={viewer.currentPage}\n numPages={viewer.numPages}\n scale={viewer.scale}\n sidebarOpen={viewer.sidebarOpen}\n onPageChange={viewer.scrollToPage}\n onScaleChange={viewer.setScale}\n onSearchOpen={viewer.search.openSearch}\n onSidebarToggle={viewer.toggleSidebar}\n onDownload={viewer.download}\n enableDownload={enableDownload}\n onRotateLeft={viewer.rotateLeft}\n onRotateRight={viewer.rotateRight}\n enableHighlight={enableHighlight}\n highlightModeActive={highlightModeActive}\n onHighlightToggle={toggleHighlightMode}\n enableFormSave={onFormSubmit != null && hasFormFields}\n onFormSave={submitFormData}\n />\n {viewer.search.isSearchOpen && (\n <PdfViewerSearchBar\n query={viewer.search.query}\n totalMatches={viewer.search.totalMatches}\n currentMatchIndex={viewer.search.currentMatchIndex}\n onQueryChange={viewer.search.setQuery}\n onNext={viewer.search.nextMatch}\n onPrev={viewer.search.prevMatch}\n onClose={viewer.search.closeSearch}\n />\n )}\n <div className={styles.contentArea}>\n {viewer.sidebarOpen && viewer.sidebarMode === \"thumbnails\" && (\n <PdfViewerSidebar\n document={viewer.document}\n numPages={viewer.numPages}\n currentPage={viewer.currentPage}\n onPageClick={viewer.scrollToPage}\n sidebarMode={viewer.sidebarMode}\n onSidebarModeChange={viewer.setSidebarMode}\n />\n )}\n {viewer.sidebarOpen && viewer.sidebarMode === \"outline\" && (\n <PdfViewerOutlineSidebar\n outlineItems={viewer.outlineItems}\n currentPage={viewer.currentPage}\n onItemClick={viewer.scrollToPage}\n sidebarMode={viewer.sidebarMode}\n onSidebarModeChange={viewer.setSidebarMode}\n outlineIcons={outlineIcons}\n />\n )}\n <div className={styles.scrollContainerWrapper}>\n <div ref={viewer.containerRef} className={styles.scrollContainer}>\n <div ref={viewer.viewerRef} className=\"pdfViewer\" />\n {viewer.portalTargets.map((target) => {\n const pageAnnotations = annotationsByPage[target.pageNumber]\n ?? EMPTY_ANNOTATION_ARRAY;\n if (pageAnnotations.length === 0) {\n return null;\n }\n return createPortal(\n <PdfViewerAnnotationLayer\n key={target.pageNumber}\n annotations={pageAnnotations}\n pageHeight={target.pageHeight}\n scale={target.scale}\n onAnnotationClick={onAnnotationClick}\n />,\n target.container,\n );\n })}\n </div>\n </div>\n </div>\n </div>\n );\n },\n);\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2025 Palantir Technologies, Inc. All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import React, { createContext, useContext, useMemo } from "react";
|
|
18
|
+
import { EMPTY_ANNOTATION_ARRAY } from "./constants.js";
|
|
19
|
+
import { usePdfAnnotationsByPage } from "./hooks/usePdfAnnotationsByPage.js";
|
|
20
|
+
import { usePdfFormFields } from "./hooks/usePdfFormFields.js";
|
|
21
|
+
import { usePdfHighlightMode } from "./hooks/usePdfHighlightMode.js";
|
|
22
|
+
import { usePdfViewerState } from "./hooks/usePdfViewerState.js";
|
|
23
|
+
|
|
24
|
+
/** The shape of the value provided by {@link PdfViewerProvider}. */
|
|
25
|
+
|
|
26
|
+
const PdfViewerContext = /*#__PURE__*/createContext(null);
|
|
27
|
+
/** Provides {@link PdfViewerContextValue} to descendant components. */
|
|
28
|
+
export function PdfViewerProvider({
|
|
29
|
+
value,
|
|
30
|
+
children
|
|
31
|
+
}) {
|
|
32
|
+
return /*#__PURE__*/React.createElement(PdfViewerContext.Provider, {
|
|
33
|
+
value: value
|
|
34
|
+
}, children);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Returns the nearest {@link PdfViewerContextValue} from a {@link PdfViewerProvider}.
|
|
39
|
+
* Throws if called outside a provider.
|
|
40
|
+
*/
|
|
41
|
+
export function usePdfViewerContext() {
|
|
42
|
+
const ctx = useContext(PdfViewerContext);
|
|
43
|
+
if (ctx == null) {
|
|
44
|
+
throw new Error("usePdfViewerContext must be used within a PdfViewerProvider");
|
|
45
|
+
}
|
|
46
|
+
return ctx;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Consumer-facing setup hook analogous to react-hook-form's `useForm()`.
|
|
51
|
+
* Accepts viewer options and returns a {@link PdfViewerContextValue} suitable
|
|
52
|
+
* for passing to {@link PdfViewerProvider}.
|
|
53
|
+
*/
|
|
54
|
+
export function usePdfViewerInstance(options) {
|
|
55
|
+
const viewer = usePdfViewerState({
|
|
56
|
+
src: options.src,
|
|
57
|
+
initialPage: options.initialPage,
|
|
58
|
+
initialScale: options.initialScale,
|
|
59
|
+
initialSidebarOpen: options.initialSidebarOpen,
|
|
60
|
+
sidebarMode: options.sidebarMode,
|
|
61
|
+
onDownload: options.onDownload
|
|
62
|
+
});
|
|
63
|
+
const {
|
|
64
|
+
highlightModeActive,
|
|
65
|
+
toggleHighlightMode
|
|
66
|
+
} = usePdfHighlightMode({
|
|
67
|
+
pdfViewerRef: viewer.pdfViewerRef,
|
|
68
|
+
document: viewer.document,
|
|
69
|
+
enabled: options.highlightEnabled ?? false,
|
|
70
|
+
onTextHighlight: options.onTextHighlight,
|
|
71
|
+
onHighlightDelete: options.onHighlightDelete
|
|
72
|
+
});
|
|
73
|
+
const {
|
|
74
|
+
hasFormFields,
|
|
75
|
+
submitFormData
|
|
76
|
+
} = usePdfFormFields({
|
|
77
|
+
pdfViewerRef: viewer.pdfViewerRef,
|
|
78
|
+
eventBusRef: viewer.eventBusRef,
|
|
79
|
+
document: viewer.document,
|
|
80
|
+
formData: options.formData,
|
|
81
|
+
onFormSubmit: options.onFormSubmit,
|
|
82
|
+
onFormChange: options.onFormChange
|
|
83
|
+
});
|
|
84
|
+
const annotations = options.annotations ?? EMPTY_ANNOTATION_ARRAY;
|
|
85
|
+
const annotationsByPage = usePdfAnnotationsByPage(annotations);
|
|
86
|
+
const highlightEnabled = options.highlightEnabled ?? false;
|
|
87
|
+
const enableDownload = options.enableDownload ?? false;
|
|
88
|
+
const enableFormSave = options.onFormSubmit != null && hasFormFields;
|
|
89
|
+
const {
|
|
90
|
+
onAnnotationClick,
|
|
91
|
+
outlineIcons
|
|
92
|
+
} = options;
|
|
93
|
+
return useMemo(() => ({
|
|
94
|
+
...viewer,
|
|
95
|
+
highlightEnabled,
|
|
96
|
+
highlightModeActive,
|
|
97
|
+
toggleHighlightMode,
|
|
98
|
+
hasFormFields,
|
|
99
|
+
submitFormData,
|
|
100
|
+
annotations,
|
|
101
|
+
annotationsByPage,
|
|
102
|
+
onAnnotationClick,
|
|
103
|
+
enableDownload,
|
|
104
|
+
enableFormSave,
|
|
105
|
+
outlineIcons
|
|
106
|
+
}), [viewer, highlightEnabled, highlightModeActive, toggleHighlightMode, hasFormFields, submitFormData, annotations, annotationsByPage, onAnnotationClick, enableDownload, enableFormSave, outlineIcons]);
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=PdfViewerContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PdfViewerContext.js","names":["React","createContext","useContext","useMemo","EMPTY_ANNOTATION_ARRAY","usePdfAnnotationsByPage","usePdfFormFields","usePdfHighlightMode","usePdfViewerState","PdfViewerContext","PdfViewerProvider","value","children","createElement","Provider","usePdfViewerContext","ctx","Error","usePdfViewerInstance","options","viewer","src","initialPage","initialScale","initialSidebarOpen","sidebarMode","onDownload","highlightModeActive","toggleHighlightMode","pdfViewerRef","document","enabled","highlightEnabled","onTextHighlight","onHighlightDelete","hasFormFields","submitFormData","eventBusRef","formData","onFormSubmit","onFormChange","annotations","annotationsByPage","enableDownload","enableFormSave","onAnnotationClick","outlineIcons"],"sources":["PdfViewerContext.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { PDFDocumentProxy } from \"pdfjs-dist\";\nimport type {\n EventBus,\n PDFFindController,\n PDFViewer,\n} from \"pdfjs-dist/web/pdf_viewer.mjs\";\nimport React, { createContext, useContext, useMemo } from \"react\";\nimport type { RefObject } from \"react\";\nimport { EMPTY_ANNOTATION_ARRAY } from \"./constants.js\";\nimport type {\n AnnotationPortalTarget,\n} from \"./hooks/usePdfAnnotationPortals.js\";\nimport { usePdfAnnotationsByPage } from \"./hooks/usePdfAnnotationsByPage.js\";\nimport { usePdfFormFields } from \"./hooks/usePdfFormFields.js\";\nimport { usePdfHighlightMode } from \"./hooks/usePdfHighlightMode.js\";\nimport type { UsePdfViewerSearchResult } from \"./hooks/usePdfViewerSearch.js\";\nimport { usePdfViewerState } from \"./hooks/usePdfViewerState.js\";\nimport type {\n OutlineItem,\n PdfAnnotation,\n PdfViewerInstanceOptions,\n SidebarMode,\n} from \"./types.js\";\n\n/** The shape of the value provided by {@link PdfViewerProvider}. */\nexport interface PdfViewerContextValue {\n // From UsePdfViewerStateResult (core + state)\n document: PDFDocumentProxy | undefined;\n numPages: number;\n loading: boolean;\n error: Error | undefined;\n containerRef: RefObject<HTMLDivElement>;\n viewerRef: RefObject<HTMLDivElement>;\n currentPage: number;\n scrollToPage: (page: number) => void;\n scale: number;\n setScale: (scale: number) => void;\n zoomIn: () => void;\n zoomOut: () => void;\n rotation: number;\n rotateLeft: () => void;\n rotateRight: () => void;\n sidebarOpen: boolean;\n sidebarMode: SidebarMode;\n setSidebarMode: (mode: SidebarMode) => void;\n toggleSidebar: () => void;\n search: UsePdfViewerSearchResult;\n outlineItems: OutlineItem[];\n download: (filename?: string) => void;\n portalTargets: AnnotationPortalTarget[];\n\n // From UsePdfHighlightModeResult\n highlightEnabled: boolean;\n highlightModeActive: boolean;\n toggleHighlightMode: () => void;\n\n // From UsePdfFormFieldsResult\n hasFormFields: boolean;\n submitFormData: () => void;\n\n // Annotations\n annotations: PdfAnnotation[];\n annotationsByPage: Record<number, PdfAnnotation[]>;\n onAnnotationClick: ((annotation: PdfAnnotation) => void) | undefined;\n\n // Config props passed through\n enableDownload: boolean;\n enableFormSave: boolean;\n outlineIcons: Partial<Record<number, React.ComponentType>> | undefined;\n\n // Internal refs (for advanced consumers)\n pdfViewerRef: RefObject<PDFViewer | null>;\n eventBusRef: RefObject<EventBus | null>;\n findControllerRef: RefObject<PDFFindController | null>;\n}\n\nconst PdfViewerContext = createContext<PdfViewerContextValue | null>(null);\n\nexport interface PdfViewerProviderProps {\n value: PdfViewerContextValue;\n children: React.ReactNode;\n}\n\n/** Provides {@link PdfViewerContextValue} to descendant components. */\nexport function PdfViewerProvider(\n { value, children }: PdfViewerProviderProps,\n): React.ReactElement {\n return (\n <PdfViewerContext.Provider value={value}>\n {children}\n </PdfViewerContext.Provider>\n );\n}\n\n/**\n * Returns the nearest {@link PdfViewerContextValue} from a {@link PdfViewerProvider}.\n * Throws if called outside a provider.\n */\nexport function usePdfViewerContext(): PdfViewerContextValue {\n const ctx = useContext(PdfViewerContext);\n if (ctx == null) {\n throw new Error(\n \"usePdfViewerContext must be used within a PdfViewerProvider\",\n );\n }\n return ctx;\n}\n\n/**\n * Consumer-facing setup hook analogous to react-hook-form's `useForm()`.\n * Accepts viewer options and returns a {@link PdfViewerContextValue} suitable\n * for passing to {@link PdfViewerProvider}.\n */\nexport function usePdfViewerInstance(\n options: PdfViewerInstanceOptions,\n): PdfViewerContextValue {\n const viewer = usePdfViewerState({\n src: options.src,\n initialPage: options.initialPage,\n initialScale: options.initialScale,\n initialSidebarOpen: options.initialSidebarOpen,\n sidebarMode: options.sidebarMode,\n onDownload: options.onDownload,\n });\n\n const { highlightModeActive, toggleHighlightMode } = usePdfHighlightMode({\n pdfViewerRef: viewer.pdfViewerRef,\n document: viewer.document,\n enabled: options.highlightEnabled ?? false,\n onTextHighlight: options.onTextHighlight,\n onHighlightDelete: options.onHighlightDelete,\n });\n\n const { hasFormFields, submitFormData } = usePdfFormFields({\n pdfViewerRef: viewer.pdfViewerRef,\n eventBusRef: viewer.eventBusRef,\n document: viewer.document,\n formData: options.formData,\n onFormSubmit: options.onFormSubmit,\n onFormChange: options.onFormChange,\n });\n\n const annotations = options.annotations ?? EMPTY_ANNOTATION_ARRAY;\n const annotationsByPage = usePdfAnnotationsByPage(annotations);\n\n const highlightEnabled = options.highlightEnabled ?? false;\n const enableDownload = options.enableDownload ?? false;\n const enableFormSave = options.onFormSubmit != null && hasFormFields;\n const { onAnnotationClick, outlineIcons } = options;\n\n return useMemo(\n () => ({\n ...viewer,\n highlightEnabled,\n highlightModeActive,\n toggleHighlightMode,\n hasFormFields,\n submitFormData,\n annotations,\n annotationsByPage,\n onAnnotationClick,\n enableDownload,\n enableFormSave,\n outlineIcons,\n }),\n [\n viewer,\n highlightEnabled,\n highlightModeActive,\n toggleHighlightMode,\n hasFormFields,\n submitFormData,\n annotations,\n annotationsByPage,\n onAnnotationClick,\n enableDownload,\n enableFormSave,\n outlineIcons,\n ],\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -17,12 +17,19 @@
|
|
|
17
17
|
import classnames from "classnames";
|
|
18
18
|
import React, { useCallback, useMemo } from "react";
|
|
19
19
|
import styles from "./PdfViewerAnnotationLayer.module.css.js";
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
20
|
+
/** Convert a single PDF rect (bottom-left origin) to CSS positioning (top-left origin). */
|
|
21
|
+
function computeRectStyle(rect, pageHeight, scale, color) {
|
|
22
|
+
return {
|
|
23
|
+
left: rect.x * scale,
|
|
24
|
+
top: (pageHeight - rect.y - rect.height) * scale,
|
|
25
|
+
width: rect.width * scale,
|
|
26
|
+
height: rect.height * scale,
|
|
27
|
+
...(color != null ? {
|
|
28
|
+
"--osdk-pdf-annotation-color": color
|
|
29
|
+
} : {})
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
function useAnnotationHandlers(annotation, onClick) {
|
|
26
33
|
const handleClick = useCallback(() => {
|
|
27
34
|
onClick?.(annotation);
|
|
28
35
|
}, [onClick, annotation]);
|
|
@@ -32,18 +39,45 @@ function AnnotationItem({
|
|
|
32
39
|
onClick?.(annotation);
|
|
33
40
|
}
|
|
34
41
|
}, [onClick, annotation]);
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
42
|
+
return {
|
|
43
|
+
handleClick,
|
|
44
|
+
handleKeyDown
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
function AnnotationItem({
|
|
48
|
+
annotation,
|
|
49
|
+
pageHeight,
|
|
50
|
+
scale,
|
|
51
|
+
onClick
|
|
52
|
+
}) {
|
|
53
|
+
const {
|
|
54
|
+
handleClick,
|
|
55
|
+
handleKeyDown
|
|
56
|
+
} = useAnnotationHandlers(annotation, onClick);
|
|
46
57
|
const className = classnames(styles.annotation, styles[annotation.type]);
|
|
58
|
+
const multiRects = annotation.rects;
|
|
59
|
+
const hasMultipleRects = multiRects != null && multiRects.length > 1;
|
|
60
|
+
const style = useMemo(() => computeRectStyle(annotation.rect, pageHeight, scale, annotation.color), [annotation, pageHeight, scale]);
|
|
61
|
+
|
|
62
|
+
// Multi-rect: render a group wrapper with one div per rect
|
|
63
|
+
if (hasMultipleRects) {
|
|
64
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
65
|
+
className: styles.annotationGroup,
|
|
66
|
+
onClick: handleClick,
|
|
67
|
+
onKeyDown: handleKeyDown,
|
|
68
|
+
role: "button",
|
|
69
|
+
tabIndex: 0,
|
|
70
|
+
title: annotation.label,
|
|
71
|
+
"data-annotation-id": annotation.id
|
|
72
|
+
}, multiRects.map((rect, i) => /*#__PURE__*/React.createElement("div", {
|
|
73
|
+
key: i,
|
|
74
|
+
className: className,
|
|
75
|
+
style: computeRectStyle(rect, pageHeight, scale, annotation.color)
|
|
76
|
+
})));
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Single rect: existing behavior
|
|
80
|
+
|
|
47
81
|
return /*#__PURE__*/React.createElement("div", {
|
|
48
82
|
className: className,
|
|
49
83
|
style: style,
|
|
@@ -55,6 +89,33 @@ function AnnotationItem({
|
|
|
55
89
|
"data-annotation-id": annotation.id
|
|
56
90
|
});
|
|
57
91
|
}
|
|
92
|
+
function CustomAnnotationItem({
|
|
93
|
+
annotation,
|
|
94
|
+
pageHeight,
|
|
95
|
+
scale,
|
|
96
|
+
onClick
|
|
97
|
+
}) {
|
|
98
|
+
const {
|
|
99
|
+
handleClick,
|
|
100
|
+
handleKeyDown
|
|
101
|
+
} = useAnnotationHandlers(annotation, onClick);
|
|
102
|
+
const style = useMemo(() => computeRectStyle(annotation.rect, pageHeight, scale, undefined), [annotation, pageHeight, scale]);
|
|
103
|
+
const renderProps = useMemo(() => ({
|
|
104
|
+
annotation,
|
|
105
|
+
scale,
|
|
106
|
+
pageHeight
|
|
107
|
+
}), [annotation, scale, pageHeight]);
|
|
108
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
109
|
+
className: styles.annotation,
|
|
110
|
+
style: style,
|
|
111
|
+
onClick: handleClick,
|
|
112
|
+
onKeyDown: handleKeyDown,
|
|
113
|
+
role: "button",
|
|
114
|
+
tabIndex: 0,
|
|
115
|
+
title: annotation.label,
|
|
116
|
+
"data-annotation-id": annotation.id
|
|
117
|
+
}, annotation.render(renderProps));
|
|
118
|
+
}
|
|
58
119
|
export function PdfViewerAnnotationLayer({
|
|
59
120
|
annotations,
|
|
60
121
|
pageHeight,
|
|
@@ -63,7 +124,13 @@ export function PdfViewerAnnotationLayer({
|
|
|
63
124
|
}) {
|
|
64
125
|
return /*#__PURE__*/React.createElement("div", {
|
|
65
126
|
className: styles.annotationLayer
|
|
66
|
-
}, annotations.map(annotation => /*#__PURE__*/React.createElement(
|
|
127
|
+
}, annotations.map(annotation => annotation.type === "custom" ? /*#__PURE__*/React.createElement(CustomAnnotationItem, {
|
|
128
|
+
key: annotation.id,
|
|
129
|
+
annotation: annotation,
|
|
130
|
+
pageHeight: pageHeight,
|
|
131
|
+
scale: scale,
|
|
132
|
+
onClick: onAnnotationClick
|
|
133
|
+
}) : /*#__PURE__*/React.createElement(AnnotationItem, {
|
|
67
134
|
key: annotation.id,
|
|
68
135
|
annotation: annotation,
|
|
69
136
|
pageHeight: pageHeight,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PdfViewerAnnotationLayer.js","names":["classnames","React","useCallback","useMemo","styles","
|
|
1
|
+
{"version":3,"file":"PdfViewerAnnotationLayer.js","names":["classnames","React","useCallback","useMemo","styles","computeRectStyle","rect","pageHeight","scale","color","left","x","top","y","height","width","useAnnotationHandlers","annotation","onClick","handleClick","handleKeyDown","e","key","preventDefault","AnnotationItem","className","type","multiRects","rects","hasMultipleRects","length","style","createElement","annotationGroup","onKeyDown","role","tabIndex","title","label","id","map","i","CustomAnnotationItem","undefined","renderProps","render","PdfViewerAnnotationLayer","annotations","onAnnotationClick","annotationLayer"],"sources":["PdfViewerAnnotationLayer.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport classnames from \"classnames\";\nimport React, { useCallback, useMemo } from \"react\";\nimport type { PdfAnnotation, PdfCustomAnnotation, PdfRect } from \"../types.js\";\nimport styles from \"./PdfViewerAnnotationLayer.module.css\";\n\nexport interface PdfViewerAnnotationLayerProps {\n annotations: PdfAnnotation[];\n pageHeight: number;\n scale: number;\n onAnnotationClick?: (annotation: PdfAnnotation) => void;\n}\n\ninterface AnnotationItemProps {\n annotation: PdfAnnotation;\n pageHeight: number;\n scale: number;\n onClick?: (annotation: PdfAnnotation) => void;\n}\n\n/** Convert a single PDF rect (bottom-left origin) to CSS positioning (top-left origin). */\nfunction computeRectStyle(\n rect: PdfRect,\n pageHeight: number,\n scale: number,\n color: string | undefined,\n): React.CSSProperties {\n return {\n left: rect.x * scale,\n top: (pageHeight - rect.y - rect.height) * scale,\n width: rect.width * scale,\n height: rect.height * scale,\n ...(color != null\n ? { \"--osdk-pdf-annotation-color\": color } as React.CSSProperties\n : {}),\n };\n}\n\nfunction useAnnotationHandlers(\n annotation: PdfAnnotation,\n onClick?: (annotation: PdfAnnotation) => void,\n) {\n const handleClick = useCallback(() => {\n onClick?.(annotation);\n }, [onClick, annotation]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n onClick?.(annotation);\n }\n },\n [onClick, annotation],\n );\n\n return { handleClick, handleKeyDown };\n}\n\nfunction AnnotationItem({\n annotation,\n pageHeight,\n scale,\n onClick,\n}: AnnotationItemProps): React.ReactElement {\n const { handleClick, handleKeyDown } = useAnnotationHandlers(\n annotation,\n onClick,\n );\n\n const className = classnames(\n styles.annotation,\n styles[annotation.type],\n );\n\n const multiRects = annotation.rects;\n const hasMultipleRects = multiRects != null && multiRects.length > 1;\n\n const style = useMemo(\n () =>\n computeRectStyle(annotation.rect, pageHeight, scale, annotation.color),\n [annotation, pageHeight, scale],\n );\n\n // Multi-rect: render a group wrapper with one div per rect\n if (hasMultipleRects) {\n return (\n <div\n className={styles.annotationGroup}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n role=\"button\"\n tabIndex={0}\n title={annotation.label}\n data-annotation-id={annotation.id}\n >\n {multiRects.map((rect, i) => (\n <div\n key={i}\n className={className}\n style={computeRectStyle(\n rect,\n pageHeight,\n scale,\n annotation.color,\n )}\n />\n ))}\n </div>\n );\n }\n\n // Single rect: existing behavior\n\n return (\n <div\n className={className}\n style={style}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n role=\"button\"\n tabIndex={0}\n title={annotation.label}\n data-annotation-id={annotation.id}\n />\n );\n}\n\nfunction CustomAnnotationItem({\n annotation,\n pageHeight,\n scale,\n onClick,\n}: AnnotationItemProps & {\n annotation: PdfCustomAnnotation;\n}): React.ReactElement {\n const { handleClick, handleKeyDown } = useAnnotationHandlers(\n annotation,\n onClick,\n );\n\n const style = useMemo(\n () => computeRectStyle(annotation.rect, pageHeight, scale, undefined),\n [annotation, pageHeight, scale],\n );\n\n const renderProps = useMemo(\n () => ({ annotation, scale, pageHeight }),\n [annotation, scale, pageHeight],\n );\n\n return (\n <div\n className={styles.annotation}\n style={style}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n role=\"button\"\n tabIndex={0}\n title={annotation.label}\n data-annotation-id={annotation.id}\n >\n {annotation.render(renderProps)}\n </div>\n );\n}\n\nexport function PdfViewerAnnotationLayer({\n annotations,\n pageHeight,\n scale,\n onAnnotationClick,\n}: PdfViewerAnnotationLayerProps): React.ReactElement {\n return (\n <div className={styles.annotationLayer}>\n {annotations.map((annotation) =>\n annotation.type === \"custom\"\n ? (\n <CustomAnnotationItem\n key={annotation.id}\n annotation={annotation}\n pageHeight={pageHeight}\n scale={scale}\n onClick={onAnnotationClick}\n />\n )\n : (\n <AnnotationItem\n key={annotation.id}\n annotation={annotation}\n pageHeight={pageHeight}\n scale={scale}\n onClick={onAnnotationClick}\n />\n )\n )}\n </div>\n );\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAOA,UAAU,MAAM,YAAY;AACnC,OAAOC,KAAK,IAAIC,WAAW,EAAEC,OAAO,QAAQ,OAAO;AAEnD,OAAOC,MAAM,MAAM,uCAAuC;AAgB1D;AACA,SAASC,gBAAgBA,CACvBC,IAAa,EACbC,UAAkB,EAClBC,KAAa,EACbC,KAAyB,EACJ;EACrB,OAAO;IACLC,IAAI,EAAEJ,IAAI,CAACK,CAAC,GAAGH,KAAK;IACpBI,GAAG,EAAE,CAACL,UAAU,GAAGD,IAAI,CAACO,CAAC,GAAGP,IAAI,CAACQ,MAAM,IAAIN,KAAK;IAChDO,KAAK,EAAET,IAAI,CAACS,KAAK,GAAGP,KAAK;IACzBM,MAAM,EAAER,IAAI,CAACQ,MAAM,GAAGN,KAAK;IAC3B,IAAIC,KAAK,IAAI,IAAI,GACb;MAAE,6BAA6B,EAAEA;IAAM,CAAC,GACxC,CAAC,CAAC;EACR,CAAC;AACH;AAEA,SAASO,qBAAqBA,CAC5BC,UAAyB,EACzBC,OAA6C,EAC7C;EACA,MAAMC,WAAW,GAAGjB,WAAW,CAAC,MAAM;IACpCgB,OAAO,GAAGD,UAAU,CAAC;EACvB,CAAC,EAAE,CAACC,OAAO,EAAED,UAAU,CAAC,CAAC;EAEzB,MAAMG,aAAa,GAAGlB,WAAW,CAC9BmB,CAAsB,IAAK;IAC1B,IAAIA,CAAC,CAACC,GAAG,KAAK,OAAO,EAAE;MACrBD,CAAC,CAACE,cAAc,CAAC,CAAC;MAClBL,OAAO,GAAGD,UAAU,CAAC;IACvB;EACF,CAAC,EACD,CAACC,OAAO,EAAED,UAAU,CACtB,CAAC;EAED,OAAO;IAAEE,WAAW;IAAEC;EAAc,CAAC;AACvC;AAEA,SAASI,cAAcA,CAAC;EACtBP,UAAU;EACVV,UAAU;EACVC,KAAK;EACLU;AACmB,CAAC,EAAsB;EAC1C,MAAM;IAAEC,WAAW;IAAEC;EAAc,CAAC,GAAGJ,qBAAqB,CAC1DC,UAAU,EACVC,OACF,CAAC;EAED,MAAMO,SAAS,GAAGzB,UAAU,CAC1BI,MAAM,CAACa,UAAU,EACjBb,MAAM,CAACa,UAAU,CAACS,IAAI,CACxB,CAAC;EAED,MAAMC,UAAU,GAAGV,UAAU,CAACW,KAAK;EACnC,MAAMC,gBAAgB,GAAGF,UAAU,IAAI,IAAI,IAAIA,UAAU,CAACG,MAAM,GAAG,CAAC;EAEpE,MAAMC,KAAK,GAAG5B,OAAO,CACnB,MACEE,gBAAgB,CAACY,UAAU,CAACX,IAAI,EAAEC,UAAU,EAAEC,KAAK,EAAES,UAAU,CAACR,KAAK,CAAC,EACxE,CAACQ,UAAU,EAAEV,UAAU,EAAEC,KAAK,CAChC,CAAC;;EAED;EACA,IAAIqB,gBAAgB,EAAE;IACpB,oBACE5B,KAAA,CAAA+B,aAAA;MACEP,SAAS,EAAErB,MAAM,CAAC6B,eAAgB;MAClCf,OAAO,EAAEC,WAAY;MACrBe,SAAS,EAAEd,aAAc;MACzBe,IAAI,EAAC,QAAQ;MACbC,QAAQ,EAAE,CAAE;MACZC,KAAK,EAAEpB,UAAU,CAACqB,KAAM;MACxB,sBAAoBrB,UAAU,CAACsB;IAAG,GAEjCZ,UAAU,CAACa,GAAG,CAAC,CAAClC,IAAI,EAAEmC,CAAC,kBACtBxC,KAAA,CAAA+B,aAAA;MACEV,GAAG,EAAEmB,CAAE;MACPhB,SAAS,EAAEA,SAAU;MACrBM,KAAK,EAAE1B,gBAAgB,CACrBC,IAAI,EACJC,UAAU,EACVC,KAAK,EACLS,UAAU,CAACR,KACb;IAAE,CACH,CACF,CACE,CAAC;EAEV;;EAEA;;EAEA,oBACER,KAAA,CAAA+B,aAAA;IACEP,SAAS,EAAEA,SAAU;IACrBM,KAAK,EAAEA,KAAM;IACbb,OAAO,EAAEC,WAAY;IACrBe,SAAS,EAAEd,aAAc;IACzBe,IAAI,EAAC,QAAQ;IACbC,QAAQ,EAAE,CAAE;IACZC,KAAK,EAAEpB,UAAU,CAACqB,KAAM;IACxB,sBAAoBrB,UAAU,CAACsB;EAAG,CACnC,CAAC;AAEN;AAEA,SAASG,oBAAoBA,CAAC;EAC5BzB,UAAU;EACVV,UAAU;EACVC,KAAK;EACLU;AAGF,CAAC,EAAsB;EACrB,MAAM;IAAEC,WAAW;IAAEC;EAAc,CAAC,GAAGJ,qBAAqB,CAC1DC,UAAU,EACVC,OACF,CAAC;EAED,MAAMa,KAAK,GAAG5B,OAAO,CACnB,MAAME,gBAAgB,CAACY,UAAU,CAACX,IAAI,EAAEC,UAAU,EAAEC,KAAK,EAAEmC,SAAS,CAAC,EACrE,CAAC1B,UAAU,EAAEV,UAAU,EAAEC,KAAK,CAChC,CAAC;EAED,MAAMoC,WAAW,GAAGzC,OAAO,CACzB,OAAO;IAAEc,UAAU;IAAET,KAAK;IAAED;EAAW,CAAC,CAAC,EACzC,CAACU,UAAU,EAAET,KAAK,EAAED,UAAU,CAChC,CAAC;EAED,oBACEN,KAAA,CAAA+B,aAAA;IACEP,SAAS,EAAErB,MAAM,CAACa,UAAW;IAC7Bc,KAAK,EAAEA,KAAM;IACbb,OAAO,EAAEC,WAAY;IACrBe,SAAS,EAAEd,aAAc;IACzBe,IAAI,EAAC,QAAQ;IACbC,QAAQ,EAAE,CAAE;IACZC,KAAK,EAAEpB,UAAU,CAACqB,KAAM;IACxB,sBAAoBrB,UAAU,CAACsB;EAAG,GAEjCtB,UAAU,CAAC4B,MAAM,CAACD,WAAW,CAC3B,CAAC;AAEV;AAEA,OAAO,SAASE,wBAAwBA,CAAC;EACvCC,WAAW;EACXxC,UAAU;EACVC,KAAK;EACLwC;AAC6B,CAAC,EAAsB;EACpD,oBACE/C,KAAA,CAAA+B,aAAA;IAAKP,SAAS,EAAErB,MAAM,CAAC6C;EAAgB,GACpCF,WAAW,CAACP,GAAG,CAAEvB,UAAU,IAC1BA,UAAU,CAACS,IAAI,KAAK,QAAQ,gBAExBzB,KAAA,CAAA+B,aAAA,CAACU,oBAAoB;IACnBpB,GAAG,EAAEL,UAAU,CAACsB,EAAG;IACnBtB,UAAU,EAAEA,UAAW;IACvBV,UAAU,EAAEA,UAAW;IACvBC,KAAK,EAAEA,KAAM;IACbU,OAAO,EAAE8B;EAAkB,CAC5B,CAAC,gBAGF/C,KAAA,CAAA+B,aAAA,CAACR,cAAc;IACbF,GAAG,EAAEL,UAAU,CAACsB,EAAG;IACnBtB,UAAU,EAAEA,UAAW;IACvBV,UAAU,EAAEA,UAAW;IACvBC,KAAK,EAAEA,KAAM;IACbU,OAAO,EAAE8B;EAAkB,CAC5B,CAEP,CACG,CAAC;AAEV","ignoreList":[]}
|
|
@@ -8,6 +8,24 @@
|
|
|
8
8
|
z-index: 3;
|
|
9
9
|
}
|
|
10
10
|
|
|
11
|
+
.annotationGroup {
|
|
12
|
+
position: absolute;
|
|
13
|
+
top: 0;
|
|
14
|
+
left: 0;
|
|
15
|
+
width: 100%;
|
|
16
|
+
height: 100%;
|
|
17
|
+
pointer-events: none;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
.annotationGroup:focus-visible {
|
|
21
|
+
outline: var(--osdk-focus-outline);
|
|
22
|
+
outline-offset: var(--osdk-focus-visible-outline-offset);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
.annotationGroup .annotation {
|
|
26
|
+
pointer-events: auto;
|
|
27
|
+
}
|
|
28
|
+
|
|
11
29
|
.annotation {
|
|
12
30
|
position: absolute;
|
|
13
31
|
pointer-events: auto;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// CSS Module proxy for PdfViewerAnnotationLayer.module.css
|
|
2
2
|
const styles = {
|
|
3
3
|
"annotationLayer": "PdfViewerAnnotationLayer-module__annotationLayer___mljRfBSQ",
|
|
4
|
+
"annotationGroup": "PdfViewerAnnotationLayer-module__annotationGroup___CiaFrKH5",
|
|
4
5
|
"annotation": "PdfViewerAnnotationLayer-module__annotation___1dAkVbQ8",
|
|
5
6
|
"highlight": "PdfViewerAnnotationLayer-module__highlight___uPiyo2kN",
|
|
6
7
|
"underline": "PdfViewerAnnotationLayer-module__underline___-qCk9Jld",
|