@archbase/data 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/README.md +57 -0
  2. package/dist/archbase-data-3.0.0.tgz +0 -0
  3. package/dist/datasource/ArchbaseDataSource.d.ts +472 -0
  4. package/dist/datasource/ArchbaseLocalFilterDataSource.d.ts +27 -0
  5. package/dist/datasource/ArchbaseRemoteDataSource.d.ts +17 -0
  6. package/dist/datasource/ArchbaseRemoteFilterDataSource.d.ts +28 -0
  7. package/dist/datasource/ArchbaseV1V2CompatibilityPattern.d.ts +72 -0
  8. package/dist/datasource/IArchbaseDataSourceBase.d.ts +111 -0
  9. package/dist/datasource/index.d.ts +10 -0
  10. package/dist/datasource/v2/ArchbaseDataSourceV2.d.ts +128 -0
  11. package/dist/datasource/v2/ArchbaseQueryIntegration.d.ts +210 -0
  12. package/dist/datasource/v2/ArchbaseQueryProvider.d.ts +79 -0
  13. package/dist/datasource/v2/ArchbaseRemoteDataSourceV2.d.ts +182 -0
  14. package/dist/datasource/v2/ArchbaseTanStackQueryIntegration.d.ts +132 -0
  15. package/dist/datasource/v2/index.d.ts +11 -0
  16. package/dist/datasource/v2/useArchbaseDataSourceV2.d.ts +143 -0
  17. package/dist/datasource/v2/useArchbaseRemoteDataSourceV2.d.ts +210 -0
  18. package/dist/hooks/index.d.ts +14 -0
  19. package/dist/hooks/useArchbaseDataSource.d.ts +15 -0
  20. package/dist/hooks/useArchbaseDataSourceListener.d.ts +7 -0
  21. package/dist/hooks/useArchbaseDidMount.d.ts +5 -0
  22. package/dist/hooks/useArchbaseDidUpdate.d.ts +6 -0
  23. package/dist/hooks/useArchbaseEventListener.d.ts +1 -0
  24. package/dist/hooks/useArchbaseForceRerender.d.ts +5 -0
  25. package/dist/hooks/useArchbaseForceUpdate.d.ts +5 -0
  26. package/dist/hooks/useArchbaseLocalFilterDataSource.d.ts +13 -0
  27. package/dist/hooks/useArchbaseRemoteDataSource.d.ts +36 -0
  28. package/dist/hooks/useArchbaseRemoteFilterDataSource.d.ts +34 -0
  29. package/dist/hooks/useArchbaseRemoteServiceApi.d.ts +2 -0
  30. package/dist/hooks/useArchbaseStore.d.ts +3 -0
  31. package/dist/hooks/useArchbaseWillUnmount.d.ts +5 -0
  32. package/dist/index.d.ts +9 -0
  33. package/dist/index.js +3360 -0
  34. package/dist/service/ArchbaseRemoteApiService.d.ts +103 -0
  35. package/dist/service/index.d.ts +2 -0
  36. package/dist/types/ArchbaseStateValues.d.ts +9 -0
  37. package/dist/types/index.d.ts +1 -0
  38. package/package.json +64 -0
package/README.md ADDED
@@ -0,0 +1,57 @@
1
+ # @archbase/data
2
+
3
+ Data management layer for Archbase React v3 - DataSource, hooks, and API services.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @archbase/data @archbase/core
9
+ ```
10
+
11
+ ## Features
12
+
13
+ - 🗄️ **DataSource**: Local and Remote data sources with TanStack Query
14
+ - 🔄 **State Management**: Zustand-based state management
15
+ - 🌐 **API Client**: Axios-based HTTP client with interceptors
16
+ - 🪝 **React Hooks**: Data fetching and state management hooks
17
+ - 📄 **Pagination**: Built-in pagination support
18
+ - 🔍 **Filtering**: Advanced filtering with RSQL
19
+ - 📊 **Sorting**: Multi-column sorting support
20
+
21
+ ## Usage
22
+
23
+ ### DataSource v2 (TanStack Query)
24
+
25
+ ```typescript
26
+ import {
27
+ useArchbaseRemoteDataSourceV2,
28
+ ArchbaseDataSourceProvider
29
+ } from '@archbase/data';
30
+
31
+ // Remote data source with TanStack Query
32
+ const { dataSource, isLoading, error } = useArchbaseRemoteDataSourceV2({
33
+ name: 'users',
34
+ endpoint: '/api/users',
35
+ queryKey: ['users']
36
+ });
37
+
38
+ // Provider for context
39
+ <ArchbaseDataSourceProvider dataSource={dataSource}>
40
+ <YourComponent />
41
+ </ArchbaseDataSourceProvider>
42
+ ```
43
+
44
+ ### Local DataSource
45
+
46
+ ```typescript
47
+ import { useArchbaseLocalDataSource } from '@archbase/data';
48
+
49
+ const dataSource = useArchbaseLocalDataSource({
50
+ data: users,
51
+ idField: 'id'
52
+ });
53
+ ```
54
+
55
+ ## API Documentation
56
+
57
+ Detailed API documentation coming soon...
Binary file
@@ -0,0 +1,472 @@
1
+ import { DataSourceValidationError, IDataSourceValidator } from '@archbase/core';
2
+ import { IArchbaseDataSourceBase } from './IArchbaseDataSourceBase';
3
+ export declare enum DataSourceEventNames {
4
+ dataChanged = 0,
5
+ recordChanged = 1,
6
+ refreshData = 2,
7
+ fieldChanged = 3,
8
+ beforeClose = 4,
9
+ afterClose = 5,
10
+ beforeOpen = 6,
11
+ afterOpen = 7,
12
+ beforeAppend = 8,
13
+ afterAppend = 9,
14
+ beforeRemove = 10,
15
+ afterRemove = 11,
16
+ beforeInsert = 12,
17
+ afterInsert = 13,
18
+ beforeEdit = 14,
19
+ afterEdit = 15,
20
+ beforeSave = 16,
21
+ afterSave = 17,
22
+ beforeCancel = 18,
23
+ afterCancel = 19,
24
+ afterScroll = 20,
25
+ onError = 21,
26
+ onFieldError = 22
27
+ }
28
+ export type FilterFn<T> = (record: T) => boolean;
29
+ export interface DataSourceOptions<T> {
30
+ records: T[];
31
+ filters?: FilterFn<T>[];
32
+ grandTotalRecords: number;
33
+ currentPage: number;
34
+ totalPages: number;
35
+ pageSize: number;
36
+ filter?: string;
37
+ sort?: string[];
38
+ id?: any;
39
+ defaultSortFields?: string[];
40
+ originFilter?: any;
41
+ originGlobalFilter?: any;
42
+ originSort?: any;
43
+ validator?: IDataSourceValidator;
44
+ /**
45
+ * Função opcional para retornar a identidade que será utilizada para identificar o registro.
46
+ * Quando não definida, será utilizada por padrão o id.
47
+ */
48
+ getIdentity?: (record: T) => any;
49
+ }
50
+ export type DataSourceEventDataChangedType<T> = {
51
+ type: DataSourceEventNames.dataChanged;
52
+ data: T[];
53
+ };
54
+ export type DataSourceEventRecordChangedType<T> = {
55
+ type: DataSourceEventNames.recordChanged;
56
+ record: T;
57
+ index: number;
58
+ };
59
+ export type DataSourceEventRefreshDataType<T> = {
60
+ type: DataSourceEventNames.refreshData;
61
+ options: DataSourceOptions<T>;
62
+ };
63
+ export type DataSourceEventFieldChangedType<T> = {
64
+ type: DataSourceEventNames.fieldChanged;
65
+ record: T;
66
+ index: number;
67
+ fieldName: string;
68
+ oldValue: any;
69
+ newValue: any;
70
+ };
71
+ export type DataSourceEventBeforeCloseType<_T> = {
72
+ type: DataSourceEventNames.beforeClose;
73
+ };
74
+ export type DataSourceEventAfterCloseType<_T> = {
75
+ type: DataSourceEventNames.afterClose;
76
+ };
77
+ export type DataSourceEventBeforeOpenType<_T> = {
78
+ type: DataSourceEventNames.beforeOpen;
79
+ };
80
+ export type DataSourceEventAfterOpenType<_T> = {
81
+ type: DataSourceEventNames.afterOpen;
82
+ };
83
+ export type DataSourceEventBeforeAppendType<T> = {
84
+ type: DataSourceEventNames.beforeAppend;
85
+ record?: T;
86
+ };
87
+ export type DataSourceEventAfterAppendType<T> = {
88
+ type: DataSourceEventNames.afterAppend;
89
+ record?: T;
90
+ index: number;
91
+ };
92
+ export type DataSourceEventBeforeRemoveType<T> = {
93
+ type: DataSourceEventNames.beforeRemove;
94
+ record?: T;
95
+ index: number;
96
+ };
97
+ export type DataSourceEventAfterRemoveType<T> = {
98
+ type: DataSourceEventNames.afterRemove;
99
+ record?: T;
100
+ index: number;
101
+ };
102
+ export type DataSourceEventBeforeInsertType<_T> = {
103
+ type: DataSourceEventNames.beforeInsert;
104
+ };
105
+ export type DataSourceEventAfterInsertType<T> = {
106
+ type: DataSourceEventNames.afterInsert;
107
+ record?: T;
108
+ index: number;
109
+ };
110
+ export type DataSourceEventBeforeEditType<T> = {
111
+ type: DataSourceEventNames.beforeEdit;
112
+ record?: T;
113
+ index: number;
114
+ };
115
+ export type DataSourceEventAfterEditType<T> = {
116
+ type: DataSourceEventNames.afterEdit;
117
+ record?: T;
118
+ index: number;
119
+ };
120
+ export type DataSourceEventBeforeSaveType<T> = {
121
+ type: DataSourceEventNames.beforeSave;
122
+ record?: T;
123
+ index: number;
124
+ };
125
+ export type DataSourceEventAfterSaveType<T> = {
126
+ type: DataSourceEventNames.afterSave;
127
+ record?: T;
128
+ index: number;
129
+ };
130
+ export type DataSourceEventBeforeCancelType<T> = {
131
+ type: DataSourceEventNames.beforeCancel;
132
+ record?: T;
133
+ index: number;
134
+ };
135
+ export type DataSourceEventAfterCancelType<T> = {
136
+ type: DataSourceEventNames.afterCancel;
137
+ record?: T;
138
+ index: number;
139
+ };
140
+ export type DataSourceEventAfterScrollType<_T> = {
141
+ type: DataSourceEventNames.afterScroll;
142
+ };
143
+ export type DataSourceEventOnErrorType<_T> = {
144
+ type: DataSourceEventNames.onError;
145
+ error: any;
146
+ originalError: any;
147
+ };
148
+ export type DataSourceEventOnFieldErrorType<_T> = {
149
+ type: DataSourceEventNames.onFieldError;
150
+ error: any;
151
+ originalError: any;
152
+ fieldName: string;
153
+ };
154
+ export type DataSourceEvent<T> = DataSourceEventDataChangedType<T> | DataSourceEventRecordChangedType<T> | DataSourceEventRefreshDataType<T> | DataSourceEventFieldChangedType<T> | DataSourceEventBeforeCloseType<T> | DataSourceEventAfterCloseType<T> | DataSourceEventBeforeOpenType<T> | DataSourceEventAfterOpenType<T> | DataSourceEventBeforeAppendType<T> | DataSourceEventAfterAppendType<T> | DataSourceEventBeforeRemoveType<T> | DataSourceEventAfterRemoveType<T> | DataSourceEventBeforeInsertType<T> | DataSourceEventAfterInsertType<T> | DataSourceEventBeforeEditType<T> | DataSourceEventAfterEditType<T> | DataSourceEventBeforeSaveType<T> | DataSourceEventAfterSaveType<T> | DataSourceEventBeforeCancelType<T> | DataSourceEventAfterCancelType<T> | DataSourceEventAfterScrollType<T> | DataSourceEventOnErrorType<T> | DataSourceEventOnFieldErrorType<T>;
155
+ export type DataSourceListener<T> = (event: DataSourceEvent<T>) => void;
156
+ /**
157
+ * Eventos gerados pelo DataSource
158
+ */
159
+ export interface DataSourceEvents<T> {
160
+ /**
161
+ * Evento gerado pelo DataSource quando os dados são alterados.
162
+ * @param data Dados alterados
163
+ * @param options Opções usadas
164
+ * @returns
165
+ */
166
+ dataChanged: (data: T[], options: DataSourceOptions<T>) => void;
167
+ /**
168
+ * Evento gerado pelo DataSource quando um registro é alterado
169
+ * @param record Registro alterado
170
+ * @param index Indice do registro dentro da coleção de dados
171
+ * @returns
172
+ */
173
+ recordChanged: (record: T, index: number) => void;
174
+ /**
175
+ * Evento gerado pelo DataSource quando um campo é alterado. Comumente usado
176
+ * para fazer bind bidirecional e atualizar componentes visuais.
177
+ * @param record Registro alterado
178
+ * @param index Indice do registro alterado
179
+ * @param fieldName Nome do campo alterado
180
+ * @param oldValue Valor antigo
181
+ * @param newValue Novo Valor
182
+ * @returns
183
+ */
184
+ fieldChanged: (record: T, index: number, fieldName: string, oldValue: any, newValue: any) => void;
185
+ /**
186
+ * Evento gerado pelo DataSource antes dele ser fechado.
187
+ */
188
+ beforeClose: () => void;
189
+ /**
190
+ * Evento gerado pelo DataSource após ele ser fechado.
191
+ */
192
+ afterClose: () => void;
193
+ /**
194
+ * Evento gerado pelo DataSource antes de ser aberto.
195
+ */
196
+ beforeOpen: () => void;
197
+ /**
198
+ * Evento gerado pelo DataSource após ele ser aberto.
199
+ */
200
+ afterOpen: () => void;
201
+ /**
202
+ * Evento gerado pelo DataSource antes de um registro ser adicionado a coleção de dados.
203
+ * @param record Registro adicionado
204
+ * @returns
205
+ */
206
+ beforeAppend: (record: T) => void;
207
+ /**
208
+ * Evento gerado pelo DataSource após o registro ser adicionado a coleção de dados.
209
+ * @param record Registro adicionado
210
+ * @param index Posição onde o registro foi adicionado
211
+ * @returns
212
+ */
213
+ afterAppend: (record: T, index: number) => void;
214
+ /**
215
+ * Evento gerado pelo DataSource antes de um registro ser removido
216
+ * @param record Registro sendo removido
217
+ * @param index Indice do registro sendo removido
218
+ * @returns
219
+ */
220
+ beforeRemove: (record: T, index: number) => void;
221
+ /**
222
+ * Evento gerado pelo DataSource após o registro ser removido
223
+ * @param record Registro removido
224
+ * @param index Indice do registro removido
225
+ * @returns
226
+ */
227
+ afterRemove: (record: T, index: number) => void;
228
+ /**
229
+ * Evento gerado pelo DataSource antes de um novo registro ser inserido para edição.
230
+ * @returns
231
+ */
232
+ beforeInsert: () => void;
233
+ /**
234
+ * Evento gerado pelo DataSource após um registro ser inserido para edição.
235
+ * @param record Registro inserido
236
+ * @param index Indice do registro inserido
237
+ * @returns
238
+ */
239
+ afterInsert: (record: T, index: number) => void;
240
+ /**
241
+ * Evento gerado pelo DataSource antes de um registro entrar no modo de edição.
242
+ * Ouvindo este evento é possível por exemplo atribuir valores padrões ao registro
243
+ * que não serão preenchidos pelo usuário.
244
+ *
245
+ * @param record Registro a ser editado
246
+ * @param index Indice do registro que vai ser editado
247
+ * @returns
248
+ */
249
+ beforeEdit: (record: T, index: number) => void;
250
+ /**
251
+ * Evento gerado pelo DataSource após o registro entrar no modo de edição.
252
+ * @param record
253
+ * @param index
254
+ * @returns
255
+ */
256
+ afterEdit: (record: T, index: number) => void;
257
+ /**
258
+ * Evento gerado pelo DataSource que ocorre antes de salvar o registro sendo editado ou inserido.
259
+ * Poderia ser usado para fazer validações ou logs caso necessário.
260
+ * @param record Registro sendo salvo
261
+ * @param index Indice do registro sendo salvo
262
+ * @returns
263
+ */
264
+ beforeSave: (record: T, index: number) => void;
265
+ /**
266
+ * Evento gerado pelo DataSource após um registro ser salvo.
267
+ * @param record Registro salvo
268
+ * @param index Indice do registro salvo
269
+ * @returns
270
+ */
271
+ afterSave: (record: T, index: number) => void;
272
+ /**
273
+ * Evento gerado pelo DataSource antes de ser cancelada a edição ou inserção de um registro.
274
+ * @param record Registro sendo cancelado
275
+ * @param index Indice do registro sendo cancelado
276
+ * @returns
277
+ */
278
+ beforeCancel: (record: T, index: number) => void;
279
+ /**
280
+ * Evento gerado pelo DataSource após ser cancelada a edição/inserção do registro.
281
+ * @param record
282
+ * @param index
283
+ * @returns
284
+ */
285
+ afterCancel: (record: T, index: number) => void;
286
+ /**
287
+ * Evento gerado pelo DataSource quando o indice da posição atual é alterada,
288
+ * ou seja quando é posicionando em um novo registro.
289
+ * @returns
290
+ */
291
+ afterScroll: () => void;
292
+ /**
293
+ * Evento gerado pelo DataSource quando ocorre algum erro em alguma das operações.
294
+ * @param error Erro ocorrido já processado para apresentação.
295
+ * @param originalError Erro original
296
+ * @returns
297
+ */
298
+ onError: (error: any, originalError: any) => void;
299
+ }
300
+ export interface IDataSource<T> {
301
+ open: (options: DataSourceOptions<T>) => void;
302
+ close: () => void;
303
+ clear: () => void;
304
+ setData: (options: DataSourceOptions<T>) => void;
305
+ insert: (record: T) => this;
306
+ edit: () => this;
307
+ remove: (callback?: Function) => Promise<T | undefined>;
308
+ save: (callback?: Function) => Promise<T | undefined>;
309
+ cancel: () => this;
310
+ getName: () => string;
311
+ getOptions: () => DataSourceOptions<T>;
312
+ refreshData: (options?: DataSourceOptions<T>) => void;
313
+ browseRecords: () => T[];
314
+ getCurrentRecord: () => T | undefined;
315
+ getTotalRecords: () => number;
316
+ getGrandTotalRecords: () => number;
317
+ getCurrentPage: () => number;
318
+ getTotalPages: () => number;
319
+ setFieldValue: (fieldName: string, value: any) => this;
320
+ getFieldValue: (fieldName: string, defaultValue: any) => any;
321
+ isEmptyField: (fieldName: string) => boolean;
322
+ isBOF: () => boolean;
323
+ isEOF: () => boolean;
324
+ isEmpty: () => boolean;
325
+ isFirst: () => boolean;
326
+ isLast: () => boolean;
327
+ isInserting: () => boolean;
328
+ isEditing: () => boolean;
329
+ isBrowsing: () => boolean;
330
+ isActive: () => boolean;
331
+ next: () => this;
332
+ prior: () => this;
333
+ first: () => this;
334
+ last: () => this;
335
+ goToPage: (pageNumber: number) => this;
336
+ goToRecord: (recordIndex: number) => T | undefined;
337
+ gotoRecordByData: (record: T) => boolean;
338
+ disabledAllListeners: () => this;
339
+ enableAllListeners: () => this;
340
+ addListener: (...listener: DataSourceListener<T>[]) => this;
341
+ removeListener: (...listener: DataSourceListener<T>[]) => this;
342
+ addFieldChangeListener: (fieldName: string, listener: (fieldName: string, oldValue: any, newValue: any) => void) => this;
343
+ removeFieldChangeListener: (fieldName: string, listener: (fieldName: string, oldValue: any, newValue: any) => void) => this;
344
+ addFilter: (filterFn: FilterFn<T>) => this;
345
+ removeFilter: (filterFn: FilterFn<T>) => this;
346
+ clearFilters: () => this;
347
+ locate(values: any): boolean;
348
+ locateByFilter(filterFn: (record: T) => boolean): boolean;
349
+ validate: () => boolean;
350
+ }
351
+ export type { DataSourceValidationError, IDataSourceValidator } from '@archbase/core';
352
+ export declare class ArchbaseDataSourceEventEmitter {
353
+ private eventEmitter;
354
+ private listenersDisable;
355
+ constructor();
356
+ disabledAllListeners(): this;
357
+ enableAllListeners(): this;
358
+ emit(event: string | symbol, ...args: any[]): boolean;
359
+ addListener(event: string | symbol, listener: (...args: any[]) => void): this;
360
+ on(event: string | symbol, listener: (...args: any[]) => void): this;
361
+ once(event: string | symbol, listener: (...args: any[]) => void): this;
362
+ removeListener(event: string | symbol, listener: (...args: any[]) => void): this;
363
+ off(event: string | symbol, listener: (...args: any[]) => void): this;
364
+ removeAllListeners(event?: string | symbol): this;
365
+ }
366
+ export declare class ArchbaseDataSource<T, _ID> implements IDataSource<T>, IArchbaseDataSourceBase<T> {
367
+ protected fieldEventListeners: Record<string, ((fieldName: string, oldValue: any, newValue: any) => void)[]>;
368
+ protected records: T[];
369
+ protected filteredRecords: T[];
370
+ protected filters?: FilterFn<T>[];
371
+ protected grandTotalRecords: number;
372
+ protected currentPageIndex: number;
373
+ protected totalPages: number;
374
+ protected pageSize: number;
375
+ protected currentRecordIndex: number;
376
+ protected currentRecord: T | undefined;
377
+ protected oldRecord: T | undefined;
378
+ protected oldRecordIndex: number;
379
+ protected emitter: ArchbaseDataSourceEventEmitter;
380
+ protected listeners: Set<DataSourceListener<T>>;
381
+ protected listenersDisable: boolean;
382
+ protected inserting: boolean;
383
+ protected active: boolean;
384
+ protected editing: boolean;
385
+ protected name: string;
386
+ protected label: string;
387
+ readonly uuid: string;
388
+ lastDataChangedAt: number;
389
+ lastDataBrowsingOn: number;
390
+ protected filter: string | undefined;
391
+ protected sort: string[] | undefined;
392
+ protected originFilter: any | undefined;
393
+ protected originSort: any | undefined;
394
+ protected originGlobalFilter: any | undefined;
395
+ protected defaultSortFields: string[];
396
+ protected validator?: IDataSourceValidator;
397
+ protected getIdentity?: any;
398
+ constructor(name: string, options: DataSourceOptions<T>, label?: string);
399
+ private loadOptions;
400
+ protected validateDataSourceActive(operation: string): void;
401
+ getName(): string;
402
+ /**
403
+ * Limpa os dados do DataSource. Ao usar este método os seguintes eventos serão gerados:
404
+ * beforeClose, afterOpen, dataChanged, afterScroll
405
+ */
406
+ clear(): void;
407
+ open(options: DataSourceOptions<T>): void;
408
+ close(): void;
409
+ setData(options: DataSourceOptions<T>): void;
410
+ goToPage(_pageNumber: number): this;
411
+ goToRecord(recordIndex: number): T | undefined;
412
+ disabledAllListeners(): this;
413
+ enableAllListeners(): this;
414
+ addFilter(filterFn: FilterFn<T>): this;
415
+ removeFilter(filterFn: FilterFn<T>): this;
416
+ clearFilters(): this;
417
+ private applyFilters;
418
+ protected emit(event: DataSourceEvent<T>): void;
419
+ append(record: T): number;
420
+ insert(record: T): this;
421
+ edit(): this;
422
+ remove(callback?: Function): Promise<T | undefined>;
423
+ isBrowsing(): boolean;
424
+ isEditing(): boolean;
425
+ isInserting(): boolean;
426
+ isActive(): boolean;
427
+ getPageSize(): number;
428
+ protected publishEventErrors: (errors: DataSourceValidationError[]) => void;
429
+ protected publishEventError: (errorMessage: string, error: any) => void;
430
+ validate(): boolean;
431
+ save(callback?: Function): Promise<T>;
432
+ cancel(): this;
433
+ getCurrentPage(): number;
434
+ getTotalPages(): number;
435
+ getTotalRecords(): number;
436
+ getGrandTotalRecords(): number;
437
+ getFieldValue(fieldName: string, defaultValue?: any): any;
438
+ private fieldValueByName;
439
+ setFieldValue(fieldName: string, value: any): this;
440
+ isEmptyField(fieldName: string): boolean;
441
+ getOptions(): DataSourceOptions<T>;
442
+ refreshData(options?: DataSourceOptions<T>): void;
443
+ browseRecords(): T[];
444
+ getCurrentIndex(): number;
445
+ getCurrentRecord(): T | undefined;
446
+ isEOF(): boolean;
447
+ isBOF(): boolean;
448
+ isEmpty(): boolean;
449
+ isFirst(): boolean;
450
+ isLast(): boolean;
451
+ next(): this;
452
+ prior(): this;
453
+ first(): this;
454
+ last(): this;
455
+ gotoRecord(index: number): T | undefined;
456
+ gotoRecordByData(record: any): boolean;
457
+ locate(values: any): boolean;
458
+ locateByFilter(filterFn: (record: T) => boolean): boolean;
459
+ addListener(listener: DataSourceListener<T>): this;
460
+ removeListener(listener: DataSourceListener<T>): this;
461
+ on<K extends keyof DataSourceEvents<T>>(eventName: K, listener: DataSourceEvents<T>[K]): void;
462
+ off<K extends keyof DataSourceEvents<T>>(eventName: K, listener: DataSourceEvents<T>[K]): void;
463
+ addFieldChangeListener(fieldName: string, listener: (fieldName: string, oldValue: any, newValue: any) => void): this;
464
+ removeFieldChangeListener(fieldName: string, listener: (fieldName: string, oldValue: any, newValue: any) => void): this;
465
+ private emitFieldChangeEvent;
466
+ /**
467
+ * Define um erro para um campo específico
468
+ * @param fieldName Nome do campo
469
+ * @param errors Array de mensagens de erro
470
+ */
471
+ setFieldError(fieldName: string, errors: string[]): void;
472
+ }
@@ -0,0 +1,27 @@
1
+ import { ArchbaseDataSource } from './ArchbaseDataSource';
2
+ import { ArchbaseQueryFilterDelegator, DelegatorCallback, IQueryFilterEntity } from '@archbase/core';
3
+ export declare class LocalFilter {
4
+ id?: any;
5
+ companyId?: any;
6
+ filter?: string;
7
+ name?: string;
8
+ description?: string;
9
+ viewName?: string;
10
+ componentName?: string;
11
+ componentId?: string;
12
+ userName?: string;
13
+ userOwner?: string;
14
+ shared?: boolean;
15
+ readOnly?: boolean;
16
+ code?: string;
17
+ constructor(data?: Partial<LocalFilter>);
18
+ }
19
+ export declare class ArchbaseLocalFilterDataSource extends ArchbaseDataSource<LocalFilter, number> implements ArchbaseQueryFilterDelegator {
20
+ getFilterById(id: any): IQueryFilterEntity | undefined;
21
+ protected convertCurrentRecordToFilter(): IQueryFilterEntity | undefined;
22
+ addNewFilter(filter: IQueryFilterEntity, onResult: DelegatorCallback): Promise<void>;
23
+ saveFilter(filter: IQueryFilterEntity, onResult: DelegatorCallback): Promise<void>;
24
+ removeFilterBy(filter: IQueryFilterEntity, onResult: DelegatorCallback): Promise<void>;
25
+ getFirstFilter(): IQueryFilterEntity | undefined;
26
+ getFilters(): IQueryFilterEntity[];
27
+ }
@@ -0,0 +1,17 @@
1
+ import { ArchbaseQueryFilter } from '@archbase/core';
2
+ import { DataSourceOptions, ArchbaseDataSource, IDataSource } from './ArchbaseDataSource';
3
+ import { ArchbaseRemoteApiService } from '../service/ArchbaseRemoteApiService';
4
+ export interface IRemoteDataSource<T> extends IDataSource<T> {
5
+ applyRemoteFilter: (filter: ArchbaseQueryFilter, page: number, callback?: (() => void) | undefined) => void;
6
+ }
7
+ export declare class ArchbaseRemoteDataSource<T, ID> extends ArchbaseDataSource<T, ID> implements IRemoteDataSource<T> {
8
+ protected service: ArchbaseRemoteApiService<T, ID>;
9
+ constructor(service: ArchbaseRemoteApiService<T, ID>, name: string, options: DataSourceOptions<T>, label?: string);
10
+ save(callback?: Function): Promise<T>;
11
+ remove(callback?: Function): Promise<T | undefined>;
12
+ applyRemoteFilter(filter: ArchbaseQueryFilter, page: number, _callback?: (() => void) | undefined): any;
13
+ protected getDataWithFilter(currentFilter: ArchbaseQueryFilter, page: number): Promise<any>;
14
+ protected getDataWithoutFilter(page: number): any;
15
+ protected getDataWithQuickFilter(currentFilter: ArchbaseQueryFilter, page: number): Promise<import("..").Page<T>>;
16
+ protected getSortFields(currentFilter: ArchbaseQueryFilter): any;
17
+ }
@@ -0,0 +1,28 @@
1
+ import { ArchbaseQueryFilterDelegator, DelegatorCallback, IQueryFilterEntity } from '@archbase/core';
2
+ import { ArchbaseRemoteDataSource } from './ArchbaseRemoteDataSource';
3
+ export declare class RemoteFilter {
4
+ id?: any;
5
+ companyId?: any;
6
+ filter?: string;
7
+ name?: string;
8
+ description?: string;
9
+ viewName?: string;
10
+ componentName?: string;
11
+ componentId?: string;
12
+ userName?: string;
13
+ userOwner?: string;
14
+ shared?: boolean;
15
+ readOnly?: boolean;
16
+ code?: string;
17
+ isNewFilter?: boolean;
18
+ constructor(data?: Partial<RemoteFilter>);
19
+ }
20
+ export declare class ArchbaseRemoteFilterDataSource extends ArchbaseRemoteDataSource<RemoteFilter, number> implements ArchbaseQueryFilterDelegator {
21
+ getFilterById(id: any): IQueryFilterEntity | undefined;
22
+ protected convertCurrentRecordToFilter(): IQueryFilterEntity | undefined;
23
+ addNewFilter(filter: IQueryFilterEntity, onResult: DelegatorCallback): Promise<void>;
24
+ saveFilter(filter: IQueryFilterEntity, onResult: DelegatorCallback): Promise<void>;
25
+ removeFilterBy(filter: IQueryFilterEntity, onResult: DelegatorCallback): Promise<void>;
26
+ getFirstFilter(): IQueryFilterEntity | undefined;
27
+ getFilters(): IQueryFilterEntity[];
28
+ }
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Padrão de Compatibilidade V1/V2 para Componentes DataSource
3
+ *
4
+ * Este arquivo define o padrão obrigatório que TODOS os componentes
5
+ * devem seguir para garantir compatibilidade entre V1 e V2.
6
+ *
7
+ * Baseado na implementação bem-sucedida do ArchbaseEdit.
8
+ */
9
+ import { DataSourceEvent } from './ArchbaseDataSource';
10
+ /**
11
+ * Hook obrigatório para compatibilidade V1/V2
12
+ *
13
+ * TODOS os componentes migrados DEVEM usar este hook.
14
+ */
15
+ export declare function useArchbaseV1V2Compatibility<T>(componentName: string, dataSource: any, dataField?: string, initialValue?: T): {
16
+ isDataSourceV2: boolean;
17
+ dataSourceVersion: string;
18
+ currentValue: T;
19
+ v1State: {
20
+ currentValue: T;
21
+ setCurrentValue: import("react").Dispatch<import("react").SetStateAction<T>>;
22
+ forceUpdate: () => void;
23
+ };
24
+ v2State: {
25
+ v2Value: T;
26
+ setV2Value: import("react").Dispatch<import("react").SetStateAction<T>>;
27
+ v2ShouldUpdate: number;
28
+ };
29
+ loadDataSourceFieldValue: () => void;
30
+ dataSourceEvent: (event: DataSourceEvent<any>) => void;
31
+ handleValueChange: (newValue: T, event?: any) => void;
32
+ isReadOnly: any;
33
+ isEditing: any;
34
+ trackUsage: () => void;
35
+ };
36
+ /**
37
+ * Padrão para props de componentes compatíveis V1/V2
38
+ */
39
+ export interface ArchbaseV1V2CompatibleProps<T, ID> {
40
+ dataSource?: any;
41
+ dataField?: string;
42
+ value?: T;
43
+ defaultValue?: T;
44
+ disabled?: boolean;
45
+ readOnly?: boolean;
46
+ required?: boolean;
47
+ style?: React.CSSProperties;
48
+ width?: string | number;
49
+ height?: string | number;
50
+ onChangeValue?: (value: T, event: any) => void;
51
+ onFocusEnter?: React.FocusEventHandler<any>;
52
+ onFocusExit?: React.FocusEventHandler<any>;
53
+ innerRef?: React.RefObject<any>;
54
+ }
55
+ /**
56
+ * Utilitários para validação de migração
57
+ */
58
+ export declare const MigrationValidation: {
59
+ /**
60
+ * Valida se o componente está seguindo o padrão corretamente
61
+ */
62
+ validatePattern: (componentName: string, hooks: ReturnType<typeof useArchbaseV1V2Compatibility>) => boolean;
63
+ /**
64
+ * Testa se o comportamento V1 está preservado
65
+ */
66
+ testV1Compatibility: (componentName: string, dataSource: any) => boolean;
67
+ };
68
+ /**
69
+ * Exemplo de uso do padrão (para documentação)
70
+ */
71
+ export declare const USAGE_EXAMPLE = "\n// Em qualquer componente que use DataSource:\n\nimport { useArchbaseV1V2Compatibility } from '../core/patterns/ArchbaseV1V2CompatibilityPattern';\n\nexport function MyComponent<T, ID>({ dataSource, dataField, value, onChangeValue, ...props }) {\n // 1. USAR HOOK DE COMPATIBILIDADE (OBRIGAT\u00D3RIO)\n const {\n isDataSourceV2,\n currentValue,\n handleValueChange,\n dataSourceEvent,\n loadDataSourceFieldValue,\n isReadOnly\n } = useArchbaseV1V2Compatibility<T>(\n 'MyComponent',\n dataSource,\n dataField,\n value\n );\n\n // 2. SETUP DOS LISTENERS (OBRIGAT\u00D3RIO)\n useArchbaseDataSourceListener({\n dataSource,\n listener: dataSourceEvent\n });\n\n // 3. CARREGAMENTO INICIAL (OBRIGAT\u00D3RIO)\n useEffect(() => {\n loadDataSourceFieldValue();\n }, [loadDataSourceFieldValue]);\n\n // 4. HANDLER DE MUDAN\u00C7A (OBRIGAT\u00D3RIO)\n const handleChange = useCallback((newValue: T, event: any) => {\n handleValueChange(newValue, event);\n \n // Callback externo preservado\n if (onChangeValue) {\n onChangeValue(newValue, event);\n }\n }, [handleValueChange, onChangeValue]);\n\n // 5. RENDERIZA\u00C7\u00C3O CONDICIONAL (OBRIGAT\u00D3RIO)\n return (\n <SomeInput\n value={currentValue} // Usa valor correto baseado na vers\u00E3o\n onChange={handleChange}\n readOnly={isReadOnly}\n {...props}\n />\n );\n}\n";
72
+ export default useArchbaseV1V2Compatibility;