Enhance API Server Context and Template Helpers with New Features
All checks were successful
farmcontrol/farmcontrol-ui/pipeline/head This commit looks good

- Added a new helper function 'renderDocumentTemplate' to the fcTemplateHelpers for improved document rendering capabilities.
- Introduced 'mapObjectFiltersForQuery' function to streamline filter mapping in API requests, enhancing code readability and maintainability.
- Updated API server context to utilize the new filter mapping function, improving data fetching logic and consistency in handling object filters.
- Refactored sorting parameters in API requests to use 'sortProperty' and 'sortOrder' for better clarity and alignment with naming conventions.
This commit is contained in:
Tom Butcher 2026-08-22 02:36:03 +01:00
parent c5b421533f
commit 6dcc5759f4
4 changed files with 31 additions and 42 deletions

View File

@ -105,5 +105,6 @@ export const fcTemplateElements = allTags.map((name) => {
export const fcTemplateHelpers = { export const fcTemplateHelpers = {
listObjects: async () => [], listObjects: async () => [],
getObject: async () => ({}), getObject: async () => ({}),
formatDate: () => '' formatDate: () => '',
renderDocumentTemplate: async () => ''
} }

View File

@ -76,6 +76,23 @@ const stableStringify = (value) => {
const getObjectTypeSubscriptionKey = (objectType, filter = {}) => const getObjectTypeSubscriptionKey = (objectType, filter = {}) =>
`${objectType}:${stableStringify(filter || {})}` `${objectType}:${stableStringify(filter || {})}`
const mapObjectFiltersForQuery = (filter = {}, type) => {
const newFilter = { ...filter }
if (filter == null || Object.keys(filter).length === 0) return newFilter
const model = getModelByName(type)
if (model.name === 'unknown') return newFilter
for (const key of Object.keys(filter)) {
const property = model?.properties?.find((p) => p.name === key)
if (property && property.type === 'object') {
newFilter[`${key}._id`] = filter[key]?._id ?? filter[key]
delete newFilter[key]
}
}
return newFilter
}
const getObjectTypeSubscriptionArgs = (filterOrCallback, callback) => { const getObjectTypeSubscriptionArgs = (filterOrCallback, callback) => {
if (typeof filterOrCallback === 'function') { if (typeof filterOrCallback === 'function') {
return { filter: {}, callback: filterOrCallback } return { filter: {}, callback: filterOrCallback }
@ -1112,22 +1129,7 @@ const ApiServerProvider = ({ children }) => {
onDataChange onDataChange
} = params } = params
let newFilter = { ...filter } const newFilter = mapObjectFiltersForQuery(filter, type)
if (filter != null && Object.keys(filter).length > 0) {
const model = getModelByName(type)
if (model.name !== 'unknown') {
for (const key of Object.keys(filter)) {
const property = model?.properties?.find((p) => p.name === key)
if (property && property.type === 'object') {
const value = filter[key]
newFilter[`${key}._id`] = value?._id ?? value
delete newFilter[key]
}
}
}
}
logger.debug('Fetching table data from:', type, { logger.debug('Fetching table data from:', type, {
page, page,
@ -1144,8 +1146,8 @@ const ApiServerProvider = ({ children }) => {
page, page,
limit, limit,
...newFilter, ...newFilter,
sort: sorter.field, sortProperty: sorter.field,
order: sorter.order sortOrder: sorter.order
}, },
headers: { headers: {
Accept: 'application/json', Accept: 'application/json',
@ -1182,22 +1184,7 @@ const ApiServerProvider = ({ children }) => {
const getObjectNeighbors = async (type, params = {}) => { const getObjectNeighbors = async (type, params = {}) => {
const { id, filter = {}, sorter = {} } = params const { id, filter = {}, sorter = {} } = params
let newFilter = { ...filter } const newFilter = mapObjectFiltersForQuery(filter, type)
if (filter != null && Object.keys(filter).length > 0) {
const model = getModelByName(type)
if (model.name !== 'unknown') {
for (const key of Object.keys(filter)) {
const property = model?.properties?.find((p) => p.name === key)
if (property && property.type === 'object') {
const value = filter[key]
newFilter[`${key}._id`] = value?._id ?? value
delete newFilter[key]
}
}
}
}
logger.debug('Fetching object neighbors from:', type, { logger.debug('Fetching object neighbors from:', type, {
id, id,
@ -1212,8 +1199,8 @@ const ApiServerProvider = ({ children }) => {
params: { params: {
id, id,
...newFilter, ...newFilter,
sort: sorter.field, sortProperty: sorter.field,
order: sorter.order sortOrder: sorter.order
}, },
headers: { headers: {
Accept: 'application/json', Accept: 'application/json',
@ -1588,8 +1575,8 @@ const ApiServerProvider = ({ children }) => {
const response = await axios.get(`${config.backendUrl}/notes`, { const response = await axios.get(`${config.backendUrl}/notes`, {
params: { params: {
parent: getModelByName(parentType).prefix + ':' + parentId, parent: getModelByName(parentType).prefix + ':' + parentId,
sort: 'createdAt', sortProperty: 'createdAt',
order: 'ascend' sortOrder: 'ascend'
}, },
headers: { headers: {
Accept: 'application/json', Accept: 'application/json',
@ -2122,7 +2109,7 @@ const ApiServerProvider = ({ children }) => {
const fetchNotificationsApi = useCallback(async () => { const fetchNotificationsApi = useCallback(async () => {
const response = await axios.get(`${config.backendUrl}/notifications`, { const response = await axios.get(`${config.backendUrl}/notifications`, {
params: { limit: 100, sort: 'createdAt', order: 'descend' }, params: { limit: 100, sortProperty: 'createdAt', sortOrder: 'descend' },
headers: { headers: {
Accept: 'application/json', Accept: 'application/json',
Authorization: `Bearer ${token}` Authorization: `Bearer ${token}`

View File

@ -43,8 +43,8 @@ export const useTableData = ({
page: pageNum, page: pageNum,
limit: pageSize, limit: pageSize,
...filters, ...filters,
sort: sorter.field, sortProperty: sorter.field,
order: sorter.order sortOrder: sorter.order
}, },
headers: { headers: {
Accept: 'application/json' Accept: 'application/json'

View File

@ -189,6 +189,7 @@ export const Invoice = {
'_reference', '_reference',
'state', 'state',
'orderType', 'orderType',
'order',
'to', 'to',
'from', 'from',
'invoiceDate', 'invoiceDate',