Files
medusa-store/packages/admin/dashboard/src/lib/table/field-utils.ts
Sebastian Rindom 23d5a902b1 feat(dashboard): reusable config datatable (#13389)
* feat: add a reusable configurable data table

* fix: cleanup

* fix: cleanup

* fix: cache invalidation

* fix: test

---------

Co-authored-by: Oli Juhl <59018053+olivermrbl@users.noreply.github.com>
2025-09-15 10:59:00 +02:00

75 lines
2.6 KiB
TypeScript

import { HttpTypes } from "@medusajs/types"
import { getEntityDefaultFields } from "./entity-defaults"
/**
* Calculates the required fields based on visible columns and entity defaults
*/
export function calculateRequiredFields(
entity: string,
apiColumns: HttpTypes.AdminViewColumn[] | undefined,
visibleColumns: Record<string, boolean>
): string {
// Get entity-specific default fields
const defaults = getEntityDefaultFields(entity)
const defaultFields = defaults.formatted
if (!apiColumns?.length) {
return defaultFields
}
// Get all visible columns
const visibleColumnObjects = apiColumns.filter(column => {
// If visibleColumns has data, use it; otherwise use default_visible
if (Object.keys(visibleColumns).length > 0) {
return visibleColumns[column.field] === true
}
return column.default_visible
})
// Collect all required fields from visible columns
const requiredFieldsSet = new Set<string>()
visibleColumnObjects.forEach(column => {
if (column.computed) {
// For computed columns, add all required and optional fields
column.computed.required_fields?.forEach((field: string) => requiredFieldsSet.add(field))
column.computed.optional_fields?.forEach((field: string) => requiredFieldsSet.add(field))
} else if (!column.field.includes('.')) {
// Direct field
requiredFieldsSet.add(column.field)
} else {
// Relationship field
requiredFieldsSet.add(column.field)
}
})
// Separate relationship fields from direct fields
const allRequiredFields = Array.from(requiredFieldsSet)
const visibleRelationshipFields = allRequiredFields.filter(field => field.includes('.'))
const visibleDirectFields = allRequiredFields.filter(field => !field.includes('.'))
// Check which relationship fields need to be added
const additionalRelationshipFields = visibleRelationshipFields.filter(field => {
const [relationName] = field.split('.')
const isAlreadyCovered = defaults.relations.some(rel =>
rel === `*${relationName}` || rel === relationName
)
return !isAlreadyCovered
})
// Check which direct fields need to be added
const additionalDirectFields = visibleDirectFields.filter(field => {
const isAlreadyIncluded = defaults.properties.includes(field)
return !isAlreadyIncluded
})
// Combine all additional fields
const additionalFields = [...additionalRelationshipFields, ...additionalDirectFields]
// Combine default fields with additional needed fields
if (additionalFields.length > 0) {
return `${defaultFields},${additionalFields.join(',')}`
}
return defaultFields
}