@payloadcms/ui 3.68.0-internal-debug.2eb12b9 → 3.68.0-internal-debug.185cc5f
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/elements/AnimateHeight/usePatchAnimateHeight.js +2 -2
- package/dist/elements/AnimateHeight/usePatchAnimateHeight.js.map +1 -1
- package/dist/elements/Autosave/index.js +1 -0
- package/dist/elements/Autosave/index.js.map +1 -1
- package/dist/elements/BulkUpload/EditMany/index.js +2 -2
- package/dist/elements/BulkUpload/EditMany/index.js.map +1 -1
- package/dist/elements/BulkUpload/FormsManager/index.js +8 -8
- package/dist/elements/BulkUpload/FormsManager/index.js.map +1 -1
- package/dist/elements/BulkUpload/index.js +12 -1
- package/dist/elements/BulkUpload/index.js.map +1 -1
- package/dist/elements/Button/index.js +2 -2
- package/dist/elements/Button/index.js.map +1 -1
- package/dist/elements/Button/types.js +13 -1
- package/dist/elements/Button/types.js.map +1 -1
- package/dist/elements/Card/index.js +5 -1
- package/dist/elements/Card/index.js.map +1 -1
- package/dist/elements/CodeEditor/CodeEditor.js +2 -2
- package/dist/elements/CodeEditor/CodeEditor.js.map +1 -1
- package/dist/elements/CodeEditor/types.js +3 -1
- package/dist/elements/CodeEditor/types.js.map +1 -1
- package/dist/elements/Collapsible/index.js +8 -1
- package/dist/elements/Collapsible/index.js.map +1 -1
- package/dist/elements/Combobox/index.js +6 -0
- package/dist/elements/Combobox/index.js.map +1 -1
- package/dist/elements/DatePicker/DatePicker.js +1 -0
- package/dist/elements/DatePicker/DatePicker.js.map +1 -1
- package/dist/elements/DatePicker/getFormattedLocale.js +1 -0
- package/dist/elements/DatePicker/getFormattedLocale.js.map +1 -1
- package/dist/elements/DeleteMany/index.js +25 -1
- package/dist/elements/DeleteMany/index.js.map +1 -1
- package/dist/elements/DocumentControls/index.js +1 -1
- package/dist/elements/DocumentControls/index.js.map +1 -1
- package/dist/elements/DocumentDrawer/Provider.js +5 -1
- package/dist/elements/DocumentDrawer/Provider.js.map +1 -1
- package/dist/elements/DocumentDrawer/types.js +11 -1
- package/dist/elements/DocumentDrawer/types.js.map +1 -1
- package/dist/elements/DraggableSortable/useDraggableSortable/index.js +1 -0
- package/dist/elements/DraggableSortable/useDraggableSortable/index.js.map +1 -1
- package/dist/elements/Drawer/index.js +3 -1
- package/dist/elements/Drawer/index.js.map +1 -1
- package/dist/elements/EditMany/DrawerContent.js +15 -1
- package/dist/elements/EditMany/DrawerContent.js.map +1 -1
- package/dist/elements/EditMany/index.js +3 -1
- package/dist/elements/EditMany/index.js.map +1 -1
- package/dist/elements/FolderView/Drawers/MoveToFolder/index.js +8 -1
- package/dist/elements/FolderView/Drawers/MoveToFolder/index.js.map +1 -1
- package/dist/elements/FolderView/FolderFileCard/index.js +1 -0
- package/dist/elements/FolderView/FolderFileCard/index.js.map +1 -1
- package/dist/elements/FolderView/MoveDocToFolder/index.js +2 -3
- package/dist/elements/FolderView/MoveDocToFolder/index.js.map +1 -1
- package/dist/elements/HTMLDiff/diff/index.js +24 -3
- package/dist/elements/HTMLDiff/diff/index.js.map +1 -1
- package/dist/elements/HydrateAuthProvider/index.js +6 -1
- package/dist/elements/HydrateAuthProvider/index.js.map +1 -1
- package/dist/elements/LeaveWithoutSaving/usePreventLeave.js +3 -1
- package/dist/elements/LeaveWithoutSaving/usePreventLeave.js.map +1 -1
- package/dist/elements/Link/index.js +5 -1
- package/dist/elements/Link/index.js.map +1 -1
- package/dist/elements/ListControls/types.js +7 -1
- package/dist/elements/ListControls/types.js.map +1 -1
- package/dist/elements/ListDrawer/DrawerContent.js +2 -2
- package/dist/elements/ListDrawer/DrawerContent.js.map +1 -1
- package/dist/elements/ListDrawer/Provider.js +8 -1
- package/dist/elements/ListDrawer/Provider.js.map +1 -1
- package/dist/elements/ListDrawer/index.js +2 -1
- package/dist/elements/ListDrawer/index.js.map +1 -1
- package/dist/elements/ListDrawer/types.js +5 -1
- package/dist/elements/ListDrawer/types.js.map +1 -1
- package/dist/elements/ListHeader/TitleActions/ListBulkUploadButton.js +5 -1
- package/dist/elements/ListHeader/TitleActions/ListBulkUploadButton.js.map +1 -1
- package/dist/elements/ListSelection/index.js +11 -1
- package/dist/elements/ListSelection/index.js.map +1 -1
- package/dist/elements/LivePreview/Toolbar/Controls/index.js +1 -1
- package/dist/elements/LivePreview/Toolbar/Controls/index.js.map +1 -1
- package/dist/elements/Logout/index.js +5 -1
- package/dist/elements/Logout/index.js.map +1 -1
- package/dist/elements/Pill/index.js +5 -2
- package/dist/elements/Pill/index.js.map +1 -1
- package/dist/elements/PublishMany/index.js +3 -1
- package/dist/elements/PublishMany/index.js.map +1 -1
- package/dist/elements/QueryPresets/QueryPresetBar/index.js +1 -2
- package/dist/elements/QueryPresets/QueryPresetBar/index.js.map +1 -1
- package/dist/elements/ReactSelect/index.js +2 -2
- package/dist/elements/ReactSelect/index.js.map +1 -1
- package/dist/elements/ReactSelect/types.js +8 -1
- package/dist/elements/ReactSelect/types.js.map +1 -1
- package/dist/elements/RelationshipTable/index.js +2 -2
- package/dist/elements/RelationshipTable/index.js.map +1 -1
- package/dist/elements/RestoreMany/index.js +1 -0
- package/dist/elements/RestoreMany/index.js.map +1 -1
- package/dist/elements/SaveButton/index.js +1 -2
- package/dist/elements/SaveButton/index.js.map +1 -1
- package/dist/elements/SaveDraftButton/index.js +1 -2
- package/dist/elements/SaveDraftButton/index.js.map +1 -1
- package/dist/elements/SearchFilter/types.js +19 -1
- package/dist/elements/SearchFilter/types.js.map +1 -1
- package/dist/elements/Status/index.js +2 -2
- package/dist/elements/Status/index.js.map +1 -1
- package/dist/elements/StepNav/index.js +5 -1
- package/dist/elements/StepNav/index.js.map +1 -1
- package/dist/elements/Table/DefaultCell/fields/Select/index.js +4 -4
- package/dist/elements/Table/DefaultCell/fields/Select/index.js.map +1 -1
- package/dist/elements/Table/DefaultCell/index.js +2 -1
- package/dist/elements/Table/DefaultCell/index.js.map +1 -1
- package/dist/elements/Table/RelationshipProvider/index.js +3 -0
- package/dist/elements/Table/RelationshipProvider/index.js.map +1 -1
- package/dist/elements/Thumbnail/createThumbnail.js +12 -12
- package/dist/elements/Thumbnail/createThumbnail.js.map +1 -1
- package/dist/elements/Tooltip/index.js +3 -1
- package/dist/elements/Tooltip/index.js.map +1 -1
- package/dist/elements/UnpublishMany/index.js +3 -1
- package/dist/elements/UnpublishMany/index.js.map +1 -1
- package/dist/elements/Upload/index.js +8 -8
- package/dist/elements/Upload/index.js.map +1 -1
- package/dist/elements/WhereBuilder/Condition/Number/index.js +1 -0
- package/dist/elements/WhereBuilder/Condition/Number/index.js.map +1 -1
- package/dist/elements/WhereBuilder/Condition/Relationship/index.js +5 -6
- package/dist/elements/WhereBuilder/Condition/Relationship/index.js.map +1 -1
- package/dist/elements/WhereBuilder/Condition/Text/index.js +1 -0
- package/dist/elements/WhereBuilder/Condition/Text/index.js.map +1 -1
- package/dist/elements/WhereBuilder/index.js +2 -2
- package/dist/elements/WhereBuilder/index.js.map +1 -1
- package/dist/exports/client/index.js +26 -2
- package/dist/exports/client/index.js.map +1 -1
- package/dist/exports/shared/index.js +2 -1
- package/dist/exports/shared/index.js.map +1 -1
- package/dist/fields/Blocks/BlockSelector/index.js +3 -1
- package/dist/fields/Blocks/BlockSelector/index.js.map +1 -1
- package/dist/fields/Email/index.js +1 -1
- package/dist/fields/Email/index.js.map +1 -1
- package/dist/fields/Group/index.js +1 -1
- package/dist/fields/Group/index.js.map +1 -1
- package/dist/fields/Number/index.js +5 -3
- package/dist/fields/Number/index.js.map +1 -1
- package/dist/fields/Password/types.js +11 -1
- package/dist/fields/Password/types.js.map +1 -1
- package/dist/fields/Point/index.js +2 -2
- package/dist/fields/Point/index.js.map +1 -1
- package/dist/fields/Relationship/select-components/MultiValueLabel/index.js +4 -1
- package/dist/fields/Relationship/select-components/MultiValueLabel/index.js.map +1 -1
- package/dist/fields/Relationship/select-components/SingleValue/index.js +4 -1
- package/dist/fields/Relationship/select-components/SingleValue/index.js.map +1 -1
- package/dist/fields/Text/index.js +3 -2
- package/dist/fields/Text/index.js.map +1 -1
- package/dist/fields/Upload/Input.js +3 -1
- package/dist/fields/Upload/Input.js.map +1 -1
- package/dist/fields/Upload/types.js +1 -0
- package/dist/fields/Upload/types.js.map +1 -1
- package/dist/fields/shared/index.js +2 -3
- package/dist/fields/shared/index.js.map +1 -1
- package/dist/forms/Form/fieldReducer.js +2 -1
- package/dist/forms/Form/fieldReducer.js.map +1 -1
- package/dist/forms/Form/index.js +12 -9
- package/dist/forms/Form/index.js.map +1 -1
- package/dist/forms/Form/mergeServerFormState.js +11 -3
- package/dist/forms/Form/mergeServerFormState.js.map +1 -1
- package/dist/forms/Form/reduceToSerializableFields.js +2 -2
- package/dist/forms/Form/reduceToSerializableFields.js.map +1 -1
- package/dist/forms/Form/types.js +52 -1
- package/dist/forms/Form/types.js.map +1 -1
- package/dist/forms/NullifyField/index.js +2 -1
- package/dist/forms/NullifyField/index.js.map +1 -1
- package/dist/forms/WatchChildErrors/index.js +6 -1
- package/dist/forms/WatchChildErrors/index.js.map +1 -1
- package/dist/forms/fieldSchemasToFormState/addFieldStatePromise.js +20 -0
- package/dist/forms/fieldSchemasToFormState/addFieldStatePromise.js.map +1 -1
- package/dist/forms/fieldSchemasToFormState/index.js +33 -1
- package/dist/forms/fieldSchemasToFormState/index.js.map +1 -1
- package/dist/forms/fieldSchemasToFormState/isRowCollapsed.js +2 -2
- package/dist/forms/fieldSchemasToFormState/isRowCollapsed.js.map +1 -1
- package/dist/forms/fieldSchemasToFormState/iterateFields.js +16 -0
- package/dist/forms/fieldSchemasToFormState/iterateFields.js.map +1 -1
- package/dist/forms/fieldSchemasToFormState/renderField.js +2 -2
- package/dist/forms/fieldSchemasToFormState/renderField.js.map +1 -1
- package/dist/forms/fieldSchemasToFormState/serverFunctions/renderFieldServerFn.js +22 -1
- package/dist/forms/fieldSchemasToFormState/serverFunctions/renderFieldServerFn.js.map +1 -1
- package/dist/forms/fieldSchemasToFormState/types.js +5 -1
- package/dist/forms/fieldSchemasToFormState/types.js.map +1 -1
- package/dist/forms/useField/index.js +1 -0
- package/dist/forms/useField/index.js.map +1 -1
- package/dist/forms/useField/types.js +19 -1
- package/dist/forms/useField/types.js.map +1 -1
- package/dist/hooks/useControllableState.js +9 -1
- package/dist/hooks/useControllableState.js.map +1 -1
- package/dist/hooks/useDelayedRender.js +3 -1
- package/dist/hooks/useDelayedRender.js.map +1 -1
- package/dist/hooks/useHotkey.js +2 -2
- package/dist/hooks/useHotkey.js.map +1 -1
- package/dist/hooks/usePayloadAPI.js +3 -4
- package/dist/hooks/usePayloadAPI.js.map +1 -1
- package/dist/hooks/usePopupWindow.js +2 -2
- package/dist/hooks/usePopupWindow.js.map +1 -1
- package/dist/hooks/useQueue.js +15 -7
- package/dist/hooks/useQueue.js.map +1 -1
- package/dist/hooks/useResize.js +4 -3
- package/dist/hooks/useResize.js.map +1 -1
- package/dist/providers/Auth/index.js +35 -3
- package/dist/providers/Auth/index.js.map +1 -1
- package/dist/providers/Config/index.js +10 -1
- package/dist/providers/Config/index.js.map +1 -1
- package/dist/providers/DocumentInfo/index.js +6 -7
- package/dist/providers/DocumentInfo/index.js.map +1 -1
- package/dist/providers/DocumentInfo/types.js +25 -1
- package/dist/providers/DocumentInfo/types.js.map +1 -1
- package/dist/providers/Folders/index.js +44 -2
- package/dist/providers/Folders/index.js.map +1 -1
- package/dist/providers/ListQuery/types.js +5 -1
- package/dist/providers/ListQuery/types.js.map +1 -1
- package/dist/providers/LivePreview/context.js +11 -1
- package/dist/providers/LivePreview/context.js.map +1 -1
- package/dist/providers/LivePreview/index.js +7 -4
- package/dist/providers/LivePreview/index.js.map +1 -1
- package/dist/providers/Preferences/index.js +7 -2
- package/dist/providers/Preferences/index.js.map +1 -1
- package/dist/providers/RouteTransition/index.js +9 -9
- package/dist/providers/RouteTransition/index.js.map +1 -1
- package/dist/providers/Selection/index.js +7 -2
- package/dist/providers/Selection/index.js.map +1 -1
- package/dist/providers/ServerFunctions/index.js +25 -22
- package/dist/providers/ServerFunctions/index.js.map +1 -1
- package/dist/providers/TableColumns/buildColumnState/index.js +10 -9
- package/dist/providers/TableColumns/buildColumnState/index.js.map +1 -1
- package/dist/providers/TableColumns/buildColumnState/renderCell.js +4 -3
- package/dist/providers/TableColumns/buildColumnState/renderCell.js.map +1 -1
- package/dist/providers/TableColumns/types.js +17 -1
- package/dist/providers/TableColumns/types.js.map +1 -1
- package/dist/utilities/abortAndIgnore.js +4 -6
- package/dist/utilities/abortAndIgnore.js.map +1 -1
- package/dist/utilities/buildFieldSchemaMap/traverseFields.js +2 -2
- package/dist/utilities/buildFieldSchemaMap/traverseFields.js.map +1 -1
- package/dist/utilities/copyDataFromLocale.js +6 -2
- package/dist/utilities/copyDataFromLocale.js.map +1 -1
- package/dist/utilities/getDisplayedFieldValue.js +8 -8
- package/dist/utilities/getDisplayedFieldValue.js.map +1 -1
- package/dist/utilities/getFolderResultsComponentAndData.js +2 -1
- package/dist/utilities/getFolderResultsComponentAndData.js.map +1 -1
- package/dist/utilities/handleFormStateLocking.js +2 -2
- package/dist/utilities/handleFormStateLocking.js.map +1 -1
- package/dist/utilities/hasSavePermission.js +5 -1
- package/dist/utilities/hasSavePermission.js.map +1 -1
- package/dist/utilities/isURLAllowed.js +6 -6
- package/dist/utilities/isURLAllowed.js.map +1 -1
- package/dist/utilities/renderTable.js +2 -1
- package/dist/utilities/renderTable.js.map +1 -1
- package/dist/utilities/schedulePublishHandler.js +3 -1
- package/dist/utilities/schedulePublishHandler.js.map +1 -1
- package/dist/utilities/upsertPreferences.js +1 -0
- package/dist/utilities/upsertPreferences.js.map +1 -1
- package/dist/views/Edit/index.js +7 -7
- package/dist/views/Edit/index.js.map +1 -1
- package/dist/views/List/ListHeader/index.js +6 -1
- package/dist/views/List/ListHeader/index.js.map +1 -1
- package/package.json +6 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/forms/fieldSchemasToFormState/renderField.tsx"],"sourcesContent":["import type {\n ClientComponentProps,\n ClientField,\n FieldPaths,\n FlattenedBlock,\n ServerComponentProps,\n} from 'payload'\n\nimport { getTranslation } from '@payloadcms/translations'\nimport { createClientField, MissingEditorProp } from 'payload'\nimport { fieldIsHiddenOrDisabled } from 'payload/shared'\n\nimport type { RenderFieldMethod } from './types.js'\n\nimport { RenderServerComponent } from '../../elements/RenderServerComponent/index.js'\n\n// eslint-disable-next-line payload/no-imports-from-exports-dir -- MUST reference the exports dir: https://github.com/payloadcms/payload/issues/12002#issuecomment-2791493587\nimport { FieldDescription, WatchCondition } from '../../exports/client/index.js'\n\nconst defaultUIFieldComponentKeys: Array<'Cell' | 'Description' | 'Field' | 'Filter'> = [\n 'Cell',\n 'Description',\n 'Field',\n 'Filter',\n]\n\nexport const renderField: RenderFieldMethod = ({\n id,\n clientFieldSchemaMap,\n collectionSlug,\n data,\n fieldConfig,\n fieldSchemaMap,\n fieldState,\n forceCreateClientField,\n formState,\n indexPath,\n lastRenderedPath,\n mockRSCs,\n operation,\n parentPath,\n parentSchemaPath,\n path,\n permissions,\n preferences,\n readOnly: readOnlyFromProps,\n renderAllFields,\n req,\n schemaPath,\n siblingData,\n}) => {\n const requiresRender = renderAllFields || !lastRenderedPath || lastRenderedPath !== path\n\n if (!requiresRender && fieldConfig.type !== 'array' && fieldConfig.type !== 'blocks') {\n return\n }\n\n const clientField =\n clientFieldSchemaMap && !forceCreateClientField\n ? (clientFieldSchemaMap.get(schemaPath) as ClientField)\n : createClientField({\n defaultIDType: req.payload.config.db.defaultIDType,\n field: fieldConfig,\n i18n: req.i18n,\n importMap: req.payload.importMap,\n })\n\n const clientProps: ClientComponentProps & Partial<FieldPaths> = {\n field: clientField,\n path,\n permissions,\n readOnly:\n readOnlyFromProps === true\n ? true\n : typeof permissions === 'boolean'\n ? !permissions\n : !permissions?.[operation],\n schemaPath,\n }\n\n if (fieldState?.customComponents) {\n clientProps.customComponents = fieldState.customComponents\n }\n\n // fields with subfields\n if (['array', 'blocks', 'collapsible', 'group', 'row', 'tabs'].includes(fieldConfig.type)) {\n clientProps.indexPath = indexPath\n clientProps.parentPath = parentPath\n clientProps.parentSchemaPath = parentSchemaPath\n }\n\n const serverProps: ServerComponentProps = {\n id,\n clientField,\n clientFieldSchemaMap,\n data,\n field: fieldConfig,\n fieldSchemaMap,\n permissions,\n // TODO: Should we pass explicit values? initialValue, value, valid\n // value and initialValue should be typed\n collectionSlug,\n formState,\n i18n: req.i18n,\n operation,\n payload: req.payload,\n preferences,\n req,\n siblingData,\n user: req.user,\n value: 'name' in fieldConfig && data?.[fieldConfig.name],\n }\n\n switch (fieldConfig.type) {\n case 'array': {\n fieldState?.rows?.forEach((row, rowIndex) => {\n const rowLastRenderedPath = row.lastRenderedPath\n\n const rowPath = `${path}.${rowIndex}`\n\n const rowRequiresRender =\n renderAllFields || !rowLastRenderedPath || rowLastRenderedPath !== rowPath\n\n if (!rowRequiresRender) {\n return\n }\n\n row.lastRenderedPath = rowPath\n\n if (fieldConfig.admin?.components && 'RowLabel' in fieldConfig.admin.components) {\n if (!row.customComponents) {\n row.customComponents = {}\n }\n\n row.customComponents.RowLabel = !mockRSCs\n ? RenderServerComponent({\n clientProps,\n Component: fieldConfig.admin.components.RowLabel,\n importMap: req.payload.importMap,\n key: `${rowIndex}`,\n serverProps: {\n ...serverProps,\n rowLabel: `${getTranslation(fieldConfig.labels.singular, req.i18n)} ${String(\n rowIndex + 1,\n ).padStart(2, '0')}`,\n rowNumber: rowIndex + 1,\n },\n })\n : 'Mock'\n }\n })\n\n break\n }\n\n case 'blocks': {\n fieldState?.rows?.forEach((row, rowIndex) => {\n const rowLastRenderedPath = row.lastRenderedPath\n\n const rowPath = `${path}.${rowIndex}`\n\n const rowRequiresRender =\n renderAllFields || !rowLastRenderedPath || rowLastRenderedPath !== rowPath\n\n if (!rowRequiresRender) {\n return\n }\n\n row.lastRenderedPath = rowPath\n\n const blockTypeToMatch: string = row.blockType\n\n const blockConfig =\n req.payload.blocks[blockTypeToMatch] ??\n ((fieldConfig.blockReferences ?? fieldConfig.blocks).find(\n (block) => typeof block !== 'string' && block.slug === blockTypeToMatch,\n ) as FlattenedBlock | undefined)\n\n if (blockConfig.admin?.components && 'Label' in blockConfig.admin.components) {\n if (!fieldState.rows[rowIndex]?.customComponents) {\n fieldState.rows[rowIndex].customComponents = {}\n }\n\n fieldState.rows[rowIndex].customComponents.RowLabel = !mockRSCs\n ? RenderServerComponent({\n clientProps,\n Component: blockConfig.admin.components.Label,\n importMap: req.payload.importMap,\n key: `${rowIndex}`,\n serverProps: {\n ...serverProps,\n blockType: row.blockType,\n rowLabel: `${getTranslation(blockConfig.labels.singular, req.i18n)} ${String(\n rowIndex + 1,\n ).padStart(2, '0')}`,\n rowNumber: rowIndex + 1,\n },\n })\n : 'Mock'\n }\n })\n\n break\n }\n }\n\n if (!requiresRender) {\n return\n }\n\n /**\n * Set the `lastRenderedPath` equal to the new path of the field, this will prevent it from being rendered again\n */\n fieldState.lastRenderedPath = path\n\n if (fieldIsHiddenOrDisabled(clientField)) {\n return\n }\n\n /**\n * Only create the `customComponents` object if needed.\n * This will prevent unnecessary data from being transferred to the client.\n */\n if (fieldConfig.admin) {\n if (\n (Object.keys(fieldConfig.admin.components || {}).length > 0 ||\n fieldConfig.type === 'richText' ||\n ('description' in fieldConfig.admin &&\n typeof fieldConfig.admin.description === 'function')) &&\n !fieldState?.customComponents\n ) {\n fieldState.customComponents = {}\n }\n }\n\n switch (fieldConfig.type) {\n case 'richText': {\n if (!fieldConfig?.editor) {\n throw new MissingEditorProp(fieldConfig) // while we allow disabling editor functionality, you should not have any richText fields defined if you do not have an editor\n }\n\n if (typeof fieldConfig?.editor === 'function') {\n throw new Error('Attempted to access unsanitized rich text editor.')\n }\n\n if (!fieldConfig.admin) {\n fieldConfig.admin = {}\n }\n\n if (!fieldConfig.admin.components) {\n fieldConfig.admin.components = {}\n }\n\n fieldState.customComponents.Field = !mockRSCs ? (\n <WatchCondition path={path}>\n {RenderServerComponent({\n clientProps,\n Component: fieldConfig.editor.FieldComponent,\n importMap: req.payload.importMap,\n serverProps: {\n ...serverProps,\n // Manually inject lexical-specific `sanitizedEditorConfig` server prop, in order to reduce the size of the field schema.\n // Otherwise, the editorConfig would be included twice - once on the top-level, and once as part of the `FieldComponent` server props.\n sanitizedEditorConfig:\n 'editorConfig' in fieldConfig.editor ? fieldConfig.editor.editorConfig : undefined,\n },\n })}\n </WatchCondition>\n ) : (\n 'Mock'\n )\n\n break\n }\n\n case 'ui': {\n if (fieldConfig?.admin?.components) {\n // Render any extra, untyped components\n for (const key in fieldConfig.admin.components) {\n if (key in defaultUIFieldComponentKeys) {\n continue\n }\n\n const Component = fieldConfig.admin.components[key]\n\n fieldState.customComponents[key] = !mockRSCs\n ? RenderServerComponent({\n clientProps,\n Component,\n importMap: req.payload.importMap,\n key: `field.admin.components.${key}`,\n serverProps,\n })\n : 'Mock'\n }\n }\n break\n }\n\n default: {\n break\n }\n }\n\n if (fieldConfig.admin) {\n if (\n 'description' in fieldConfig.admin &&\n typeof fieldConfig.admin?.description === 'function'\n ) {\n fieldState.customComponents.Description = !mockRSCs ? (\n <FieldDescription\n description={fieldConfig.admin?.description({\n i18n: req.i18n,\n t: req.i18n.t,\n })}\n path={path}\n />\n ) : (\n 'Mock'\n )\n }\n\n if (fieldConfig.admin?.components) {\n if ('afterInput' in fieldConfig.admin.components) {\n fieldState.customComponents.AfterInput = !mockRSCs\n ? RenderServerComponent({\n clientProps,\n Component: fieldConfig.admin.components.afterInput,\n importMap: req.payload.importMap,\n key: 'field.admin.components.afterInput',\n serverProps,\n })\n : 'Mock'\n }\n\n if ('beforeInput' in fieldConfig.admin.components) {\n fieldState.customComponents.BeforeInput = !mockRSCs\n ? RenderServerComponent({\n clientProps,\n Component: fieldConfig.admin.components.beforeInput,\n importMap: req.payload.importMap,\n key: 'field.admin.components.beforeInput',\n serverProps,\n })\n : 'Mock'\n }\n\n if ('Description' in fieldConfig.admin.components) {\n fieldState.customComponents.Description = !mockRSCs\n ? RenderServerComponent({\n clientProps,\n Component: fieldConfig.admin.components.Description,\n importMap: req.payload.importMap,\n key: 'field.admin.components.Description',\n serverProps,\n })\n : 'Mock'\n }\n\n if ('Error' in fieldConfig.admin.components) {\n fieldState.customComponents.Error = !mockRSCs\n ? RenderServerComponent({\n clientProps,\n Component: fieldConfig.admin.components.Error,\n importMap: req.payload.importMap,\n key: 'field.admin.components.Error',\n serverProps,\n })\n : 'Mock'\n }\n\n if ('Label' in fieldConfig.admin.components) {\n fieldState.customComponents.Label = !mockRSCs\n ? RenderServerComponent({\n clientProps,\n Component: fieldConfig.admin.components.Label,\n importMap: req.payload.importMap,\n key: 'field.admin.components.Label',\n serverProps,\n })\n : 'Mock'\n }\n\n if ('Field' in fieldConfig.admin.components) {\n fieldState.customComponents.Field = !mockRSCs ? (\n <WatchCondition path={path}>\n {RenderServerComponent({\n clientProps,\n Component: fieldConfig.admin.components.Field,\n importMap: req.payload.importMap,\n key: 'field.admin.components.Field',\n serverProps,\n })}\n </WatchCondition>\n ) : (\n 'Mock'\n )\n }\n }\n }\n}\n"],"names":["getTranslation","createClientField","MissingEditorProp","fieldIsHiddenOrDisabled","RenderServerComponent","FieldDescription","WatchCondition","defaultUIFieldComponentKeys","renderField","id","clientFieldSchemaMap","collectionSlug","data","fieldConfig","fieldSchemaMap","fieldState","forceCreateClientField","formState","indexPath","lastRenderedPath","mockRSCs","operation","parentPath","parentSchemaPath","path","permissions","preferences","readOnly","readOnlyFromProps","renderAllFields","req","schemaPath","siblingData","requiresRender","type","clientField","get","defaultIDType","payload","config","db","field","i18n","importMap","clientProps","customComponents","includes","serverProps","user","value","name","rows","forEach","row","rowIndex","rowLastRenderedPath","rowPath","rowRequiresRender","admin","components","RowLabel","Component","key","rowLabel","labels","singular","String","padStart","rowNumber","blockTypeToMatch","blockType","blockConfig","blocks","blockReferences","find","block","slug","Label","Object","keys","length","description","editor","Error","Field","FieldComponent","sanitizedEditorConfig","editorConfig","undefined","Description","t","AfterInput","afterInput","BeforeInput","beforeInput"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/forms/fieldSchemasToFormState/renderField.tsx"],"sourcesContent":["import type {\n ClientComponentProps,\n ClientField,\n FieldPaths,\n FlattenedBlock,\n ServerComponentProps,\n} from 'payload'\n\nimport { getTranslation } from '@payloadcms/translations'\nimport { createClientField, MissingEditorProp } from 'payload'\nimport { fieldIsHiddenOrDisabled } from 'payload/shared'\n\nimport type { RenderFieldMethod } from './types.js'\n\nimport { RenderServerComponent } from '../../elements/RenderServerComponent/index.js'\n\n// eslint-disable-next-line payload/no-imports-from-exports-dir -- MUST reference the exports dir: https://github.com/payloadcms/payload/issues/12002#issuecomment-2791493587\nimport { FieldDescription, WatchCondition } from '../../exports/client/index.js'\n\nconst defaultUIFieldComponentKeys: Array<'Cell' | 'Description' | 'Field' | 'Filter'> = [\n 'Cell',\n 'Description',\n 'Field',\n 'Filter',\n]\n\nexport const renderField: RenderFieldMethod = ({\n id,\n clientFieldSchemaMap,\n collectionSlug,\n data,\n fieldConfig,\n fieldSchemaMap,\n fieldState,\n forceCreateClientField,\n formState,\n indexPath,\n lastRenderedPath,\n mockRSCs,\n operation,\n parentPath,\n parentSchemaPath,\n path,\n permissions,\n preferences,\n readOnly: readOnlyFromProps,\n renderAllFields,\n req,\n schemaPath,\n siblingData,\n}) => {\n const requiresRender = renderAllFields || !lastRenderedPath || lastRenderedPath !== path\n\n if (!requiresRender && fieldConfig.type !== 'array' && fieldConfig.type !== 'blocks') {\n return\n }\n\n const clientField =\n clientFieldSchemaMap && !forceCreateClientField\n ? (clientFieldSchemaMap.get(schemaPath) as ClientField)\n : createClientField({\n defaultIDType: req.payload.config.db.defaultIDType,\n field: fieldConfig,\n i18n: req.i18n,\n importMap: req.payload.importMap,\n })\n\n const clientProps: ClientComponentProps & Partial<FieldPaths> = {\n field: clientField,\n path,\n permissions,\n readOnly:\n readOnlyFromProps === true\n ? true\n : typeof permissions === 'boolean'\n ? !permissions\n : !permissions?.[operation],\n schemaPath,\n }\n\n if (fieldState?.customComponents) {\n clientProps.customComponents = fieldState.customComponents\n }\n\n // fields with subfields\n if (['array', 'blocks', 'collapsible', 'group', 'row', 'tabs'].includes(fieldConfig.type)) {\n clientProps.indexPath = indexPath\n clientProps.parentPath = parentPath\n clientProps.parentSchemaPath = parentSchemaPath\n }\n\n const serverProps: ServerComponentProps = {\n id,\n clientField,\n clientFieldSchemaMap,\n data,\n field: fieldConfig,\n fieldSchemaMap,\n permissions,\n // TODO: Should we pass explicit values? initialValue, value, valid\n // value and initialValue should be typed\n collectionSlug,\n formState,\n i18n: req.i18n,\n operation,\n payload: req.payload,\n preferences,\n req,\n siblingData,\n user: req.user,\n value: 'name' in fieldConfig && data?.[fieldConfig.name],\n }\n\n switch (fieldConfig.type) {\n case 'array': {\n fieldState?.rows?.forEach((row, rowIndex) => {\n const rowLastRenderedPath = row.lastRenderedPath\n\n const rowPath = `${path}.${rowIndex}`\n\n const rowRequiresRender =\n renderAllFields || !rowLastRenderedPath || rowLastRenderedPath !== rowPath\n\n if (!rowRequiresRender) {\n return\n }\n\n row.lastRenderedPath = rowPath\n\n if (fieldConfig.admin?.components && 'RowLabel' in fieldConfig.admin.components) {\n if (!row.customComponents) {\n row.customComponents = {}\n }\n\n row.customComponents.RowLabel = !mockRSCs\n ? RenderServerComponent({\n clientProps,\n Component: fieldConfig.admin.components.RowLabel,\n importMap: req.payload.importMap,\n key: `${rowIndex}`,\n serverProps: {\n ...serverProps,\n rowLabel: `${getTranslation(fieldConfig.labels.singular, req.i18n)} ${String(\n rowIndex + 1,\n ).padStart(2, '0')}`,\n rowNumber: rowIndex + 1,\n },\n })\n : 'Mock'\n }\n })\n\n break\n }\n\n case 'blocks': {\n fieldState?.rows?.forEach((row, rowIndex) => {\n const rowLastRenderedPath = row.lastRenderedPath\n\n const rowPath = `${path}.${rowIndex}`\n\n const rowRequiresRender =\n renderAllFields || !rowLastRenderedPath || rowLastRenderedPath !== rowPath\n\n if (!rowRequiresRender) {\n return\n }\n\n row.lastRenderedPath = rowPath\n\n const blockTypeToMatch: string = row.blockType\n\n const blockConfig =\n req.payload.blocks[blockTypeToMatch] ??\n ((fieldConfig.blockReferences ?? fieldConfig.blocks).find(\n (block) => typeof block !== 'string' && block.slug === blockTypeToMatch,\n ) as FlattenedBlock | undefined)\n\n if (blockConfig.admin?.components && 'Label' in blockConfig.admin.components) {\n if (!fieldState.rows[rowIndex]?.customComponents) {\n fieldState.rows[rowIndex].customComponents = {}\n }\n\n fieldState.rows[rowIndex].customComponents.RowLabel = !mockRSCs\n ? RenderServerComponent({\n clientProps,\n Component: blockConfig.admin.components.Label,\n importMap: req.payload.importMap,\n key: `${rowIndex}`,\n serverProps: {\n ...serverProps,\n blockType: row.blockType,\n rowLabel: `${getTranslation(blockConfig.labels.singular, req.i18n)} ${String(\n rowIndex + 1,\n ).padStart(2, '0')}`,\n rowNumber: rowIndex + 1,\n },\n })\n : 'Mock'\n }\n })\n\n break\n }\n }\n\n if (!requiresRender) {\n return\n }\n\n /**\n * Set the `lastRenderedPath` equal to the new path of the field, this will prevent it from being rendered again\n */\n fieldState.lastRenderedPath = path\n\n if (fieldIsHiddenOrDisabled(clientField)) {\n return\n }\n\n /**\n * Only create the `customComponents` object if needed.\n * This will prevent unnecessary data from being transferred to the client.\n */\n if (fieldConfig.admin) {\n if (\n (Object.keys(fieldConfig.admin.components || {}).length > 0 ||\n fieldConfig.type === 'richText' ||\n ('description' in fieldConfig.admin &&\n typeof fieldConfig.admin.description === 'function')) &&\n !fieldState?.customComponents\n ) {\n fieldState.customComponents = {}\n }\n }\n\n switch (fieldConfig.type) {\n case 'richText': {\n if (!fieldConfig?.editor) {\n throw new MissingEditorProp(fieldConfig) // while we allow disabling editor functionality, you should not have any richText fields defined if you do not have an editor\n }\n\n if (typeof fieldConfig?.editor === 'function') {\n throw new Error('Attempted to access unsanitized rich text editor.')\n }\n\n if (!fieldConfig.admin) {\n fieldConfig.admin = {}\n }\n\n if (!fieldConfig.admin.components) {\n fieldConfig.admin.components = {}\n }\n\n fieldState.customComponents.Field = !mockRSCs ? (\n <WatchCondition path={path}>\n {RenderServerComponent({\n clientProps,\n Component: fieldConfig.editor.FieldComponent,\n importMap: req.payload.importMap,\n serverProps: {\n ...serverProps,\n // Manually inject lexical-specific `sanitizedEditorConfig` server prop, in order to reduce the size of the field schema.\n // Otherwise, the editorConfig would be included twice - once on the top-level, and once as part of the `FieldComponent` server props.\n sanitizedEditorConfig:\n 'editorConfig' in fieldConfig.editor ? fieldConfig.editor.editorConfig : undefined,\n },\n })}\n </WatchCondition>\n ) : (\n 'Mock'\n )\n\n break\n }\n\n case 'ui': {\n if (fieldConfig?.admin?.components) {\n // Render any extra, untyped components\n for (const key in fieldConfig.admin.components) {\n if (key in defaultUIFieldComponentKeys) {\n continue\n }\n\n const Component = fieldConfig.admin.components[key]\n\n fieldState.customComponents[key] = !mockRSCs\n ? RenderServerComponent({\n clientProps,\n Component,\n importMap: req.payload.importMap,\n key: `field.admin.components.${key}`,\n serverProps,\n })\n : 'Mock'\n }\n }\n break\n }\n\n default: {\n break\n }\n }\n\n if (fieldConfig.admin) {\n if (\n 'description' in fieldConfig.admin &&\n typeof fieldConfig.admin?.description === 'function'\n ) {\n fieldState.customComponents.Description = !mockRSCs ? (\n <FieldDescription\n description={fieldConfig.admin?.description({\n i18n: req.i18n,\n t: req.i18n.t,\n })}\n path={path}\n />\n ) : (\n 'Mock'\n )\n }\n\n if (fieldConfig.admin?.components) {\n if ('afterInput' in fieldConfig.admin.components) {\n fieldState.customComponents.AfterInput = !mockRSCs\n ? RenderServerComponent({\n clientProps,\n Component: fieldConfig.admin.components.afterInput,\n importMap: req.payload.importMap,\n key: 'field.admin.components.afterInput',\n serverProps,\n })\n : 'Mock'\n }\n\n if ('beforeInput' in fieldConfig.admin.components) {\n fieldState.customComponents.BeforeInput = !mockRSCs\n ? RenderServerComponent({\n clientProps,\n Component: fieldConfig.admin.components.beforeInput,\n importMap: req.payload.importMap,\n key: 'field.admin.components.beforeInput',\n serverProps,\n })\n : 'Mock'\n }\n\n if ('Description' in fieldConfig.admin.components) {\n fieldState.customComponents.Description = !mockRSCs\n ? RenderServerComponent({\n clientProps,\n Component: fieldConfig.admin.components.Description,\n importMap: req.payload.importMap,\n key: 'field.admin.components.Description',\n serverProps,\n })\n : 'Mock'\n }\n\n if ('Error' in fieldConfig.admin.components) {\n fieldState.customComponents.Error = !mockRSCs\n ? RenderServerComponent({\n clientProps,\n Component: fieldConfig.admin.components.Error,\n importMap: req.payload.importMap,\n key: 'field.admin.components.Error',\n serverProps,\n })\n : 'Mock'\n }\n\n if ('Label' in fieldConfig.admin.components) {\n fieldState.customComponents.Label = !mockRSCs\n ? RenderServerComponent({\n clientProps,\n Component: fieldConfig.admin.components.Label,\n importMap: req.payload.importMap,\n key: 'field.admin.components.Label',\n serverProps,\n })\n : 'Mock'\n }\n\n if ('Field' in fieldConfig.admin.components) {\n fieldState.customComponents.Field = !mockRSCs ? (\n <WatchCondition path={path}>\n {RenderServerComponent({\n clientProps,\n Component: fieldConfig.admin.components.Field,\n importMap: req.payload.importMap,\n key: 'field.admin.components.Field',\n serverProps,\n })}\n </WatchCondition>\n ) : (\n 'Mock'\n )\n }\n }\n }\n}\n"],"names":["getTranslation","createClientField","MissingEditorProp","fieldIsHiddenOrDisabled","RenderServerComponent","FieldDescription","WatchCondition","defaultUIFieldComponentKeys","renderField","id","clientFieldSchemaMap","collectionSlug","data","fieldConfig","fieldSchemaMap","fieldState","forceCreateClientField","formState","indexPath","lastRenderedPath","mockRSCs","operation","parentPath","parentSchemaPath","path","permissions","preferences","readOnly","readOnlyFromProps","renderAllFields","req","schemaPath","siblingData","requiresRender","type","clientField","get","defaultIDType","payload","config","db","field","i18n","importMap","clientProps","customComponents","includes","serverProps","user","value","name","rows","forEach","row","rowIndex","rowLastRenderedPath","rowPath","rowRequiresRender","admin","components","RowLabel","Component","key","rowLabel","labels","singular","String","padStart","rowNumber","blockTypeToMatch","blockType","blockConfig","blocks","blockReferences","find","block","slug","Label","Object","keys","length","description","editor","Error","Field","FieldComponent","sanitizedEditorConfig","editorConfig","undefined","Description","t","AfterInput","afterInput","BeforeInput","beforeInput"],"mappings":"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"}
|
|
@@ -4,8 +4,27 @@ import { getClientSchemaMap } from '../../../utilities/getClientSchemaMap.js';
|
|
|
4
4
|
import { getSchemaMap } from '../../../utilities/getSchemaMap.js';
|
|
5
5
|
import { renderField } from '../renderField.js';
|
|
6
6
|
/**
|
|
7
|
+
* Override field config pulled from schemaPath lookup
|
|
8
|
+
*/ /**
|
|
9
|
+
* Pass the value this field will receive when rendering it on the server.
|
|
10
|
+
* For richText, this helps provide initial state for sub-fields that are immediately rendered (like blocks)
|
|
11
|
+
* so that we can avoid multiple waterfall requests for each block that renders on the client.
|
|
12
|
+
*/ /**
|
|
13
|
+
* Path to the field to render
|
|
14
|
+
* @default field name
|
|
15
|
+
*/ /**
|
|
16
|
+
* Dot schema path to a richText field declared in your config.
|
|
17
|
+
* Format:
|
|
18
|
+
* "collection.<collectionSlug>.<fieldPath>"
|
|
19
|
+
* "global.<globalSlug>.<fieldPath>"
|
|
20
|
+
*
|
|
21
|
+
* Examples:
|
|
22
|
+
* "collection.posts.richText"
|
|
23
|
+
* "global.siteSettings.content"
|
|
24
|
+
*/ /**
|
|
7
25
|
* @experimental - may break in minor releases
|
|
8
|
-
*/ export const _internal_renderFieldHandler =
|
|
26
|
+
*/ export const _internal_renderFieldHandler = // eslint-disable-next-line @typescript-eslint/require-await
|
|
27
|
+
async ({ field: fieldArg, initialValue, path, req, schemaPath })=>{
|
|
9
28
|
if (!req.user) {
|
|
10
29
|
throw new Error('Unauthorized');
|
|
11
30
|
}
|
|
@@ -54,7 +73,9 @@ import { renderField } from '../renderField.js';
|
|
|
54
73
|
fieldConfig: field,
|
|
55
74
|
fieldSchemaMap: schemaMap,
|
|
56
75
|
fieldState,
|
|
76
|
+
// TODO,
|
|
57
77
|
formState: {},
|
|
78
|
+
// TODO,
|
|
58
79
|
indexPath: '',
|
|
59
80
|
lastRenderedPath: '',
|
|
60
81
|
operation: 'create',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/forms/fieldSchemasToFormState/serverFunctions/renderFieldServerFn.ts"],"sourcesContent":["import { deepMerge, type Field, type FieldState, type ServerFunction } from 'payload'\n\nimport { getClientConfig } from '../../../utilities/getClientConfig.js'\nimport { getClientSchemaMap } from '../../../utilities/getClientSchemaMap.js'\nimport { getSchemaMap } from '../../../utilities/getSchemaMap.js'\nimport { renderField } from '../renderField.js'\n\nexport type RenderFieldServerFnArgs<TField = Field> = {\n /**\n * Override field config pulled from schemaPath lookup\n */\n field?: Partial<TField>\n /**\n * Pass the value this field will receive when rendering it on the server.\n * For richText, this helps provide initial state for sub-fields that are immediately rendered (like blocks)\n * so that we can avoid multiple waterfall requests for each block that renders on the client.\n */\n initialValue?: unknown\n /**\n * Path to the field to render\n * @default field name\n */\n path?: string\n /**\n * Dot schema path to a richText field declared in your config.\n * Format:\n * \"collection.<collectionSlug>.<fieldPath>\"\n * \"global.<globalSlug>.<fieldPath>\"\n *\n * Examples:\n * \"collection.posts.richText\"\n * \"global.siteSettings.content\"\n */\n schemaPath: string\n}\nexport type RenderFieldServerFnReturnType = {} & FieldState['customComponents']\n\n/**\n * @experimental - may break in minor releases\n */\nexport const _internal_renderFieldHandler: ServerFunction<\n RenderFieldServerFnArgs,\n Promise<RenderFieldServerFnReturnType>\n // eslint-disable-next-line @typescript-eslint/require-await\n> = async ({ field: fieldArg, initialValue, path, req, schemaPath }) => {\n if (!req.user) {\n throw new Error('Unauthorized')\n }\n\n const [entityType, entitySlug, ...fieldPath] = schemaPath.split('.')\n\n const schemaMap = getSchemaMap({\n collectionSlug: entityType === 'collection' ? entitySlug : undefined,\n config: req.payload.config,\n globalSlug: entityType === 'global' ? entitySlug : undefined,\n i18n: req.i18n,\n })\n\n // Provide client schema map as it would have been provided if the target editor field would have been rendered.\n // For lexical, only then will it contain all the lexical-internal entries\n const clientSchemaMap = getClientSchemaMap({\n collectionSlug: entityType === 'collection' ? entitySlug : undefined,\n config: getClientConfig({\n config: req.payload.config,\n i18n: req.i18n,\n importMap: req.payload.importMap,\n user: req.user,\n }),\n globalSlug: entityType === 'global' ? entitySlug : undefined,\n i18n: req.i18n,\n payload: req.payload,\n schemaMap,\n })\n\n const targetField = schemaMap.get(`${entitySlug}.${fieldPath.join('.')}`) as Field | undefined\n\n if (!targetField) {\n throw new Error(`Could not find target field at schemaPath: ${schemaPath}`)\n }\n\n const field: Field = fieldArg ? deepMerge(targetField, fieldArg, { clone: false }) : targetField\n\n let data = {}\n if (typeof initialValue !== 'undefined') {\n if ('name' in field) {\n data[field.name] = initialValue\n } else {\n data = initialValue\n }\n }\n\n const fieldState: FieldState = {}\n renderField({\n clientFieldSchemaMap: clientSchemaMap,\n collectionSlug: entityType === 'collection' && entitySlug ? entitySlug : '-',\n data,\n fieldConfig: field,\n fieldSchemaMap: schemaMap,\n fieldState, // TODO,\n formState: {}, // TODO,\n indexPath: '',\n lastRenderedPath: '',\n operation: 'create',\n parentPath: '',\n parentSchemaPath: '',\n path: path ?? ('name' in field ? field.name : ''),\n permissions: true,\n preferences: {\n fields: {},\n },\n // If we are passed a field override, we want to ensure we create a new client field based on that override\n forceCreateClientField: fieldArg ? true : false,\n previousFieldState: undefined,\n renderAllFields: true,\n req,\n schemaPath: `${entitySlug}.${fieldPath.join('.')}`,\n siblingData: data,\n })\n\n return fieldState.customComponents ?? {}\n}\n"],"names":["deepMerge","getClientConfig","getClientSchemaMap","getSchemaMap","renderField","_internal_renderFieldHandler","field","fieldArg","initialValue","path","req","schemaPath","user","Error","entityType","entitySlug","fieldPath","split","schemaMap","collectionSlug","undefined","config","payload","globalSlug","i18n","clientSchemaMap","importMap","targetField","get","join","clone","data","name","fieldState","clientFieldSchemaMap","fieldConfig","fieldSchemaMap","formState","indexPath","lastRenderedPath","operation","parentPath","parentSchemaPath","permissions","preferences","fields","forceCreateClientField","previousFieldState","renderAllFields","siblingData","customComponents"],"mappings":"AAAA,SAASA,SAAS,QAA0D,UAAS;AAErF,SAASC,eAAe,QAAQ,wCAAuC;AACvE,SAASC,kBAAkB,QAAQ,2CAA0C;AAC7E,SAASC,YAAY,QAAQ,qCAAoC;AACjE,SAASC,WAAW,QAAQ,oBAAmB;
|
|
1
|
+
{"version":3,"sources":["../../../../src/forms/fieldSchemasToFormState/serverFunctions/renderFieldServerFn.ts"],"sourcesContent":["import { deepMerge, type Field, type FieldState, type ServerFunction } from 'payload'\n\nimport { getClientConfig } from '../../../utilities/getClientConfig.js'\nimport { getClientSchemaMap } from '../../../utilities/getClientSchemaMap.js'\nimport { getSchemaMap } from '../../../utilities/getSchemaMap.js'\nimport { renderField } from '../renderField.js'\n\nexport type RenderFieldServerFnArgs<TField = Field> = {\n /**\n * Override field config pulled from schemaPath lookup\n */\n field?: Partial<TField>\n /**\n * Pass the value this field will receive when rendering it on the server.\n * For richText, this helps provide initial state for sub-fields that are immediately rendered (like blocks)\n * so that we can avoid multiple waterfall requests for each block that renders on the client.\n */\n initialValue?: unknown\n /**\n * Path to the field to render\n * @default field name\n */\n path?: string\n /**\n * Dot schema path to a richText field declared in your config.\n * Format:\n * \"collection.<collectionSlug>.<fieldPath>\"\n * \"global.<globalSlug>.<fieldPath>\"\n *\n * Examples:\n * \"collection.posts.richText\"\n * \"global.siteSettings.content\"\n */\n schemaPath: string\n}\nexport type RenderFieldServerFnReturnType = {} & FieldState['customComponents']\n\n/**\n * @experimental - may break in minor releases\n */\nexport const _internal_renderFieldHandler: ServerFunction<\n RenderFieldServerFnArgs,\n Promise<RenderFieldServerFnReturnType>\n // eslint-disable-next-line @typescript-eslint/require-await\n> = async ({ field: fieldArg, initialValue, path, req, schemaPath }) => {\n if (!req.user) {\n throw new Error('Unauthorized')\n }\n\n const [entityType, entitySlug, ...fieldPath] = schemaPath.split('.')\n\n const schemaMap = getSchemaMap({\n collectionSlug: entityType === 'collection' ? entitySlug : undefined,\n config: req.payload.config,\n globalSlug: entityType === 'global' ? entitySlug : undefined,\n i18n: req.i18n,\n })\n\n // Provide client schema map as it would have been provided if the target editor field would have been rendered.\n // For lexical, only then will it contain all the lexical-internal entries\n const clientSchemaMap = getClientSchemaMap({\n collectionSlug: entityType === 'collection' ? entitySlug : undefined,\n config: getClientConfig({\n config: req.payload.config,\n i18n: req.i18n,\n importMap: req.payload.importMap,\n user: req.user,\n }),\n globalSlug: entityType === 'global' ? entitySlug : undefined,\n i18n: req.i18n,\n payload: req.payload,\n schemaMap,\n })\n\n const targetField = schemaMap.get(`${entitySlug}.${fieldPath.join('.')}`) as Field | undefined\n\n if (!targetField) {\n throw new Error(`Could not find target field at schemaPath: ${schemaPath}`)\n }\n\n const field: Field = fieldArg ? deepMerge(targetField, fieldArg, { clone: false }) : targetField\n\n let data = {}\n if (typeof initialValue !== 'undefined') {\n if ('name' in field) {\n data[field.name] = initialValue\n } else {\n data = initialValue\n }\n }\n\n const fieldState: FieldState = {}\n renderField({\n clientFieldSchemaMap: clientSchemaMap,\n collectionSlug: entityType === 'collection' && entitySlug ? entitySlug : '-',\n data,\n fieldConfig: field,\n fieldSchemaMap: schemaMap,\n fieldState, // TODO,\n formState: {}, // TODO,\n indexPath: '',\n lastRenderedPath: '',\n operation: 'create',\n parentPath: '',\n parentSchemaPath: '',\n path: path ?? ('name' in field ? field.name : ''),\n permissions: true,\n preferences: {\n fields: {},\n },\n // If we are passed a field override, we want to ensure we create a new client field based on that override\n forceCreateClientField: fieldArg ? true : false,\n previousFieldState: undefined,\n renderAllFields: true,\n req,\n schemaPath: `${entitySlug}.${fieldPath.join('.')}`,\n siblingData: data,\n })\n\n return fieldState.customComponents ?? {}\n}\n"],"names":["deepMerge","getClientConfig","getClientSchemaMap","getSchemaMap","renderField","_internal_renderFieldHandler","field","fieldArg","initialValue","path","req","schemaPath","user","Error","entityType","entitySlug","fieldPath","split","schemaMap","collectionSlug","undefined","config","payload","globalSlug","i18n","clientSchemaMap","importMap","targetField","get","join","clone","data","name","fieldState","clientFieldSchemaMap","fieldConfig","fieldSchemaMap","formState","indexPath","lastRenderedPath","operation","parentPath","parentSchemaPath","permissions","preferences","fields","forceCreateClientField","previousFieldState","renderAllFields","siblingData","customComponents"],"mappings":"AAAA,SAASA,SAAS,QAA0D,UAAS;AAErF,SAASC,eAAe,QAAQ,wCAAuC;AACvE,SAASC,kBAAkB,QAAQ,2CAA0C;AAC7E,SAASC,YAAY,QAAQ,qCAAoC;AACjE,SAASC,WAAW,QAAQ,oBAAmB;AAG7C;;GAEC,GAED;;;;GAIC,GAED;;;GAGC,GAED;;;;;;;;;GASC,GAKH;;CAEC,GACD,OAAO,MAAMC,+BAGX,4DAA4D;AAC1D,OAAO,EAAEC,OAAOC,QAAQ,EAAEC,YAAY,EAAEC,IAAI,EAAEC,GAAG,EAAEC,UAAU,EAAE;IACjE,IAAI,CAACD,IAAIE,IAAI,EAAE;QACb,MAAM,IAAIC,MAAM;IAClB;IAEA,MAAM,CAACC,YAAYC,YAAY,GAAGC,UAAU,GAAGL,WAAWM,KAAK,CAAC;IAEhE,MAAMC,YAAYf,aAAa;QAC7BgB,gBAAgBL,eAAe,eAAeC,aAAaK;QAC3DC,QAAQX,IAAIY,OAAO,CAACD,MAAM;QAC1BE,YAAYT,eAAe,WAAWC,aAAaK;QACnDI,MAAMd,IAAIc,IAAI;IAChB;IAEA,gHAAgH;IAChH,0EAA0E;IAC1E,MAAMC,kBAAkBvB,mBAAmB;QACzCiB,gBAAgBL,eAAe,eAAeC,aAAaK;QAC3DC,QAAQpB,gBAAgB;YACtBoB,QAAQX,IAAIY,OAAO,CAACD,MAAM;YAC1BG,MAAMd,IAAIc,IAAI;YACdE,WAAWhB,IAAIY,OAAO,CAACI,SAAS;YAChCd,MAAMF,IAAIE,IAAI;QAChB;QACAW,YAAYT,eAAe,WAAWC,aAAaK;QACnDI,MAAMd,IAAIc,IAAI;QACdF,SAASZ,IAAIY,OAAO;QACpBJ;IACF;IAEA,MAAMS,cAAcT,UAAUU,GAAG,CAAC,GAAGb,WAAW,CAAC,EAAEC,UAAUa,IAAI,CAAC,MAAM;IAExE,IAAI,CAACF,aAAa;QAChB,MAAM,IAAId,MAAM,CAAC,2CAA2C,EAAEF,YAAY;IAC5E;IAEA,MAAML,QAAeC,WAAWP,UAAU2B,aAAapB,UAAU;QAAEuB,OAAO;IAAM,KAAKH;IAErF,IAAII,OAAO,CAAC;IACZ,IAAI,OAAOvB,iBAAiB,aAAa;QACvC,IAAI,UAAUF,OAAO;YACnByB,IAAI,CAACzB,MAAM0B,IAAI,CAAC,GAAGxB;QACrB,OAAO;YACLuB,OAAOvB;QACT;IACF;IAEA,MAAMyB,aAAyB,CAAC;IAChC7B,YAAY;QACV8B,sBAAsBT;QACtBN,gBAAgBL,eAAe,gBAAgBC,aAAaA,aAAa;QACzEgB;QACAI,aAAa7B;QACb8B,gBAAgBlB;QAChBe;QAAY,QAAQ;QACpBI,WAAW,CAAC;QAAG,QAAQ;QACvBC,WAAW;QACXC,kBAAkB;QAClBC,WAAW;QACXC,YAAY;QACZC,kBAAkB;QAClBjC,MAAMA,QAAS,CAAA,UAAUH,QAAQA,MAAM0B,IAAI,GAAG,EAAC;QAC/CW,aAAa;QACbC,aAAa;YACXC,QAAQ,CAAC;QACX;QACA,2GAA2G;QAC3GC,wBAAwBvC,WAAW,OAAO;QAC1CwC,oBAAoB3B;QACpB4B,iBAAiB;QACjBtC;QACAC,YAAY,GAAGI,WAAW,CAAC,EAAEC,UAAUa,IAAI,CAAC,MAAM;QAClDoB,aAAalB;IACf;IAEA,OAAOE,WAAWiB,gBAAgB,IAAI,CAAC;AACzC,EAAC"}
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* If set to true, it will force creating a clientField based on the passed fieldConfig instead of pulling
|
|
3
|
+
* the client field from the clientFieldSchemaMap. This is useful if the passed fieldConfig differs from the one in the schema map,
|
|
4
|
+
* e.g. when calling the render-field server function and passing a field config override.
|
|
5
|
+
*/ export { };
|
|
2
6
|
|
|
3
7
|
//# sourceMappingURL=types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/forms/fieldSchemasToFormState/types.ts"],"sourcesContent":["import type {\n ClientFieldSchemaMap,\n Data,\n DocumentPreferences,\n Field,\n FieldSchemaMap,\n FieldState,\n FormState,\n Operation,\n PayloadRequest,\n SanitizedFieldPermissions,\n} from 'payload'\n\nexport type RenderFieldArgs = {\n clientFieldSchemaMap?: ClientFieldSchemaMap\n collectionSlug: string\n data: Data\n fieldConfig: Field\n fieldSchemaMap: FieldSchemaMap\n fieldState: FieldState\n /**\n * If set to true, it will force creating a clientField based on the passed fieldConfig instead of pulling\n * the client field from the clientFieldSchemaMap. This is useful if the passed fieldConfig differs from the one in the schema map,\n * e.g. when calling the render-field server function and passing a field config override.\n */\n forceCreateClientField?: boolean\n formState: FormState\n id?: number | string\n indexPath: string\n lastRenderedPath: string\n mockRSCs?: boolean\n operation: Operation\n parentPath: string\n parentSchemaPath: string\n path: string\n permissions: SanitizedFieldPermissions\n preferences: DocumentPreferences\n previousFieldState: FieldState\n readOnly?: boolean\n renderAllFields: boolean\n req: PayloadRequest\n schemaPath: string\n siblingData: Data\n}\n\nexport type RenderFieldMethod = (args: RenderFieldArgs) => void\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../src/forms/fieldSchemasToFormState/types.ts"],"sourcesContent":["import type {\n ClientFieldSchemaMap,\n Data,\n DocumentPreferences,\n Field,\n FieldSchemaMap,\n FieldState,\n FormState,\n Operation,\n PayloadRequest,\n SanitizedFieldPermissions,\n} from 'payload'\n\nexport type RenderFieldArgs = {\n clientFieldSchemaMap?: ClientFieldSchemaMap\n collectionSlug: string\n data: Data\n fieldConfig: Field\n fieldSchemaMap: FieldSchemaMap\n fieldState: FieldState\n /**\n * If set to true, it will force creating a clientField based on the passed fieldConfig instead of pulling\n * the client field from the clientFieldSchemaMap. This is useful if the passed fieldConfig differs from the one in the schema map,\n * e.g. when calling the render-field server function and passing a field config override.\n */\n forceCreateClientField?: boolean\n formState: FormState\n id?: number | string\n indexPath: string\n lastRenderedPath: string\n mockRSCs?: boolean\n operation: Operation\n parentPath: string\n parentSchemaPath: string\n path: string\n permissions: SanitizedFieldPermissions\n preferences: DocumentPreferences\n previousFieldState: FieldState\n readOnly?: boolean\n renderAllFields: boolean\n req: PayloadRequest\n schemaPath: string\n siblingData: Data\n}\n\nexport type RenderFieldMethod = (args: RenderFieldArgs) => void\n"],"names":[],"mappings":"AAoBE;;;;GAIC,GAqBH,WAA+D"}
|
|
@@ -103,6 +103,7 @@ const useFieldInForm = (options)=>{
|
|
|
103
103
|
const isValid = typeof validate === 'function' ? await validate(valueToValidate, {
|
|
104
104
|
id,
|
|
105
105
|
blockData: undefined,
|
|
106
|
+
// Will be expensive to get - not worth to pass to client-side validation, as this can be obtained by the user using `useFormFields()`
|
|
106
107
|
collectionSlug,
|
|
107
108
|
data: documentForm?.getData ? documentForm.getData() : data,
|
|
108
109
|
event: 'onChange',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/forms/useField/index.tsx"],"sourcesContent":["'use client'\nimport type { PayloadRequest } from 'payload'\n\nimport React, { useCallback, useMemo, useRef } from 'react'\n\nimport type { UPDATE } from '../Form/types.js'\nimport type { FieldType, Options } from './types.js'\n\nexport type { FieldType, Options }\n\nimport { useThrottledEffect } from '../../hooks/useThrottledEffect.js'\nimport { useAuth } from '../../providers/Auth/index.js'\nimport { useConfig } from '../../providers/Config/index.js'\nimport { useDocumentInfo } from '../../providers/DocumentInfo/index.js'\nimport { useOperation } from '../../providers/Operation/index.js'\nimport { useTranslation } from '../../providers/Translation/index.js'\nimport {\n useDocumentForm,\n useForm,\n useFormFields,\n useFormInitializing,\n useFormProcessing,\n useFormSubmitted,\n} from '../Form/context.js'\nimport { useFieldPath } from '../RenderFields/context.js'\n\nconst useFieldInForm = <TValue,>(options?: Options): FieldType<TValue> => {\n const {\n disableFormData = false,\n hasRows,\n path: pathFromOptions,\n potentiallyStalePath,\n validate,\n } = options || {}\n\n const pathFromContext = useFieldPath()\n\n // This is a workaround for stale props given to server rendered components.\n // See the notes in the `potentiallyStalePath` type definition for more details.\n const path = pathFromOptions || pathFromContext || potentiallyStalePath\n\n const submitted = useFormSubmitted()\n const processing = useFormProcessing()\n const initializing = useFormInitializing()\n const { user } = useAuth()\n const { id, collectionSlug } = useDocumentInfo()\n const operation = useOperation()\n\n const dispatchField = useFormFields(([_, dispatch]) => dispatch)\n const field = useFormFields(([fields]) => (fields && fields?.[path]) || null)\n\n const { t } = useTranslation()\n const { config } = useConfig()\n\n const { getData, getDataByPath, getSiblingData, setModified } = useForm()\n const documentForm = useDocumentForm()\n\n const filterOptions = field?.filterOptions\n const value = field?.value as TValue\n const initialValue = field?.initialValue as TValue\n const valid = typeof field?.valid === 'boolean' ? field.valid : true\n const showError = valid === false && submitted\n\n const prevValid = useRef(valid)\n const prevErrorMessage = useRef(field?.errorMessage)\n\n const pathSegments = path ? path.split('.') : []\n\n // Method to return from `useField`, used to\n // update field values from field component(s)\n const setValue = useCallback(\n (e, disableModifyingForm = false) => {\n // TODO:\n // There are no built-in fields that pass events into `e`.\n // Remove this check in the next major version.\n const isEvent =\n e &&\n typeof e === 'object' &&\n typeof e.preventDefault === 'function' &&\n typeof e.stopPropagation === 'function'\n\n const val = isEvent ? e.target.value : e\n\n dispatchField({\n type: 'UPDATE',\n disableFormData: disableFormData || (hasRows && val > 0),\n path,\n value: val,\n })\n\n if (!disableModifyingForm) {\n setModified(true)\n }\n },\n [setModified, path, dispatchField, disableFormData, hasRows],\n )\n\n // Store result from hook as ref\n // to prevent unnecessary rerenders\n const result: FieldType<TValue> = useMemo(\n () => ({\n blocksFilterOptions: field?.blocksFilterOptions,\n customComponents: field?.customComponents,\n disabled: processing || initializing,\n errorMessage: field?.errorMessage,\n errorPaths: field?.errorPaths || [],\n filterOptions,\n formInitializing: initializing,\n formProcessing: processing,\n formSubmitted: submitted,\n initialValue,\n path,\n rows: field?.rows,\n selectFilterOptions: field?.selectFilterOptions,\n setValue,\n showError,\n valid: field?.valid,\n value,\n }),\n [\n field,\n processing,\n setValue,\n showError,\n submitted,\n value,\n initialValue,\n path,\n filterOptions,\n initializing,\n ],\n )\n\n // Throttle the validate function\n useThrottledEffect(\n () => {\n const validateField = async () => {\n let valueToValidate = value\n\n if (field?.rows && Array.isArray(field.rows)) {\n valueToValidate = getDataByPath(path)\n }\n\n let errorMessage: string | undefined = prevErrorMessage.current\n let valid: boolean | string = prevValid.current\n\n const data = getData()\n const isValid =\n typeof validate === 'function'\n ? await validate(valueToValidate, {\n id,\n blockData: undefined, // Will be expensive to get - not worth to pass to client-side validation, as this can be obtained by the user using `useFormFields()`\n collectionSlug,\n data: documentForm?.getData ? documentForm.getData() : data,\n event: 'onChange',\n operation,\n path: pathSegments,\n preferences: {} as any,\n req: {\n payload: {\n config,\n },\n t,\n user,\n } as unknown as PayloadRequest,\n siblingData: getSiblingData(path),\n })\n : typeof prevErrorMessage.current === 'string'\n ? prevErrorMessage.current\n : prevValid.current\n\n if (typeof isValid === 'string') {\n valid = false\n errorMessage = isValid\n } else if (typeof isValid === 'boolean') {\n valid = isValid\n errorMessage = undefined\n }\n\n // Only dispatch if the validation result has changed\n // This will prevent unnecessary rerenders\n if (valid !== prevValid.current || errorMessage !== prevErrorMessage.current) {\n prevValid.current = valid\n prevErrorMessage.current = errorMessage\n\n const update: UPDATE = {\n type: 'UPDATE',\n errorMessage,\n path,\n rows: field?.rows,\n valid,\n validate,\n value,\n }\n\n if (disableFormData || (hasRows ? typeof value === 'number' && value > 0 : false)) {\n update.disableFormData = true\n }\n\n if (typeof dispatchField === 'function') {\n dispatchField(update)\n }\n }\n }\n\n void validateField()\n },\n 150,\n [\n value,\n disableFormData,\n dispatchField,\n getData,\n getSiblingData,\n getDataByPath,\n id,\n operation,\n path,\n user,\n validate,\n field?.rows,\n collectionSlug,\n ],\n )\n\n return result\n}\n\n/**\n * Context to allow providing useField value for fields directly, if managed outside the Form\n *\n * @experimental\n */\nexport const FieldContext = React.createContext<FieldType<unknown> | undefined>(undefined)\n\n/**\n * Get and set the value of a form field.\n *\n * @see https://payloadcms.com/docs/admin/react-hooks#usefield\n */\nexport const useField = <TValue,>(options?: Options): FieldType<TValue> => {\n const pathFromContext = useFieldPath()\n\n const fieldContext = React.use(FieldContext) as FieldType<TValue> | undefined\n\n // Lock the mode on first render so hook order is stable forever. This ensures\n // that hooks are called in the same order each time a component renders => should\n // not break the rule of hooks.\n const hasFieldContext = React.useRef<false | null | true>(null)\n if (hasFieldContext.current === null) {\n // Use field context, if a field context exists **and** the path matches. If the path\n // does not match, this could be the field context of a parent field => there likely is\n // a nested <Form /> we should use instead => 'form'\n const currentPath = options?.path || pathFromContext || options.potentiallyStalePath\n\n hasFieldContext.current =\n fieldContext && currentPath && fieldContext.path === currentPath ? true : false\n }\n\n if (hasFieldContext.current === true) {\n if (!fieldContext) {\n // Provider was removed after mount. That violates hook guarantees.\n throw new Error('FieldContext was removed after mount. This breaks hook ordering.')\n }\n return fieldContext\n }\n\n // We intentionally guard this hook call with a mode that is fixed on first render.\n // The order is consistent across renders. Silence the linter’s false positive.\n\n // eslint-disable-next-line react-compiler/react-compiler\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return useFieldInForm<TValue>(options)\n}\n"],"names":["React","useCallback","useMemo","useRef","useThrottledEffect","useAuth","useConfig","useDocumentInfo","useOperation","useTranslation","useDocumentForm","useForm","useFormFields","useFormInitializing","useFormProcessing","useFormSubmitted","useFieldPath","useFieldInForm","options","disableFormData","hasRows","path","pathFromOptions","potentiallyStalePath","validate","pathFromContext","submitted","processing","initializing","user","id","collectionSlug","operation","dispatchField","_","dispatch","field","fields","t","config","getData","getDataByPath","getSiblingData","setModified","documentForm","filterOptions","value","initialValue","valid","showError","prevValid","prevErrorMessage","errorMessage","pathSegments","split","setValue","e","disableModifyingForm","isEvent","preventDefault","stopPropagation","val","target","type","result","blocksFilterOptions","customComponents","disabled","errorPaths","formInitializing","formProcessing","formSubmitted","rows","selectFilterOptions","validateField","valueToValidate","Array","isArray","current","data","isValid","blockData","undefined","event","preferences","req","payload","siblingData","update","FieldContext","createContext","useField","fieldContext","use","hasFieldContext","currentPath","Error"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/forms/useField/index.tsx"],"sourcesContent":["'use client'\nimport type { PayloadRequest } from 'payload'\n\nimport React, { useCallback, useMemo, useRef } from 'react'\n\nimport type { UPDATE } from '../Form/types.js'\nimport type { FieldType, Options } from './types.js'\n\nexport type { FieldType, Options }\n\nimport { useThrottledEffect } from '../../hooks/useThrottledEffect.js'\nimport { useAuth } from '../../providers/Auth/index.js'\nimport { useConfig } from '../../providers/Config/index.js'\nimport { useDocumentInfo } from '../../providers/DocumentInfo/index.js'\nimport { useOperation } from '../../providers/Operation/index.js'\nimport { useTranslation } from '../../providers/Translation/index.js'\nimport {\n useDocumentForm,\n useForm,\n useFormFields,\n useFormInitializing,\n useFormProcessing,\n useFormSubmitted,\n} from '../Form/context.js'\nimport { useFieldPath } from '../RenderFields/context.js'\n\nconst useFieldInForm = <TValue,>(options?: Options): FieldType<TValue> => {\n const {\n disableFormData = false,\n hasRows,\n path: pathFromOptions,\n potentiallyStalePath,\n validate,\n } = options || {}\n\n const pathFromContext = useFieldPath()\n\n // This is a workaround for stale props given to server rendered components.\n // See the notes in the `potentiallyStalePath` type definition for more details.\n const path = pathFromOptions || pathFromContext || potentiallyStalePath\n\n const submitted = useFormSubmitted()\n const processing = useFormProcessing()\n const initializing = useFormInitializing()\n const { user } = useAuth()\n const { id, collectionSlug } = useDocumentInfo()\n const operation = useOperation()\n\n const dispatchField = useFormFields(([_, dispatch]) => dispatch)\n const field = useFormFields(([fields]) => (fields && fields?.[path]) || null)\n\n const { t } = useTranslation()\n const { config } = useConfig()\n\n const { getData, getDataByPath, getSiblingData, setModified } = useForm()\n const documentForm = useDocumentForm()\n\n const filterOptions = field?.filterOptions\n const value = field?.value as TValue\n const initialValue = field?.initialValue as TValue\n const valid = typeof field?.valid === 'boolean' ? field.valid : true\n const showError = valid === false && submitted\n\n const prevValid = useRef(valid)\n const prevErrorMessage = useRef(field?.errorMessage)\n\n const pathSegments = path ? path.split('.') : []\n\n // Method to return from `useField`, used to\n // update field values from field component(s)\n const setValue = useCallback(\n (e, disableModifyingForm = false) => {\n // TODO:\n // There are no built-in fields that pass events into `e`.\n // Remove this check in the next major version.\n const isEvent =\n e &&\n typeof e === 'object' &&\n typeof e.preventDefault === 'function' &&\n typeof e.stopPropagation === 'function'\n\n const val = isEvent ? e.target.value : e\n\n dispatchField({\n type: 'UPDATE',\n disableFormData: disableFormData || (hasRows && val > 0),\n path,\n value: val,\n })\n\n if (!disableModifyingForm) {\n setModified(true)\n }\n },\n [setModified, path, dispatchField, disableFormData, hasRows],\n )\n\n // Store result from hook as ref\n // to prevent unnecessary rerenders\n const result: FieldType<TValue> = useMemo(\n () => ({\n blocksFilterOptions: field?.blocksFilterOptions,\n customComponents: field?.customComponents,\n disabled: processing || initializing,\n errorMessage: field?.errorMessage,\n errorPaths: field?.errorPaths || [],\n filterOptions,\n formInitializing: initializing,\n formProcessing: processing,\n formSubmitted: submitted,\n initialValue,\n path,\n rows: field?.rows,\n selectFilterOptions: field?.selectFilterOptions,\n setValue,\n showError,\n valid: field?.valid,\n value,\n }),\n [\n field,\n processing,\n setValue,\n showError,\n submitted,\n value,\n initialValue,\n path,\n filterOptions,\n initializing,\n ],\n )\n\n // Throttle the validate function\n useThrottledEffect(\n () => {\n const validateField = async () => {\n let valueToValidate = value\n\n if (field?.rows && Array.isArray(field.rows)) {\n valueToValidate = getDataByPath(path)\n }\n\n let errorMessage: string | undefined = prevErrorMessage.current\n let valid: boolean | string = prevValid.current\n\n const data = getData()\n const isValid =\n typeof validate === 'function'\n ? await validate(valueToValidate, {\n id,\n blockData: undefined, // Will be expensive to get - not worth to pass to client-side validation, as this can be obtained by the user using `useFormFields()`\n collectionSlug,\n data: documentForm?.getData ? documentForm.getData() : data,\n event: 'onChange',\n operation,\n path: pathSegments,\n preferences: {} as any,\n req: {\n payload: {\n config,\n },\n t,\n user,\n } as unknown as PayloadRequest,\n siblingData: getSiblingData(path),\n })\n : typeof prevErrorMessage.current === 'string'\n ? prevErrorMessage.current\n : prevValid.current\n\n if (typeof isValid === 'string') {\n valid = false\n errorMessage = isValid\n } else if (typeof isValid === 'boolean') {\n valid = isValid\n errorMessage = undefined\n }\n\n // Only dispatch if the validation result has changed\n // This will prevent unnecessary rerenders\n if (valid !== prevValid.current || errorMessage !== prevErrorMessage.current) {\n prevValid.current = valid\n prevErrorMessage.current = errorMessage\n\n const update: UPDATE = {\n type: 'UPDATE',\n errorMessage,\n path,\n rows: field?.rows,\n valid,\n validate,\n value,\n }\n\n if (disableFormData || (hasRows ? typeof value === 'number' && value > 0 : false)) {\n update.disableFormData = true\n }\n\n if (typeof dispatchField === 'function') {\n dispatchField(update)\n }\n }\n }\n\n void validateField()\n },\n 150,\n [\n value,\n disableFormData,\n dispatchField,\n getData,\n getSiblingData,\n getDataByPath,\n id,\n operation,\n path,\n user,\n validate,\n field?.rows,\n collectionSlug,\n ],\n )\n\n return result\n}\n\n/**\n * Context to allow providing useField value for fields directly, if managed outside the Form\n *\n * @experimental\n */\nexport const FieldContext = React.createContext<FieldType<unknown> | undefined>(undefined)\n\n/**\n * Get and set the value of a form field.\n *\n * @see https://payloadcms.com/docs/admin/react-hooks#usefield\n */\nexport const useField = <TValue,>(options?: Options): FieldType<TValue> => {\n const pathFromContext = useFieldPath()\n\n const fieldContext = React.use(FieldContext) as FieldType<TValue> | undefined\n\n // Lock the mode on first render so hook order is stable forever. This ensures\n // that hooks are called in the same order each time a component renders => should\n // not break the rule of hooks.\n const hasFieldContext = React.useRef<false | null | true>(null)\n if (hasFieldContext.current === null) {\n // Use field context, if a field context exists **and** the path matches. If the path\n // does not match, this could be the field context of a parent field => there likely is\n // a nested <Form /> we should use instead => 'form'\n const currentPath = options?.path || pathFromContext || options.potentiallyStalePath\n\n hasFieldContext.current =\n fieldContext && currentPath && fieldContext.path === currentPath ? true : false\n }\n\n if (hasFieldContext.current === true) {\n if (!fieldContext) {\n // Provider was removed after mount. That violates hook guarantees.\n throw new Error('FieldContext was removed after mount. This breaks hook ordering.')\n }\n return fieldContext\n }\n\n // We intentionally guard this hook call with a mode that is fixed on first render.\n // The order is consistent across renders. Silence the linter’s false positive.\n\n // eslint-disable-next-line react-compiler/react-compiler\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return useFieldInForm<TValue>(options)\n}\n"],"names":["React","useCallback","useMemo","useRef","useThrottledEffect","useAuth","useConfig","useDocumentInfo","useOperation","useTranslation","useDocumentForm","useForm","useFormFields","useFormInitializing","useFormProcessing","useFormSubmitted","useFieldPath","useFieldInForm","options","disableFormData","hasRows","path","pathFromOptions","potentiallyStalePath","validate","pathFromContext","submitted","processing","initializing","user","id","collectionSlug","operation","dispatchField","_","dispatch","field","fields","t","config","getData","getDataByPath","getSiblingData","setModified","documentForm","filterOptions","value","initialValue","valid","showError","prevValid","prevErrorMessage","errorMessage","pathSegments","split","setValue","e","disableModifyingForm","isEvent","preventDefault","stopPropagation","val","target","type","result","blocksFilterOptions","customComponents","disabled","errorPaths","formInitializing","formProcessing","formSubmitted","rows","selectFilterOptions","validateField","valueToValidate","Array","isArray","current","data","isValid","blockData","undefined","event","preferences","req","payload","siblingData","update","FieldContext","createContext","useField","fieldContext","use","hasFieldContext","currentPath","Error"],"mappings":"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"}
|
|
@@ -1,3 +1,21 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* If `path` is provided to this hook, it will be used outright. This is useful when calling this hook directly within a custom component.
|
|
3
|
+
* Otherwise, the field will attempt to get the path from the `FieldPathContext` via the `useFieldPath` hook.
|
|
4
|
+
* If still not found, the `potentiallyStalePath` arg will be used. See the note below about why this is important.
|
|
5
|
+
*/ /**
|
|
6
|
+
* Custom server components receive a static `path` prop at render-time, leading to temporarily stale paths when re-ordering rows in form state.
|
|
7
|
+
* This is because when manipulating rows, field paths change in form state, but the prop remains the same until the component is re-rendered on the server.
|
|
8
|
+
* This causes the component to temporarily point to the wrong field in form state until the server responds with a freshly rendered component.
|
|
9
|
+
* To prevent this, fields are wrapped with a `FieldPathContext` which is guaranteed to be up-to-date.
|
|
10
|
+
* The `path` prop that Payload's default fields receive, then, are sent into this hook as the `potentiallyStalePath` arg.
|
|
11
|
+
* This ensures that:
|
|
12
|
+
* 1. Custom components that use this hook directly will still respect the `path` prop as top priority.
|
|
13
|
+
* 2. Custom server components that blindly spread their props into default Payload fields still prefer the dynamic path from context.
|
|
14
|
+
* 3. Components that render default Payload fields directly do not require a `FieldPathProvider`, e.g. the email field in the account view.
|
|
15
|
+
*/ /**
|
|
16
|
+
* Client-side validation function fired when the form is submitted.
|
|
17
|
+
*/ export { }; /**
|
|
18
|
+
* @deprecated - readOnly is no longer returned from useField. Remove this in 4.0.
|
|
19
|
+
*/
|
|
2
20
|
|
|
3
21
|
//# sourceMappingURL=types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/forms/useField/types.ts"],"sourcesContent":["import type { FieldState, Validate } from 'payload'\n\nexport type Options = {\n disableFormData?: boolean\n hasRows?: boolean\n /**\n * If `path` is provided to this hook, it will be used outright. This is useful when calling this hook directly within a custom component.\n * Otherwise, the field will attempt to get the path from the `FieldPathContext` via the `useFieldPath` hook.\n * If still not found, the `potentiallyStalePath` arg will be used. See the note below about why this is important.\n */\n path?: string\n /**\n * Custom server components receive a static `path` prop at render-time, leading to temporarily stale paths when re-ordering rows in form state.\n * This is because when manipulating rows, field paths change in form state, but the prop remains the same until the component is re-rendered on the server.\n * This causes the component to temporarily point to the wrong field in form state until the server responds with a freshly rendered component.\n * To prevent this, fields are wrapped with a `FieldPathContext` which is guaranteed to be up-to-date.\n * The `path` prop that Payload's default fields receive, then, are sent into this hook as the `potentiallyStalePath` arg.\n * This ensures that:\n * 1. Custom components that use this hook directly will still respect the `path` prop as top priority.\n * 2. Custom server components that blindly spread their props into default Payload fields still prefer the dynamic path from context.\n * 3. Components that render default Payload fields directly do not require a `FieldPathProvider`, e.g. the email field in the account view.\n */\n potentiallyStalePath?: string\n /**\n * Client-side validation function fired when the form is submitted.\n */\n validate?: Validate\n}\n\nexport type FieldType<T> = {\n disabled: boolean\n formInitializing: boolean\n formProcessing: boolean\n formSubmitted: boolean\n initialValue?: T\n path: string\n /**\n * @deprecated - readOnly is no longer returned from useField. Remove this in 4.0.\n */\n readOnly?: boolean\n setValue: (val: unknown, disableModifyingForm?: boolean) => void\n showError: boolean\n value: T\n} & Pick<\n FieldState,\n | 'blocksFilterOptions'\n | 'customComponents'\n | 'errorMessage'\n | 'errorPaths'\n | 'filterOptions'\n | 'rows'\n | 'selectFilterOptions'\n | 'valid'\n>\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../src/forms/useField/types.ts"],"sourcesContent":["import type { FieldState, Validate } from 'payload'\n\nexport type Options = {\n disableFormData?: boolean\n hasRows?: boolean\n /**\n * If `path` is provided to this hook, it will be used outright. This is useful when calling this hook directly within a custom component.\n * Otherwise, the field will attempt to get the path from the `FieldPathContext` via the `useFieldPath` hook.\n * If still not found, the `potentiallyStalePath` arg will be used. See the note below about why this is important.\n */\n path?: string\n /**\n * Custom server components receive a static `path` prop at render-time, leading to temporarily stale paths when re-ordering rows in form state.\n * This is because when manipulating rows, field paths change in form state, but the prop remains the same until the component is re-rendered on the server.\n * This causes the component to temporarily point to the wrong field in form state until the server responds with a freshly rendered component.\n * To prevent this, fields are wrapped with a `FieldPathContext` which is guaranteed to be up-to-date.\n * The `path` prop that Payload's default fields receive, then, are sent into this hook as the `potentiallyStalePath` arg.\n * This ensures that:\n * 1. Custom components that use this hook directly will still respect the `path` prop as top priority.\n * 2. Custom server components that blindly spread their props into default Payload fields still prefer the dynamic path from context.\n * 3. Components that render default Payload fields directly do not require a `FieldPathProvider`, e.g. the email field in the account view.\n */\n potentiallyStalePath?: string\n /**\n * Client-side validation function fired when the form is submitted.\n */\n validate?: Validate\n}\n\nexport type FieldType<T> = {\n disabled: boolean\n formInitializing: boolean\n formProcessing: boolean\n formSubmitted: boolean\n initialValue?: T\n path: string\n /**\n * @deprecated - readOnly is no longer returned from useField. Remove this in 4.0.\n */\n readOnly?: boolean\n setValue: (val: unknown, disableModifyingForm?: boolean) => void\n showError: boolean\n value: T\n} & Pick<\n FieldState,\n | 'blocksFilterOptions'\n | 'customComponents'\n | 'errorMessage'\n | 'errorPaths'\n | 'filterOptions'\n | 'rows'\n | 'selectFilterOptions'\n | 'valid'\n>\n"],"names":[],"mappings":"AAKE;;;;GAIC,GAED;;;;;;;;;;GAUC,GAED;;GAEC,GAIH,WAwBC,CAjBC;;GAEC"}
|
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { useEffect, useRef, useState } from 'react';
|
|
3
|
-
|
|
3
|
+
/**
|
|
4
|
+
* A hook for managing state that can be controlled by props but also overridden locally.
|
|
5
|
+
* Props always take precedence if they change, but local state can override them temporarily.
|
|
6
|
+
*
|
|
7
|
+
* @param propValue - The controlled value from props
|
|
8
|
+
* @param fallbackValue - Value to use when propValue is null or undefined
|
|
9
|
+
*
|
|
10
|
+
* @internal - may change or be removed without a major version bump
|
|
11
|
+
*/ export function useControllableState(propValue, fallbackValue) {
|
|
4
12
|
const [localValue, setLocalValue] = useState(propValue);
|
|
5
13
|
const initialRenderRef = useRef(true);
|
|
6
14
|
useEffect(()=>{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/hooks/useControllableState.ts"],"sourcesContent":["'use client'\nimport { useEffect, useRef, useState } from 'react'\n\n/**\n * A hook for managing state that can be controlled by props but also overridden locally.\n * Props always take precedence if they change, but local state can override them temporarily.\n *\n * @param propValue - The controlled value from props\n * @param fallbackValue - Value to use when propValue is null or undefined\n *\n * @internal - may change or be removed without a major version bump\n */\nexport function useControllableState<T, D>(\n propValue: T,\n fallbackValue: D,\n): [T extends NonNullable<T> ? T : D | NonNullable<T>, (value: ((prev: T) => T) | T) => void]\n\nexport function useControllableState<T>(propValue: T): [T, (value: ((prev: T) => T) | T) => void]\n\nexport function useControllableState<T, D>(\n propValue: T,\n fallbackValue?: D,\n): [T extends NonNullable<T> ? T : D | NonNullable<T>, (value: ((prev: T) => T) | T) => void] {\n const [localValue, setLocalValue] = useState<T>(propValue)\n const initialRenderRef = useRef(true)\n\n useEffect(() => {\n if (initialRenderRef.current) {\n initialRenderRef.current = false\n return\n }\n\n setLocalValue(propValue)\n }, [propValue])\n\n return [localValue ?? fallbackValue, setLocalValue] as [\n T extends NonNullable<T> ? T : D | NonNullable<T>,\n (value: ((prev: T) => T) | T) => void,\n ]\n}\n"],"names":["useEffect","useRef","useState","useControllableState","propValue","fallbackValue","localValue","setLocalValue","initialRenderRef","current"],"mappings":"AAAA;AACA,SAASA,SAAS,EAAEC,MAAM,EAAEC,QAAQ,QAAQ,QAAO;
|
|
1
|
+
{"version":3,"sources":["../../src/hooks/useControllableState.ts"],"sourcesContent":["'use client'\nimport { useEffect, useRef, useState } from 'react'\n\n/**\n * A hook for managing state that can be controlled by props but also overridden locally.\n * Props always take precedence if they change, but local state can override them temporarily.\n *\n * @param propValue - The controlled value from props\n * @param fallbackValue - Value to use when propValue is null or undefined\n *\n * @internal - may change or be removed without a major version bump\n */\nexport function useControllableState<T, D>(\n propValue: T,\n fallbackValue: D,\n): [T extends NonNullable<T> ? T : D | NonNullable<T>, (value: ((prev: T) => T) | T) => void]\n\nexport function useControllableState<T>(propValue: T): [T, (value: ((prev: T) => T) | T) => void]\n\nexport function useControllableState<T, D>(\n propValue: T,\n fallbackValue?: D,\n): [T extends NonNullable<T> ? T : D | NonNullable<T>, (value: ((prev: T) => T) | T) => void] {\n const [localValue, setLocalValue] = useState<T>(propValue)\n const initialRenderRef = useRef(true)\n\n useEffect(() => {\n if (initialRenderRef.current) {\n initialRenderRef.current = false\n return\n }\n\n setLocalValue(propValue)\n }, [propValue])\n\n return [localValue ?? fallbackValue, setLocalValue] as [\n T extends NonNullable<T> ? T : D | NonNullable<T>,\n (value: ((prev: T) => T) | T) => void,\n ]\n}\n"],"names":["useEffect","useRef","useState","useControllableState","propValue","fallbackValue","localValue","setLocalValue","initialRenderRef","current"],"mappings":"AAAA;AACA,SAASA,SAAS,EAAEC,MAAM,EAAEC,QAAQ,QAAQ,QAAO;AAEnD;;;;;;;;CAQC,GAQD,OAAO,SAASC,qBACdC,SAAY,EACZC,aAAiB;IAEjB,MAAM,CAACC,YAAYC,cAAc,GAAGL,SAAYE;IAChD,MAAMI,mBAAmBP,OAAO;IAEhCD,UAAU;QACR,IAAIQ,iBAAiBC,OAAO,EAAE;YAC5BD,iBAAiBC,OAAO,GAAG;YAC3B;QACF;QAEAF,cAAcH;IAChB,GAAG;QAACA;KAAU;IAEd,OAAO;QAACE,cAAcD;QAAeE;KAAc;AAIrD"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import * as React from 'react';
|
|
3
3
|
import { useDelay } from './useDelay.js';
|
|
4
|
-
|
|
4
|
+
/** Time in ms to wait before "mounting" the component. */ /** Time in ms for the "enter" phase of the transition, after delay completes. */ /** Min time in ms for the "entered" phase of the transition. */ /** Time in ms for the exit phase of the transition. */ /** `true` starts the mount process.
|
|
5
|
+
* `false` starts the unmount process.
|
|
6
|
+
* */ /** `true` if the component has mounted after the timeout. */ /** `true` if the component is unmounting. */ /** Call this function to trigger the timeout delay before rendering. */ export const useDelayedRender = ({ delayBeforeShow, inTimeout, minShowTime, outTimeout, show })=>{
|
|
5
7
|
const totalMountTime = inTimeout + minShowTime + outTimeout;
|
|
6
8
|
const [hasDelayed, triggerDelay] = useDelay(delayBeforeShow);
|
|
7
9
|
const [isMounted, setIsMounted] = React.useState(false);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/hooks/useDelayedRender.ts"],"sourcesContent":["'use client'\nimport * as React from 'react'\n\nimport { useDelay } from './useDelay.js'\n\ntype DelayedRenderProps = {\n /** Time in ms to wait before \"mounting\" the component. */\n delayBeforeShow: number\n /** Time in ms for the \"enter\" phase of the transition, after delay completes. */\n inTimeout: number\n /** Min time in ms for the \"entered\" phase of the transition. */\n minShowTime: number\n /** Time in ms for the exit phase of the transition. */\n outTimeout: number\n /** `true` starts the mount process.\n * `false` starts the unmount process.\n * */\n show: boolean\n}\ntype useDelayedRenderT = (props: DelayedRenderProps) => {\n /** `true` if the component has mounted after the timeout. */\n isMounted: boolean\n /** `true` if the component is unmounting. */\n isUnmounting: boolean\n /** Call this function to trigger the timeout delay before rendering. */\n triggerDelayedRender: () => void\n}\nexport const useDelayedRender: useDelayedRenderT = ({\n delayBeforeShow,\n inTimeout,\n minShowTime,\n outTimeout,\n show,\n}) => {\n const totalMountTime = inTimeout + minShowTime + outTimeout\n const [hasDelayed, triggerDelay] = useDelay(delayBeforeShow)\n const [isMounted, setIsMounted] = React.useState(false)\n const [isUnmounting, setIsUnmounting] = React.useState(false)\n const onMountTimestampRef = React.useRef(0)\n const unmountTimeoutRef: React.RefObject<NodeJS.Timeout | undefined> = React.useRef(undefined)\n\n const unmount = React.useCallback(() => {\n setIsUnmounting(true)\n unmountTimeoutRef.current = setTimeout(() => {\n setIsMounted(false)\n setIsUnmounting(false)\n }, outTimeout)\n }, [setIsUnmounting, outTimeout])\n\n React.useEffect(() => {\n const shouldMount = hasDelayed && !isMounted && show\n const shouldUnmount = isMounted && !show\n\n if (shouldMount) {\n onMountTimestampRef.current = Date.now()\n setIsMounted(true)\n } else if (shouldUnmount) {\n const totalTimeMounted = Date.now() - onMountTimestampRef.current\n const remainingTime = totalMountTime - totalTimeMounted\n clearTimeout(unmountTimeoutRef.current)\n unmountTimeoutRef.current = setTimeout(unmount, Math.max(0, remainingTime))\n }\n }, [isMounted, show, unmount, totalMountTime, hasDelayed])\n\n return {\n isMounted,\n isUnmounting,\n triggerDelayedRender: triggerDelay,\n }\n}\n"],"names":["React","useDelay","useDelayedRender","delayBeforeShow","inTimeout","minShowTime","outTimeout","show","totalMountTime","hasDelayed","triggerDelay","isMounted","setIsMounted","useState","isUnmounting","setIsUnmounting","onMountTimestampRef","useRef","unmountTimeoutRef","undefined","unmount","useCallback","current","setTimeout","useEffect","shouldMount","shouldUnmount","Date","now","totalTimeMounted","remainingTime","clearTimeout","Math","max","triggerDelayedRender"],"mappings":"AAAA;AACA,YAAYA,WAAW,QAAO;AAE9B,SAASC,QAAQ,QAAQ,gBAAe;
|
|
1
|
+
{"version":3,"sources":["../../src/hooks/useDelayedRender.ts"],"sourcesContent":["'use client'\nimport * as React from 'react'\n\nimport { useDelay } from './useDelay.js'\n\ntype DelayedRenderProps = {\n /** Time in ms to wait before \"mounting\" the component. */\n delayBeforeShow: number\n /** Time in ms for the \"enter\" phase of the transition, after delay completes. */\n inTimeout: number\n /** Min time in ms for the \"entered\" phase of the transition. */\n minShowTime: number\n /** Time in ms for the exit phase of the transition. */\n outTimeout: number\n /** `true` starts the mount process.\n * `false` starts the unmount process.\n * */\n show: boolean\n}\ntype useDelayedRenderT = (props: DelayedRenderProps) => {\n /** `true` if the component has mounted after the timeout. */\n isMounted: boolean\n /** `true` if the component is unmounting. */\n isUnmounting: boolean\n /** Call this function to trigger the timeout delay before rendering. */\n triggerDelayedRender: () => void\n}\nexport const useDelayedRender: useDelayedRenderT = ({\n delayBeforeShow,\n inTimeout,\n minShowTime,\n outTimeout,\n show,\n}) => {\n const totalMountTime = inTimeout + minShowTime + outTimeout\n const [hasDelayed, triggerDelay] = useDelay(delayBeforeShow)\n const [isMounted, setIsMounted] = React.useState(false)\n const [isUnmounting, setIsUnmounting] = React.useState(false)\n const onMountTimestampRef = React.useRef(0)\n const unmountTimeoutRef: React.RefObject<NodeJS.Timeout | undefined> = React.useRef(undefined)\n\n const unmount = React.useCallback(() => {\n setIsUnmounting(true)\n unmountTimeoutRef.current = setTimeout(() => {\n setIsMounted(false)\n setIsUnmounting(false)\n }, outTimeout)\n }, [setIsUnmounting, outTimeout])\n\n React.useEffect(() => {\n const shouldMount = hasDelayed && !isMounted && show\n const shouldUnmount = isMounted && !show\n\n if (shouldMount) {\n onMountTimestampRef.current = Date.now()\n setIsMounted(true)\n } else if (shouldUnmount) {\n const totalTimeMounted = Date.now() - onMountTimestampRef.current\n const remainingTime = totalMountTime - totalTimeMounted\n clearTimeout(unmountTimeoutRef.current)\n unmountTimeoutRef.current = setTimeout(unmount, Math.max(0, remainingTime))\n }\n }, [isMounted, show, unmount, totalMountTime, hasDelayed])\n\n return {\n isMounted,\n isUnmounting,\n triggerDelayedRender: triggerDelay,\n }\n}\n"],"names":["React","useDelay","useDelayedRender","delayBeforeShow","inTimeout","minShowTime","outTimeout","show","totalMountTime","hasDelayed","triggerDelay","isMounted","setIsMounted","useState","isUnmounting","setIsUnmounting","onMountTimestampRef","useRef","unmountTimeoutRef","undefined","unmount","useCallback","current","setTimeout","useEffect","shouldMount","shouldUnmount","Date","now","totalTimeMounted","remainingTime","clearTimeout","Math","max","triggerDelayedRender"],"mappings":"AAAA;AACA,YAAYA,WAAW,QAAO;AAE9B,SAASC,QAAQ,QAAQ,gBAAe;AAGtC,wDAAwD,GAExD,+EAA+E,GAE/E,8DAA8D,GAE9D,qDAAqD,GAErD;;KAEG,GAIH,2DAA2D,GAE3D,2CAA2C,GAE3C,sEAAsE,GAGxE,OAAO,MAAMC,mBAAsC,CAAC,EAClDC,eAAe,EACfC,SAAS,EACTC,WAAW,EACXC,UAAU,EACVC,IAAI,EACL;IACC,MAAMC,iBAAiBJ,YAAYC,cAAcC;IACjD,MAAM,CAACG,YAAYC,aAAa,GAAGT,SAASE;IAC5C,MAAM,CAACQ,WAAWC,aAAa,GAAGZ,MAAMa,QAAQ,CAAC;IACjD,MAAM,CAACC,cAAcC,gBAAgB,GAAGf,MAAMa,QAAQ,CAAC;IACvD,MAAMG,sBAAsBhB,MAAMiB,MAAM,CAAC;IACzC,MAAMC,oBAAiElB,MAAMiB,MAAM,CAACE;IAEpF,MAAMC,UAAUpB,MAAMqB,WAAW,CAAC;QAChCN,gBAAgB;QAChBG,kBAAkBI,OAAO,GAAGC,WAAW;YACrCX,aAAa;YACbG,gBAAgB;QAClB,GAAGT;IACL,GAAG;QAACS;QAAiBT;KAAW;IAEhCN,MAAMwB,SAAS,CAAC;QACd,MAAMC,cAAchB,cAAc,CAACE,aAAaJ;QAChD,MAAMmB,gBAAgBf,aAAa,CAACJ;QAEpC,IAAIkB,aAAa;YACfT,oBAAoBM,OAAO,GAAGK,KAAKC,GAAG;YACtChB,aAAa;QACf,OAAO,IAAIc,eAAe;YACxB,MAAMG,mBAAmBF,KAAKC,GAAG,KAAKZ,oBAAoBM,OAAO;YACjE,MAAMQ,gBAAgBtB,iBAAiBqB;YACvCE,aAAab,kBAAkBI,OAAO;YACtCJ,kBAAkBI,OAAO,GAAGC,WAAWH,SAASY,KAAKC,GAAG,CAAC,GAAGH;QAC9D;IACF,GAAG;QAACnB;QAAWJ;QAAMa;QAASZ;QAAgBC;KAAW;IAEzD,OAAO;QACLE;QACAG;QACAoB,sBAAsBxB;IACxB;AACF,EAAC"}
|
package/dist/hooks/useHotkey.js
CHANGED
|
@@ -105,8 +105,8 @@ const removeFromKeys = (code)=>{
|
|
|
105
105
|
}, []);
|
|
106
106
|
useEffect(()=>{
|
|
107
107
|
document.addEventListener('keydown', keydown, false);
|
|
108
|
-
document.addEventListener('bypassKeyDown', keydown, false)
|
|
109
|
-
|
|
108
|
+
document.addEventListener('bypassKeyDown', keydown, false);
|
|
109
|
+
// this is called if the keydown event's propagation is stopped by react-select
|
|
110
110
|
document.addEventListener('keyup', keyup, false);
|
|
111
111
|
return ()=>{
|
|
112
112
|
document.removeEventListener('keydown', keydown);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/hooks/useHotkey.ts"],"sourcesContent":["'use client'\n\nimport { useModal } from '@faceless-ui/modal'\nimport { setsAreEqual } from 'payload/shared'\nimport { useCallback, useEffect } from 'react'\n\n// Required to be outside of hook, else debounce would be necessary\n// and then one could not prevent the default behaviour.\n\n// It maps the pressed keys with the time they were pressed, in order to implement a maximum time\n// for the user to press the next key in the sequence\n\n// This is necessary to prevent a bug where the keyup event, which unsets the key as pressed\n// is not fired when the window is not focused.\n// When the user then comes back to the window, the key is still registered as pressed, even though it's not.\nconst pressedKeys = new Map<string, number>([])\n\nconst map = {\n altleft: 'alt',\n altright: 'alt',\n controlleft: 'ctrl',\n controlright: 'ctrl',\n ctrlleft: 'ctrl',\n ctrlright: 'ctrl',\n escape: 'esc',\n metaleft: 'meta',\n metaright: 'meta',\n osleft: 'meta',\n osright: 'meta',\n shiftleft: 'shift',\n shiftright: 'shift',\n}\n\nconst stripKey = (key: string) => {\n return (map[key.toLowerCase()] || key).trim().toLowerCase().replace('key', '')\n}\n\nconst pushToKeys = (code: string) => {\n const key = stripKey(code)\n\n // There is a weird bug with macos that if the keys are not cleared they remain in the\n // pressed keys set.\n if (key === 'meta') {\n pressedKeys.forEach(\n (time, pressedKey) => pressedKey !== 'meta' && pressedKeys.delete(pressedKey),\n )\n }\n\n pressedKeys.set(key, Date.now())\n}\n\nconst removeFromKeys = (code: string) => {\n const key = stripKey(code)\n // There is a weird bug with macos that if the keys are not cleared they remain in the\n // pressed keys set.\n if (key === 'meta') {\n pressedKeys.clear()\n }\n pressedKeys.delete(key)\n}\n\n/**\n * Hook function to work with hotkeys.\n * @param param0.keyCode {string[]} The keys to listen for (`Event.code` without `'Key'` and lowercased)\n * @param param0.cmdCtrlKey {boolean} Whether Ctrl on windows or Cmd on mac must be pressed\n * @param param0.editDepth {boolean} This ensures that the hotkey is only triggered for the most top-level drawer in case there are nested drawers\n * @param func The callback function\n */\nexport const useHotkey = (\n options: {\n cmdCtrlKey: boolean\n editDepth: number\n keyCodes: string[]\n },\n func: (e: KeyboardEvent) => void,\n): void => {\n const { cmdCtrlKey, editDepth, keyCodes } = options\n\n const { modalState } = useModal()\n\n const keydown = useCallback(\n (event: CustomEvent | KeyboardEvent) => {\n const e: KeyboardEvent = event.detail?.key ? event.detail : event\n if (e.key === undefined) {\n // Autofill events, or other synthetic events, can be ignored\n return\n }\n\n // Filter out pressed keys which have been pressed > 3 seconds ago\n pressedKeys.forEach((time, key) => {\n if (Date.now() - time > 3000) {\n pressedKeys.delete(key)\n }\n })\n\n if (e.code) {\n pushToKeys(e.code)\n }\n\n // Check for Mac and iPad\n const hasCmd = window.navigator.userAgent.includes('Mac OS X')\n const pressedWithoutModifier = [...pressedKeys.keys()].filter(\n (key) => !['alt', 'ctrl', 'meta', 'shift'].includes(key),\n )\n\n // Check whether arrays contain the same values (regardless of number of occurrences)\n if (\n setsAreEqual(new Set(pressedWithoutModifier), new Set(keyCodes)) &&\n (!cmdCtrlKey || (hasCmd && pressedKeys.has('meta')) || (!hasCmd && e.ctrlKey))\n ) {\n // get the maximum edit depth by counting the number of open drawers. modalState is and object which contains the state of all drawers.\n const maxEditDepth =\n Object.keys(modalState).filter((key) => modalState[key]?.isOpen)?.length + 1 || 1\n\n if (maxEditDepth !== editDepth) {\n // We only want to execute the hotkey from the most top-level drawer / edit depth.\n return\n }\n // execute the function associated with the maximum edit depth\n func(e)\n }\n },\n [keyCodes, cmdCtrlKey, editDepth, modalState, func],\n )\n\n const keyup = useCallback((e: KeyboardEvent) => {\n if (e.code) {\n removeFromKeys(e.code)\n }\n }, [])\n\n useEffect(() => {\n document.addEventListener('keydown', keydown, false)\n document.addEventListener('bypassKeyDown', keydown, false) // this is called if the keydown event's propagation is stopped by react-select\n document.addEventListener('keyup', keyup, false)\n\n return () => {\n document.removeEventListener('keydown', keydown)\n document.removeEventListener('bypassKeyDown', keydown)\n document.removeEventListener('keyup', keyup)\n }\n }, [keydown, keyup])\n}\n"],"names":["useModal","setsAreEqual","useCallback","useEffect","pressedKeys","Map","map","altleft","altright","controlleft","controlright","ctrlleft","ctrlright","escape","metaleft","metaright","osleft","osright","shiftleft","shiftright","stripKey","key","toLowerCase","trim","replace","pushToKeys","code","forEach","time","pressedKey","delete","set","Date","now","removeFromKeys","clear","useHotkey","options","func","cmdCtrlKey","editDepth","keyCodes","modalState","keydown","event","e","detail","undefined","hasCmd","window","navigator","userAgent","includes","pressedWithoutModifier","keys","filter","Set","has","ctrlKey","maxEditDepth","Object","isOpen","length","keyup","document","addEventListener","removeEventListener"],"mappings":"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
|
|
1
|
+
{"version":3,"sources":["../../src/hooks/useHotkey.ts"],"sourcesContent":["'use client'\n\nimport { useModal } from '@faceless-ui/modal'\nimport { setsAreEqual } from 'payload/shared'\nimport { useCallback, useEffect } from 'react'\n\n// Required to be outside of hook, else debounce would be necessary\n// and then one could not prevent the default behaviour.\n\n// It maps the pressed keys with the time they were pressed, in order to implement a maximum time\n// for the user to press the next key in the sequence\n\n// This is necessary to prevent a bug where the keyup event, which unsets the key as pressed\n// is not fired when the window is not focused.\n// When the user then comes back to the window, the key is still registered as pressed, even though it's not.\nconst pressedKeys = new Map<string, number>([])\n\nconst map = {\n altleft: 'alt',\n altright: 'alt',\n controlleft: 'ctrl',\n controlright: 'ctrl',\n ctrlleft: 'ctrl',\n ctrlright: 'ctrl',\n escape: 'esc',\n metaleft: 'meta',\n metaright: 'meta',\n osleft: 'meta',\n osright: 'meta',\n shiftleft: 'shift',\n shiftright: 'shift',\n}\n\nconst stripKey = (key: string) => {\n return (map[key.toLowerCase()] || key).trim().toLowerCase().replace('key', '')\n}\n\nconst pushToKeys = (code: string) => {\n const key = stripKey(code)\n\n // There is a weird bug with macos that if the keys are not cleared they remain in the\n // pressed keys set.\n if (key === 'meta') {\n pressedKeys.forEach(\n (time, pressedKey) => pressedKey !== 'meta' && pressedKeys.delete(pressedKey),\n )\n }\n\n pressedKeys.set(key, Date.now())\n}\n\nconst removeFromKeys = (code: string) => {\n const key = stripKey(code)\n // There is a weird bug with macos that if the keys are not cleared they remain in the\n // pressed keys set.\n if (key === 'meta') {\n pressedKeys.clear()\n }\n pressedKeys.delete(key)\n}\n\n/**\n * Hook function to work with hotkeys.\n * @param param0.keyCode {string[]} The keys to listen for (`Event.code` without `'Key'` and lowercased)\n * @param param0.cmdCtrlKey {boolean} Whether Ctrl on windows or Cmd on mac must be pressed\n * @param param0.editDepth {boolean} This ensures that the hotkey is only triggered for the most top-level drawer in case there are nested drawers\n * @param func The callback function\n */\nexport const useHotkey = (\n options: {\n cmdCtrlKey: boolean\n editDepth: number\n keyCodes: string[]\n },\n func: (e: KeyboardEvent) => void,\n): void => {\n const { cmdCtrlKey, editDepth, keyCodes } = options\n\n const { modalState } = useModal()\n\n const keydown = useCallback(\n (event: CustomEvent | KeyboardEvent) => {\n const e: KeyboardEvent = event.detail?.key ? event.detail : event\n if (e.key === undefined) {\n // Autofill events, or other synthetic events, can be ignored\n return\n }\n\n // Filter out pressed keys which have been pressed > 3 seconds ago\n pressedKeys.forEach((time, key) => {\n if (Date.now() - time > 3000) {\n pressedKeys.delete(key)\n }\n })\n\n if (e.code) {\n pushToKeys(e.code)\n }\n\n // Check for Mac and iPad\n const hasCmd = window.navigator.userAgent.includes('Mac OS X')\n const pressedWithoutModifier = [...pressedKeys.keys()].filter(\n (key) => !['alt', 'ctrl', 'meta', 'shift'].includes(key),\n )\n\n // Check whether arrays contain the same values (regardless of number of occurrences)\n if (\n setsAreEqual(new Set(pressedWithoutModifier), new Set(keyCodes)) &&\n (!cmdCtrlKey || (hasCmd && pressedKeys.has('meta')) || (!hasCmd && e.ctrlKey))\n ) {\n // get the maximum edit depth by counting the number of open drawers. modalState is and object which contains the state of all drawers.\n const maxEditDepth =\n Object.keys(modalState).filter((key) => modalState[key]?.isOpen)?.length + 1 || 1\n\n if (maxEditDepth !== editDepth) {\n // We only want to execute the hotkey from the most top-level drawer / edit depth.\n return\n }\n // execute the function associated with the maximum edit depth\n func(e)\n }\n },\n [keyCodes, cmdCtrlKey, editDepth, modalState, func],\n )\n\n const keyup = useCallback((e: KeyboardEvent) => {\n if (e.code) {\n removeFromKeys(e.code)\n }\n }, [])\n\n useEffect(() => {\n document.addEventListener('keydown', keydown, false)\n document.addEventListener('bypassKeyDown', keydown, false) // this is called if the keydown event's propagation is stopped by react-select\n document.addEventListener('keyup', keyup, false)\n\n return () => {\n document.removeEventListener('keydown', keydown)\n document.removeEventListener('bypassKeyDown', keydown)\n document.removeEventListener('keyup', keyup)\n }\n }, [keydown, keyup])\n}\n"],"names":["useModal","setsAreEqual","useCallback","useEffect","pressedKeys","Map","map","altleft","altright","controlleft","controlright","ctrlleft","ctrlright","escape","metaleft","metaright","osleft","osright","shiftleft","shiftright","stripKey","key","toLowerCase","trim","replace","pushToKeys","code","forEach","time","pressedKey","delete","set","Date","now","removeFromKeys","clear","useHotkey","options","func","cmdCtrlKey","editDepth","keyCodes","modalState","keydown","event","e","detail","undefined","hasCmd","window","navigator","userAgent","includes","pressedWithoutModifier","keys","filter","Set","has","ctrlKey","maxEditDepth","Object","isOpen","length","keyup","document","addEventListener","removeEventListener"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/hooks/usePayloadAPI.ts"],"sourcesContent":["'use client'\nimport type React from 'react'\n\nimport * as qs from 'qs-esm'\nimport { useEffect, useRef, useState } from 'react'\n\nimport { useLocale } from '../providers/Locale/index.js'\nimport { useTranslation } from '../providers/Translation/index.js'\nimport { requests } from '../utilities/api.js'\n\ntype Result = [\n {\n data: any\n isError: boolean\n isLoading: boolean\n },\n {\n setParams: React.Dispatch<unknown>\n },\n]\n\ntype Options = {\n initialData?: any\n initialParams?: unknown\n}\n\ntype UsePayloadAPI = (url: string, options?: Options) => Result\n\nexport const usePayloadAPI: UsePayloadAPI = (url, options = {}) => {\n const { initialData, initialParams = {} } = options\n\n const { i18n } = useTranslation()\n const [data, setData] = useState(initialData || {})\n const [params, setParams] = useState(initialParams)\n const [isLoading, setIsLoading] = useState(!initialData)\n const [isError, setIsError] = useState(false)\n const { code: locale } = useLocale()\n const hasInitialized = useRef(false)\n\n const search = qs.stringify(\n {\n locale,\n ...(typeof params === 'object' ? params : {}),\n },\n {\n addQueryPrefix: true,\n },\n )\n\n // If `initialData`, no need to make a request\n useEffect(() => {\n if (initialData && !hasInitialized.current) {\n hasInitialized.current = true\n return\n }\n\n const abortController = new AbortController()\n\n const fetchData = async () => {\n setIsError(false)\n setIsLoading(true)\n\n try {\n const response = await requests.get(`${url}${search}`, {\n headers: {\n 'Accept-Language': i18n.language,\n },\n signal: abortController.signal,\n })\n\n if (response.status > 201) {\n setIsError(true)\n }\n\n const json = await response.json()\n\n setData(json)\n setIsLoading(false)\n } catch (error) {\n if (!abortController.signal.aborted) {\n setIsError(true)\n setIsLoading(false)\n }\n }\n }\n\n if (url) {\n void fetchData()\n } else {\n setIsError(false)\n setIsLoading(false)\n }\n\n return () => {\n try {\n abortController.abort()\n } catch (_err) {\n // swallow error\n }\n }\n }, [url, locale, search, i18n.language, initialData])\n\n // If `initialData` changes, reset the state\n useEffect(() => {\n if (initialData && hasInitialized.current) {\n setData(initialData)\n }\n }, [initialData])\n\n return [{ data, isError, isLoading }, { setParams }]\n}\n"],"names":["qs","useEffect","useRef","useState","useLocale","useTranslation","requests","usePayloadAPI","url","options","initialData","initialParams","i18n","data","setData","params","setParams","isLoading","setIsLoading","isError","setIsError","code","locale","hasInitialized","search","stringify","addQueryPrefix","current","abortController","AbortController","fetchData","response","get","headers","language","signal","status","json","error","aborted","abort","_err"],"mappings":"AAAA;AAGA,YAAYA,QAAQ,SAAQ;AAC5B,SAASC,SAAS,EAAEC,MAAM,EAAEC,QAAQ,QAAQ,QAAO;AAEnD,SAASC,SAAS,QAAQ,+BAA8B;AACxD,SAASC,cAAc,QAAQ,oCAAmC;AAClE,SAASC,QAAQ,QAAQ,sBAAqB;AAoB9C,OAAO,MAAMC,gBAA+B,CAACC,KAAKC,UAAU,CAAC,CAAC;IAC5D,MAAM,EAAEC,WAAW,EAAEC,gBAAgB,CAAC,CAAC,EAAE,GAAGF;IAE5C,MAAM,EAAEG,IAAI,EAAE,GAAGP;IACjB,MAAM,CAACQ,MAAMC,QAAQ,GAAGX,SAASO,eAAe,CAAC;IACjD,MAAM,CAACK,QAAQC,UAAU,GAAGb,SAASQ;IACrC,MAAM,CAACM,WAAWC,aAAa,GAAGf,SAAS,CAACO;IAC5C,MAAM,CAACS,SAASC,WAAW,GAAGjB,SAAS;IACvC,MAAM,EAAEkB,MAAMC,MAAM,EAAE,GAAGlB;IACzB,MAAMmB,iBAAiBrB,OAAO;IAE9B,MAAMsB,SAASxB,GAAGyB,SAAS,CACzB;QACEH;QACA,GAAI,OAAOP,WAAW,WAAWA,SAAS,CAAC,CAAC;IAC9C,GACA;QACEW,gBAAgB;IAClB;IAGF,8CAA8C;IAC9CzB,UAAU;QACR,IAAIS,eAAe,CAACa,eAAeI,OAAO,EAAE;YAC1CJ,eAAeI,OAAO,GAAG;YACzB;QACF;QAEA,MAAMC,kBAAkB,IAAIC;QAE5B,MAAMC,YAAY;YAChBV,WAAW;YACXF,aAAa;YAEb,IAAI;gBACF,MAAMa,WAAW,MAAMzB,SAAS0B,GAAG,CAAC,GAAGxB,MAAMgB,QAAQ,EAAE;oBACrDS,SAAS;wBACP,mBAAmBrB,KAAKsB,QAAQ;oBAClC;oBACAC,QAAQP,gBAAgBO,MAAM;gBAChC;gBAEA,IAAIJ,SAASK,MAAM,GAAG,KAAK;oBACzBhB,WAAW;gBACb;gBAEA,MAAMiB,OAAO,MAAMN,SAASM,IAAI;gBAEhCvB,QAAQuB;gBACRnB,aAAa;YACf,EAAE,OAAOoB,OAAO;gBACd,IAAI,CAACV,gBAAgBO,MAAM,CAACI,OAAO,EAAE;oBACnCnB,WAAW;oBACXF,aAAa;gBACf;YACF;QACF;QAEA,IAAIV,KAAK;YACP,KAAKsB;QACP,OAAO;YACLV,WAAW;YACXF,aAAa;QACf;QAEA,OAAO;YACL,IAAI;gBACFU,gBAAgBY,KAAK;YACvB,EAAE,OAAOC,MAAM
|
|
1
|
+
{"version":3,"sources":["../../src/hooks/usePayloadAPI.ts"],"sourcesContent":["'use client'\nimport type React from 'react'\n\nimport * as qs from 'qs-esm'\nimport { useEffect, useRef, useState } from 'react'\n\nimport { useLocale } from '../providers/Locale/index.js'\nimport { useTranslation } from '../providers/Translation/index.js'\nimport { requests } from '../utilities/api.js'\n\ntype Result = [\n {\n data: any\n isError: boolean\n isLoading: boolean\n },\n {\n setParams: React.Dispatch<unknown>\n },\n]\n\ntype Options = {\n initialData?: any\n initialParams?: unknown\n}\n\ntype UsePayloadAPI = (url: string, options?: Options) => Result\n\nexport const usePayloadAPI: UsePayloadAPI = (url, options = {}) => {\n const { initialData, initialParams = {} } = options\n\n const { i18n } = useTranslation()\n const [data, setData] = useState(initialData || {})\n const [params, setParams] = useState(initialParams)\n const [isLoading, setIsLoading] = useState(!initialData)\n const [isError, setIsError] = useState(false)\n const { code: locale } = useLocale()\n const hasInitialized = useRef(false)\n\n const search = qs.stringify(\n {\n locale,\n ...(typeof params === 'object' ? params : {}),\n },\n {\n addQueryPrefix: true,\n },\n )\n\n // If `initialData`, no need to make a request\n useEffect(() => {\n if (initialData && !hasInitialized.current) {\n hasInitialized.current = true\n return\n }\n\n const abortController = new AbortController()\n\n const fetchData = async () => {\n setIsError(false)\n setIsLoading(true)\n\n try {\n const response = await requests.get(`${url}${search}`, {\n headers: {\n 'Accept-Language': i18n.language,\n },\n signal: abortController.signal,\n })\n\n if (response.status > 201) {\n setIsError(true)\n }\n\n const json = await response.json()\n\n setData(json)\n setIsLoading(false)\n } catch (error) {\n if (!abortController.signal.aborted) {\n setIsError(true)\n setIsLoading(false)\n }\n }\n }\n\n if (url) {\n void fetchData()\n } else {\n setIsError(false)\n setIsLoading(false)\n }\n\n return () => {\n try {\n abortController.abort()\n } catch (_err) {\n // swallow error\n }\n }\n }, [url, locale, search, i18n.language, initialData])\n\n // If `initialData` changes, reset the state\n useEffect(() => {\n if (initialData && hasInitialized.current) {\n setData(initialData)\n }\n }, [initialData])\n\n return [{ data, isError, isLoading }, { setParams }]\n}\n"],"names":["qs","useEffect","useRef","useState","useLocale","useTranslation","requests","usePayloadAPI","url","options","initialData","initialParams","i18n","data","setData","params","setParams","isLoading","setIsLoading","isError","setIsError","code","locale","hasInitialized","search","stringify","addQueryPrefix","current","abortController","AbortController","fetchData","response","get","headers","language","signal","status","json","error","aborted","abort","_err"],"mappings":"AAAA;AAGA,YAAYA,QAAQ,SAAQ;AAC5B,SAASC,SAAS,EAAEC,MAAM,EAAEC,QAAQ,QAAQ,QAAO;AAEnD,SAASC,SAAS,QAAQ,+BAA8B;AACxD,SAASC,cAAc,QAAQ,oCAAmC;AAClE,SAASC,QAAQ,QAAQ,sBAAqB;AAoB9C,OAAO,MAAMC,gBAA+B,CAACC,KAAKC,UAAU,CAAC,CAAC;IAC5D,MAAM,EAAEC,WAAW,EAAEC,gBAAgB,CAAC,CAAC,EAAE,GAAGF;IAE5C,MAAM,EAAEG,IAAI,EAAE,GAAGP;IACjB,MAAM,CAACQ,MAAMC,QAAQ,GAAGX,SAASO,eAAe,CAAC;IACjD,MAAM,CAACK,QAAQC,UAAU,GAAGb,SAASQ;IACrC,MAAM,CAACM,WAAWC,aAAa,GAAGf,SAAS,CAACO;IAC5C,MAAM,CAACS,SAASC,WAAW,GAAGjB,SAAS;IACvC,MAAM,EAAEkB,MAAMC,MAAM,EAAE,GAAGlB;IACzB,MAAMmB,iBAAiBrB,OAAO;IAE9B,MAAMsB,SAASxB,GAAGyB,SAAS,CACzB;QACEH;QACA,GAAI,OAAOP,WAAW,WAAWA,SAAS,CAAC,CAAC;IAC9C,GACA;QACEW,gBAAgB;IAClB;IAGF,8CAA8C;IAC9CzB,UAAU;QACR,IAAIS,eAAe,CAACa,eAAeI,OAAO,EAAE;YAC1CJ,eAAeI,OAAO,GAAG;YACzB;QACF;QAEA,MAAMC,kBAAkB,IAAIC;QAE5B,MAAMC,YAAY;YAChBV,WAAW;YACXF,aAAa;YAEb,IAAI;gBACF,MAAMa,WAAW,MAAMzB,SAAS0B,GAAG,CAAC,GAAGxB,MAAMgB,QAAQ,EAAE;oBACrDS,SAAS;wBACP,mBAAmBrB,KAAKsB,QAAQ;oBAClC;oBACAC,QAAQP,gBAAgBO,MAAM;gBAChC;gBAEA,IAAIJ,SAASK,MAAM,GAAG,KAAK;oBACzBhB,WAAW;gBACb;gBAEA,MAAMiB,OAAO,MAAMN,SAASM,IAAI;gBAEhCvB,QAAQuB;gBACRnB,aAAa;YACf,EAAE,OAAOoB,OAAO;gBACd,IAAI,CAACV,gBAAgBO,MAAM,CAACI,OAAO,EAAE;oBACnCnB,WAAW;oBACXF,aAAa;gBACf;YACF;QACF;QAEA,IAAIV,KAAK;YACP,KAAKsB;QACP,OAAO;YACLV,WAAW;YACXF,aAAa;QACf;QAEA,OAAO;YACL,IAAI;gBACFU,gBAAgBY,KAAK;YACvB,EAAE,OAAOC,MAAM,CAEf;QACF;IACF,GAHM,gBAAgB;IAGnB;QAACjC;QAAKc;QAAQE;QAAQZ,KAAKsB,QAAQ;QAAExB;KAAY;IAEpD,4CAA4C;IAC5CT,UAAU;QACR,IAAIS,eAAea,eAAeI,OAAO,EAAE;YACzCb,QAAQJ;QACV;IACF,GAAG;QAACA;KAAY;IAEhB,OAAO;QAAC;YAAEG;YAAMM;YAASF;QAAU;QAAG;YAAED;QAAU;KAAE;AACtD,EAAC"}
|
|
@@ -61,8 +61,8 @@ export const usePopupWindow = (props)=>{
|
|
|
61
61
|
}
|
|
62
62
|
strCopy += `${key}=${value},`;
|
|
63
63
|
return strCopy;
|
|
64
|
-
}, '').slice(0, -1)
|
|
65
|
-
|
|
64
|
+
}, '').slice(0, -1);
|
|
65
|
+
// remove last ',' (comma)
|
|
66
66
|
const newWindow = window.open(url, '_blank', popupOptions);
|
|
67
67
|
popupRef.current = newWindow;
|
|
68
68
|
setIsOpen(true);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/hooks/usePopupWindow.ts"],"sourcesContent":["'use client'\nimport type React from 'react'\n\nimport { useCallback, useEffect, useRef, useState } from 'react'\n\nimport { useConfig } from '../providers/Config/index.js'\n\nexport interface PopupMessage {\n searchParams: {\n [key: string]: string | undefined\n code: string\n installation_id: string\n state: string\n }\n type: string\n}\n\nexport const usePopupWindow = (props: {\n eventType?: string\n\n onMessage?: (searchParams: PopupMessage['searchParams']) => Promise<void>\n url: string\n}): {\n isPopupOpen: boolean\n openPopupWindow: () => void\n popupRef?: React.RefObject<null | Window>\n} => {\n const { eventType, onMessage, url } = props\n const isReceivingMessage = useRef(false)\n const [isOpen, setIsOpen] = useState(false)\n\n const {\n config: { serverURL },\n } = useConfig()\n\n const popupRef = useRef<null | Window>(null)\n\n // Optionally broadcast messages back out to the parent component\n useEffect(() => {\n const receiveMessage = async (event: MessageEvent): Promise<void> => {\n if (\n event.origin !== window.location.origin ||\n event.origin !== url ||\n event.origin !== serverURL\n ) {\n // console.warn(`Message received by ${event.origin}; IGNORED.`) // eslint-disable-line no-console\n return\n }\n\n if (\n typeof onMessage === 'function' &&\n event.data?.type === eventType &&\n !isReceivingMessage.current\n ) {\n isReceivingMessage.current = true\n await onMessage(event.data?.searchParams)\n isReceivingMessage.current = false\n }\n }\n\n if (isOpen && popupRef.current) {\n window.addEventListener('message', receiveMessage, false)\n }\n\n return () => {\n window.removeEventListener('message', receiveMessage)\n }\n }, [onMessage, eventType, url, serverURL, isOpen])\n\n // Customize the size, position, and style of the popup window\n const openPopupWindow = useCallback(\n (e?: MouseEvent) => {\n if (e) {\n e.preventDefault()\n }\n\n const features = {\n height: 700,\n left: 'auto',\n menubar: 'no',\n popup: 'yes',\n toolbar: 'no',\n top: 'auto',\n width: 800,\n }\n\n const popupOptions = Object.entries(features)\n .reduce((str, [key, value]) => {\n let strCopy = str\n if (value === 'auto') {\n if (key === 'top') {\n const v = Math.round(window.innerHeight / 2 - features.height / 2)\n strCopy += `top=${v},`\n } else if (key === 'left') {\n const v = Math.round(window.innerWidth / 2 - features.width / 2)\n strCopy += `left=${v},`\n }\n return strCopy\n }\n\n strCopy += `${key}=${value},`\n return strCopy\n }, '')\n .slice(0, -1) // remove last ',' (comma)\n\n const newWindow = window.open(url, '_blank', popupOptions)\n\n popupRef.current = newWindow\n\n setIsOpen(true)\n },\n [url],\n )\n\n // this is the most stable and widely supported way to check if a popup window is no longer open\n // we poll its ref every x ms and use the popup window's `closed` property\n useEffect(() => {\n let timer: NodeJS.Timeout\n\n if (isOpen) {\n timer = setInterval(function () {\n if (popupRef.current.closed) {\n clearInterval(timer)\n setIsOpen(false)\n }\n }, 1000)\n } else {\n clearInterval(timer)\n }\n\n return () => {\n if (timer) {\n clearInterval(timer)\n }\n }\n }, [isOpen, popupRef])\n\n return {\n isPopupOpen: isOpen,\n openPopupWindow,\n popupRef,\n }\n}\n"],"names":["useCallback","useEffect","useRef","useState","useConfig","usePopupWindow","props","eventType","onMessage","url","isReceivingMessage","isOpen","setIsOpen","config","serverURL","popupRef","receiveMessage","event","origin","window","location","data","type","current","searchParams","addEventListener","removeEventListener","openPopupWindow","e","preventDefault","features","height","left","menubar","popup","toolbar","top","width","popupOptions","Object","entries","reduce","str","key","value","strCopy","v","Math","round","innerHeight","innerWidth","slice","newWindow","open","timer","setInterval","closed","clearInterval","isPopupOpen"],"mappings":"AAAA;AAGA,SAASA,WAAW,EAAEC,SAAS,EAAEC,MAAM,EAAEC,QAAQ,QAAQ,QAAO;AAEhE,SAASC,SAAS,QAAQ,+BAA8B;AAYxD,OAAO,MAAMC,iBAAiB,CAACC;IAU7B,MAAM,EAAEC,SAAS,EAAEC,SAAS,EAAEC,GAAG,EAAE,GAAGH;IACtC,MAAMI,qBAAqBR,OAAO;IAClC,MAAM,CAACS,QAAQC,UAAU,GAAGT,SAAS;IAErC,MAAM,EACJU,QAAQ,EAAEC,SAAS,EAAE,EACtB,GAAGV;IAEJ,MAAMW,WAAWb,OAAsB;IAEvC,iEAAiE;IACjED,UAAU;QACR,MAAMe,iBAAiB,OAAOC;YAC5B,IACEA,MAAMC,MAAM,KAAKC,OAAOC,QAAQ,CAACF,MAAM,IACvCD,MAAMC,MAAM,KAAKT,OACjBQ,MAAMC,MAAM,KAAKJ,WACjB;gBACA,kGAAkG;gBAClG;YACF;YAEA,IACE,OAAON,cAAc,cACrBS,MAAMI,IAAI,EAAEC,SAASf,aACrB,CAACG,mBAAmBa,OAAO,EAC3B;gBACAb,mBAAmBa,OAAO,GAAG;gBAC7B,MAAMf,UAAUS,MAAMI,IAAI,EAAEG;gBAC5Bd,mBAAmBa,OAAO,GAAG;YAC/B;QACF;QAEA,IAAIZ,UAAUI,SAASQ,OAAO,EAAE;YAC9BJ,OAAOM,gBAAgB,CAAC,WAAWT,gBAAgB;QACrD;QAEA,OAAO;YACLG,OAAOO,mBAAmB,CAAC,WAAWV;QACxC;IACF,GAAG;QAACR;QAAWD;QAAWE;QAAKK;QAAWH;KAAO;IAEjD,8DAA8D;IAC9D,MAAMgB,kBAAkB3B,YACtB,CAAC4B;QACC,IAAIA,GAAG;YACLA,EAAEC,cAAc;QAClB;QAEA,MAAMC,WAAW;YACfC,QAAQ;YACRC,MAAM;YACNC,SAAS;YACTC,OAAO;YACPC,SAAS;YACTC,KAAK;YACLC,OAAO;QACT;QAEA,MAAMC,eAAeC,OAAOC,OAAO,CAACV,UACjCW,MAAM,CAAC,CAACC,KAAK,CAACC,KAAKC,MAAM;YACxB,IAAIC,UAAUH;YACd,IAAIE,UAAU,QAAQ;gBACpB,IAAID,QAAQ,OAAO;oBACjB,MAAMG,IAAIC,KAAKC,KAAK,CAAC7B,OAAO8B,WAAW,GAAG,IAAInB,SAASC,MAAM,GAAG;oBAChEc,WAAW,CAAC,IAAI,EAAEC,EAAE,CAAC,CAAC;gBACxB,OAAO,IAAIH,QAAQ,QAAQ;oBACzB,MAAMG,IAAIC,KAAKC,KAAK,CAAC7B,OAAO+B,UAAU,GAAG,IAAIpB,SAASO,KAAK,GAAG;oBAC9DQ,WAAW,CAAC,KAAK,EAAEC,EAAE,CAAC,CAAC;gBACzB;gBACA,OAAOD;YACT;YAEAA,WAAW,GAAGF,IAAI,CAAC,EAAEC,MAAM,CAAC,CAAC;YAC7B,OAAOC;QACT,GAAG,IACFM,KAAK,CAAC,GAAG,CAAC,
|
|
1
|
+
{"version":3,"sources":["../../src/hooks/usePopupWindow.ts"],"sourcesContent":["'use client'\nimport type React from 'react'\n\nimport { useCallback, useEffect, useRef, useState } from 'react'\n\nimport { useConfig } from '../providers/Config/index.js'\n\nexport interface PopupMessage {\n searchParams: {\n [key: string]: string | undefined\n code: string\n installation_id: string\n state: string\n }\n type: string\n}\n\nexport const usePopupWindow = (props: {\n eventType?: string\n\n onMessage?: (searchParams: PopupMessage['searchParams']) => Promise<void>\n url: string\n}): {\n isPopupOpen: boolean\n openPopupWindow: () => void\n popupRef?: React.RefObject<null | Window>\n} => {\n const { eventType, onMessage, url } = props\n const isReceivingMessage = useRef(false)\n const [isOpen, setIsOpen] = useState(false)\n\n const {\n config: { serverURL },\n } = useConfig()\n\n const popupRef = useRef<null | Window>(null)\n\n // Optionally broadcast messages back out to the parent component\n useEffect(() => {\n const receiveMessage = async (event: MessageEvent): Promise<void> => {\n if (\n event.origin !== window.location.origin ||\n event.origin !== url ||\n event.origin !== serverURL\n ) {\n // console.warn(`Message received by ${event.origin}; IGNORED.`) // eslint-disable-line no-console\n return\n }\n\n if (\n typeof onMessage === 'function' &&\n event.data?.type === eventType &&\n !isReceivingMessage.current\n ) {\n isReceivingMessage.current = true\n await onMessage(event.data?.searchParams)\n isReceivingMessage.current = false\n }\n }\n\n if (isOpen && popupRef.current) {\n window.addEventListener('message', receiveMessage, false)\n }\n\n return () => {\n window.removeEventListener('message', receiveMessage)\n }\n }, [onMessage, eventType, url, serverURL, isOpen])\n\n // Customize the size, position, and style of the popup window\n const openPopupWindow = useCallback(\n (e?: MouseEvent) => {\n if (e) {\n e.preventDefault()\n }\n\n const features = {\n height: 700,\n left: 'auto',\n menubar: 'no',\n popup: 'yes',\n toolbar: 'no',\n top: 'auto',\n width: 800,\n }\n\n const popupOptions = Object.entries(features)\n .reduce((str, [key, value]) => {\n let strCopy = str\n if (value === 'auto') {\n if (key === 'top') {\n const v = Math.round(window.innerHeight / 2 - features.height / 2)\n strCopy += `top=${v},`\n } else if (key === 'left') {\n const v = Math.round(window.innerWidth / 2 - features.width / 2)\n strCopy += `left=${v},`\n }\n return strCopy\n }\n\n strCopy += `${key}=${value},`\n return strCopy\n }, '')\n .slice(0, -1) // remove last ',' (comma)\n\n const newWindow = window.open(url, '_blank', popupOptions)\n\n popupRef.current = newWindow\n\n setIsOpen(true)\n },\n [url],\n )\n\n // this is the most stable and widely supported way to check if a popup window is no longer open\n // we poll its ref every x ms and use the popup window's `closed` property\n useEffect(() => {\n let timer: NodeJS.Timeout\n\n if (isOpen) {\n timer = setInterval(function () {\n if (popupRef.current.closed) {\n clearInterval(timer)\n setIsOpen(false)\n }\n }, 1000)\n } else {\n clearInterval(timer)\n }\n\n return () => {\n if (timer) {\n clearInterval(timer)\n }\n }\n }, [isOpen, popupRef])\n\n return {\n isPopupOpen: isOpen,\n openPopupWindow,\n popupRef,\n }\n}\n"],"names":["useCallback","useEffect","useRef","useState","useConfig","usePopupWindow","props","eventType","onMessage","url","isReceivingMessage","isOpen","setIsOpen","config","serverURL","popupRef","receiveMessage","event","origin","window","location","data","type","current","searchParams","addEventListener","removeEventListener","openPopupWindow","e","preventDefault","features","height","left","menubar","popup","toolbar","top","width","popupOptions","Object","entries","reduce","str","key","value","strCopy","v","Math","round","innerHeight","innerWidth","slice","newWindow","open","timer","setInterval","closed","clearInterval","isPopupOpen"],"mappings":"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"}
|
package/dist/hooks/useQueue.js
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
import { useCallback, useRef } from 'react';
|
|
2
2
|
/**
|
|
3
|
+
* A function that is called after the queue has processed a function
|
|
4
|
+
* Used to perform side effects after processing the queue
|
|
5
|
+
* @returns {void}
|
|
6
|
+
*/ /**
|
|
7
|
+
* A function that can be used to prevent the queue from processing under certain conditions
|
|
8
|
+
* Can also be used to perform side effects before processing the queue
|
|
9
|
+
* @returns {boolean} If `false`, the queue will not process
|
|
10
|
+
*/ /**
|
|
3
11
|
* A React hook that allows you to queue up functions to be executed in order.
|
|
4
12
|
* This is useful when you need to ensure long running networks requests are processed sequentially.
|
|
5
13
|
* Builds up a "queue" of functions to be executed in order, only ever processing the last function in the queue.
|
|
@@ -31,17 +39,17 @@ import { useCallback, useRef } from 'react';
|
|
|
31
39
|
}
|
|
32
40
|
}
|
|
33
41
|
while(queue.current.length > 0){
|
|
34
|
-
const latestTask = queue.current.pop()
|
|
35
|
-
|
|
36
|
-
queue.current = []
|
|
37
|
-
|
|
42
|
+
const latestTask = queue.current.pop();
|
|
43
|
+
// Only process the last task in the queue
|
|
44
|
+
queue.current = [];
|
|
45
|
+
// Discard all other tasks
|
|
38
46
|
isProcessing.current = true;
|
|
39
47
|
try {
|
|
40
48
|
await latestTask();
|
|
41
49
|
} catch (err) {
|
|
42
|
-
console.error('Error in queued function:', err)
|
|
43
|
-
|
|
44
|
-
|
|
50
|
+
console.error('Error in queued function:', err);
|
|
51
|
+
} finally// eslint-disable-line no-console
|
|
52
|
+
{
|
|
45
53
|
isProcessing.current = false;
|
|
46
54
|
if (typeof options?.afterProcess === 'function') {
|
|
47
55
|
options.afterProcess();
|