@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.
- package/README.md +57 -0
- package/dist/archbase-data-3.0.0.tgz +0 -0
- package/dist/datasource/ArchbaseDataSource.d.ts +472 -0
- package/dist/datasource/ArchbaseLocalFilterDataSource.d.ts +27 -0
- package/dist/datasource/ArchbaseRemoteDataSource.d.ts +17 -0
- package/dist/datasource/ArchbaseRemoteFilterDataSource.d.ts +28 -0
- package/dist/datasource/ArchbaseV1V2CompatibilityPattern.d.ts +72 -0
- package/dist/datasource/IArchbaseDataSourceBase.d.ts +111 -0
- package/dist/datasource/index.d.ts +10 -0
- package/dist/datasource/v2/ArchbaseDataSourceV2.d.ts +128 -0
- package/dist/datasource/v2/ArchbaseQueryIntegration.d.ts +210 -0
- package/dist/datasource/v2/ArchbaseQueryProvider.d.ts +79 -0
- package/dist/datasource/v2/ArchbaseRemoteDataSourceV2.d.ts +182 -0
- package/dist/datasource/v2/ArchbaseTanStackQueryIntegration.d.ts +132 -0
- package/dist/datasource/v2/index.d.ts +11 -0
- package/dist/datasource/v2/useArchbaseDataSourceV2.d.ts +143 -0
- package/dist/datasource/v2/useArchbaseRemoteDataSourceV2.d.ts +210 -0
- package/dist/hooks/index.d.ts +14 -0
- package/dist/hooks/useArchbaseDataSource.d.ts +15 -0
- package/dist/hooks/useArchbaseDataSourceListener.d.ts +7 -0
- package/dist/hooks/useArchbaseDidMount.d.ts +5 -0
- package/dist/hooks/useArchbaseDidUpdate.d.ts +6 -0
- package/dist/hooks/useArchbaseEventListener.d.ts +1 -0
- package/dist/hooks/useArchbaseForceRerender.d.ts +5 -0
- package/dist/hooks/useArchbaseForceUpdate.d.ts +5 -0
- package/dist/hooks/useArchbaseLocalFilterDataSource.d.ts +13 -0
- package/dist/hooks/useArchbaseRemoteDataSource.d.ts +36 -0
- package/dist/hooks/useArchbaseRemoteFilterDataSource.d.ts +34 -0
- package/dist/hooks/useArchbaseRemoteServiceApi.d.ts +2 -0
- package/dist/hooks/useArchbaseStore.d.ts +3 -0
- package/dist/hooks/useArchbaseWillUnmount.d.ts +5 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +3360 -0
- package/dist/service/ArchbaseRemoteApiService.d.ts +103 -0
- package/dist/service/index.d.ts +2 -0
- package/dist/types/ArchbaseStateValues.d.ts +9 -0
- package/dist/types/index.d.ts +1 -0
- 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;
|