feat: WIP tab compatible with traverseFields

This commit is contained in:
Dan Ribbens
2022-08-11 11:07:46 -04:00
parent 6a6a69190f
commit 2ae33b603a
9 changed files with 267 additions and 119 deletions

View File

@@ -181,7 +181,7 @@ export const collapsible = baseField.keys({
admin: baseAdminFields.default(),
});
const tab = joi.object({
const tab = baseField.keys({
name: joi.string().when('localized', { is: joi.exist(), then: joi.required() }),
localized: joi.boolean(),
label: joi.string().required(),

View File

@@ -181,18 +181,14 @@ export type CollapsibleField = Omit<FieldBase, 'name'> & {
export type TabsAdmin = Omit<Admin, 'description'>;
type BaseTab = {
type TabBase = {
fields: Field[]
description?: Description
}
type NamedTab = BaseTab & {
name: string
localized?: boolean
label?: string
}
export type NamedTab = TabBase & FieldBase
type UnnamedTab = BaseTab & {
export type UnnamedTab = TabBase & Omit<FieldBase, 'name'> & {
label: string
localized?: never
}
@@ -205,6 +201,10 @@ export type TabsField = Omit<FieldBase, 'admin' | 'name' | 'localized'> & {
admin?: TabsAdmin
}
type TabAsField = Tab & {
type: 'tab'
};
export type UIField = {
name: string
label?: string
@@ -363,6 +363,7 @@ export type Field =
| RowField
| CollapsibleField
| TabsField
| TabAsField
| UIField;
export type FieldAffectingData =
@@ -468,7 +469,7 @@ export function tabHasName(tab: Tab): tab is NamedTab {
return 'name' in tab;
}
export function fieldIsLocalized(field: Field): boolean {
export function fieldIsLocalized(field: Field | Tab): boolean {
return 'localized' in field && field.localized;
}

View File

@@ -1,6 +1,6 @@
/* eslint-disable no-param-reassign */
import { PayloadRequest } from '../../../express/types';
import { Field, fieldAffectsData } from '../../config/types';
import { Field, fieldAffectsData, tabHasName } from '../../config/types';
import { traverseFields } from './traverseFields';
type Args = {
@@ -125,20 +125,40 @@ export const promise = async ({
break;
}
case 'tabs': {
const promises = [];
field.tabs.forEach((tab) => {
promises.push(traverseFields({
data,
doc,
fields: tab.fields,
operation,
req,
siblingData: siblingData || {},
siblingDoc: { ...siblingDoc },
}));
case 'tab': {
let tabSiblingData;
let tabSiblingDoc;
if (tabHasName(field)) {
tabSiblingData = siblingData[field.name] || {};
tabSiblingDoc = siblingDoc[field.name];
} else {
tabSiblingData = siblingData || {};
tabSiblingDoc = { ...siblingDoc };
}
await traverseFields({
data,
doc,
fields: field.fields,
operation,
req,
siblingData: tabSiblingData,
siblingDoc: tabSiblingDoc,
});
break;
}
case 'tabs': {
await traverseFields({
data,
doc,
fields: field.tabs.map((tab) => ({ ...tab, type: 'tab' })),
operation,
req,
siblingData: siblingData || {},
siblingDoc: { ...siblingDoc },
});
await Promise.all(promises);
break;
}

View File

@@ -275,28 +275,45 @@ export const promise = async ({
break;
}
case 'tabs': {
field.tabs.forEach((tab) => {
let tabDoc = siblingDoc;
if (tabHasName(tab)) {
tabDoc = siblingDoc[tab.name] as Record<string, unknown>;
if (typeof siblingDoc[tab.name] !== 'object') tabDoc = {};
}
case 'tab': {
let tabDoc = siblingDoc;
if (tabHasName(field)) {
tabDoc = siblingDoc[field.name] as Record<string, unknown>;
if (typeof siblingDoc[field.name] !== 'object') tabDoc = {};
}
traverseFields({
currentDepth,
depth,
doc,
fieldPromises,
fields: tab.fields,
findMany,
flattenLocales,
overrideAccess,
populationPromises,
req,
siblingDoc: tabDoc,
showHiddenFields,
});
await traverseFields({
currentDepth,
depth,
doc,
fieldPromises,
fields: field.fields,
findMany,
flattenLocales,
overrideAccess,
populationPromises,
req,
siblingDoc: tabDoc,
showHiddenFields,
});
break;
}
case 'tabs': {
traverseFields({
currentDepth,
depth,
doc,
fieldPromises,
fields: field.tabs.map((tab) => ({ ...tab, type: 'tab' })),
findMany,
flattenLocales,
overrideAccess,
populationPromises,
req,
siblingDoc,
showHiddenFields,
});
break;
}

View File

@@ -281,38 +281,55 @@ export const promise = async ({
break;
}
case 'tabs': {
const promises = [];
field.tabs.forEach((tab) => {
let tabPath = path;
let tabSiblingData = siblingData;
let tabSiblingDoc = siblingDoc;
let tabSiblingDocWithLocales = siblingDocWithLocales;
if (tabHasName(tab)) {
tabPath = `${path}${tab.name}.`;
tabSiblingData = typeof siblingData[tab.name] === 'object' ? siblingData[tab.name] as Record<string, unknown> : {};
tabSiblingDoc = typeof siblingDoc[tab.name] === 'object' ? siblingDoc[tab.name] as Record<string, unknown> : {};
tabSiblingDocWithLocales = typeof siblingDocWithLocales[tab.name] === 'object' ? siblingDocWithLocales[tab.name] as Record<string, unknown> : {};
}
promises.push(traverseFields({
data,
doc,
docWithLocales,
errors,
fields: tab.fields,
id,
mergeLocaleActions,
operation,
path: tabPath,
req,
siblingData: tabSiblingData,
siblingDoc: tabSiblingDoc,
siblingDocWithLocales: tabSiblingDocWithLocales,
skipValidation: skipValidationFromHere,
}));
case 'tab': {
let tabPath = path;
let tabSiblingData = siblingData;
let tabSiblingDoc = siblingDoc;
let tabSiblingDocWithLocales = siblingDocWithLocales;
if (tabHasName(field)) {
tabPath = `${path}${field.name}.`;
tabSiblingData = typeof siblingData[field.name] === 'object' ? siblingData[field.name] as Record<string, unknown> : {};
tabSiblingDoc = typeof siblingDoc[field.name] === 'object' ? siblingDoc[field.name] as Record<string, unknown> : {};
tabSiblingDocWithLocales = typeof siblingDocWithLocales[field.name] === 'object' ? siblingDocWithLocales[field.name] as Record<string, unknown> : {};
}
await traverseFields({
data,
doc,
docWithLocales,
errors,
fields: field.fields,
id,
mergeLocaleActions,
operation,
path: tabPath,
req,
siblingData: tabSiblingData,
siblingDoc: tabSiblingDoc,
siblingDocWithLocales: tabSiblingDocWithLocales,
skipValidation: skipValidationFromHere,
});
await Promise.all(promises);
break;
}
case 'tabs': {
await traverseFields({
data,
doc,
docWithLocales,
errors,
fields: field.tabs.map((tab) => ({ ...tab, type: 'tab' })),
id,
mergeLocaleActions,
operation,
path,
req,
siblingData,
siblingDoc,
siblingDocWithLocales,
skipValidation: skipValidationFromHere,
});
break;
}

View File

@@ -1,6 +1,6 @@
/* eslint-disable no-param-reassign */
import { PayloadRequest } from '../../../express/types';
import { Field, fieldAffectsData, valueIsValueWithRelation } from '../../config/types';
import { Field, fieldAffectsData, tabHasName, valueIsValueWithRelation } from '../../config/types';
import { traverseFields } from './traverseFields';
type Args = {
@@ -265,22 +265,44 @@ export const promise = async ({
break;
}
case 'tabs': {
const promises = [];
field.tabs.forEach((tab) => {
promises.push(traverseFields({
data,
doc,
fields: tab.fields,
id,
operation,
overrideAccess,
req,
siblingData,
siblingDoc,
}));
case 'tab': {
let tabSiblingData;
let tabSiblingDoc;
if (tabHasName(field)) {
tabSiblingData = typeof siblingData[field.name] === 'object' ? siblingData[field.name] : {};
tabSiblingDoc = typeof siblingDoc[field.name] === 'object' ? siblingDoc[field.name] : {};
} else {
tabSiblingData = siblingData;
tabSiblingDoc = siblingDoc;
}
await traverseFields({
data,
doc,
fields: field.fields,
id,
operation,
overrideAccess,
req,
siblingData: tabSiblingData,
siblingDoc: tabSiblingDoc,
});
break;
}
case 'tabs': {
await traverseFields({
data,
doc,
fields: field.tabs.map((tab) => ({ ...tab, type: 'tab' })),
id,
operation,
overrideAccess,
req,
siblingData,
siblingDoc,
});
await Promise.all(promises);
break;
}