From 6dcc5759f416f02d4e4bfc34508b4fa54b185427 Mon Sep 17 00:00:00 2001 From: Tom Butcher Date: Sat, 22 Aug 2026 02:36:03 +0100 Subject: [PATCH] Enhance API Server Context and Template Helpers with New Features - 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. --- src/codemirror/fcTemplateLang/schema.js | 3 +- .../Dashboard/context/ApiServerContext.jsx | 65 ++++++++----------- .../Dashboard/hooks/useTableData.jsx | 4 +- src/database/models/Invoice.js | 1 + 4 files changed, 31 insertions(+), 42 deletions(-) diff --git a/src/codemirror/fcTemplateLang/schema.js b/src/codemirror/fcTemplateLang/schema.js index 0a177ab0..5afb5be0 100644 --- a/src/codemirror/fcTemplateLang/schema.js +++ b/src/codemirror/fcTemplateLang/schema.js @@ -105,5 +105,6 @@ export const fcTemplateElements = allTags.map((name) => { export const fcTemplateHelpers = { listObjects: async () => [], getObject: async () => ({}), - formatDate: () => '' + formatDate: () => '', + renderDocumentTemplate: async () => '' } diff --git a/src/components/Dashboard/context/ApiServerContext.jsx b/src/components/Dashboard/context/ApiServerContext.jsx index f55c3c38..0538b2e6 100644 --- a/src/components/Dashboard/context/ApiServerContext.jsx +++ b/src/components/Dashboard/context/ApiServerContext.jsx @@ -76,6 +76,23 @@ const stableStringify = (value) => { const getObjectTypeSubscriptionKey = (objectType, 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) => { if (typeof filterOrCallback === 'function') { return { filter: {}, callback: filterOrCallback } @@ -1112,22 +1129,7 @@ const ApiServerProvider = ({ children }) => { onDataChange } = params - let newFilter = { ...filter } - - 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] - } - } - } - } + const newFilter = mapObjectFiltersForQuery(filter, type) logger.debug('Fetching table data from:', type, { page, @@ -1144,8 +1146,8 @@ const ApiServerProvider = ({ children }) => { page, limit, ...newFilter, - sort: sorter.field, - order: sorter.order + sortProperty: sorter.field, + sortOrder: sorter.order }, headers: { Accept: 'application/json', @@ -1182,22 +1184,7 @@ const ApiServerProvider = ({ children }) => { const getObjectNeighbors = async (type, params = {}) => { const { id, filter = {}, sorter = {} } = params - let newFilter = { ...filter } - - 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] - } - } - } - } + const newFilter = mapObjectFiltersForQuery(filter, type) logger.debug('Fetching object neighbors from:', type, { id, @@ -1212,8 +1199,8 @@ const ApiServerProvider = ({ children }) => { params: { id, ...newFilter, - sort: sorter.field, - order: sorter.order + sortProperty: sorter.field, + sortOrder: sorter.order }, headers: { Accept: 'application/json', @@ -1588,8 +1575,8 @@ const ApiServerProvider = ({ children }) => { const response = await axios.get(`${config.backendUrl}/notes`, { params: { parent: getModelByName(parentType).prefix + ':' + parentId, - sort: 'createdAt', - order: 'ascend' + sortProperty: 'createdAt', + sortOrder: 'ascend' }, headers: { Accept: 'application/json', @@ -2122,7 +2109,7 @@ const ApiServerProvider = ({ children }) => { const fetchNotificationsApi = useCallback(async () => { const response = await axios.get(`${config.backendUrl}/notifications`, { - params: { limit: 100, sort: 'createdAt', order: 'descend' }, + params: { limit: 100, sortProperty: 'createdAt', sortOrder: 'descend' }, headers: { Accept: 'application/json', Authorization: `Bearer ${token}` diff --git a/src/components/Dashboard/hooks/useTableData.jsx b/src/components/Dashboard/hooks/useTableData.jsx index 51ec95ef..b6a5ba1c 100644 --- a/src/components/Dashboard/hooks/useTableData.jsx +++ b/src/components/Dashboard/hooks/useTableData.jsx @@ -43,8 +43,8 @@ export const useTableData = ({ page: pageNum, limit: pageSize, ...filters, - sort: sorter.field, - order: sorter.order + sortProperty: sorter.field, + sortOrder: sorter.order }, headers: { Accept: 'application/json' diff --git a/src/database/models/Invoice.js b/src/database/models/Invoice.js index 7c9c3b4c..741ec91f 100644 --- a/src/database/models/Invoice.js +++ b/src/database/models/Invoice.js @@ -189,6 +189,7 @@ export const Invoice = { '_reference', 'state', 'orderType', + 'order', 'to', 'from', 'invoiceDate',