chore: more consistently passes validation args

This commit is contained in:
James
2022-03-29 15:38:22 -04:00
parent e597b4c66b
commit f5191dc7c8
7 changed files with 42 additions and 26 deletions

View File

@@ -39,7 +39,6 @@ const buildStateFromSchema = async (args: Args): Promise<Fields> => {
const {
fieldSchema,
data: fullData = {},
siblingData = {},
user,
id,
operation,
@@ -48,7 +47,7 @@ const buildStateFromSchema = async (args: Args): Promise<Fields> => {
if (fieldSchema) {
const validationPromises = [];
const structureFieldState = (field, passesCondition, data = {}) => {
const structureFieldState = (field, passesCondition, data = {}, siblingData = {}) => {
const value = typeof data?.[field.name] !== 'undefined' ? data[field.name] : field.defaultValue;
const fieldState = {
@@ -156,7 +155,7 @@ const buildStateFromSchema = async (args: Args): Promise<Fields> => {
return {
...state,
[`${path}${field.name}`]: structureFieldState(field, passesCondition, data),
[`${path}${field.name}`]: structureFieldState(field, passesCondition, fullData, data),
};
}
@@ -173,7 +172,7 @@ const buildStateFromSchema = async (args: Args): Promise<Fields> => {
// Handle normal fields
return {
...state,
[`${path}${namedField.name}`]: structureFieldState(field, passesCondition, data),
[`${path}${namedField.name}`]: structureFieldState(field, passesCondition, fullData, data),
};
}

View File

@@ -1,6 +1,7 @@
import React, { useCallback, useEffect, useReducer, useState } from 'react';
import { DragDropContext, Droppable } from 'react-beautiful-dnd';
import { useAuth } from '@payloadcms/config-provider';
import withCondition from '../../withCondition';
import Button from '../../../elements/Button';
import DraggableSection from '../../DraggableSection';
@@ -14,6 +15,9 @@ import Banner from '../../../elements/Banner';
import FieldDescription from '../../FieldDescription';
import { Props } from './types';
import { useDocumentInfo } from '../../../utilities/DocumentInfo';
import { useOperation } from '../../../utilities/OperationProvider';
import './index.scss';
const baseClass = 'field-type array';
@@ -49,6 +53,9 @@ const ArrayFieldType: React.FC<Props> = (props) => {
const [rows, dispatchRows] = useReducer(reducer, []);
const formContext = useForm();
const { user } = useAuth();
const { id } = useDocumentInfo();
const operation = useOperation();
const { dispatchFields } = formContext;
@@ -74,11 +81,11 @@ const ArrayFieldType: React.FC<Props> = (props) => {
});
const addRow = useCallback(async (rowIndex) => {
const subFieldState = await buildStateFromSchema({ fieldSchema: fields });
const subFieldState = await buildStateFromSchema({ fieldSchema: fields, operation, id, user });
dispatchFields({ type: 'ADD_ROW', rowIndex, subFieldState, path });
dispatchRows({ type: 'ADD', rowIndex });
setValue(value as number + 1);
}, [dispatchRows, dispatchFields, fields, path, setValue, value]);
}, [dispatchRows, dispatchFields, fields, path, setValue, value, operation, id, user]);
const removeRow = useCallback((rowIndex) => {
dispatchRows({ type: 'REMOVE', rowIndex });

View File

@@ -1,6 +1,7 @@
import React, { useCallback, useEffect, useReducer, useState } from 'react';
import { DragDropContext, Droppable } from 'react-beautiful-dnd';
import { useAuth } from '@payloadcms/config-provider';
import { usePreferences } from '../../../utilities/Preferences';
import withCondition from '../../withCondition';
import Button from '../../../elements/Button';
@@ -18,6 +19,7 @@ import Banner from '../../../elements/Banner';
import FieldDescription from '../../FieldDescription';
import { Props } from './types';
import { DocumentPreferences } from '../../../../../preferences/types';
import { useOperation } from '../../../utilities/OperationProvider';
import './index.scss';
@@ -55,6 +57,9 @@ const Blocks: React.FC<Props> = (props) => {
const { getPreference, setPreference } = usePreferences();
const [rows, dispatchRows] = useReducer(reducer, []);
const formContext = useForm();
const { user } = useAuth();
const { id } = useDocumentInfo();
const operation = useOperation();
const { dispatchFields } = formContext;
const memoizedValidate = useCallback((value, options) => {
@@ -79,12 +84,12 @@ const Blocks: React.FC<Props> = (props) => {
const addRow = useCallback(async (rowIndex, blockType) => {
const block = blocks.find((potentialBlock) => potentialBlock.slug === blockType);
const subFieldState = await buildStateFromSchema({ fieldSchema: block.fields });
const subFieldState = await buildStateFromSchema({ fieldSchema: block.fields, operation, id, user });
dispatchFields({ type: 'ADD_ROW', rowIndex, subFieldState, path, blockType });
dispatchRows({ type: 'ADD', rowIndex, blockType });
setValue(value as number + 1);
}, [path, setValue, value, blocks, dispatchFields]);
}, [path, setValue, value, blocks, dispatchFields, operation, id, user]);
const removeRow = useCallback((rowIndex) => {
dispatchRows({ type: 'REMOVE', rowIndex });
@@ -97,8 +102,8 @@ const Blocks: React.FC<Props> = (props) => {
dispatchFields({ type: 'MOVE_ROW', moveFromIndex, moveToIndex, path });
}, [dispatchRows, dispatchFields, path]);
const setCollapse = useCallback(async (id: string, collapsed: boolean) => {
dispatchRows({ type: 'SET_COLLAPSE', id, collapsed });
const setCollapse = useCallback(async (rowID: string, collapsed: boolean) => {
dispatchRows({ type: 'SET_COLLAPSE', rowID, collapsed });
if (preferencesKey) {
const preferences: DocumentPreferences = await getPreference(preferencesKey);
@@ -108,9 +113,9 @@ const Blocks: React.FC<Props> = (props) => {
|| [];
if (!collapsed) {
newCollapsedState = newCollapsedState.filter((existingID) => existingID !== id);
newCollapsedState = newCollapsedState.filter((existingID) => existingID !== rowID);
} else {
newCollapsedState.push(id);
newCollapsedState.push(rowID);
}
setPreference(preferencesKey, {

View File

@@ -2,6 +2,7 @@ import React, { useCallback, useEffect, useState } from 'react';
import { Transforms, Element } from 'slate';
import { ReactEditor, useSlateStatic } from 'slate-react';
import { Modal } from '@faceless-ui/modal';
import { useAuth } from '@payloadcms/config-provider';
import { SanitizedCollectionConfig } from '../../../../../../../../../collections/config/types';
import buildStateFromSchema from '../../../../../../Form/buildStateFromSchema';
import MinimalTemplate from '../../../../../../../templates/Minimal';
@@ -29,6 +30,7 @@ type Props = {
export const EditModal: React.FC<Props> = ({ slug, closeModal, relatedCollectionConfig, fieldSchema, element }) => {
const editor = useSlateStatic();
const [initialState, setInitialState] = useState({});
const { user } = useAuth();
const handleUpdateEditData = useCallback((fields) => {
const newNode = {
@@ -47,12 +49,12 @@ export const EditModal: React.FC<Props> = ({ slug, closeModal, relatedCollection
useEffect(() => {
const awaitInitialState = async () => {
const state = await buildStateFromSchema({ fieldSchema, data: element?.fields });
const state = await buildStateFromSchema({ fieldSchema, data: element?.fields, user, operation: 'update' });
setInitialState(state);
};
awaitInitialState();
}, [fieldSchema, element.fields]);
}, [fieldSchema, element.fields, user]);
return (
<Modal

View File

@@ -9,6 +9,7 @@ import DefaultAccount from './Default';
import buildStateFromSchema from '../../forms/Form/buildStateFromSchema';
import RenderCustomComponent from '../../utilities/RenderCustomComponent';
import { NegativeFieldGutterProvider } from '../../forms/FieldTypeGutter/context';
import { useDocumentInfo } from '../../utilities/DocumentInfo';
const AccountView: React.FC = () => {
const { state: locationState } = useLocation<{ data: unknown }>();
@@ -16,6 +17,8 @@ const AccountView: React.FC = () => {
const { setStepNav } = useStepNav();
const { user, permissions } = useAuth();
const [initialState, setInitialState] = useState({});
const { id } = useDocumentInfo();
const {
serverURL,
routes: { api },
@@ -61,12 +64,12 @@ const AccountView: React.FC = () => {
useEffect(() => {
const awaitInitialState = async () => {
const state = await buildStateFromSchema({ fieldSchema: fields, data: dataToRender });
const state = await buildStateFromSchema({ fieldSchema: fields, data: dataToRender, operation: 'update', id, user });
setInitialState(state);
};
awaitInitialState();
}, [dataToRender, fields]);
}, [dataToRender, fields, id, user]);
return (
<NegativeFieldGutterProvider allow>

View File

@@ -17,7 +17,7 @@ const GlobalView: React.FC<IndexProps> = (props) => {
const { state: locationState } = useLocation<{data?: Record<string, unknown>}>();
const locale = useLocale();
const { setStepNav } = useStepNav();
const { permissions } = useAuth();
const { permissions, user } = useAuth();
const [initialState, setInitialState] = useState({});
const { getVersions } = useDocumentInfo();
@@ -45,9 +45,9 @@ const GlobalView: React.FC<IndexProps> = (props) => {
const onSave = useCallback(async (json) => {
getVersions();
const state = await buildStateFromSchema({ fieldSchema: fields, data: json.result });
const state = await buildStateFromSchema({ fieldSchema: fields, data: json.result, operation: 'update', user });
setInitialState(state);
}, [getVersions, fields]);
}, [getVersions, fields, user]);
const [{ data, isLoading }] = usePayloadAPI(
`${serverURL}${api}/globals/${slug}`,
@@ -66,12 +66,12 @@ const GlobalView: React.FC<IndexProps> = (props) => {
useEffect(() => {
const awaitInitialState = async () => {
const state = await buildStateFromSchema({ fieldSchema: fields, data: dataToRender });
const state = await buildStateFromSchema({ fieldSchema: fields, data: dataToRender, user, operation: 'update' });
setInitialState(state);
};
awaitInitialState();
}, [dataToRender, fields]);
}, [dataToRender, fields, user]);
const globalPermissions = permissions?.globals?.[slug];

View File

@@ -42,7 +42,7 @@ const EditView: React.FC<IndexProps> = (props) => {
const history = useHistory();
const { setStepNav } = useStepNav();
const [initialState, setInitialState] = useState({});
const { permissions } = useAuth();
const { permissions, user } = useAuth();
const { getVersions } = useDocumentInfo();
const onSave = useCallback(async (json: any) => {
@@ -50,10 +50,10 @@ const EditView: React.FC<IndexProps> = (props) => {
if (!isEditing) {
history.push(`${admin}/collections/${collection.slug}/${json?.doc?.id}`);
} else {
const state = await buildStateFromSchema({ fieldSchema: collection.fields, data: json.doc });
const state = await buildStateFromSchema({ fieldSchema: collection.fields, data: json.doc, user, id, operation: 'update' });
setInitialState(state);
}
}, [admin, collection, history, isEditing, getVersions]);
}, [admin, collection, history, isEditing, getVersions, user, id]);
const [{ data, isLoading, isError }] = usePayloadAPI(
(isEditing ? `${serverURL}${api}/${slug}/${id}` : null),
@@ -97,12 +97,12 @@ const EditView: React.FC<IndexProps> = (props) => {
useEffect(() => {
const awaitInitialState = async () => {
const state = await buildStateFromSchema({ fieldSchema: fields, data: dataToRender });
const state = await buildStateFromSchema({ fieldSchema: fields, data: dataToRender, user, operation: isEditing ? 'update' : 'create', id });
setInitialState(state);
};
awaitInitialState();
}, [dataToRender, fields]);
}, [dataToRender, fields, isEditing, id, user]);
if (isError) {
return (