From 86011cd8f255830add8d91edd6ecfde9083ca888 Mon Sep 17 00:00:00 2001 From: Petr Kachanovsky Date: Mon, 10 Mar 2025 12:00:37 +0200 Subject: [PATCH] fix: allow virtual columns to be grouped --- adminforth/index.ts | 29 --------------------------- adminforth/modules/configValidator.ts | 25 +++++++++++++++++++++++ 2 files changed, 25 insertions(+), 29 deletions(-) diff --git a/adminforth/index.ts b/adminforth/index.ts index ba151fda9..10982e54c 100644 --- a/adminforth/index.ts +++ b/adminforth/index.ts @@ -207,29 +207,6 @@ class AdminForth implements IAdminForth { return plugins[0] as T; } - validateFieldGroups(fieldGroups: { - groupName: string; - columns: string[]; - }[], fieldTypes: { - [key: string]: AdminForthResourceColumn; -}): void { - if (!fieldGroups) return; - const allColumns = Object.keys(fieldTypes); - - fieldGroups.forEach((group) => { - group.columns.forEach((col) => { - if (!allColumns.includes(col)) { - const similar = suggestIfTypo(allColumns, col); - throw new Error( - `Group '${group.groupName}' has an unknown column '${col}'. ${ - similar ? `Did you mean '${similar}'?` : '' - }` - ); - } - }); - }); - } - validateRecordValues(resource: AdminForthResource, record: any): any { // check if record with validation is valid for (const column of resource.columns.filter((col) => col.name in record && col.validation)) { @@ -341,12 +318,6 @@ class AdminForth implements IAdminForth { // first find discovered values, but allow override res.columns[i] = { ...fieldTypes[col.name], ...col }; }); - - this.validateFieldGroups(res.options.fieldGroups, fieldTypes); - this.validateFieldGroups(res.options.showFieldGroups, fieldTypes); - this.validateFieldGroups(res.options.createFieldGroups, fieldTypes); - this.validateFieldGroups(res.options.editFieldGroups, fieldTypes); - // check if primaryKey column is present if (!res.columns.some((col) => col.primaryKey)) { diff --git a/adminforth/modules/configValidator.ts b/adminforth/modules/configValidator.ts index 148180f5e..d635bcd2d 100644 --- a/adminforth/modules/configValidator.ts +++ b/adminforth/modules/configValidator.ts @@ -330,6 +330,25 @@ export default class ConfigValidator implements IConfigValidator { return showInTransformedToObject as ShowIn; } + validateFieldGroups(fieldGroups: { + groupName: string; + columns: string[]; + }[], resourceColumns: string[]): void { + if (!fieldGroups) return; + + fieldGroups.forEach((group) => { + group.columns.forEach((col) => { + if (!resourceColumns.includes(col)) { + const similar = suggestIfTypo(resourceColumns, col); + throw new Error( + `Group '${group.groupName}' has an unknown column '${col}'. ${similar ? `Did you mean '${similar}'?` : '' + }` + ); + } + }); + }); + } + validateAndNormalizeCustomActions(resInput: AdminForthResourceInput, res: Partial, errors: string[]): any[] { if (!resInput.options?.actions) { return []; @@ -671,6 +690,12 @@ export default class ConfigValidator implements IConfigValidator { options.bulkActions = this.validateAndNormalizeBulkActions(resInput, res, errors); options.actions = this.validateAndNormalizeCustomActions(resInput, res, errors); + const allColumnsList = res.columns.map((col) => col.name); + this.validateFieldGroups(options.fieldGroups, allColumnsList); + this.validateFieldGroups(options.showFieldGroups, allColumnsList); + this.validateFieldGroups(options.createFieldGroups, allColumnsList); + this.validateFieldGroups(options.editFieldGroups, allColumnsList); + // if pageInjection is a string, make array with one element. Also check file exists const possibleInjections = ['beforeBreadcrumbs', 'afterBreadcrumbs', 'bottom', 'threeDotsDropdownItems', 'customActionIcons']; const possiblePages = ['list', 'show', 'create', 'edit'];