From cae83865448b0205a9593f9643bb854886090f2a Mon Sep 17 00:00:00 2001
From: ValueOn AG
Date: Sun, 22 Feb 2026 22:51:29 +0100
Subject: [PATCH] fix TS build errors and add position-documents API
Co-authored-by: Cursor
---
src/api/trusteeApi.ts | 65 +++++++++++++++++++
.../FormGeneratorControls.tsx | 3 +-
.../FormGeneratorTable/FormGeneratorTable.tsx | 3 +-
src/hooks/useTrustee.ts | 3 +
.../trustee/TrusteePositionDocumentsView.tsx | 6 +-
5 files changed, 75 insertions(+), 5 deletions(-)
diff --git a/src/api/trusteeApi.ts b/src/api/trusteeApi.ts
index 543c70a..4230612 100644
--- a/src/api/trusteeApi.ts
+++ b/src/api/trusteeApi.ts
@@ -686,6 +686,71 @@ export async function deletePosition(
});
}
+// ============================================================================
+// POSITION-DOCUMENT LINK API
+// ============================================================================
+
+export interface TrusteePositionDocument {
+ id: string;
+ positionId: string;
+ documentId: string;
+ mandateId?: string;
+ featureInstanceId?: string;
+ _createdAt?: number;
+ _modifiedAt?: number;
+ [key: string]: any;
+}
+
+export async function fetchPositionDocuments(
+ request: ApiRequestFunction,
+ instanceId: string,
+ params?: PaginationParams
+): Promise | TrusteePositionDocument[]> {
+ return await request({
+ url: `${_getTrusteeBaseUrl(instanceId)}/position-documents`,
+ method: 'get',
+ params: _buildPaginationParams(params)
+ });
+}
+
+export async function fetchPositionDocumentById(
+ request: ApiRequestFunction,
+ instanceId: string,
+ linkId: string
+): Promise {
+ try {
+ return await request({
+ url: `${_getTrusteeBaseUrl(instanceId)}/position-documents/${linkId}`,
+ method: 'get'
+ });
+ } catch {
+ return null;
+ }
+}
+
+export async function createPositionDocument(
+ request: ApiRequestFunction,
+ instanceId: string,
+ data: Partial
+): Promise {
+ return await request({
+ url: `${_getTrusteeBaseUrl(instanceId)}/position-documents`,
+ method: 'post',
+ data
+ });
+}
+
+export async function deletePositionDocument(
+ request: ApiRequestFunction,
+ instanceId: string,
+ linkId: string
+): Promise {
+ await request({
+ url: `${_getTrusteeBaseUrl(instanceId)}/position-documents/${linkId}`,
+ method: 'delete'
+ });
+}
+
// ============================================================================
// ACCOUNTING API
// ============================================================================
diff --git a/src/components/FormGenerator/FormGeneratorControls/FormGeneratorControls.tsx b/src/components/FormGenerator/FormGeneratorControls/FormGeneratorControls.tsx
index 7134bb0..11f33b4 100644
--- a/src/components/FormGenerator/FormGeneratorControls/FormGeneratorControls.tsx
+++ b/src/components/FormGenerator/FormGeneratorControls/FormGeneratorControls.tsx
@@ -1,4 +1,5 @@
import React from 'react';
+import type { IconType } from 'react-icons';
import { useLanguage } from '../../../providers/language/LanguageContext';
import styles from './FormGeneratorControls.module.css';
import { Button } from '../../UiComponents/Button';
@@ -44,7 +45,7 @@ export interface FormGeneratorControlsProps {
label: string;
onClick: () => void | Promise;
loading?: boolean;
- icon?: React.ReactNode;
+ icon?: IconType;
}[];
// Refresh handler
diff --git a/src/components/FormGenerator/FormGeneratorTable/FormGeneratorTable.tsx b/src/components/FormGenerator/FormGeneratorTable/FormGeneratorTable.tsx
index 3a59674..33b5d8f 100644
--- a/src/components/FormGenerator/FormGeneratorTable/FormGeneratorTable.tsx
+++ b/src/components/FormGenerator/FormGeneratorTable/FormGeneratorTable.tsx
@@ -1,4 +1,5 @@
import React, { useState, useMemo, useRef, useEffect, useCallback } from 'react';
+import type { IconType } from 'react-icons';
import { useLanguage } from '../../../providers/language/LanguageContext';
import styles from './FormGeneratorTable.module.css';
import {
@@ -153,7 +154,7 @@ export interface FormGeneratorTableProps {
label: string;
onClick: (rows: T[]) => void | Promise;
loading?: boolean;
- icon?: React.ReactNode;
+ icon?: IconType;
}[];
onRefresh?: () => void;
className?: string;
diff --git a/src/hooks/useTrustee.ts b/src/hooks/useTrustee.ts
index 3a993e2..244a45e 100644
--- a/src/hooks/useTrustee.ts
+++ b/src/hooks/useTrustee.ts
@@ -578,3 +578,6 @@ const positionConfig: TrusteeEntityConfig = {
export const useTrusteePositions = _createTrusteeEntityHook(positionConfig);
export const useTrusteePositionOperations = _createTrusteeOperationsHook(positionConfig);
+export { useTrusteePositionDocuments, useTrusteePositionDocumentOperations } from './useTrusteePositionDocuments';
+export type { TrusteePositionDocument } from '../api/trusteeApi';
+
diff --git a/src/pages/views/trustee/TrusteePositionDocumentsView.tsx b/src/pages/views/trustee/TrusteePositionDocumentsView.tsx
index 6194a6a..6c4cdef 100644
--- a/src/pages/views/trustee/TrusteePositionDocumentsView.tsx
+++ b/src/pages/views/trustee/TrusteePositionDocumentsView.tsx
@@ -56,8 +56,8 @@ export const TrusteePositionDocumentsView: React.FC = () => {
const excludedFields = ['id', 'mandateId', 'featureInstanceId', '_createdBy', '_createdAt', '_modifiedAt', '_modifiedBy'];
return attributes
- .filter(attr => !excludedFields.includes(attr.name))
- .map(attr => {
+ .filter((attr: any) => !excludedFields.includes(attr.name))
+ .map((attr: any) => {
// Replace {instanceId} placeholder in options URL
let fkSource = attr.options;
if (typeof fkSource === 'string' && instanceId) {
@@ -133,7 +133,7 @@ export const TrusteePositionDocumentsView: React.FC = () => {
// Form attributes (exclude system fields)
const formAttributes = useMemo(() => {
const excludedFields = ['id', 'mandateId', 'featureInstanceId', '_createdBy', '_createdAt', '_modifiedAt', '_modifiedBy'];
- return (attributes || []).filter(attr => !excludedFields.includes(attr.name));
+ return (attributes || []).filter((attr: any) => !excludedFields.includes(attr.name));
}, [attributes]);
if (error) {