fix TS build errors and add position-documents API

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
ValueOn AG 2026-02-22 22:51:29 +01:00
parent be8757e15e
commit cae8386544
5 changed files with 75 additions and 5 deletions

View file

@ -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<PaginatedResponse<TrusteePositionDocument> | 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<TrusteePositionDocument | null> {
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<TrusteePositionDocument>
): Promise<TrusteePositionDocument> {
return await request({
url: `${_getTrusteeBaseUrl(instanceId)}/position-documents`,
method: 'post',
data
});
}
export async function deletePositionDocument(
request: ApiRequestFunction,
instanceId: string,
linkId: string
): Promise<void> {
await request({
url: `${_getTrusteeBaseUrl(instanceId)}/position-documents/${linkId}`,
method: 'delete'
});
}
// ============================================================================ // ============================================================================
// ACCOUNTING API // ACCOUNTING API
// ============================================================================ // ============================================================================

View file

@ -1,4 +1,5 @@
import React from 'react'; import React from 'react';
import type { IconType } from 'react-icons';
import { useLanguage } from '../../../providers/language/LanguageContext'; import { useLanguage } from '../../../providers/language/LanguageContext';
import styles from './FormGeneratorControls.module.css'; import styles from './FormGeneratorControls.module.css';
import { Button } from '../../UiComponents/Button'; import { Button } from '../../UiComponents/Button';
@ -44,7 +45,7 @@ export interface FormGeneratorControlsProps {
label: string; label: string;
onClick: () => void | Promise<void>; onClick: () => void | Promise<void>;
loading?: boolean; loading?: boolean;
icon?: React.ReactNode; icon?: IconType;
}[]; }[];
// Refresh handler // Refresh handler

View file

@ -1,4 +1,5 @@
import React, { useState, useMemo, useRef, useEffect, useCallback } from 'react'; import React, { useState, useMemo, useRef, useEffect, useCallback } from 'react';
import type { IconType } from 'react-icons';
import { useLanguage } from '../../../providers/language/LanguageContext'; import { useLanguage } from '../../../providers/language/LanguageContext';
import styles from './FormGeneratorTable.module.css'; import styles from './FormGeneratorTable.module.css';
import { import {
@ -153,7 +154,7 @@ export interface FormGeneratorTableProps<T = any> {
label: string; label: string;
onClick: (rows: T[]) => void | Promise<void>; onClick: (rows: T[]) => void | Promise<void>;
loading?: boolean; loading?: boolean;
icon?: React.ReactNode; icon?: IconType;
}[]; }[];
onRefresh?: () => void; onRefresh?: () => void;
className?: string; className?: string;

View file

@ -578,3 +578,6 @@ const positionConfig: TrusteeEntityConfig<TrusteePosition> = {
export const useTrusteePositions = _createTrusteeEntityHook(positionConfig); export const useTrusteePositions = _createTrusteeEntityHook(positionConfig);
export const useTrusteePositionOperations = _createTrusteeOperationsHook(positionConfig); export const useTrusteePositionOperations = _createTrusteeOperationsHook(positionConfig);
export { useTrusteePositionDocuments, useTrusteePositionDocumentOperations } from './useTrusteePositionDocuments';
export type { TrusteePositionDocument } from '../api/trusteeApi';

View file

@ -56,8 +56,8 @@ export const TrusteePositionDocumentsView: React.FC = () => {
const excludedFields = ['id', 'mandateId', 'featureInstanceId', '_createdBy', '_createdAt', '_modifiedAt', '_modifiedBy']; const excludedFields = ['id', 'mandateId', 'featureInstanceId', '_createdBy', '_createdAt', '_modifiedAt', '_modifiedBy'];
return attributes return attributes
.filter(attr => !excludedFields.includes(attr.name)) .filter((attr: any) => !excludedFields.includes(attr.name))
.map(attr => { .map((attr: any) => {
// Replace {instanceId} placeholder in options URL // Replace {instanceId} placeholder in options URL
let fkSource = attr.options; let fkSource = attr.options;
if (typeof fkSource === 'string' && instanceId) { if (typeof fkSource === 'string' && instanceId) {
@ -133,7 +133,7 @@ export const TrusteePositionDocumentsView: React.FC = () => {
// Form attributes (exclude system fields) // Form attributes (exclude system fields)
const formAttributes = useMemo(() => { const formAttributes = useMemo(() => {
const excludedFields = ['id', 'mandateId', 'featureInstanceId', '_createdBy', '_createdAt', '_modifiedAt', '_modifiedBy']; 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]); }, [attributes]);
if (error) { if (error) {