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'];