Some checks failed
Build & Deploy / 🔍 Prepare (push) Successful in 20s
Build & Deploy / 🧪 QA (push) Failing after 34s
Build & Deploy / 🏗️ Build (push) Has started running
Build & Deploy / 🚀 Deploy (push) Has been cancelled
Build & Deploy / 🧪 Smoke Test (push) Has been cancelled
Build & Deploy / ⚡ Lighthouse (push) Has been cancelled
Build & Deploy / 🔔 Notify (push) Has been cancelled
182 lines
4.9 KiB
Plaintext
182 lines
4.9 KiB
Plaintext
import { APIError, canAccessAdmin, formatErrors } from 'payload';
|
|
import { applyLocaleFiltering, isNumber } from 'payload/shared';
|
|
import { getClientConfig } from './getClientConfig.js';
|
|
import { getColumns } from './getColumns.js';
|
|
import { renderFilters, renderTable } from './renderTable.js';
|
|
import { upsertPreferences } from './upsertPreferences.js';
|
|
export const buildTableStateHandler = async args => {
|
|
const {
|
|
req
|
|
} = args;
|
|
try {
|
|
const res = await buildTableState(args);
|
|
return res;
|
|
} catch (err) {
|
|
req.payload.logger.error({
|
|
err,
|
|
msg: `There was an error building form state`
|
|
});
|
|
if (err.message === 'Could not find field schema for given path') {
|
|
return {
|
|
message: err.message
|
|
};
|
|
}
|
|
if (err.message === 'Unauthorized') {
|
|
return null;
|
|
}
|
|
return formatErrors(err);
|
|
}
|
|
};
|
|
const buildTableState = async args => {
|
|
const {
|
|
collectionSlug,
|
|
columns: columnsFromArgs,
|
|
data: dataFromArgs,
|
|
enableRowSelections,
|
|
orderableFieldName,
|
|
parent,
|
|
permissions,
|
|
query,
|
|
renderRowTypes,
|
|
req,
|
|
req: {
|
|
i18n,
|
|
payload,
|
|
payload: {
|
|
config
|
|
},
|
|
user
|
|
},
|
|
tableAppearance
|
|
} = args;
|
|
await canAccessAdmin({
|
|
req
|
|
});
|
|
const clientConfig = getClientConfig({
|
|
config,
|
|
i18n,
|
|
importMap: payload.importMap,
|
|
user
|
|
});
|
|
await applyLocaleFiltering({
|
|
clientConfig,
|
|
config,
|
|
req
|
|
});
|
|
let collectionConfig;
|
|
let clientCollectionConfig;
|
|
if (!Array.isArray(collectionSlug)) {
|
|
if (req.payload.collections[collectionSlug]) {
|
|
collectionConfig = req.payload.collections[collectionSlug].config;
|
|
clientCollectionConfig = clientConfig.collections.find(collection => collection.slug === collectionSlug);
|
|
}
|
|
}
|
|
const collectionPreferences = await upsertPreferences({
|
|
key: Array.isArray(collectionSlug) ? `${parent.collectionSlug}-${parent.joinPath}` : `collection-${collectionSlug}`,
|
|
req,
|
|
value: {
|
|
columns: columnsFromArgs,
|
|
limit: isNumber(query?.limit) ? Number(query.limit) : undefined,
|
|
sort: query?.sort
|
|
}
|
|
});
|
|
let data = dataFromArgs;
|
|
// lookup docs, if desired, i.e. within `join` field which initialize with `depth: 0`
|
|
if (!data?.docs || query) {
|
|
if (Array.isArray(collectionSlug)) {
|
|
if (!parent) {
|
|
throw new APIError('Unexpected array of collectionSlug, parent must be provided');
|
|
}
|
|
const select = {};
|
|
let currentSelectRef = select;
|
|
const segments = parent.joinPath.split('.');
|
|
for (let i = 0; i < segments.length; i++) {
|
|
currentSelectRef[segments[i]] = i === segments.length - 1 ? true : {};
|
|
currentSelectRef = currentSelectRef[segments[i]];
|
|
}
|
|
const joinQuery = {
|
|
sort: query?.sort,
|
|
where: query?.where
|
|
};
|
|
if (query) {
|
|
if (!Number.isNaN(Number(query.limit))) {
|
|
joinQuery.limit = Number(query.limit);
|
|
}
|
|
if (!Number.isNaN(Number(query.page))) {
|
|
joinQuery.limit = Number(query.limit);
|
|
}
|
|
}
|
|
let parentDoc = await payload.findByID({
|
|
id: parent.id,
|
|
collection: parent.collectionSlug,
|
|
depth: 1,
|
|
joins: {
|
|
[parent.joinPath]: joinQuery
|
|
},
|
|
overrideAccess: false,
|
|
select,
|
|
user: req.user
|
|
});
|
|
for (let i = 0; i < segments.length; i++) {
|
|
if (i === segments.length - 1) {
|
|
data = parentDoc[segments[i]];
|
|
} else {
|
|
parentDoc = parentDoc[segments[i]];
|
|
}
|
|
}
|
|
} else {
|
|
data = await payload.find({
|
|
collection: collectionSlug,
|
|
depth: 0,
|
|
draft: true,
|
|
limit: query?.limit,
|
|
locale: req.locale,
|
|
overrideAccess: false,
|
|
page: query?.page,
|
|
sort: query?.sort,
|
|
user: req.user,
|
|
where: query?.where
|
|
});
|
|
}
|
|
}
|
|
const {
|
|
columnState,
|
|
Table
|
|
} = renderTable({
|
|
clientCollectionConfig,
|
|
clientConfig,
|
|
collectionConfig,
|
|
collections: Array.isArray(collectionSlug) ? collectionSlug : undefined,
|
|
columns: getColumns({
|
|
clientConfig,
|
|
collectionConfig: clientCollectionConfig,
|
|
collectionSlug,
|
|
columns: columnsFromArgs,
|
|
i18n: req.i18n,
|
|
permissions
|
|
}),
|
|
data,
|
|
enableRowSelections,
|
|
fieldPermissions: Array.isArray(collectionSlug) ? true : permissions.collections[collectionSlug].fields,
|
|
i18n: req.i18n,
|
|
orderableFieldName,
|
|
payload,
|
|
query,
|
|
renderRowTypes,
|
|
req,
|
|
tableAppearance,
|
|
useAsTitle: Array.isArray(collectionSlug) ? payload.collections[collectionSlug[0]]?.config?.admin?.useAsTitle : collectionConfig?.admin?.useAsTitle
|
|
});
|
|
let renderedFilters;
|
|
if (collectionConfig) {
|
|
renderedFilters = renderFilters(collectionConfig.fields, req.payload.importMap);
|
|
}
|
|
return {
|
|
data,
|
|
preferences: collectionPreferences,
|
|
renderedFilters,
|
|
state: columnState,
|
|
Table
|
|
};
|
|
};
|
|
//# sourceMappingURL=buildTableState.js.map |