From c31de5ac1b43e4b52f85ab892b450de43ce2c7ad Mon Sep 17 00:00:00 2001 From: Artem Niehrieiev Date: Thu, 18 Sep 2025 12:40:02 +0000 Subject: [PATCH 1/2] refactor: simplify available fields logic in BasicDataAccessObject --- .../basic-data-access-object.ts | 25 +++++++++---------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/shared-code/src/data-access-layer/data-access-objects/basic-data-access-object.ts b/shared-code/src/data-access-layer/data-access-objects/basic-data-access-object.ts index 389fdf699..8452018d8 100644 --- a/shared-code/src/data-access-layer/data-access-objects/basic-data-access-object.ts +++ b/shared-code/src/data-access-layer/data-access-objects/basic-data-access-object.ts @@ -1,10 +1,9 @@ -import { KnexManager } from '../../knex-manager/knex-manager.js'; -import { ConnectionParams } from '../shared/data-structures/connections-params.ds.js'; import { Knex } from 'knex'; import { isObjectEmpty } from '../../helpers/is-object-empty.js'; -import { comparePrimitiveArrayElements } from '../../helpers/compate-primitive-array-elements.js'; -import { TableStructureDS } from '../shared/data-structures/table-structure.ds.js'; +import { KnexManager } from '../../knex-manager/knex-manager.js'; +import { ConnectionParams } from '../shared/data-structures/connections-params.ds.js'; import { TableSettingsDS } from '../shared/data-structures/table-settings.ds.js'; +import { TableStructureDS } from '../shared/data-structures/table-structure.ds.js'; export class BasicDataAccessObject { protected connection: ConnectionParams; @@ -32,15 +31,15 @@ export class BasicDataAccessObject { const excludedFields = settings.excluded_fields; if (settings.list_fields && settings.list_fields.length > 0) { - if (!comparePrimitiveArrayElements(settings.list_fields, fieldsFromStructure)) { - availableFields = [...settings.list_fields, ...fieldsFromStructure]; - availableFields = [...new Set(availableFields)]; - availableFields = availableFields.filter((fieldName) => { - return fieldsFromStructure.includes(fieldName); - }); - } else { - availableFields = settings.list_fields; - } + const validListFields = settings.list_fields.filter((fieldName) => { + return fieldsFromStructure.includes(fieldName); + }); + + const additionalFields = fieldsFromStructure.filter((fieldName) => { + return !settings.list_fields.includes(fieldName); + }); + + availableFields = [...validListFields, ...additionalFields]; } else { availableFields = tableStructure.map((el) => { return el.column_name; From 726a989ce0c88abc570e1737b67d9d36520bbf0e Mon Sep 17 00:00:00 2001 From: Artem Niehrieiev Date: Thu, 18 Sep 2025 13:44:29 +0000 Subject: [PATCH 2/2] feat: implement findAvailableFields utility for dynamic field selection --- .../use-cases/get-table-rows.use.case.ts | 3 +- .../utils/find-available-fields.utils.ts | 43 +++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 backend/src/entities/table/utils/find-available-fields.utils.ts diff --git a/backend/src/entities/table/use-cases/get-table-rows.use.case.ts b/backend/src/entities/table/use-cases/get-table-rows.use.case.ts index 31109b233..d4b675570 100644 --- a/backend/src/entities/table/use-cases/get-table-rows.use.case.ts +++ b/backend/src/entities/table/use-cases/get-table-rows.use.case.ts @@ -40,6 +40,7 @@ import { isHexString } from '../utils/is-hex-string.js'; import { processRowsUtil } from '../utils/process-found-rows-util.js'; import { IGetTableRows } from './table-use-cases.interface.js'; import { ConnectionTypesEnum } from '@rocketadmin/shared-code/dist/src/data-access-layer/shared/enums/connection-types-enum.js'; +import { findAvailableFields } from '../utils/find-available-fields.utils.js'; @Injectable() export class GetTableRowsUseCase extends AbstractUseCase implements IGetTableRows { @@ -237,7 +238,7 @@ export class GetTableRowsUseCase extends AbstractUseCase 0 ? tableSettings.list_fields : [], + list_fields: findAvailableFields(tableSettings, tableStructure), action_events: customActionEvents.map((el) => buildActionEventDto(el)), table_actions: customActionEvents.map((el) => buildActionEventDto(el)), large_dataset: largeDataset, diff --git a/backend/src/entities/table/utils/find-available-fields.utils.ts b/backend/src/entities/table/utils/find-available-fields.utils.ts new file mode 100644 index 000000000..525e7cba6 --- /dev/null +++ b/backend/src/entities/table/utils/find-available-fields.utils.ts @@ -0,0 +1,43 @@ +import { TableSettingsDS } from '@rocketadmin/shared-code/dist/src/data-access-layer/shared/data-structures/table-settings.ds.js'; +import { TableStructureDS } from '@rocketadmin/shared-code/dist/src/data-access-layer/shared/data-structures/table-structure.ds.js'; +import { isObjectEmpty } from '../../../helpers/is-object-empty.js'; + +export function findAvailableFields(settings: TableSettingsDS, tableStructure: Array): Array { + let availableFields: Array = []; + const fieldsFromStructure = tableStructure.map((el) => { + return el.column_name; + }); + + if (isObjectEmpty(settings)) { + availableFields = tableStructure.map((el) => { + return el.column_name; + }); + return availableFields; + } + const excludedFields = settings.excluded_fields; + + if (settings.list_fields && settings.list_fields.length > 0) { + const validListFields = settings.list_fields.filter((fieldName) => { + return fieldsFromStructure.includes(fieldName); + }); + + const additionalFields = fieldsFromStructure.filter((fieldName) => { + return !settings.list_fields.includes(fieldName); + }); + + availableFields = [...validListFields, ...additionalFields]; + } else { + availableFields = tableStructure.map((el) => { + return el.column_name; + }); + } + if (excludedFields && excludedFields.length > 0) { + for (const field of excludedFields) { + const delIndex = availableFields.indexOf(field); + if (delIndex >= 0) { + availableFields.splice(availableFields.indexOf(field), 1); + } + } + } + return availableFields; +}