feat: WIP tab compatible with traverseFields
This commit is contained in:
@@ -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(),
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user