import { Draft } from 'immer'; import { ArchbaseQueryFilter } from '@archbase/core'; import { DataSourceListener, IDataSourceValidator } from '../ArchbaseDataSource'; import { IArchbaseDataSourceBase } from '../IArchbaseDataSourceBase'; import { ArchbaseRemoteApiService } from '../../service/ArchbaseRemoteApiService'; /** * Estados possíveis do DataSource */ type DataSourceState = 'browse' | 'edit' | 'insert'; /** * Configuração para ArchbaseRemoteDataSourceV2 * Suporta configuração inicial com registros ou carregamento remoto */ export interface ArchbaseRemoteDataSourceV2Config { name: string; label?: string; service: ArchbaseRemoteApiService; records?: T[]; validator?: IDataSourceValidator; defaultSortFields?: string[]; pageSize?: number; id?: any; loadOnStart?: boolean; onStateChange?: (prevRecords: T[], newRecords: T[]) => void; onFieldError?: (fieldName: string, error: string) => void; onError?: (error: string, originalError?: any) => void; } /** * ArchbaseRemoteDataSourceV2 - Versão V2 com Immer e suporte a TanStack Query * * Esta implementação: * - Garante imutabilidade completa com Immer * - Preparada para integração com TanStack Query * - Suporte para operações CRUD remotas * - Gestão de cache e sincronização otimizada * - Interface simplificada focada em funcionalidade V2 */ export declare class ArchbaseRemoteDataSourceV2 implements IArchbaseDataSourceBase { private name; private label; private service; private records; private filteredRecords; private currentIndex; private state; private listeners; private originalRecord; private validator?; private lastDataChangedAt; private lastDataBrowsingOn; private grandTotalRecords; private defaultSortFields; private pageSize; private active; private onStateChange?; private onFieldError?; private onError?; constructor(config: ArchbaseRemoteDataSourceV2Config); getName(): string; getLabel(): string; isActive(): boolean; close(): void; getCurrentRecord(): T | undefined; getCurrentIndex(): number; getTotalRecords(): number; isEmpty(): boolean; first(): void; last(): void; next(): void; prior(): void; goToRecord(index: number): void; isFirst(): boolean; isLast(): boolean; isBOF(): boolean; isEOF(): boolean; isBrowsing(): boolean; isEditing(): boolean; isInserting(): boolean; edit(): void; cancel(): void; insert(record: T): void; save(callback?: Function): Promise; remove(callback?: Function): Promise; setFieldValue(fieldName: string, value: any): void; getFieldValue(fieldName: string): any; appendToFieldArray(fieldName: K, item: T[K] extends Array ? U : never): void; updateFieldArrayItem(fieldName: K, index: number, updater: (draft: T[K] extends Array ? Draft : never) => void): void; removeFromFieldArray(fieldName: K, index: number): void; insertIntoFieldArray(fieldName: K, index: number, item: T[K] extends Array ? U : never): void; getFieldArray(fieldName: K): T[K] extends Array ? U[] : never; isFieldArray(fieldName: K): boolean; /** * Interface de opções para refreshData - compatibilidade com V1 */ private currentPage; private currentFilter?; private currentSort?; /** * Atualiza os dados do DataSource com as opções fornecidas. * Compatível com a interface do DataSource V1. * * @param options Opções de refresh incluindo página, filtro e ordenação */ private _isLoadingData; refreshData(options?: { currentPage?: number; pageSize?: number; filter?: string; sort?: string[]; originFilter?: any; originGlobalFilter?: string; }): void; /** * Carrega um registro específico pelo ID. * Útil para cenários onde se deseja editar um registro específico. * * @param id ID do registro a ser carregado * @returns Promise com o registro carregado ou undefined se não encontrado */ loadById(id: any): Promise; /** * Carrega dados com filtro RSQL */ private getDataWithRsqlFilter; /** * Retorna as opções atuais do DataSource - compatibilidade com V1 */ getOptions(): { currentPage: number; pageSize: number; filter?: string; sort?: string[]; grandTotalRecords: number; }; applyRemoteFilter(filter: ArchbaseQueryFilter, page: number, callback?: (() => void) | undefined): void; addListener(listener: DataSourceListener): void; removeListener(listener: DataSourceListener): void; /** * Adiciona um listener para mudanças em um campo específico. * Permite que componentes escutem apenas mudanças no campo que exibem, * evitando re-renders desnecessários. */ addFieldChangeListener(fieldName: string, listener: (fieldName: string, oldValue: any, newValue: any) => void): this; /** * Remove um listener de campo específico. * Nota: A remoção exata não é suportada nesta versão simplificada. */ removeFieldChangeListener(_fieldName: string, _listener: (fieldName: string, oldValue: any, newValue: any) => void): this; private emit; getGrandTotalRecords(): number; getPageSize(): number; setPageSize(pageSize: number): void; /** * Retorna a página atual (0-indexed) */ getCurrentPage(): number; /** * Alias para getRecords - compatibilidade com V1 */ browseRecords(): T[]; getRecords(): T[]; /** * Localiza um registro por valores de campos e navega para ele * @param values Objeto com campos/valores para busca * @returns true se encontrou, false caso contrário */ locate(values: any): boolean; /** * Vai para um registro pelo seu índice (alias para goToRecord) * @param index Índice do registro */ gotoRecord(index: number): void; /** * Vai para um registro pelo seu dado * @param record Dados do registro para navegar * @returns true se encontrou, false caso contrário */ gotoRecordByData(record: T): boolean; setRecords(records: T[], totalElements?: number): void; getDebugSnapshot(): { name: string; label: string; recordCount: number; currentIndex: number; currentRecord: T; state: DataSourceState; listeners: number; totalRecords: number; pageSize: number; }; private validateDataSourceActive; private publishEventError; private publishEventErrors; private handleSaveError; private notifyStateChange; private setNestedValue; private getNestedValue; private getDataWithFilter; private getDataWithoutFilter; private getDataWithQuickFilter; private getSortFields; private handleRemoteError; } export {};