@bootkit/ng0 0.0.0-alpha.18 → 0.0.0-alpha.19
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/data/index.d.ts +61 -59
- package/fesm2022/bootkit-ng0-data.mjs +52 -52
- package/fesm2022/bootkit-ng0-data.mjs.map +1 -1
- package/fesm2022/bootkit-ng0-form.mjs +117 -95
- package/fesm2022/bootkit-ng0-form.mjs.map +1 -1
- package/form/index.d.ts +46 -27
- package/package.json +9 -9
package/data/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import * as _angular_core from '@angular/core';
|
|
2
2
|
import * as rxjs from 'rxjs';
|
|
3
3
|
import { Observable, Subject } from 'rxjs';
|
|
4
|
+
import * as _bootkit_ng0_data from '@bootkit/ng0/data';
|
|
4
5
|
|
|
5
6
|
/**
|
|
6
7
|
* Boolean value comparer function type.
|
|
@@ -103,38 +104,9 @@ declare class DataResult<T = any> {
|
|
|
103
104
|
|
|
104
105
|
/**
|
|
105
106
|
* DataLoader is a function that takes a DataRequest and returns an Observable of DataResult.
|
|
106
|
-
* It is used by
|
|
107
|
+
* It is used by RemoteDataSource to load data asynchronously.
|
|
107
108
|
*/
|
|
108
109
|
type DataLoader<T = any> = (request: DataRequest) => Observable<DataResult<T>>;
|
|
109
|
-
/**
|
|
110
|
-
* RemoteDataSource is a DataSource that loads data asynchronously using a DataLoader function.
|
|
111
|
-
* It is used to fetch data from a remote source, such as an API.
|
|
112
|
-
*/
|
|
113
|
-
declare class RemoteDataSource extends DataSource {
|
|
114
|
-
private readonly loader;
|
|
115
|
-
readonly type = "remote";
|
|
116
|
-
constructor(loader: DataLoader);
|
|
117
|
-
load(request: DataRequest): Observable<DataResult<any>>;
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
/**
|
|
121
|
-
* DataSourceLike is a type that can be used to represent any data source
|
|
122
|
-
* that can be used with the table, autocomplete, dropdown and any component that requires data.
|
|
123
|
-
* It can be an array of data, a function that returns an observable of data,
|
|
124
|
-
* or an instance of DataSource.
|
|
125
|
-
*/
|
|
126
|
-
type DataSourceLike<T = any> = Array<any> | DataLoader<T> | DataSource<T> | Record<string, string | number> | // enum: extract enum or object values
|
|
127
|
-
undefined | null;
|
|
128
|
-
/**
|
|
129
|
-
* Converts a DataSourceLike to a DataSource instance.
|
|
130
|
-
* @param source The data source to convert.
|
|
131
|
-
* @returns A DataSource instance.
|
|
132
|
-
*/
|
|
133
|
-
declare function dataSourceAttribute<T>(source: DataSourceLike): DataSource<T>;
|
|
134
|
-
/**
|
|
135
|
-
* LogicalOperator is a list of predefined logical operators that can be used in data requests to filter data.
|
|
136
|
-
*/
|
|
137
|
-
type LogicalOperator = 'contains' | 'endsWith' | 'startsWith' | 'like' | 'eq' | 'ne' | 'gt' | 'gte' | 'lt' | 'lte';
|
|
138
110
|
interface DataSourceChange {
|
|
139
111
|
type: 'insert' | 'replace' | 'remove';
|
|
140
112
|
}
|
|
@@ -157,6 +129,54 @@ interface DataSourceItemRemove extends DataSourceChange {
|
|
|
157
129
|
interface DataSourceChangeEvent {
|
|
158
130
|
changes: Array<DataSourceItemInsert | DataSourceItemReplace | DataSourceItemRemove>;
|
|
159
131
|
}
|
|
132
|
+
/**
|
|
133
|
+
* Abstract base class for data sources.
|
|
134
|
+
* This class provides a common interface for loading data from various sources.
|
|
135
|
+
*/
|
|
136
|
+
declare abstract class DataSource<T = any> {
|
|
137
|
+
abstract readonly type: 'local' | 'remote';
|
|
138
|
+
protected changeSubject: Subject<DataSourceChangeEvent>;
|
|
139
|
+
protected loading: _angular_core.WritableSignal<boolean>;
|
|
140
|
+
/**
|
|
141
|
+
*
|
|
142
|
+
*/
|
|
143
|
+
readonly change: Observable<DataSourceChangeEvent>;
|
|
144
|
+
/**
|
|
145
|
+
* Indicates whether the data source is currently loading data.
|
|
146
|
+
*/
|
|
147
|
+
isLoading: _angular_core.Signal<boolean>;
|
|
148
|
+
/**
|
|
149
|
+
* Loads data from the data source.
|
|
150
|
+
* @param request The data request object containing pagination, sorting, and filtering information.
|
|
151
|
+
*/
|
|
152
|
+
abstract load(request: DataRequest): Observable<DataResult>;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* DataSourceLike is a type that can be used to represent any data source
|
|
156
|
+
* that can be used with the table, autocomplete, dropdown and any component that requires data.
|
|
157
|
+
* It can be an array of data, a function that returns an observable of data,
|
|
158
|
+
* or an instance of DataSource.
|
|
159
|
+
*/
|
|
160
|
+
type DataSourceLike<T = any> = Array<any> | DataLoader<T> | DataSource<T> | Record<string, string | number> | // enum: extract enum or object values
|
|
161
|
+
undefined | null;
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Converts a DataSourceLike to a DataSource instance.
|
|
165
|
+
* @param source The data source to convert.
|
|
166
|
+
* @returns A DataSource instance.
|
|
167
|
+
*/
|
|
168
|
+
declare function dataSourceAttribute<T>(source: DataSourceLike): DataSource<T>;
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* RemoteDataSource is a DataSource that loads data asynchronously using a DataLoader function.
|
|
172
|
+
* It is used to fetch data from a remote source, such as an API.
|
|
173
|
+
*/
|
|
174
|
+
declare class RemoteDataSource extends DataSource {
|
|
175
|
+
private readonly loader;
|
|
176
|
+
readonly type = "remote";
|
|
177
|
+
constructor(loader: DataLoader);
|
|
178
|
+
load(request: DataRequest): Observable<_bootkit_ng0_data.DataResult<any>>;
|
|
179
|
+
}
|
|
160
180
|
|
|
161
181
|
/**
|
|
162
182
|
* Value extractor function type.
|
|
@@ -188,6 +208,12 @@ declare class LocalDataSource extends DataSource {
|
|
|
188
208
|
readonly type = "local";
|
|
189
209
|
valueExtractor: (initialValue: ValueExtractor, options?: _angular_core.CreateSignalOptions<ValueExtractor> | undefined) => _angular_core.WritableSignal<ValueExtractor>;
|
|
190
210
|
constructor(items: any[]);
|
|
211
|
+
/**
|
|
212
|
+
* Creates a LocalDataSource from enum values.
|
|
213
|
+
* @param enumClass The enum class to extract values from.
|
|
214
|
+
* @returns A LocalDataSource containing the enum values.
|
|
215
|
+
*/
|
|
216
|
+
static fromEnum(enumClass: Record<string, string | number>): LocalDataSource;
|
|
191
217
|
load(request: DataRequest): rxjs.Observable<DataResult<any>>;
|
|
192
218
|
remove(index: any): void;
|
|
193
219
|
insert(index: number, ...items: any[]): void;
|
|
@@ -195,35 +221,6 @@ declare class LocalDataSource extends DataSource {
|
|
|
195
221
|
replace(index: number, newValue: any): void;
|
|
196
222
|
}
|
|
197
223
|
|
|
198
|
-
/**
|
|
199
|
-
* Abstract base class for data sources.
|
|
200
|
-
* This class provides a common interface for loading data from various sources.
|
|
201
|
-
*/
|
|
202
|
-
declare abstract class DataSource<T = any> {
|
|
203
|
-
abstract readonly type: 'local' | 'remote';
|
|
204
|
-
protected changeSubject: Subject<DataSourceChangeEvent>;
|
|
205
|
-
protected loading: _angular_core.WritableSignal<boolean>;
|
|
206
|
-
/**
|
|
207
|
-
*
|
|
208
|
-
*/
|
|
209
|
-
readonly change: Observable<DataSourceChangeEvent>;
|
|
210
|
-
/**
|
|
211
|
-
* Indicates whether the data source is currently loading data.
|
|
212
|
-
*/
|
|
213
|
-
isLoading: _angular_core.Signal<boolean>;
|
|
214
|
-
/**
|
|
215
|
-
* Loads data from the data source.
|
|
216
|
-
* @param request The data request object containing pagination, sorting, and filtering information.
|
|
217
|
-
*/
|
|
218
|
-
abstract load(request: DataRequest): Observable<DataResult>;
|
|
219
|
-
/**
|
|
220
|
-
* Creates a LocalDataSource from enum values.
|
|
221
|
-
* @param enumClass The enum class to extract values from.
|
|
222
|
-
* @returns A LocalDataSource containing the enum values.
|
|
223
|
-
*/
|
|
224
|
-
static fromEnum(enumClass: Record<string, string | number>): LocalDataSource;
|
|
225
|
-
}
|
|
226
|
-
|
|
227
224
|
declare function toDataResult<T = any>(dr: DataRequest): (source: Observable<any>) => Observable<DataResult<T>>;
|
|
228
225
|
|
|
229
226
|
/**
|
|
@@ -280,5 +277,10 @@ declare const stringFilter: FilterPredicate;
|
|
|
280
277
|
*/
|
|
281
278
|
declare function FilterPredicateAttribute(v: FilterPredicateLike): FilterPredicate;
|
|
282
279
|
|
|
280
|
+
/**
|
|
281
|
+
* LogicalOperator is a list of predefined logical operators that can be used in data requests to filter data.
|
|
282
|
+
*/
|
|
283
|
+
type LogicalOperator = 'contains' | 'endsWith' | 'startsWith' | 'like' | 'eq' | 'ne' | 'gt' | 'gte' | 'lt' | 'lte';
|
|
284
|
+
|
|
283
285
|
export { BooleanValueComparerAttribute, DataRequest, DataResult, DataSource, FilterPredicateAttribute, LocalDataSource, RemoteDataSource, ValueComparerAttribute, ValueExtractorAttribute, dataSourceAttribute, defaultBooleanValueComparer, defaultValueComparer, defaultValueExtractor, stringFilter, toDataResult };
|
|
284
286
|
export type { BooleanValueComparer, BooleanValueComparerLike, DataLoader, DataRequestFilter, DataRequestPage, DataRequestSort, DataSourceChange, DataSourceChangeEvent, DataSourceItemInsert, DataSourceItemRemove, DataSourceItemReplace, DataSourceLike, FilterPredicate, FilterPredicateLike, LogicalOperator, ValueComparer, ValueComparerLike, ValueExtractor, ValueExtractorLike };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Subject, of, catchError, tap, Observable } from 'rxjs';
|
|
2
2
|
import { signal } from '@angular/core';
|
|
3
3
|
import { getEnumValues } from '@bootkit/ng0/common';
|
|
4
4
|
|
|
@@ -64,6 +64,23 @@ class DataResult {
|
|
|
64
64
|
}
|
|
65
65
|
}
|
|
66
66
|
|
|
67
|
+
/**
|
|
68
|
+
* Abstract base class for data sources.
|
|
69
|
+
* This class provides a common interface for loading data from various sources.
|
|
70
|
+
*/
|
|
71
|
+
class DataSource {
|
|
72
|
+
changeSubject = new Subject();
|
|
73
|
+
loading = signal(false, ...(ngDevMode ? [{ debugName: "loading" }] : []));
|
|
74
|
+
/**
|
|
75
|
+
*
|
|
76
|
+
*/
|
|
77
|
+
change = this.changeSubject.asObservable();
|
|
78
|
+
/**
|
|
79
|
+
* Indicates whether the data source is currently loading data.
|
|
80
|
+
*/
|
|
81
|
+
isLoading = this.loading.asReadonly();
|
|
82
|
+
}
|
|
83
|
+
|
|
67
84
|
/**
|
|
68
85
|
* An implementation of DataSource that uses an array as the data source.
|
|
69
86
|
* This is useful for static data or when you want to manage the data manually.
|
|
@@ -77,6 +94,14 @@ class LocalDataSource extends DataSource {
|
|
|
77
94
|
super();
|
|
78
95
|
this.items = items;
|
|
79
96
|
}
|
|
97
|
+
/**
|
|
98
|
+
* Creates a LocalDataSource from enum values.
|
|
99
|
+
* @param enumClass The enum class to extract values from.
|
|
100
|
+
* @returns A LocalDataSource containing the enum values.
|
|
101
|
+
*/
|
|
102
|
+
static fromEnum(enumClass) {
|
|
103
|
+
return new LocalDataSource(getEnumValues(enumClass));
|
|
104
|
+
}
|
|
80
105
|
load(request) {
|
|
81
106
|
let filteredValues = [...this.items];
|
|
82
107
|
let result;
|
|
@@ -179,31 +204,6 @@ function getFilterFunction(requestfilter) {
|
|
|
179
204
|
}
|
|
180
205
|
}
|
|
181
206
|
|
|
182
|
-
/**
|
|
183
|
-
* Abstract base class for data sources.
|
|
184
|
-
* This class provides a common interface for loading data from various sources.
|
|
185
|
-
*/
|
|
186
|
-
class DataSource {
|
|
187
|
-
changeSubject = new Subject();
|
|
188
|
-
loading = signal(false, ...(ngDevMode ? [{ debugName: "loading" }] : []));
|
|
189
|
-
/**
|
|
190
|
-
*
|
|
191
|
-
*/
|
|
192
|
-
change = this.changeSubject.asObservable();
|
|
193
|
-
/**
|
|
194
|
-
* Indicates whether the data source is currently loading data.
|
|
195
|
-
*/
|
|
196
|
-
isLoading = this.loading.asReadonly();
|
|
197
|
-
/**
|
|
198
|
-
* Creates a LocalDataSource from enum values.
|
|
199
|
-
* @param enumClass The enum class to extract values from.
|
|
200
|
-
* @returns A LocalDataSource containing the enum values.
|
|
201
|
-
*/
|
|
202
|
-
static fromEnum(enumClass) {
|
|
203
|
-
return new LocalDataSource(getEnumValues(enumClass));
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
|
|
207
207
|
/**
|
|
208
208
|
* RemoteDataSource is a DataSource that loads data asynchronously using a DataLoader function.
|
|
209
209
|
* It is used to fetch data from a remote source, such as an API.
|
|
@@ -229,6 +229,32 @@ class RemoteDataSource extends DataSource {
|
|
|
229
229
|
}
|
|
230
230
|
}
|
|
231
231
|
|
|
232
|
+
/**
|
|
233
|
+
* Converts a DataSourceLike to a DataSource instance.
|
|
234
|
+
* @param source The data source to convert.
|
|
235
|
+
* @returns A DataSource instance.
|
|
236
|
+
*/
|
|
237
|
+
function dataSourceAttribute(source) {
|
|
238
|
+
if (Array.isArray(source)) {
|
|
239
|
+
return new LocalDataSource(source);
|
|
240
|
+
}
|
|
241
|
+
else if (typeof source == 'function') {
|
|
242
|
+
return new RemoteDataSource(source);
|
|
243
|
+
}
|
|
244
|
+
else if (source instanceof DataSource) {
|
|
245
|
+
return source;
|
|
246
|
+
}
|
|
247
|
+
else if (source === undefined || source === null) {
|
|
248
|
+
return new LocalDataSource([]);
|
|
249
|
+
}
|
|
250
|
+
else if (typeof source === 'object') {
|
|
251
|
+
return LocalDataSource.fromEnum(source);
|
|
252
|
+
}
|
|
253
|
+
else {
|
|
254
|
+
throw new Error('Invalid data source.');
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
|
|
232
258
|
function toDataResult(dr) {
|
|
233
259
|
return function (source) {
|
|
234
260
|
return new Observable(subscriber => {
|
|
@@ -320,32 +346,6 @@ function FilterPredicateAttribute(v) {
|
|
|
320
346
|
throw Error('invalid filter predicate');
|
|
321
347
|
}
|
|
322
348
|
|
|
323
|
-
/**
|
|
324
|
-
* Converts a DataSourceLike to a DataSource instance.
|
|
325
|
-
* @param source The data source to convert.
|
|
326
|
-
* @returns A DataSource instance.
|
|
327
|
-
*/
|
|
328
|
-
function dataSourceAttribute(source) {
|
|
329
|
-
if (Array.isArray(source)) {
|
|
330
|
-
return new LocalDataSource(source);
|
|
331
|
-
}
|
|
332
|
-
else if (typeof source == 'function') {
|
|
333
|
-
return new RemoteDataSource(source);
|
|
334
|
-
}
|
|
335
|
-
else if (source instanceof DataSource) {
|
|
336
|
-
return source;
|
|
337
|
-
}
|
|
338
|
-
else if (source === undefined || source === null) {
|
|
339
|
-
return new LocalDataSource([]);
|
|
340
|
-
}
|
|
341
|
-
else if (typeof source === 'object') {
|
|
342
|
-
return DataSource.fromEnum(source);
|
|
343
|
-
}
|
|
344
|
-
else {
|
|
345
|
-
throw new Error('Invalid data source.');
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
|
|
349
349
|
/**
|
|
350
350
|
* Generated bundle index. Do not edit.
|
|
351
351
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootkit-ng0-data.mjs","sources":["../../../projects/ng0/data/boolean-value-comparer.ts","../../../projects/ng0/data/data-request.ts","../../../projects/ng0/data/data-result.ts","../../../projects/ng0/data/local-data-source.ts","../../../projects/ng0/data/data-source.ts","../../../projects/ng0/data/remote-data-source.ts","../../../projects/ng0/data/data-result-operator.ts","../../../projects/ng0/data/value-extractor.ts","../../../projects/ng0/data/value-comparer.ts","../../../projects/ng0/data/filter.ts","../../../projects/ng0/data/types.ts","../../../projects/ng0/data/bootkit-ng0-data.ts"],"sourcesContent":["/**\r\n * Boolean value comparer function type.\r\n * @param a First value to compare.\r\n * @param b Second value to compare.\r\n * @returns true if a is considered equal to b else returns false\r\n */\r\nexport type BooleanValueComparer = (a: any, b: any) => boolean;\r\n\r\n/**\r\n * Boolean value comparer can be a function or a string representing the property name to compare.\r\n */\r\nexport type BooleanValueComparerLike = BooleanValueComparer | string;\r\n\r\n/**\r\n * Default value comparer function.\r\n * @param a \r\n * @param b \r\n * @returns true if a === b else returns false\r\n */\r\nexport function defaultBooleanValueComparer(a: any, b: any): boolean {\r\n return a === b;\r\n}\r\n\r\nexport function BooleanValueComparerAttribute(v: BooleanValueComparerLike): BooleanValueComparer {\r\n if (typeof v === 'function')\r\n return v;\r\n if (typeof v === 'string') {\r\n return (a: any, b: any) => {\r\n \r\n let a2 = typeof a === 'object' && a != null ? a[v] : a;\r\n let b2 = typeof b === 'object' && b != null ? b[v] : b;\r\n return a2 === b2;\r\n }\r\n }\r\n\r\n throw Error('invalid boolean value comparer');\r\n}\r\n","/**\r\n * DataRequest class represents a request for data with pagination, filtering, sorting, and field selection.\r\n * It is used to encapsulate the parameters needed to fetch data from a data source.\r\n * It can be used with various data sources such as HTTP services, in-memory arrays, etc.\r\n * \r\n */\r\nexport class DataRequest {\r\n public page?: DataRequestPage;\r\n public filters?: DataRequestFilter[];\r\n public sort?: DataRequestSort;\r\n public select?: string[];\r\n public computeTotal?: boolean;\r\n\r\n constructor(options?: {\r\n page?: DataRequestPage,\r\n filters?: DataRequestFilter[],\r\n sort?: DataRequestSort,\r\n select?: string[],\r\n computeTotal?: boolean,\r\n }) {\r\n this.page = options?.page;\r\n this.filters = options?.filters;\r\n this.sort = options?.sort;\r\n this.select = options?.select;\r\n this.computeTotal = options?.computeTotal;\r\n }\r\n}\r\n\r\n/**\r\n * Represents a data request page.\r\n */\r\nexport interface DataRequestPage {\r\n /**\r\n * Index of the page.\r\n * If zeroBased is true, the index starts from 0.\r\n */\r\n index: number;\r\n\r\n /**\r\n * Size of the page, i.e., number of items in each page.\r\n */\r\n size: number;\r\n\r\n /**\r\n * Indicates if the index is zero-based.\r\n */\r\n zeroBased: boolean;\r\n}\r\n\r\n/**\r\n * Represents a sorting option in a DataRequest.\r\n * @property field The field to sort by.\r\n * @property asc Whether to sort in ascending order.\r\n */\r\nexport interface DataRequestSort {\r\n field: string;\r\n asc?: boolean\r\n}\r\n\r\n/**\r\n * Represents a filter in a DataRequest.\r\n */\r\nexport interface DataRequestFilter {\r\n /**\r\n * The field to filter by.\r\n * It can be a string representing the property name of the data items.\r\n */\r\n field?: string;\r\n\r\n /**\r\n * The value to filter by.\r\n * It can be a string, number, or any other type depending on the field.\r\n */\r\n value?: string;\r\n\r\n /**\r\n * The operator to use for filtering.\r\n * It can be one of the standard filter operators like Contains, StartsWith, EndsWith, Equals, etc.\r\n */\r\n operator?: string;\r\n\r\n /**\r\n * Indicates if the filter is case-sensitive. only for text columns.\r\n * Default is false.\r\n */\r\n caseSensitive?: boolean;\r\n}\r\n\r\n// export enum DataRequestFilterOperator {\r\n// EQ = 0,\r\n// NEQ = 1,\r\n// LT = 2,\r\n// LTE = 3,\r\n// GT = 4,\r\n// GTE = 5,\r\n// LI = 6,\r\n// SW = 7,\r\n// }\r\n","export class DataResult<T = any> {\r\n constructor(\r\n public readonly data: T[],\r\n public readonly total?: number) {\r\n }\r\n}\r\n","import { of } from \"rxjs\";\r\nimport { DataRequest, DataRequestFilter } from \"./data-request\";\r\nimport { DataResult } from \"./data-result\";\r\nimport { DataSource } from \"./data-source\";\r\nimport { signal } from \"@angular/core\";\r\nimport { ValueExtractor } from \"./value-extractor\";\r\n\r\n/**\r\n * An implementation of DataSource that uses an array as the data source.\r\n * This is useful for static data or when you want to manage the data manually.\r\n */\r\nexport class LocalDataSource extends DataSource {\r\n readonly type = 'local';\r\n public valueExtractor = signal<ValueExtractor>\r\n // public valueComparer = signal<ValueComparerFunction>\r\n\r\n constructor(private items: any[]) {\r\n super();\r\n }\r\n\r\n load(request: DataRequest) {\r\n let filteredValues = [...this.items];\r\n let result: any[];\r\n\r\n // Filtering\r\n if (Array.isArray(request.filters) && request.filters.length > 0) {\r\n request.filters.forEach(filter => {\r\n if (!filter.field) {\r\n throw Error('DataRequestFilter \"field\" cannot be null.');\r\n }\r\n\r\n let isPassedByFilter = getFilterFunction(filter);\r\n\r\n for (let i = 0; i < filteredValues.length; i++) {\r\n let row = filteredValues[i];\r\n if (!isPassedByFilter(row[filter.field], filter.value)) {\r\n filteredValues.splice(i, 1);\r\n i--; // Adjust index after removal\r\n }\r\n }\r\n });\r\n }\r\n\r\n // Pagination\r\n if (request.page) {\r\n let startItemIndex = (request.page.zeroBased ? request.page.index : request.page.index - 1) * request.page.size;\r\n result = filteredValues.slice(startItemIndex, startItemIndex + request.page.size);\r\n } else {\r\n result = filteredValues;\r\n }\r\n\r\n // Sorting\r\n if (request.sort) {\r\n\r\n }\r\n\r\n let dataResult = new DataResult(result, filteredValues.length);\r\n\r\n // this._loading = true;\r\n // return of(result).pipe(\r\n // delay(5000),\r\n // tap(x => this._loading = false)\r\n // );\r\n return of(dataResult);\r\n }\r\n\r\n public remove(index: any) {\r\n if (index < 0) {\r\n throw Error('Invalid index');\r\n }\r\n\r\n this.items.splice(index, 1);\r\n this.changeSubject.next({ changes: [{ type: 'remove', index, count: 1 }] });\r\n }\r\n\r\n public insert(index: number, ...items: any[]) {\r\n this.items.splice(index, 0, ...items);\r\n this.changeSubject.next({ changes: [{ type: 'insert', items, index }] });\r\n }\r\n\r\n public push(...items: any[]) {\r\n let insertIndex = this.items.length;\r\n this.items.push(items);\r\n this.changeSubject.next({ changes: [{ type: 'insert', items, index: insertIndex }] });\r\n }\r\n\r\n public replace(index: number, newValue: any) {\r\n this.items[index] = newValue;\r\n this.changeSubject.next({ changes: [{ type: 'replace', value: newValue, index }] });\r\n }\r\n}\r\n\r\nfunction getFilterFunction(requestfilter: DataRequestFilter): (cellValue: any, filterValue: any) => boolean {\r\n let operator = requestfilter.operator || 'contains';\r\n let caseSensitive = requestfilter.caseSensitive || false;\r\n\r\n // if (requestfilter.value === undefined || requestfilter.value === null) {\r\n // return (item: any) => true; // No filter applied\r\n // }\r\n\r\n switch (requestfilter.operator) {\r\n case 'contains':\r\n return caseSensitive ?\r\n (item: string, filter: string) => item.includes(filter) :\r\n (item: string, filter: string) => item.toLowerCase().includes(filter.toLowerCase());\r\n\r\n case 'startsWith':\r\n return caseSensitive ?\r\n (item: string, filter: string) => item.startsWith(filter) :\r\n (item: string, filter: string) => item.toLowerCase().startsWith(filter.toLowerCase());\r\n\r\n case 'endsWith':\r\n return caseSensitive ?\r\n (item: string, filter: string) => item.endsWith(filter) :\r\n (item: string, filter: string) => item.toLowerCase().endsWith(filter.toLowerCase());\r\n\r\n case 'eq':\r\n if (typeof requestfilter.value === 'string') {\r\n return caseSensitive ?\r\n (item: string, filter: string) => item == filter :\r\n (item: string, filter: string) => item.toString().toLowerCase() === filter.toLowerCase();\r\n } else {\r\n return (item: any, filter: any) => item === filter;\r\n }\r\n\r\n case 'lt':\r\n return (item: any, filter: any) => item < filter;\r\n\r\n case 'lte':\r\n return (item: any, filter: any) => item <= filter;\r\n\r\n case 'gt':\r\n return (item: any, filter: any) => item > filter;\r\n\r\n case 'gte':\r\n return (item: any, filter: any) => item >= filter;\r\n\r\n case 'ne':\r\n return (item: any, filter: any) => item !== filter;\r\n\r\n default:\r\n throw new Error(`filter operator: ${operator} is not implemented in ArrayDataSource.`);\r\n }\r\n}","import { Observable, Subject } from \"rxjs\";\r\nimport { DataRequest } from \"./data-request\";\r\nimport { DataResult } from \"./data-result\";\r\nimport { signal } from \"@angular/core\";\r\nimport { DataSourceChangeEvent } from \"./types\";\r\nimport { LocalDataSource } from \"./local-data-source\";\r\nimport { getEnumValues } from \"@bootkit/ng0/common\";\r\n\r\n/**\r\n * Abstract base class for data sources.\r\n * This class provides a common interface for loading data from various sources.\r\n */\r\nexport abstract class DataSource<T = any> {\r\n abstract readonly type: 'local' | 'remote'; \r\n \r\n protected changeSubject = new Subject<DataSourceChangeEvent>();\r\n protected loading = signal(false);\r\n\r\n /**\r\n * \r\n */\r\n public readonly change = this.changeSubject.asObservable();\r\n\r\n /**\r\n * Indicates whether the data source is currently loading data.\r\n */\r\n public isLoading = this.loading.asReadonly();\r\n\r\n\r\n /**\r\n * Loads data from the data source.\r\n * @param request The data request object containing pagination, sorting, and filtering information.\r\n */\r\n abstract load(request: DataRequest): Observable<DataResult>;\r\n\r\n /**\r\n * Creates a LocalDataSource from enum values.\r\n * @param enumClass The enum class to extract values from.\r\n * @returns A LocalDataSource containing the enum values.\r\n */\r\n public static fromEnum(enumClass: Record<string, string | number>): LocalDataSource {\r\n return new LocalDataSource(getEnumValues(enumClass));\r\n }\r\n}\r\n","import { catchError, Observable, tap } from \"rxjs\";\r\nimport { DataRequest } from \"./data-request\";\r\nimport { DataResult } from \"./data-result\";\r\nimport { DataSource } from \"./data-source\";\r\n\r\n/**\r\n * DataLoader is a function that takes a DataRequest and returns an Observable of DataResult.\r\n * It is used by AsyncDataSource to load data asynchronously.\r\n */\r\nexport type DataLoader<T = any> = (request: DataRequest) => Observable<DataResult<T>>;\r\n\r\n\r\n/**\r\n * RemoteDataSource is a DataSource that loads data asynchronously using a DataLoader function.\r\n * It is used to fetch data from a remote source, such as an API.\r\n */\r\nexport class RemoteDataSource extends DataSource {\r\n readonly type = 'remote';\r\n\r\n constructor(private readonly loader: DataLoader) {\r\n super();\r\n\r\n if (typeof loader !== 'function') {\r\n throw 'Invalid data loader';\r\n }\r\n }\r\n\r\n load(request: DataRequest) {\r\n this.loading.set(true);\r\n\r\n return this.loader(request).pipe(\r\n catchError(err => {\r\n this.loading.set(false);\r\n throw err;\r\n }),\r\n tap(res => {\r\n this.loading.set(false);\r\n })\r\n )\r\n }\r\n}\r\n","import { Observable } from \"rxjs\";\r\nimport { DataResult } from \"./data-result\";\r\nimport { DataRequest } from \"./data-request\";\r\n\r\nexport function toDataResult<T=any>(dr: DataRequest) {\r\n return function (source: Observable<any>): Observable<DataResult<T>> {\r\n return new Observable(subscriber => {\r\n source.subscribe({\r\n next(event) {\r\n subscriber.next(new DataResult(event));\r\n },\r\n error(error) {\r\n subscriber.error(error);\r\n },\r\n complete() {\r\n subscriber.complete();\r\n }\r\n });\r\n });\r\n }\r\n}\r\n","/**\r\n * Value extractor function type.\r\n */\r\nexport type ValueExtractor = (a: any) => any;\r\n\r\n/**\r\n * Value extractor can be a function or a string representing the property name to extract.\r\n */\r\nexport type ValueExtractorLike = ValueExtractor | string;\r\n\r\n\r\n/**\r\n * Default value extractor function.\r\n * @param a The input value\r\n * @returns the input value\r\n */\r\nexport function defaultValueExtractor(a: any): any {\r\n return a;\r\n}\r\n\r\n/**\r\n * Converts a ValueExtractorLike to a ValueExtractorFunction.\r\n * @param v The value extractor to convert.\r\n * @returns A function that extracts the desired value.\r\n */\r\nexport function ValueExtractorAttribute(v: ValueExtractorLike): ValueExtractor {\r\n if (typeof v === 'function')\r\n return v;\r\n if (typeof v === 'string') {\r\n return (item: any) => item ? item[v] : undefined;\r\n }\r\n\r\n throw Error('invalid value extractor');\r\n}\r\n","/**\r\n * A comparison function type that defines an ordering relation between two values.\r\n * @param a The first value to compare.\r\n * @param b The second value to compare.\r\n * @returns\r\n * - A negative number if `a` should come before `b`\r\n * - A positive number if `a` should come after `b`\r\n * - Zero if `a` and `b` are considered equal\r\n */\r\nexport type ValueComparer = (a: any, b: any) => number;\r\n\r\n/**\r\n * Value comparer can be a function or a string representing the property name to compare.\r\n */\r\nexport type ValueComparerLike = ValueComparer | string;\r\n\r\n/**\r\n * Default value comparer function.\r\n * @param a \r\n * @param b \r\n * @returns -1 if a < b, 1 if a > b, 0 if a === b\r\n */\r\nexport function defaultValueComparer(a: any, b: any): number {\r\n return a === b ? 0 : a < b ? -1 : 1;\r\n}\r\n\r\n/**\r\n * Converts a ValueComparerLike to a ValueComparerFunction.\r\n * @param v The value comparer to convert.\r\n * @returns A function that compares two values.\r\n */\r\nexport function ValueComparerAttribute(v: ValueComparerLike): ValueComparer {\r\n if (typeof v === 'function')\r\n return v;\r\n if (typeof v === 'string') {\r\n return (a: any, b: any) => a?.[v] === b?.[v] ? 0 : a?.[v] < b?.[v] ? -1 : 1;\r\n }\r\n\r\n throw Error('invalid value comparer');\r\n}\r\n","/**\r\n * Filter predicate function type.\r\n * @param item The item to test against the filter.\r\n * @param params Additional parameters to pass to the filter function.\r\n * @returns True if the item matches the filter, false otherwise.\r\n */\r\nexport type FilterPredicate = (item: any, ...params: any[]) => boolean;\r\n\r\n/**\r\n * Filter predicate can be a function or a string representing the property name to filter.\r\n */\r\nexport type FilterPredicateLike = FilterPredicate | string;\r\n\r\n/**\r\n * A filter predicate that checks if a string contains the filter criteria (case insensitive).\r\n * @param item The item to test against the filter.\r\n * @param criteria The filter criteria.\r\n * @returns True if the item matches the filter, false otherwise.\r\n */\r\nexport const stringFilter: FilterPredicate = (item: string, criteria?: string) => {\r\n if (criteria == null || criteria == '' || item == null || item === '') {\r\n return true;\r\n }\r\n\r\n return item.toString().toLowerCase().includes(criteria.toString().toLowerCase());\r\n}\r\n\r\n/**\r\n * Converts a FilterPredicateLike to a FilterPredicate function.\r\n * If the input is a string, it creates a predicate that checks the property with that name.\r\n * @param v The FilterPredicateLike to convert.\r\n * @returns The corresponding FilterPredicate function.\r\n */\r\nexport function FilterPredicateAttribute(v: FilterPredicateLike): FilterPredicate {\r\n if (typeof v === 'function')\r\n return v;\r\n if (typeof v === 'string') {\r\n let predicate: FilterPredicate = (item: any, criteria?: string) => stringFilter(item?.[v], criteria);\r\n return predicate;\r\n }\r\n\r\n throw Error('invalid filter predicate');\r\n}\r\n","import { LocalDataSource } from \"./local-data-source\";\r\nimport { RemoteDataSource, DataLoader } from \"./remote-data-source\";\r\nimport { DataSource } from \"./data-source\";\r\n\r\n/**\r\n * DataSourceLike is a type that can be used to represent any data source\r\n * that can be used with the table, autocomplete, dropdown and any component that requires data.\r\n * It can be an array of data, a function that returns an observable of data,\r\n * or an instance of DataSource.\r\n */\r\nexport type DataSourceLike<T = any> =\r\n Array<any> |\r\n DataLoader<T> |\r\n DataSource<T> |\r\n Record<string, string | number> | // enum: extract enum or object values\r\n undefined |\r\n null;\r\n\r\n/**\r\n * Converts a DataSourceLike to a DataSource instance.\r\n * @param source The data source to convert.\r\n * @returns A DataSource instance.\r\n */\r\nexport function dataSourceAttribute<T>(source: DataSourceLike): DataSource<T> {\r\n if (Array.isArray(source)) {\r\n return new LocalDataSource(source);\r\n } else if (typeof source == 'function') {\r\n return new RemoteDataSource(source);\r\n } else if (source instanceof DataSource) {\r\n return source;\r\n } else if (source === undefined || source === null) {\r\n return new LocalDataSource([]);\r\n } else if (typeof source === 'object') {\r\n return DataSource.fromEnum(source);\r\n } else {\r\n throw new Error('Invalid data source.');\r\n }\r\n}\r\n\r\n/**\r\n * LogicalOperator is a list of predefined logical operators that can be used in data requests to filter data.\r\n */\r\nexport type LogicalOperator =\r\n | 'contains'\r\n | 'endsWith'\r\n | 'startsWith'\r\n | 'like'\r\n | 'eq'\r\n | 'ne'\r\n | 'gt'\r\n | 'gte'\r\n | 'lt'\r\n | 'lte';\r\n\r\nexport interface DataSourceChange {\r\n type: 'insert' | 'replace' | 'remove';\r\n}\r\n\r\nexport interface DataSourceItemInsert extends DataSourceChange {\r\n type: 'insert'\r\n\r\n /** Insert index */\r\n index?: number;\r\n items: any[];\r\n}\r\n\r\nexport interface DataSourceItemReplace extends DataSourceChange {\r\n type: 'replace'\r\n index: number;\r\n value: any;\r\n}\r\n\r\nexport interface DataSourceItemRemove extends DataSourceChange {\r\n type: 'remove'\r\n index: number;\r\n count?: number\r\n}\r\n\r\n\r\nexport interface DataSourceChangeEvent {\r\n changes: Array<DataSourceItemInsert | DataSourceItemReplace | DataSourceItemRemove>\r\n}","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"bootkit-ng0-data.mjs","sources":["../../../projects/ng0/data/boolean-value-comparer.ts","../../../projects/ng0/data/data-request.ts","../../../projects/ng0/data/data-result.ts","../../../projects/ng0/data/data-source.ts","../../../projects/ng0/data/local-data-source.ts","../../../projects/ng0/data/remote-data-source.ts","../../../projects/ng0/data/data-source-attribute.ts","../../../projects/ng0/data/data-result-operator.ts","../../../projects/ng0/data/value-extractor.ts","../../../projects/ng0/data/value-comparer.ts","../../../projects/ng0/data/filter.ts","../../../projects/ng0/data/bootkit-ng0-data.ts"],"sourcesContent":["/**\r\n * Boolean value comparer function type.\r\n * @param a First value to compare.\r\n * @param b Second value to compare.\r\n * @returns true if a is considered equal to b else returns false\r\n */\r\nexport type BooleanValueComparer = (a: any, b: any) => boolean;\r\n\r\n/**\r\n * Boolean value comparer can be a function or a string representing the property name to compare.\r\n */\r\nexport type BooleanValueComparerLike = BooleanValueComparer | string;\r\n\r\n/**\r\n * Default value comparer function.\r\n * @param a \r\n * @param b \r\n * @returns true if a === b else returns false\r\n */\r\nexport function defaultBooleanValueComparer(a: any, b: any): boolean {\r\n return a === b;\r\n}\r\n\r\nexport function BooleanValueComparerAttribute(v: BooleanValueComparerLike): BooleanValueComparer {\r\n if (typeof v === 'function')\r\n return v;\r\n if (typeof v === 'string') {\r\n return (a: any, b: any) => {\r\n \r\n let a2 = typeof a === 'object' && a != null ? a[v] : a;\r\n let b2 = typeof b === 'object' && b != null ? b[v] : b;\r\n return a2 === b2;\r\n }\r\n }\r\n\r\n throw Error('invalid boolean value comparer');\r\n}\r\n","/**\r\n * DataRequest class represents a request for data with pagination, filtering, sorting, and field selection.\r\n * It is used to encapsulate the parameters needed to fetch data from a data source.\r\n * It can be used with various data sources such as HTTP services, in-memory arrays, etc.\r\n * \r\n */\r\nexport class DataRequest {\r\n public page?: DataRequestPage;\r\n public filters?: DataRequestFilter[];\r\n public sort?: DataRequestSort;\r\n public select?: string[];\r\n public computeTotal?: boolean;\r\n\r\n constructor(options?: {\r\n page?: DataRequestPage,\r\n filters?: DataRequestFilter[],\r\n sort?: DataRequestSort,\r\n select?: string[],\r\n computeTotal?: boolean,\r\n }) {\r\n this.page = options?.page;\r\n this.filters = options?.filters;\r\n this.sort = options?.sort;\r\n this.select = options?.select;\r\n this.computeTotal = options?.computeTotal;\r\n }\r\n}\r\n\r\n/**\r\n * Represents a data request page.\r\n */\r\nexport interface DataRequestPage {\r\n /**\r\n * Index of the page.\r\n * If zeroBased is true, the index starts from 0.\r\n */\r\n index: number;\r\n\r\n /**\r\n * Size of the page, i.e., number of items in each page.\r\n */\r\n size: number;\r\n\r\n /**\r\n * Indicates if the index is zero-based.\r\n */\r\n zeroBased: boolean;\r\n}\r\n\r\n/**\r\n * Represents a sorting option in a DataRequest.\r\n * @property field The field to sort by.\r\n * @property asc Whether to sort in ascending order.\r\n */\r\nexport interface DataRequestSort {\r\n field: string;\r\n asc?: boolean\r\n}\r\n\r\n/**\r\n * Represents a filter in a DataRequest.\r\n */\r\nexport interface DataRequestFilter {\r\n /**\r\n * The field to filter by.\r\n * It can be a string representing the property name of the data items.\r\n */\r\n field?: string;\r\n\r\n /**\r\n * The value to filter by.\r\n * It can be a string, number, or any other type depending on the field.\r\n */\r\n value?: string;\r\n\r\n /**\r\n * The operator to use for filtering.\r\n * It can be one of the standard filter operators like Contains, StartsWith, EndsWith, Equals, etc.\r\n */\r\n operator?: string;\r\n\r\n /**\r\n * Indicates if the filter is case-sensitive. only for text columns.\r\n * Default is false.\r\n */\r\n caseSensitive?: boolean;\r\n}\r\n\r\n// export enum DataRequestFilterOperator {\r\n// EQ = 0,\r\n// NEQ = 1,\r\n// LT = 2,\r\n// LTE = 3,\r\n// GT = 4,\r\n// GTE = 5,\r\n// LI = 6,\r\n// SW = 7,\r\n// }\r\n","export class DataResult<T = any> {\r\n constructor(\r\n public readonly data: T[],\r\n public readonly total?: number) {\r\n }\r\n}\r\n","import { Observable, Subject } from \"rxjs\";\r\nimport { DataRequest } from \"./data-request\";\r\nimport { DataResult } from \"./data-result\";\r\nimport { signal } from \"@angular/core\";\r\n\r\n/**\r\n * DataLoader is a function that takes a DataRequest and returns an Observable of DataResult.\r\n * It is used by RemoteDataSource to load data asynchronously.\r\n */\r\nexport type DataLoader<T = any> = (request: DataRequest) => Observable<DataResult<T>>;\r\n\r\n\r\nexport interface DataSourceChange {\r\n type: 'insert' | 'replace' | 'remove';\r\n}\r\n\r\nexport interface DataSourceItemInsert extends DataSourceChange {\r\n type: 'insert'\r\n\r\n /** Insert index */\r\n index?: number;\r\n items: any[];\r\n}\r\n\r\nexport interface DataSourceItemReplace extends DataSourceChange {\r\n type: 'replace'\r\n index: number;\r\n value: any;\r\n}\r\n\r\nexport interface DataSourceItemRemove extends DataSourceChange {\r\n type: 'remove'\r\n index: number;\r\n count?: number\r\n}\r\n\r\n\r\nexport interface DataSourceChangeEvent {\r\n changes: Array<DataSourceItemInsert | DataSourceItemReplace | DataSourceItemRemove>\r\n}\r\n\r\n\r\n/**\r\n * Abstract base class for data sources.\r\n * This class provides a common interface for loading data from various sources.\r\n */\r\nexport abstract class DataSource<T = any> {\r\n abstract readonly type: 'local' | 'remote'; \r\n \r\n protected changeSubject = new Subject<DataSourceChangeEvent>();\r\n protected loading = signal(false);\r\n\r\n /**\r\n * \r\n */\r\n public readonly change = this.changeSubject.asObservable();\r\n\r\n /**\r\n * Indicates whether the data source is currently loading data.\r\n */\r\n public isLoading = this.loading.asReadonly();\r\n\r\n\r\n /**\r\n * Loads data from the data source.\r\n * @param request The data request object containing pagination, sorting, and filtering information.\r\n */\r\n abstract load(request: DataRequest): Observable<DataResult>;\r\n}\r\n\r\n/**\r\n * DataSourceLike is a type that can be used to represent any data source\r\n * that can be used with the table, autocomplete, dropdown and any component that requires data.\r\n * It can be an array of data, a function that returns an observable of data,\r\n * or an instance of DataSource.\r\n */\r\nexport type DataSourceLike<T = any> =\r\n Array<any> |\r\n DataLoader<T> |\r\n DataSource<T> |\r\n Record<string, string | number> | // enum: extract enum or object values\r\n undefined |\r\n null;\r\n","import { of } from \"rxjs\";\r\nimport { DataRequest, DataRequestFilter } from \"./data-request\";\r\nimport { DataResult } from \"./data-result\";\r\nimport { DataSource } from \"./data-source\";\r\nimport { signal } from \"@angular/core\";\r\nimport { ValueExtractor } from \"./value-extractor\";\r\nimport { getEnumValues } from \"@bootkit/ng0/common\";\r\n\r\n/**\r\n * An implementation of DataSource that uses an array as the data source.\r\n * This is useful for static data or when you want to manage the data manually.\r\n */\r\nexport class LocalDataSource extends DataSource {\r\n readonly type = 'local';\r\n public valueExtractor = signal<ValueExtractor>\r\n // public valueComparer = signal<ValueComparerFunction>\r\n\r\n constructor(private items: any[]) {\r\n super();\r\n }\r\n\r\n /**\r\n * Creates a LocalDataSource from enum values.\r\n * @param enumClass The enum class to extract values from.\r\n * @returns A LocalDataSource containing the enum values.\r\n */\r\n public static fromEnum(enumClass: Record<string, string | number>): LocalDataSource {\r\n return new LocalDataSource(getEnumValues(enumClass));\r\n }\r\n\r\n load(request: DataRequest) {\r\n let filteredValues = [...this.items];\r\n let result: any[];\r\n\r\n // Filtering\r\n if (Array.isArray(request.filters) && request.filters.length > 0) {\r\n request.filters.forEach(filter => {\r\n if (!filter.field) {\r\n throw Error('DataRequestFilter \"field\" cannot be null.');\r\n }\r\n\r\n let isPassedByFilter = getFilterFunction(filter);\r\n\r\n for (let i = 0; i < filteredValues.length; i++) {\r\n let row = filteredValues[i];\r\n if (!isPassedByFilter(row[filter.field], filter.value)) {\r\n filteredValues.splice(i, 1);\r\n i--; // Adjust index after removal\r\n }\r\n }\r\n });\r\n }\r\n\r\n // Pagination\r\n if (request.page) {\r\n let startItemIndex = (request.page.zeroBased ? request.page.index : request.page.index - 1) * request.page.size;\r\n result = filteredValues.slice(startItemIndex, startItemIndex + request.page.size);\r\n } else {\r\n result = filteredValues;\r\n }\r\n\r\n // Sorting\r\n if (request.sort) {\r\n\r\n }\r\n\r\n let dataResult = new DataResult(result, filteredValues.length);\r\n\r\n // this._loading = true;\r\n // return of(result).pipe(\r\n // delay(5000),\r\n // tap(x => this._loading = false)\r\n // );\r\n return of(dataResult);\r\n }\r\n\r\n public remove(index: any) {\r\n if (index < 0) {\r\n throw Error('Invalid index');\r\n }\r\n\r\n this.items.splice(index, 1);\r\n this.changeSubject.next({ changes: [{ type: 'remove', index, count: 1 }] });\r\n }\r\n\r\n public insert(index: number, ...items: any[]) {\r\n this.items.splice(index, 0, ...items);\r\n this.changeSubject.next({ changes: [{ type: 'insert', items, index }] });\r\n }\r\n\r\n public push(...items: any[]) {\r\n let insertIndex = this.items.length;\r\n this.items.push(items);\r\n this.changeSubject.next({ changes: [{ type: 'insert', items, index: insertIndex }] });\r\n }\r\n\r\n public replace(index: number, newValue: any) {\r\n this.items[index] = newValue;\r\n this.changeSubject.next({ changes: [{ type: 'replace', value: newValue, index }] });\r\n }\r\n}\r\n\r\nfunction getFilterFunction(requestfilter: DataRequestFilter): (cellValue: any, filterValue: any) => boolean {\r\n let operator = requestfilter.operator || 'contains';\r\n let caseSensitive = requestfilter.caseSensitive || false;\r\n\r\n // if (requestfilter.value === undefined || requestfilter.value === null) {\r\n // return (item: any) => true; // No filter applied\r\n // }\r\n\r\n switch (requestfilter.operator) {\r\n case 'contains':\r\n return caseSensitive ?\r\n (item: string, filter: string) => item.includes(filter) :\r\n (item: string, filter: string) => item.toLowerCase().includes(filter.toLowerCase());\r\n\r\n case 'startsWith':\r\n return caseSensitive ?\r\n (item: string, filter: string) => item.startsWith(filter) :\r\n (item: string, filter: string) => item.toLowerCase().startsWith(filter.toLowerCase());\r\n\r\n case 'endsWith':\r\n return caseSensitive ?\r\n (item: string, filter: string) => item.endsWith(filter) :\r\n (item: string, filter: string) => item.toLowerCase().endsWith(filter.toLowerCase());\r\n\r\n case 'eq':\r\n if (typeof requestfilter.value === 'string') {\r\n return caseSensitive ?\r\n (item: string, filter: string) => item == filter :\r\n (item: string, filter: string) => item.toString().toLowerCase() === filter.toLowerCase();\r\n } else {\r\n return (item: any, filter: any) => item === filter;\r\n }\r\n\r\n case 'lt':\r\n return (item: any, filter: any) => item < filter;\r\n\r\n case 'lte':\r\n return (item: any, filter: any) => item <= filter;\r\n\r\n case 'gt':\r\n return (item: any, filter: any) => item > filter;\r\n\r\n case 'gte':\r\n return (item: any, filter: any) => item >= filter;\r\n\r\n case 'ne':\r\n return (item: any, filter: any) => item !== filter;\r\n\r\n default:\r\n throw new Error(`filter operator: ${operator} is not implemented in ArrayDataSource.`);\r\n }\r\n}","import { catchError, Observable, tap } from \"rxjs\";\r\nimport { DataRequest } from \"./data-request\";\r\nimport { DataLoader, DataSource } from \"./data-source\";\r\n\r\n\r\n/**\r\n * RemoteDataSource is a DataSource that loads data asynchronously using a DataLoader function.\r\n * It is used to fetch data from a remote source, such as an API.\r\n */\r\nexport class RemoteDataSource extends DataSource {\r\n readonly type = 'remote';\r\n\r\n constructor(private readonly loader: DataLoader) {\r\n super();\r\n\r\n if (typeof loader !== 'function') {\r\n throw 'Invalid data loader';\r\n }\r\n }\r\n\r\n load(request: DataRequest) {\r\n this.loading.set(true);\r\n\r\n return this.loader(request).pipe(\r\n catchError(err => {\r\n this.loading.set(false);\r\n throw err;\r\n }),\r\n tap(res => {\r\n this.loading.set(false);\r\n })\r\n )\r\n }\r\n}\r\n","import { LocalDataSource } from \"./local-data-source\";\r\nimport { RemoteDataSource } from \"./remote-data-source\";\r\nimport { DataSource, DataSourceLike } from \"./data-source\";\r\n\r\n/**\r\n * Converts a DataSourceLike to a DataSource instance.\r\n * @param source The data source to convert.\r\n * @returns A DataSource instance.\r\n */\r\nexport function dataSourceAttribute<T>(source: DataSourceLike): DataSource<T> {\r\n if (Array.isArray(source)) {\r\n return new LocalDataSource(source);\r\n } else if (typeof source == 'function') {\r\n return new RemoteDataSource(source);\r\n } else if (source instanceof DataSource) {\r\n return source;\r\n } else if (source === undefined || source === null) {\r\n return new LocalDataSource([]);\r\n } else if (typeof source === 'object') {\r\n return LocalDataSource.fromEnum(source);\r\n } else {\r\n throw new Error('Invalid data source.');\r\n }\r\n}\r\n","import { Observable } from \"rxjs\";\r\nimport { DataResult } from \"./data-result\";\r\nimport { DataRequest } from \"./data-request\";\r\n\r\nexport function toDataResult<T=any>(dr: DataRequest) {\r\n return function (source: Observable<any>): Observable<DataResult<T>> {\r\n return new Observable(subscriber => {\r\n source.subscribe({\r\n next(event) {\r\n subscriber.next(new DataResult(event));\r\n },\r\n error(error) {\r\n subscriber.error(error);\r\n },\r\n complete() {\r\n subscriber.complete();\r\n }\r\n });\r\n });\r\n }\r\n}\r\n","/**\r\n * Value extractor function type.\r\n */\r\nexport type ValueExtractor = (a: any) => any;\r\n\r\n/**\r\n * Value extractor can be a function or a string representing the property name to extract.\r\n */\r\nexport type ValueExtractorLike = ValueExtractor | string;\r\n\r\n\r\n/**\r\n * Default value extractor function.\r\n * @param a The input value\r\n * @returns the input value\r\n */\r\nexport function defaultValueExtractor(a: any): any {\r\n return a;\r\n}\r\n\r\n/**\r\n * Converts a ValueExtractorLike to a ValueExtractorFunction.\r\n * @param v The value extractor to convert.\r\n * @returns A function that extracts the desired value.\r\n */\r\nexport function ValueExtractorAttribute(v: ValueExtractorLike): ValueExtractor {\r\n if (typeof v === 'function')\r\n return v;\r\n if (typeof v === 'string') {\r\n return (item: any) => item ? item[v] : undefined;\r\n }\r\n\r\n throw Error('invalid value extractor');\r\n}\r\n","/**\r\n * A comparison function type that defines an ordering relation between two values.\r\n * @param a The first value to compare.\r\n * @param b The second value to compare.\r\n * @returns\r\n * - A negative number if `a` should come before `b`\r\n * - A positive number if `a` should come after `b`\r\n * - Zero if `a` and `b` are considered equal\r\n */\r\nexport type ValueComparer = (a: any, b: any) => number;\r\n\r\n/**\r\n * Value comparer can be a function or a string representing the property name to compare.\r\n */\r\nexport type ValueComparerLike = ValueComparer | string;\r\n\r\n/**\r\n * Default value comparer function.\r\n * @param a \r\n * @param b \r\n * @returns -1 if a < b, 1 if a > b, 0 if a === b\r\n */\r\nexport function defaultValueComparer(a: any, b: any): number {\r\n return a === b ? 0 : a < b ? -1 : 1;\r\n}\r\n\r\n/**\r\n * Converts a ValueComparerLike to a ValueComparerFunction.\r\n * @param v The value comparer to convert.\r\n * @returns A function that compares two values.\r\n */\r\nexport function ValueComparerAttribute(v: ValueComparerLike): ValueComparer {\r\n if (typeof v === 'function')\r\n return v;\r\n if (typeof v === 'string') {\r\n return (a: any, b: any) => a?.[v] === b?.[v] ? 0 : a?.[v] < b?.[v] ? -1 : 1;\r\n }\r\n\r\n throw Error('invalid value comparer');\r\n}\r\n","/**\r\n * Filter predicate function type.\r\n * @param item The item to test against the filter.\r\n * @param params Additional parameters to pass to the filter function.\r\n * @returns True if the item matches the filter, false otherwise.\r\n */\r\nexport type FilterPredicate = (item: any, ...params: any[]) => boolean;\r\n\r\n/**\r\n * Filter predicate can be a function or a string representing the property name to filter.\r\n */\r\nexport type FilterPredicateLike = FilterPredicate | string;\r\n\r\n/**\r\n * A filter predicate that checks if a string contains the filter criteria (case insensitive).\r\n * @param item The item to test against the filter.\r\n * @param criteria The filter criteria.\r\n * @returns True if the item matches the filter, false otherwise.\r\n */\r\nexport const stringFilter: FilterPredicate = (item: string, criteria?: string) => {\r\n if (criteria == null || criteria == '' || item == null || item === '') {\r\n return true;\r\n }\r\n\r\n return item.toString().toLowerCase().includes(criteria.toString().toLowerCase());\r\n}\r\n\r\n/**\r\n * Converts a FilterPredicateLike to a FilterPredicate function.\r\n * If the input is a string, it creates a predicate that checks the property with that name.\r\n * @param v The FilterPredicateLike to convert.\r\n * @returns The corresponding FilterPredicate function.\r\n */\r\nexport function FilterPredicateAttribute(v: FilterPredicateLike): FilterPredicate {\r\n if (typeof v === 'function')\r\n return v;\r\n if (typeof v === 'string') {\r\n let predicate: FilterPredicate = (item: any, criteria?: string) => stringFilter(item?.[v], criteria);\r\n return predicate;\r\n }\r\n\r\n throw Error('invalid filter predicate');\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { Input, Directive, input, forwardRef, HostListener,
|
|
2
|
+
import { Input, Directive, inject, ElementRef, Renderer2, input, numberAttribute, booleanAttribute, forwardRef, HostListener, NgModule } from '@angular/core';
|
|
3
3
|
import { NG_VALUE_ACCESSOR, NG_VALIDATORS, Validators } from '@angular/forms';
|
|
4
4
|
import { formatNumber } from '@angular/common';
|
|
5
5
|
|
|
@@ -58,108 +58,125 @@ const Keys = {
|
|
|
58
58
|
home: 'Home',
|
|
59
59
|
end: 'End'
|
|
60
60
|
};
|
|
61
|
+
/**
|
|
62
|
+
* Directive to allow only number input in text fields.
|
|
63
|
+
* It supports integer and decimal numbers, negative numbers, min/max values, thousands separator.
|
|
64
|
+
*/
|
|
61
65
|
class NumberDirective {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
66
|
+
_value;
|
|
67
|
+
_decimalSeparator;
|
|
68
|
+
_thousandsSeparator = ',';
|
|
69
|
+
_onChangeCallback;
|
|
70
|
+
_onTouchedCallback;
|
|
71
|
+
_elmRef = inject((ElementRef));
|
|
72
|
+
_renderer = inject(Renderer2);
|
|
73
|
+
/**
|
|
74
|
+
* The minimum number of digits to display after the decimal point.
|
|
75
|
+
* Applied only when 'numberType' is set to 'decimal'.
|
|
76
|
+
* @default 1
|
|
77
|
+
*/
|
|
78
|
+
minFractionDigits = input(1, ...(ngDevMode ? [{ debugName: "minFractionDigits", transform: numberAttribute }] : [{ transform: numberAttribute }]));
|
|
79
|
+
/**
|
|
80
|
+
* The maximum number of digits to display after the decimal point.
|
|
81
|
+
* Applied only when 'numberType' is set to 'decimal'.
|
|
82
|
+
* @default 2
|
|
83
|
+
*/
|
|
84
|
+
maxFractionDigits = input(2, ...(ngDevMode ? [{ debugName: "maxFractionDigits", transform: numberAttribute }] : [{ transform: numberAttribute }]));
|
|
85
|
+
/**
|
|
86
|
+
* Whether to use grouping separators, such as thousands separators
|
|
87
|
+
* @default false
|
|
88
|
+
*/
|
|
89
|
+
useGrouping = input(false, ...(ngDevMode ? [{ debugName: "useGrouping", transform: booleanAttribute }] : [{ transform: booleanAttribute }]));
|
|
90
|
+
/**
|
|
91
|
+
* Type of numbers to allow
|
|
92
|
+
* 'decimal' - allow decimal numbers
|
|
93
|
+
* 'integer' - allow integer numbers only
|
|
94
|
+
* @default 'integer'
|
|
95
|
+
*/
|
|
68
96
|
numberType = input('integer', ...(ngDevMode ? [{ debugName: "numberType" }] : []));
|
|
69
|
-
|
|
70
|
-
onTouched = () => { };
|
|
71
|
-
decimalSeparator;
|
|
72
|
-
thousandsSeparator = ',';
|
|
73
|
-
selectionStart = 0;
|
|
74
|
-
selectionEnd = 0;
|
|
75
|
-
isCursorInsideIntegerPart = false;
|
|
76
|
-
decimalSeparatorPosition = -1;
|
|
77
|
-
value;
|
|
78
|
-
setProperty = (prop, value) => this.renderer.setProperty(this.el.nativeElement, prop, value);
|
|
79
|
-
constructor(el, renderer) {
|
|
80
|
-
this.el = el;
|
|
81
|
-
this.renderer = renderer;
|
|
82
|
-
}
|
|
97
|
+
constructor() { }
|
|
83
98
|
ngOnInit() {
|
|
84
99
|
// Use Intl.NumberFormat to find decimal separator for locale
|
|
85
100
|
const formatted = formatNumber(1.1, 'en', '1.1-1');
|
|
86
|
-
this.
|
|
101
|
+
this._decimalSeparator = formatted.replace(/\d/g, '') || '.';
|
|
87
102
|
}
|
|
88
103
|
registerOnChange(fn) {
|
|
89
|
-
this.
|
|
104
|
+
this._onChangeCallback = fn;
|
|
90
105
|
}
|
|
91
106
|
registerOnTouched(fn) {
|
|
92
|
-
this.
|
|
107
|
+
this._onTouchedCallback = fn;
|
|
93
108
|
}
|
|
94
109
|
setDisabledState(isDisabled) {
|
|
95
|
-
this.
|
|
110
|
+
// this._setProperty('disabled', isDisabled);
|
|
96
111
|
}
|
|
97
112
|
writeValue(value) {
|
|
98
113
|
var inputValue;
|
|
99
114
|
if (value === undefined || value === null) {
|
|
100
115
|
inputValue = '';
|
|
101
|
-
this.
|
|
116
|
+
this._value = undefined;
|
|
102
117
|
}
|
|
103
118
|
else if (typeof value === 'number') {
|
|
104
|
-
inputValue = this.
|
|
105
|
-
this.
|
|
119
|
+
inputValue = this._formatNumber(value);
|
|
120
|
+
this._value = value;
|
|
106
121
|
}
|
|
107
122
|
else if (typeof value === 'string') {
|
|
108
|
-
const parsedValue = this.
|
|
109
|
-
inputValue = this.
|
|
123
|
+
const parsedValue = this._value = Number.parseFloat(value);
|
|
124
|
+
inputValue = this._formatNumber(parsedValue);
|
|
110
125
|
}
|
|
111
126
|
else {
|
|
112
127
|
console.error('NumberDirective: Unsupported value type', value);
|
|
113
128
|
inputValue = 'Invalid';
|
|
114
129
|
}
|
|
115
|
-
this.
|
|
130
|
+
this._setProperty('value', inputValue);
|
|
116
131
|
}
|
|
117
|
-
|
|
118
|
-
this.updateCursorInfo();
|
|
119
|
-
if (!this.isKeyAllowed(event.key)) {
|
|
120
|
-
event.preventDefault();
|
|
121
|
-
return;
|
|
122
|
-
}
|
|
132
|
+
_onKeyDown(event) {
|
|
123
133
|
const key = event.key;
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
134
|
+
const state = this._getInputState();
|
|
135
|
+
if (this._isAllowedKey(key)) {
|
|
136
|
+
if (key == Keys.backspace) {
|
|
137
|
+
if (state.selectionStart > 1 && (state.selectionStart === state.selectionEnd)) {
|
|
138
|
+
let value = this._elmRef.nativeElement.value;
|
|
139
|
+
let beforeSelection = value.charAt(state.selectionStart - 1);
|
|
140
|
+
if (beforeSelection === ',') {
|
|
141
|
+
// If the character before the cursor is a comma, we need to skip it
|
|
142
|
+
this._setProperty('selectionStart', state.selectionStart - 2);
|
|
143
|
+
}
|
|
131
144
|
}
|
|
132
145
|
}
|
|
133
146
|
}
|
|
147
|
+
else {
|
|
148
|
+
event.preventDefault();
|
|
149
|
+
}
|
|
134
150
|
}
|
|
135
|
-
|
|
136
|
-
if (
|
|
137
|
-
this.
|
|
138
|
-
this.
|
|
151
|
+
_onInput(value) {
|
|
152
|
+
if (value === '') {
|
|
153
|
+
this._value = undefined;
|
|
154
|
+
this._onChangeCallback?.(undefined);
|
|
139
155
|
return;
|
|
140
156
|
}
|
|
141
|
-
this.
|
|
142
|
-
if (this.
|
|
143
|
-
this.
|
|
157
|
+
const state = this._getInputState();
|
|
158
|
+
if (state.isCursorInsideIntegerPart && this.useGrouping()) {
|
|
159
|
+
this._formatIntegerPart(value);
|
|
144
160
|
}
|
|
145
|
-
var number = Number(removeChar(this.
|
|
146
|
-
this.
|
|
147
|
-
this.
|
|
161
|
+
var number = Number(removeChar(this._elmRef.nativeElement.value, this._thousandsSeparator));
|
|
162
|
+
this._value = isNaN(number) ? undefined : number;
|
|
163
|
+
this._onChangeCallback?.(this._value);
|
|
148
164
|
}
|
|
149
|
-
|
|
165
|
+
_formatIntegerPart(value) {
|
|
150
166
|
// Format the input value
|
|
151
|
-
const integerPart = value.split(this.
|
|
152
|
-
const decimalPart = value.split(this.
|
|
167
|
+
const integerPart = value.split(this._decimalSeparator)[0];
|
|
168
|
+
const decimalPart = value.split(this._decimalSeparator)[1];
|
|
153
169
|
if (integerPart.length <= 3) {
|
|
154
170
|
return;
|
|
155
171
|
}
|
|
156
|
-
let normalizedIntegerPart = removeChar(integerPart, this.
|
|
172
|
+
let normalizedIntegerPart = removeChar(integerPart, this._thousandsSeparator); // Remove commas
|
|
157
173
|
let formattedValue = addThousandsSeparator(normalizedIntegerPart);
|
|
158
174
|
if (decimalPart !== undefined) {
|
|
159
|
-
formattedValue += this.
|
|
175
|
+
formattedValue += this._decimalSeparator + decimalPart;
|
|
160
176
|
}
|
|
161
|
-
this.
|
|
177
|
+
this._setProperty('value', formattedValue);
|
|
162
178
|
let newSelectionStart;
|
|
179
|
+
let state = this._getInputState();
|
|
163
180
|
// fix the cursor position after formatting
|
|
164
181
|
if (value.length == 1) {
|
|
165
182
|
newSelectionStart = 1;
|
|
@@ -167,36 +184,36 @@ class NumberDirective {
|
|
|
167
184
|
else {
|
|
168
185
|
const newValueLength = formattedValue.length;
|
|
169
186
|
const cursorJump = newValueLength - value.length;
|
|
170
|
-
newSelectionStart = Math.max(0,
|
|
187
|
+
newSelectionStart = Math.max(0, state.selectionStart + cursorJump);
|
|
171
188
|
}
|
|
172
|
-
this.
|
|
173
|
-
this.
|
|
189
|
+
this._setProperty('selectionStart', newSelectionStart);
|
|
190
|
+
this._setProperty('selectionEnd', newSelectionStart);
|
|
174
191
|
// return formattedValue;
|
|
175
192
|
}
|
|
176
|
-
|
|
177
|
-
if (this.
|
|
178
|
-
let formattedValue = this.
|
|
179
|
-
this.
|
|
193
|
+
_onBlur() {
|
|
194
|
+
if (this._value !== undefined) {
|
|
195
|
+
let formattedValue = this._formatNumber(this._value);
|
|
196
|
+
this._setProperty('value', formattedValue);
|
|
180
197
|
}
|
|
181
|
-
this.
|
|
198
|
+
this._onTouchedCallback?.();
|
|
182
199
|
}
|
|
183
|
-
|
|
200
|
+
_onPaste(event) {
|
|
184
201
|
// event.
|
|
185
202
|
// value = value.trim();
|
|
186
203
|
}
|
|
187
|
-
|
|
188
|
-
let value = this.
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
}
|
|
204
|
+
_getInputState() {
|
|
205
|
+
let value = this._elmRef.nativeElement.value;
|
|
206
|
+
let decimalSeparatorPosition = value.indexOf(this._decimalSeparator);
|
|
207
|
+
let selectionStart = this._elmRef.nativeElement.selectionStart || 0;
|
|
208
|
+
let selectionEnd = this._elmRef.nativeElement.selectionEnd || 0;
|
|
209
|
+
return {
|
|
210
|
+
selectionStart,
|
|
211
|
+
selectionEnd,
|
|
212
|
+
decimalSeparatorPosition,
|
|
213
|
+
isCursorInsideIntegerPart: decimalSeparatorPosition > -1 ? (selectionStart <= decimalSeparatorPosition) : true
|
|
214
|
+
};
|
|
198
215
|
}
|
|
199
|
-
|
|
216
|
+
_formatNumber(n) {
|
|
200
217
|
var isInteger = this.numberType() == 'integer';
|
|
201
218
|
return new Intl.NumberFormat('en-US', {
|
|
202
219
|
useGrouping: this.useGrouping(),
|
|
@@ -205,10 +222,11 @@ class NumberDirective {
|
|
|
205
222
|
style: 'decimal',
|
|
206
223
|
}).format(n);
|
|
207
224
|
}
|
|
208
|
-
|
|
225
|
+
_isAllowedKey(key) {
|
|
209
226
|
const allowedKeys = [Keys.backspace, Keys.tab, Keys.arrowLeft, Keys.arrowRight, Keys.delete, Keys.home, Keys.end];
|
|
210
|
-
const input = this.
|
|
227
|
+
const input = this._elmRef.nativeElement;
|
|
211
228
|
const value = input.value;
|
|
229
|
+
const state = this._getInputState();
|
|
212
230
|
if (allowedKeys.includes(key)) {
|
|
213
231
|
return true; // allow control/navigation keys
|
|
214
232
|
}
|
|
@@ -217,31 +235,35 @@ class NumberDirective {
|
|
|
217
235
|
return (input.selectionStart === 0 || input.selectionEnd === 0) && value.charAt(0) !== '-';
|
|
218
236
|
}
|
|
219
237
|
// Allow one dot for decimal
|
|
220
|
-
if (key === this.
|
|
238
|
+
if (key === this._decimalSeparator) {
|
|
221
239
|
return (this.numberType() == 'decimal') &&
|
|
222
|
-
(!value.includes(this.
|
|
223
|
-
(
|
|
240
|
+
(!value.includes(this._decimalSeparator)) &&
|
|
241
|
+
(state.selectionStart == input.value.length);
|
|
224
242
|
}
|
|
225
243
|
// Allow numbers only
|
|
226
244
|
if (/^\d$/.test(key)) {
|
|
227
|
-
if (
|
|
245
|
+
if (state.isCursorInsideIntegerPart) {
|
|
228
246
|
return true;
|
|
229
247
|
}
|
|
230
248
|
else {
|
|
231
|
-
var decimalPart = value.split(this.
|
|
249
|
+
var decimalPart = value.split(this._decimalSeparator)[1];
|
|
232
250
|
var maxFractionDigits = this.maxFractionDigits();
|
|
233
251
|
if (maxFractionDigits != undefined && decimalPart.length < maxFractionDigits) {
|
|
234
252
|
return true;
|
|
235
253
|
}
|
|
236
254
|
else {
|
|
237
|
-
return
|
|
255
|
+
return input.selectionStart !== input.selectionEnd; // allow a new digit if a substring is selected
|
|
238
256
|
}
|
|
239
257
|
}
|
|
240
258
|
}
|
|
241
259
|
return false;
|
|
242
260
|
}
|
|
243
|
-
|
|
244
|
-
|
|
261
|
+
_setProperty(prop, value) {
|
|
262
|
+
this._renderer.setProperty(this._elmRef.nativeElement, prop, value);
|
|
263
|
+
}
|
|
264
|
+
;
|
|
265
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: NumberDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
266
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.2.1", type: NumberDirective, isStandalone: true, selector: "[ng0Number]", inputs: { minFractionDigits: { classPropertyName: "minFractionDigits", publicName: "minFractionDigits", isSignal: true, isRequired: false, transformFunction: null }, maxFractionDigits: { classPropertyName: "maxFractionDigits", publicName: "maxFractionDigits", isSignal: true, isRequired: false, transformFunction: null }, useGrouping: { classPropertyName: "useGrouping", publicName: "useGrouping", isSignal: true, isRequired: false, transformFunction: null }, numberType: { classPropertyName: "numberType", publicName: "numberType", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "keydown": "_onKeyDown($event)", "input": "_onInput($event.target.value)", "blur": "_onBlur()", "paste": "_onPaste($event)" } }, providers: [
|
|
245
267
|
{
|
|
246
268
|
provide: NG_VALUE_ACCESSOR,
|
|
247
269
|
useExisting: forwardRef(() => NumberDirective),
|
|
@@ -261,16 +283,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.1", ngImpor
|
|
|
261
283
|
}
|
|
262
284
|
]
|
|
263
285
|
}]
|
|
264
|
-
}], ctorParameters: () => [
|
|
286
|
+
}], ctorParameters: () => [], propDecorators: { _onKeyDown: [{
|
|
265
287
|
type: HostListener,
|
|
266
288
|
args: ['keydown', ['$event']]
|
|
267
|
-
}],
|
|
289
|
+
}], _onInput: [{
|
|
268
290
|
type: HostListener,
|
|
269
291
|
args: ['input', ['$event.target.value']]
|
|
270
|
-
}],
|
|
292
|
+
}], _onBlur: [{
|
|
271
293
|
type: HostListener,
|
|
272
294
|
args: ['blur']
|
|
273
|
-
}],
|
|
295
|
+
}], _onPaste: [{
|
|
274
296
|
type: HostListener,
|
|
275
297
|
args: ['paste', ['$event']]
|
|
276
298
|
}] } });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootkit-ng0-form.mjs","sources":["../../../projects/ng0/form/focus.directive.ts","../../../projects/ng0/form/number.directive.ts","../../../projects/ng0/form/validation/validators/equal-with/equal-with-validator.ts","../../../projects/ng0/form/validation/validators/equal-with/equal-with.directive.ts","../../../projects/ng0/form/validation/validators/url/url-validator.ts","../../../projects/ng0/form/validation/validators/url/url-validator.directive.ts","../../../projects/ng0/form/validation/validators/custom/custom-validator.directive.ts","../../../projects/ng0/form/validation/validators/min/min-validator.directive.ts","../../../projects/ng0/form/validation/validators/max/max-validator.directive.ts","../../../projects/ng0/form/form.module.ts","../../../projects/ng0/form/public-api.ts","../../../projects/ng0/form/bootkit-ng0-form.ts"],"sourcesContent":["import { Directive, ElementRef, Input, OnChanges, SimpleChanges, OnInit } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[ng0Focus]',\r\n exportAs: 'ng0Focus',\r\n standalone: true\r\n})\r\nexport class FocusDirective implements OnInit, OnChanges {\r\n /** \r\n * \r\n */\r\n @Input() focusOnLoad = true;\r\n @Input() focusWhen?: boolean;\r\n private focused = false;\r\n\r\n constructor(private elementRef: ElementRef) {\r\n }\r\n\r\n ngOnInit(): void {\r\n if (this.focusOnLoad) {\r\n setTimeout(() => {\r\n this.elementRef.nativeElement.focus();\r\n });\r\n }\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['focusWhen']) {\r\n if (this.focusWhen) {\r\n setTimeout(() => {\r\n this.elementRef.nativeElement.focus();\r\n });\r\n }\r\n }\r\n }\r\n}\r\n","import { Directive, HostListener, forwardRef, ElementRef, Renderer2, input } from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { formatNumber } from '@angular/common';\r\n\r\nconst addThousandsSeparator = (str: string) => str.replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\r\nconst isValidNumber = (str: string) => str.trim() !== '' && !isNaN(Number(str));\r\nconst removeChar = (str: string, charToRemove: string) => str.split(charToRemove).join('');\r\n\r\nconst Keys = {\r\n backspace: 'Backspace',\r\n tab: 'Tab',\r\n arrowLeft: 'ArrowLeft',\r\n arrowRight: 'ArrowRight',\r\n delete: 'Delete',\r\n home: 'Home',\r\n end: 'End'\r\n}\r\n\r\n@Directive({\r\n selector: '[ng0Number]',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => NumberDirective),\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class NumberDirective implements ControlValueAccessor {\r\n /** */\r\n minFractionDigits = input<number | undefined>(3);\r\n maxFractionDigits = input<number| undefined>(10);\r\n useGrouping = input<boolean>(false);\r\n numberType = input<'decimal' | 'integer'>('integer');\r\n private onChange = (_: any) => { };\r\n private onTouched = () => { };\r\n private decimalSeparator!: string;\r\n private thousandsSeparator: string = ',';\r\n private selectionStart: number = 0;\r\n private selectionEnd: number = 0;\r\n private isCursorInsideIntegerPart: boolean = false;\r\n private decimalSeparatorPosition = -1;\r\n private value?: number;\r\n private setProperty = (prop: string, value: any) => this.renderer.setProperty(this.el.nativeElement, prop, value);\r\n\r\n constructor(\r\n private el: ElementRef<HTMLInputElement>,\r\n private renderer: Renderer2,\r\n // private locale: Locale,\r\n ) { }\r\n\r\n ngOnInit() {\r\n // Use Intl.NumberFormat to find decimal separator for locale\r\n const formatted = formatNumber(1.1, 'en', '1.1-1');\r\n this.decimalSeparator = formatted.replace(/\\d/g, '') || '.';\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState?(isDisabled: boolean): void {\r\n this.setProperty('disabled', isDisabled);\r\n }\r\n\r\n writeValue(value: any): void {\r\n var inputValue: string;\r\n\r\n if (value === undefined || value === null) {\r\n inputValue = '';\r\n this.value = undefined;\r\n } else if (typeof value === 'number') {\r\n inputValue = this.formatNumber(value);\r\n this.value = value;\r\n }\r\n else if (typeof value === 'string') {\r\n const parsedValue = this.value = Number.parseFloat(value);\r\n inputValue = this.formatNumber(parsedValue);\r\n } else {\r\n console.error('NumberDirective: Unsupported value type', value);\r\n inputValue = 'Invalid';\r\n }\r\n\r\n this.setProperty('value', inputValue);\r\n }\r\n\r\n @HostListener('keydown', ['$event'])\r\n private onKeyDown(event: KeyboardEvent) {\r\n this.updateCursorInfo();\r\n\r\n if (!this.isKeyAllowed(event.key)) {\r\n event.preventDefault();\r\n return;\r\n }\r\n\r\n const key = event.key;\r\n\r\n if (key == Keys.backspace) {\r\n if (this.selectionStart > 1 && (this.selectionStart === this.selectionEnd)) {\r\n let value = this.el.nativeElement.value;\r\n let beforeSelection = value.charAt(this.selectionStart - 1);\r\n if (beforeSelection === ',') {\r\n // If the character before the cursor is a comma, we need to skip it\r\n this.setProperty('selectionStart', this.selectionStart - 2);\r\n }\r\n }\r\n }\r\n }\r\n\r\n @HostListener('input', ['$event.target.value'])\r\n private onInput(s: string) {\r\n if (s === '') {\r\n this.value = undefined;\r\n this.onChange(undefined);\r\n return;\r\n }\r\n\r\n this.updateCursorInfo();\r\n\r\n if (this.isCursorInsideIntegerPart) {\r\n this.formatIntegerPart(s);\r\n }\r\n\r\n var number = Number(removeChar(this.el.nativeElement.value, this.thousandsSeparator));\r\n this.value = isNaN(number) ? undefined : number;\r\n this.onChange(this.value);\r\n }\r\n\r\n private formatIntegerPart(value: string) {\r\n // Format the input value\r\n const integerPart = value.split(this.decimalSeparator)[0];\r\n const decimalPart = value.split(this.decimalSeparator)[1];\r\n\r\n if (integerPart.length <= 3) {\r\n return;\r\n }\r\n\r\n let normalizedIntegerPart = removeChar(integerPart, this.thousandsSeparator); // Remove commas\r\n\r\n let formattedValue = addThousandsSeparator(normalizedIntegerPart);\r\n if (decimalPart !== undefined) {\r\n formattedValue += this.decimalSeparator + decimalPart;\r\n }\r\n\r\n this.setProperty('value', formattedValue);\r\n let newSelectionStart: number;\r\n\r\n // fix the cursor position after formatting\r\n if (value.length == 1) {\r\n newSelectionStart = 1;\r\n } else {\r\n const newValueLength = formattedValue.length;\r\n const cursorJump = newValueLength - value.length;\r\n newSelectionStart = Math.max(0, this.selectionStart + cursorJump);\r\n }\r\n\r\n this.setProperty('selectionStart', newSelectionStart);\r\n this.setProperty('selectionEnd', newSelectionStart);\r\n\r\n // return formattedValue;\r\n }\r\n\r\n @HostListener('blur')\r\n private onBlur() {\r\n if (this.value !== undefined) {\r\n let formattedValue = this.formatNumber(this.value);\r\n this.setProperty('value', formattedValue);\r\n }\r\n\r\n this.onTouched();\r\n }\r\n\r\n @HostListener('paste', ['$event'])\r\n private onPaste(event: ClipboardEvent) {\r\n // event.\r\n // value = value.trim();\r\n }\r\n\r\n private updateCursorInfo() {\r\n let value = this.el.nativeElement.value;\r\n this.selectionStart = this.el.nativeElement.selectionStart || 0;\r\n this.selectionEnd = this.el.nativeElement.selectionEnd || 0;\r\n\r\n this.decimalSeparatorPosition = value.indexOf(this.decimalSeparator);\r\n if (this.decimalSeparatorPosition > -1) {\r\n this.isCursorInsideIntegerPart = (this.selectionStart <= this.decimalSeparatorPosition);\r\n } else {\r\n this.isCursorInsideIntegerPart = true;\r\n }\r\n }\r\n\r\n private formatNumber(n: number): string {\r\n var isInteger = this.numberType() == 'integer';\r\n return new Intl.NumberFormat('en-US', {\r\n useGrouping: this.useGrouping(),\r\n minimumFractionDigits: isInteger ? 0 : this.minFractionDigits(),\r\n maximumFractionDigits: isInteger ? 0 : this.maxFractionDigits(),\r\n style: 'decimal',\r\n }).format(n);\r\n }\r\n\r\n private isKeyAllowed(key: string) {\r\n const allowedKeys = [Keys.backspace, Keys.tab, Keys.arrowLeft, Keys.arrowRight, Keys.delete, Keys.home, Keys.end];\r\n const input = this.el.nativeElement;\r\n const value = input.value;\r\n\r\n if (allowedKeys.includes(key)) {\r\n return true; // allow control/navigation keys\r\n }\r\n\r\n // Allow one leading minus\r\n if (key === '-') {\r\n return (input.selectionStart === 0 || input.selectionEnd === 0) && value.charAt(0) !== '-';\r\n }\r\n\r\n // Allow one dot for decimal\r\n if (key === this.decimalSeparator) {\r\n return (this.numberType() == 'decimal') &&\r\n (!value.includes(this.decimalSeparator)) &&\r\n (this.selectionStart == input.value.length);\r\n }\r\n\r\n // Allow numbers only\r\n if (/^\\d$/.test(key)) {\r\n if (this.isCursorInsideIntegerPart) {\r\n return true;\r\n } else {\r\n var decimalPart = value.split(this.decimalSeparator)[1];\r\n var maxFractionDigits = this.maxFractionDigits();\r\n if (maxFractionDigits != undefined && decimalPart.length < maxFractionDigits) {\r\n return true;\r\n } else {\r\n return this.selectionStart !== this.selectionEnd; // allow a new digit if a substring is selected\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n}\r\n","import { AbstractControl, ValidatorFn } from '@angular/forms';\r\n\r\nexport function equalWithValidator(targetValue?: string, inequalityMessage?: string): ValidatorFn {\r\n return (control: AbstractControl): { [key: string]: any } | null => {\r\n const isValid = control.value === targetValue;\r\n\r\n return isValid ? null :\r\n {\r\n equalWith: {\r\n value: control.value,\r\n message: inequalityMessage\r\n }\r\n };\r\n };\r\n}\r\n","import { Directive, Input } from '@angular/core';\r\nimport { AbstractControl, NG_VALIDATORS, Validator } from '@angular/forms';\r\nimport { equalWithValidator } from './equal-with-validator';\r\n\r\n@Directive({\r\n selector: '[ng0EqualWith]',\r\n exportAs: 'ng0EqualWith',\r\n standalone: true,\r\n providers: [\r\n { provide: NG_VALIDATORS, useExisting: EqualWithValidatorDirective, multi: true }\r\n ]\r\n})\r\nexport class EqualWithValidatorDirective implements Validator {\r\n @Input('ng0EqualWith') targetValue?: string;\r\n @Input() inequalityMessage?: string;\r\n\r\n constructor() {\r\n }\r\n\r\n validate(control: AbstractControl): { [key: string]: any } | null {\r\n return equalWithValidator(this.targetValue, this.inequalityMessage)(control);\r\n }\r\n}\r\n","import { AbstractControl, ValidatorFn } from '@angular/forms';\r\nconst urlRegEx = new RegExp('(https?://)?([\\\\da-z.-]+)\\\\.([a-z.]{2,6})[/\\\\w .-]*/?');\r\n\r\nexport function urlValidator(): ValidatorFn {\r\n return (control: AbstractControl): { [key: string]: any } | null => {\r\n const value = (control.value as string);\r\n if (!value || urlRegEx.test(value)) {\r\n return null;\r\n } else {\r\n return {\r\n 'url': {\r\n value\r\n }\r\n };\r\n }\r\n };\r\n}","import { Directive, Input } from '@angular/core';\r\nimport { FormControl, NG_VALIDATORS, ValidationErrors, Validator } from '@angular/forms';\r\nimport { urlValidator } from './url-validator';\r\n\r\n@Directive({\r\n selector: 'input[ng0Url]',\r\n exportAs: 'ng0Url',\r\n standalone: true,\r\n providers: [{ provide: NG_VALIDATORS, useExisting: UrlValidatorDirective, multi: true }]\r\n})\r\nexport class UrlValidatorDirective implements Validator {\r\n /** Directive is enabled or disabled */\r\n @Input() iscUrl?: boolean | string = true;\r\n\r\n validate(control: FormControl): ValidationErrors | null {\r\n return urlValidator()(control);\r\n }\r\n}\r\n","import { Directive, input, Input } from '@angular/core';\r\nimport { AbstractControl, NG_VALIDATORS, ValidationErrors, Validator } from '@angular/forms';\r\n\r\n@Directive({\r\n selector: '[ng0CustomValidator]',\r\n exportAs: 'ng0CustomValidator',\r\n standalone: true,\r\n providers: [\r\n { provide: NG_VALIDATORS, useExisting: CustomValidatorDirective, multi: true }\r\n ]\r\n})\r\nexport class CustomValidatorDirective implements Validator {\r\n validator = input.required<(value: any) => ValidationErrors | null>({alias: 'ng0CustomValidator'});\r\n\r\n constructor() { }\r\n\r\n validate(control: AbstractControl): ValidationErrors | null {\r\n return this.validator()(control);\r\n }\r\n}\r\n","import { Directive, input, numberAttribute } from '@angular/core';\r\nimport { AbstractControl, NG_VALIDATORS, ValidationErrors, Validator, Validators } from '@angular/forms';\r\n\r\n/** Min validator */\r\n@Directive({\r\n selector: 'input[type=text][ng0Number][min]',\r\n exportAs: 'ng0Min',\r\n standalone: true,\r\n providers: [{\r\n provide: NG_VALIDATORS,\r\n useExisting: MinValidatorDirective,\r\n multi: true\r\n }]\r\n})\r\nexport class MinValidatorDirective implements Validator {\r\n min = input.required<number, number | string | undefined | null>({\r\n transform: numberAttribute,\r\n });\r\n\r\n validate(control: AbstractControl): ValidationErrors | null {\r\n return Validators.min(this.min())(control);\r\n }\r\n}\r\n","import { Directive, input, numberAttribute } from '@angular/core';\r\nimport { AbstractControl, NG_VALIDATORS, ValidationErrors, Validator, Validators } from '@angular/forms';\r\n\r\n/** Max validator */\r\n@Directive({\r\n selector: 'input[type=text][ng0Number][max]',\r\n exportAs: 'ng0Max',\r\n standalone: true,\r\n providers: [{\r\n provide: NG_VALIDATORS,\r\n useExisting: MaxValidatorDirective,\r\n multi: true\r\n }]\r\n})\r\nexport class MaxValidatorDirective implements Validator {\r\n max = input.required<number, number | string | undefined | null>({\r\n transform: numberAttribute,\r\n });\r\n\r\n validate(control: AbstractControl): ValidationErrors | null {\r\n return Validators.max(this.max())(control);\r\n }\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { EqualWithValidatorDirective } from './validation/validators/equal-with/equal-with.directive';\r\nimport { UrlValidatorDirective } from './validation/validators/url/url-validator.directive';\r\nimport { CustomValidatorDirective } from './validation/validators/custom/custom-validator.directive';\r\nimport { MinValidatorDirective } from './validation/validators/min/min-validator.directive';\r\nimport { MaxValidatorDirective } from './validation/validators/max/max-validator.directive';\r\nimport { NumberDirective } from './number.directive';\r\n\r\nconst items = [\r\n // ErrorDirective,\r\n // FirstErrorDirective,\r\n NumberDirective,\r\n\r\n // Validators\r\n MinValidatorDirective,\r\n MaxValidatorDirective,\r\n EqualWithValidatorDirective,\r\n UrlValidatorDirective,\r\n CustomValidatorDirective,\r\n];\r\n\r\n@NgModule({\r\n imports: items,\r\n exports: items,\r\n})\r\nexport class FormModule { }\r\n","\r\nexport * from './focus.directive';\r\nexport * from './number.directive';\r\nexport * from './form.module';\r\n\r\n// Validation\r\nexport * from './validation/validators/custom/custom-validator.directive';\r\nexport * from './validation/validators/equal-with/equal-with-validator';\r\nexport * from './validation/validators/equal-with/equal-with.directive';\r\nexport * from './validation/validators/url/url-validator.directive';\r\nexport * from './validation/validators/min/min-validator.directive';\r\nexport * from './validation/validators/max/max-validator.directive';\r\n// export * from './validation/error.directive';\r\n// export * from './validation/first-error.directive';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"bootkit-ng0-form.mjs","sources":["../../../projects/ng0/form/focus.directive.ts","../../../projects/ng0/form/number.directive.ts","../../../projects/ng0/form/validation/validators/equal-with/equal-with-validator.ts","../../../projects/ng0/form/validation/validators/equal-with/equal-with.directive.ts","../../../projects/ng0/form/validation/validators/url/url-validator.ts","../../../projects/ng0/form/validation/validators/url/url-validator.directive.ts","../../../projects/ng0/form/validation/validators/custom/custom-validator.directive.ts","../../../projects/ng0/form/validation/validators/min/min-validator.directive.ts","../../../projects/ng0/form/validation/validators/max/max-validator.directive.ts","../../../projects/ng0/form/form.module.ts","../../../projects/ng0/form/public-api.ts","../../../projects/ng0/form/bootkit-ng0-form.ts"],"sourcesContent":["import { Directive, ElementRef, Input, OnChanges, SimpleChanges, OnInit } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[ng0Focus]',\r\n exportAs: 'ng0Focus',\r\n standalone: true\r\n})\r\nexport class FocusDirective implements OnInit, OnChanges {\r\n /** \r\n * \r\n */\r\n @Input() focusOnLoad = true;\r\n @Input() focusWhen?: boolean;\r\n private focused = false;\r\n\r\n constructor(private elementRef: ElementRef) {\r\n }\r\n\r\n ngOnInit(): void {\r\n if (this.focusOnLoad) {\r\n setTimeout(() => {\r\n this.elementRef.nativeElement.focus();\r\n });\r\n }\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['focusWhen']) {\r\n if (this.focusWhen) {\r\n setTimeout(() => {\r\n this.elementRef.nativeElement.focus();\r\n });\r\n }\r\n }\r\n }\r\n}\r\n","import { Directive, HostListener, forwardRef, ElementRef, Renderer2, input, booleanAttribute, numberAttribute, inject } from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { formatNumber } from '@angular/common';\r\n\r\nconst addThousandsSeparator = (str: string) => str.replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\r\nconst isValidNumber = (str: string) => str.trim() !== '' && !isNaN(Number(str));\r\nconst removeChar = (str: string, charToRemove: string) => str.split(charToRemove).join('');\r\n\r\nconst Keys = {\r\n backspace: 'Backspace',\r\n tab: 'Tab',\r\n arrowLeft: 'ArrowLeft',\r\n arrowRight: 'ArrowRight',\r\n delete: 'Delete',\r\n home: 'Home',\r\n end: 'End'\r\n}\r\n\r\ninterface InputElementState {\r\n selectionStart: number;\r\n selectionEnd: number;\r\n isCursorInsideIntegerPart: boolean;\r\n decimalSeparatorPosition: number;\r\n}\r\n\r\n/**\r\n * Directive to allow only number input in text fields.\r\n * It supports integer and decimal numbers, negative numbers, min/max values, thousands separator.\r\n */\r\n@Directive({\r\n selector: '[ng0Number]',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => NumberDirective),\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class NumberDirective implements ControlValueAccessor {\r\n private _value?: number;\r\n private _decimalSeparator!: string;\r\n private _thousandsSeparator: string = ',';\r\n private _onChangeCallback?: (v: any) => {};\r\n private _onTouchedCallback?: () => {};\r\n private _elmRef = inject(ElementRef<HTMLInputElement>);\r\n private _renderer = inject(Renderer2);\r\n\r\n /**\r\n * The minimum number of digits to display after the decimal point.\r\n * Applied only when 'numberType' is set to 'decimal'.\r\n * @default 1\r\n */\r\n public minFractionDigits = input(1, { transform: numberAttribute });\r\n\r\n /**\r\n * The maximum number of digits to display after the decimal point.\r\n * Applied only when 'numberType' is set to 'decimal'.\r\n * @default 2\r\n */\r\n public maxFractionDigits = input(2, { transform: numberAttribute });\r\n\r\n /**\r\n * Whether to use grouping separators, such as thousands separators\r\n * @default false\r\n */\r\n public useGrouping = input(false, { transform: booleanAttribute });\r\n\r\n /**\r\n * Type of numbers to allow\r\n * 'decimal' - allow decimal numbers\r\n * 'integer' - allow integer numbers only\r\n * @default 'integer'\r\n */\r\n public numberType = input<'integer' | 'decimal'>('integer');\r\n\r\n constructor() { }\r\n\r\n ngOnInit() {\r\n // Use Intl.NumberFormat to find decimal separator for locale\r\n const formatted = formatNumber(1.1, 'en', '1.1-1');\r\n this._decimalSeparator = formatted.replace(/\\d/g, '') || '.';\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this._onChangeCallback = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this._onTouchedCallback = fn;\r\n }\r\n\r\n setDisabledState?(isDisabled: boolean): void {\r\n // this._setProperty('disabled', isDisabled);\r\n }\r\n\r\n writeValue(value: any): void {\r\n var inputValue: string;\r\n\r\n if (value === undefined || value === null) {\r\n inputValue = '';\r\n this._value = undefined;\r\n } else if (typeof value === 'number') {\r\n inputValue = this._formatNumber(value);\r\n this._value = value;\r\n }\r\n else if (typeof value === 'string') {\r\n const parsedValue = this._value = Number.parseFloat(value);\r\n inputValue = this._formatNumber(parsedValue);\r\n } else {\r\n console.error('NumberDirective: Unsupported value type', value);\r\n inputValue = 'Invalid';\r\n }\r\n\r\n this._setProperty('value', inputValue);\r\n }\r\n\r\n @HostListener('keydown', ['$event'])\r\n private _onKeyDown(event: KeyboardEvent) {\r\n const key = event.key;\r\n const state = this._getInputState();\r\n\r\n if (this._isAllowedKey(key)) {\r\n if (key == Keys.backspace) {\r\n if (state.selectionStart > 1 && (state.selectionStart === state.selectionEnd)) {\r\n let value = this._elmRef.nativeElement.value;\r\n let beforeSelection = value.charAt(state.selectionStart - 1);\r\n if (beforeSelection === ',') {\r\n // If the character before the cursor is a comma, we need to skip it\r\n this._setProperty('selectionStart', state.selectionStart - 2);\r\n }\r\n }\r\n }\r\n } else {\r\n event.preventDefault();\r\n }\r\n }\r\n\r\n @HostListener('input', ['$event.target.value'])\r\n private _onInput(value: string) {\r\n if (value === '') {\r\n this._value = undefined;\r\n this._onChangeCallback?.(undefined);\r\n return;\r\n }\r\n\r\n const state = this._getInputState();\r\n if (state.isCursorInsideIntegerPart && this.useGrouping()) {\r\n this._formatIntegerPart(value);\r\n }\r\n\r\n var number = Number(removeChar(this._elmRef.nativeElement.value, this._thousandsSeparator));\r\n this._value = isNaN(number) ? undefined : number;\r\n this._onChangeCallback?.(this._value);\r\n }\r\n\r\n private _formatIntegerPart(value: string) {\r\n // Format the input value\r\n const integerPart = value.split(this._decimalSeparator)[0];\r\n const decimalPart = value.split(this._decimalSeparator)[1];\r\n\r\n if (integerPart.length <= 3) {\r\n return;\r\n }\r\n\r\n let normalizedIntegerPart = removeChar(integerPart, this._thousandsSeparator); // Remove commas\r\n\r\n let formattedValue = addThousandsSeparator(normalizedIntegerPart);\r\n if (decimalPart !== undefined) {\r\n formattedValue += this._decimalSeparator + decimalPart;\r\n }\r\n\r\n this._setProperty('value', formattedValue);\r\n let newSelectionStart: number;\r\n let state = this._getInputState();\r\n\r\n // fix the cursor position after formatting\r\n if (value.length == 1) {\r\n newSelectionStart = 1;\r\n } else {\r\n const newValueLength = formattedValue.length;\r\n const cursorJump = newValueLength - value.length;\r\n newSelectionStart = Math.max(0, state.selectionStart + cursorJump);\r\n }\r\n\r\n this._setProperty('selectionStart', newSelectionStart);\r\n this._setProperty('selectionEnd', newSelectionStart);\r\n\r\n // return formattedValue;\r\n }\r\n\r\n @HostListener('blur')\r\n private _onBlur() {\r\n if (this._value !== undefined) {\r\n let formattedValue = this._formatNumber(this._value);\r\n this._setProperty('value', formattedValue);\r\n }\r\n\r\n this._onTouchedCallback?.();\r\n }\r\n\r\n @HostListener('paste', ['$event'])\r\n private _onPaste(event: ClipboardEvent) {\r\n // event.\r\n // value = value.trim();\r\n }\r\n\r\n private _getInputState(): InputElementState {\r\n let value = this._elmRef.nativeElement.value;\r\n let decimalSeparatorPosition = value.indexOf(this._decimalSeparator);\r\n let selectionStart = this._elmRef.nativeElement.selectionStart || 0;\r\n let selectionEnd = this._elmRef.nativeElement.selectionEnd || 0;\r\n\r\n return {\r\n selectionStart,\r\n selectionEnd,\r\n decimalSeparatorPosition,\r\n isCursorInsideIntegerPart: decimalSeparatorPosition > -1 ? (selectionStart <= decimalSeparatorPosition) : true\r\n }\r\n }\r\n\r\n private _formatNumber(n: number): string {\r\n var isInteger = this.numberType() == 'integer';\r\n return new Intl.NumberFormat('en-US', {\r\n useGrouping: this.useGrouping(),\r\n minimumFractionDigits: isInteger ? 0 : this.minFractionDigits(),\r\n maximumFractionDigits: isInteger ? 0 : this.maxFractionDigits(),\r\n style: 'decimal',\r\n }).format(n);\r\n }\r\n\r\n private _isAllowedKey(key: string) {\r\n const allowedKeys = [Keys.backspace, Keys.tab, Keys.arrowLeft, Keys.arrowRight, Keys.delete, Keys.home, Keys.end];\r\n const input = this._elmRef.nativeElement;\r\n const value = input.value;\r\n const state = this._getInputState();\r\n\r\n if (allowedKeys.includes(key)) {\r\n return true; // allow control/navigation keys\r\n }\r\n\r\n // Allow one leading minus\r\n if (key === '-') {\r\n return (input.selectionStart === 0 || input.selectionEnd === 0) && value.charAt(0) !== '-';\r\n }\r\n\r\n // Allow one dot for decimal\r\n if (key === this._decimalSeparator) {\r\n return (this.numberType() == 'decimal') &&\r\n (!value.includes(this._decimalSeparator)) &&\r\n (state.selectionStart == input.value.length);\r\n }\r\n\r\n // Allow numbers only\r\n if (/^\\d$/.test(key)) {\r\n if (state.isCursorInsideIntegerPart) {\r\n return true;\r\n } else {\r\n var decimalPart = value.split(this._decimalSeparator)[1];\r\n var maxFractionDigits = this.maxFractionDigits();\r\n if (maxFractionDigits != undefined && decimalPart.length < maxFractionDigits) {\r\n return true;\r\n } else {\r\n return input.selectionStart !== input.selectionEnd; // allow a new digit if a substring is selected\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _setProperty(prop: string, value: any) {\r\n this._renderer.setProperty(this._elmRef.nativeElement, prop, value);\r\n };\r\n}\r\n","import { AbstractControl, ValidatorFn } from '@angular/forms';\r\n\r\nexport function equalWithValidator(targetValue?: string, inequalityMessage?: string): ValidatorFn {\r\n return (control: AbstractControl): { [key: string]: any } | null => {\r\n const isValid = control.value === targetValue;\r\n\r\n return isValid ? null :\r\n {\r\n equalWith: {\r\n value: control.value,\r\n message: inequalityMessage\r\n }\r\n };\r\n };\r\n}\r\n","import { Directive, Input } from '@angular/core';\r\nimport { AbstractControl, NG_VALIDATORS, Validator } from '@angular/forms';\r\nimport { equalWithValidator } from './equal-with-validator';\r\n\r\n@Directive({\r\n selector: '[ng0EqualWith]',\r\n exportAs: 'ng0EqualWith',\r\n standalone: true,\r\n providers: [\r\n { provide: NG_VALIDATORS, useExisting: EqualWithValidatorDirective, multi: true }\r\n ]\r\n})\r\nexport class EqualWithValidatorDirective implements Validator {\r\n @Input('ng0EqualWith') targetValue?: string;\r\n @Input() inequalityMessage?: string;\r\n\r\n constructor() {\r\n }\r\n\r\n validate(control: AbstractControl): { [key: string]: any } | null {\r\n return equalWithValidator(this.targetValue, this.inequalityMessage)(control);\r\n }\r\n}\r\n","import { AbstractControl, ValidatorFn } from '@angular/forms';\r\nconst urlRegEx = new RegExp('(https?://)?([\\\\da-z.-]+)\\\\.([a-z.]{2,6})[/\\\\w .-]*/?');\r\n\r\nexport function urlValidator(): ValidatorFn {\r\n return (control: AbstractControl): { [key: string]: any } | null => {\r\n const value = (control.value as string);\r\n if (!value || urlRegEx.test(value)) {\r\n return null;\r\n } else {\r\n return {\r\n 'url': {\r\n value\r\n }\r\n };\r\n }\r\n };\r\n}","import { Directive, Input } from '@angular/core';\r\nimport { FormControl, NG_VALIDATORS, ValidationErrors, Validator } from '@angular/forms';\r\nimport { urlValidator } from './url-validator';\r\n\r\n@Directive({\r\n selector: 'input[ng0Url]',\r\n exportAs: 'ng0Url',\r\n standalone: true,\r\n providers: [{ provide: NG_VALIDATORS, useExisting: UrlValidatorDirective, multi: true }]\r\n})\r\nexport class UrlValidatorDirective implements Validator {\r\n /** Directive is enabled or disabled */\r\n @Input() iscUrl?: boolean | string = true;\r\n\r\n validate(control: FormControl): ValidationErrors | null {\r\n return urlValidator()(control);\r\n }\r\n}\r\n","import { Directive, input, Input } from '@angular/core';\r\nimport { AbstractControl, NG_VALIDATORS, ValidationErrors, Validator } from '@angular/forms';\r\n\r\n@Directive({\r\n selector: '[ng0CustomValidator]',\r\n exportAs: 'ng0CustomValidator',\r\n standalone: true,\r\n providers: [\r\n { provide: NG_VALIDATORS, useExisting: CustomValidatorDirective, multi: true }\r\n ]\r\n})\r\nexport class CustomValidatorDirective implements Validator {\r\n validator = input.required<(value: any) => ValidationErrors | null>({alias: 'ng0CustomValidator'});\r\n\r\n constructor() { }\r\n\r\n validate(control: AbstractControl): ValidationErrors | null {\r\n return this.validator()(control);\r\n }\r\n}\r\n","import { Directive, input, numberAttribute } from '@angular/core';\r\nimport { AbstractControl, NG_VALIDATORS, ValidationErrors, Validator, Validators } from '@angular/forms';\r\n\r\n/** Min validator */\r\n@Directive({\r\n selector: 'input[type=text][ng0Number][min]',\r\n exportAs: 'ng0Min',\r\n standalone: true,\r\n providers: [{\r\n provide: NG_VALIDATORS,\r\n useExisting: MinValidatorDirective,\r\n multi: true\r\n }]\r\n})\r\nexport class MinValidatorDirective implements Validator {\r\n min = input.required<number, number | string | undefined | null>({\r\n transform: numberAttribute,\r\n });\r\n\r\n validate(control: AbstractControl): ValidationErrors | null {\r\n return Validators.min(this.min())(control);\r\n }\r\n}\r\n","import { Directive, input, numberAttribute } from '@angular/core';\r\nimport { AbstractControl, NG_VALIDATORS, ValidationErrors, Validator, Validators } from '@angular/forms';\r\n\r\n/** Max validator */\r\n@Directive({\r\n selector: 'input[type=text][ng0Number][max]',\r\n exportAs: 'ng0Max',\r\n standalone: true,\r\n providers: [{\r\n provide: NG_VALIDATORS,\r\n useExisting: MaxValidatorDirective,\r\n multi: true\r\n }]\r\n})\r\nexport class MaxValidatorDirective implements Validator {\r\n max = input.required<number, number | string | undefined | null>({\r\n transform: numberAttribute,\r\n });\r\n\r\n validate(control: AbstractControl): ValidationErrors | null {\r\n return Validators.max(this.max())(control);\r\n }\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { EqualWithValidatorDirective } from './validation/validators/equal-with/equal-with.directive';\r\nimport { UrlValidatorDirective } from './validation/validators/url/url-validator.directive';\r\nimport { CustomValidatorDirective } from './validation/validators/custom/custom-validator.directive';\r\nimport { MinValidatorDirective } from './validation/validators/min/min-validator.directive';\r\nimport { MaxValidatorDirective } from './validation/validators/max/max-validator.directive';\r\nimport { NumberDirective } from './number.directive';\r\n\r\nconst items = [\r\n // ErrorDirective,\r\n // FirstErrorDirective,\r\n NumberDirective,\r\n\r\n // Validators\r\n MinValidatorDirective,\r\n MaxValidatorDirective,\r\n EqualWithValidatorDirective,\r\n UrlValidatorDirective,\r\n CustomValidatorDirective,\r\n];\r\n\r\n@NgModule({\r\n imports: items,\r\n exports: items,\r\n})\r\nexport class FormModule { }\r\n","\r\nexport * from './focus.directive';\r\nexport * from './number.directive';\r\nexport * from './form.module';\r\n\r\n// Validation\r\nexport * from './validation/validators/custom/custom-validator.directive';\r\nexport * from './validation/validators/equal-with/equal-with-validator';\r\nexport * from './validation/validators/equal-with/equal-with.directive';\r\nexport * from './validation/validators/url/url-validator.directive';\r\nexport * from './validation/validators/min/min-validator.directive';\r\nexport * from './validation/validators/max/max-validator.directive';\r\n// export * from './validation/error.directive';\r\n// export * from './validation/first-error.directive';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
package/form/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { OnInit, OnChanges, ElementRef, SimpleChanges
|
|
2
|
+
import { OnInit, OnChanges, ElementRef, SimpleChanges } from '@angular/core';
|
|
3
3
|
import { ControlValueAccessor, Validator, AbstractControl, ValidationErrors, FormControl, ValidatorFn } from '@angular/forms';
|
|
4
4
|
|
|
5
5
|
declare class FocusDirective implements OnInit, OnChanges {
|
|
@@ -17,38 +17,57 @@ declare class FocusDirective implements OnInit, OnChanges {
|
|
|
17
17
|
static ɵdir: i0.ɵɵDirectiveDeclaration<FocusDirective, "[ng0Focus]", ["ng0Focus"], { "focusOnLoad": { "alias": "focusOnLoad"; "required": false; }; "focusWhen": { "alias": "focusWhen"; "required": false; }; }, {}, never, never, true, never>;
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
+
/**
|
|
21
|
+
* Directive to allow only number input in text fields.
|
|
22
|
+
* It supports integer and decimal numbers, negative numbers, min/max values, thousands separator.
|
|
23
|
+
*/
|
|
20
24
|
declare class NumberDirective implements ControlValueAccessor {
|
|
21
|
-
private
|
|
22
|
-
private
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
25
|
+
private _value?;
|
|
26
|
+
private _decimalSeparator;
|
|
27
|
+
private _thousandsSeparator;
|
|
28
|
+
private _onChangeCallback?;
|
|
29
|
+
private _onTouchedCallback?;
|
|
30
|
+
private _elmRef;
|
|
31
|
+
private _renderer;
|
|
32
|
+
/**
|
|
33
|
+
* The minimum number of digits to display after the decimal point.
|
|
34
|
+
* Applied only when 'numberType' is set to 'decimal'.
|
|
35
|
+
* @default 1
|
|
36
|
+
*/
|
|
37
|
+
minFractionDigits: i0.InputSignalWithTransform<number, unknown>;
|
|
38
|
+
/**
|
|
39
|
+
* The maximum number of digits to display after the decimal point.
|
|
40
|
+
* Applied only when 'numberType' is set to 'decimal'.
|
|
41
|
+
* @default 2
|
|
42
|
+
*/
|
|
43
|
+
maxFractionDigits: i0.InputSignalWithTransform<number, unknown>;
|
|
44
|
+
/**
|
|
45
|
+
* Whether to use grouping separators, such as thousands separators
|
|
46
|
+
* @default false
|
|
47
|
+
*/
|
|
48
|
+
useGrouping: i0.InputSignalWithTransform<boolean, unknown>;
|
|
49
|
+
/**
|
|
50
|
+
* Type of numbers to allow
|
|
51
|
+
* 'decimal' - allow decimal numbers
|
|
52
|
+
* 'integer' - allow integer numbers only
|
|
53
|
+
* @default 'integer'
|
|
54
|
+
*/
|
|
55
|
+
numberType: i0.InputSignal<"integer" | "decimal">;
|
|
56
|
+
constructor();
|
|
39
57
|
ngOnInit(): void;
|
|
40
58
|
registerOnChange(fn: any): void;
|
|
41
59
|
registerOnTouched(fn: any): void;
|
|
42
60
|
setDisabledState?(isDisabled: boolean): void;
|
|
43
61
|
writeValue(value: any): void;
|
|
44
|
-
private
|
|
45
|
-
private
|
|
46
|
-
private
|
|
47
|
-
private
|
|
48
|
-
private
|
|
49
|
-
private
|
|
50
|
-
private
|
|
51
|
-
private
|
|
62
|
+
private _onKeyDown;
|
|
63
|
+
private _onInput;
|
|
64
|
+
private _formatIntegerPart;
|
|
65
|
+
private _onBlur;
|
|
66
|
+
private _onPaste;
|
|
67
|
+
private _getInputState;
|
|
68
|
+
private _formatNumber;
|
|
69
|
+
private _isAllowedKey;
|
|
70
|
+
private _setProperty;
|
|
52
71
|
static ɵfac: i0.ɵɵFactoryDeclaration<NumberDirective, never>;
|
|
53
72
|
static ɵdir: i0.ɵɵDirectiveDeclaration<NumberDirective, "[ng0Number]", never, { "minFractionDigits": { "alias": "minFractionDigits"; "required": false; "isSignal": true; }; "maxFractionDigits": { "alias": "maxFractionDigits"; "required": false; "isSignal": true; }; "useGrouping": { "alias": "useGrouping"; "required": false; "isSignal": true; }; "numberType": { "alias": "numberType"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
54
73
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bootkit/ng0",
|
|
3
|
-
"version": "0.0.0-alpha.
|
|
3
|
+
"version": "0.0.0-alpha.19",
|
|
4
4
|
"description": "Angular+Bootstrap Component Library",
|
|
5
5
|
"homepage": "https://bootkitlib.github.io/",
|
|
6
6
|
"author": "BootKit",
|
|
@@ -99,14 +99,14 @@
|
|
|
99
99
|
"types": "./components/confirmation/index.d.ts",
|
|
100
100
|
"default": "./fesm2022/bootkit-ng0-components-confirmation.mjs"
|
|
101
101
|
},
|
|
102
|
-
"./components/list": {
|
|
103
|
-
"types": "./components/list/index.d.ts",
|
|
104
|
-
"default": "./fesm2022/bootkit-ng0-components-list.mjs"
|
|
105
|
-
},
|
|
106
102
|
"./components/form-field": {
|
|
107
103
|
"types": "./components/form-field/index.d.ts",
|
|
108
104
|
"default": "./fesm2022/bootkit-ng0-components-form-field.mjs"
|
|
109
105
|
},
|
|
106
|
+
"./components/list": {
|
|
107
|
+
"types": "./components/list/index.d.ts",
|
|
108
|
+
"default": "./fesm2022/bootkit-ng0-components-list.mjs"
|
|
109
|
+
},
|
|
110
110
|
"./components/modal": {
|
|
111
111
|
"types": "./components/modal/index.d.ts",
|
|
112
112
|
"default": "./fesm2022/bootkit-ng0-components-modal.mjs"
|
|
@@ -139,14 +139,14 @@
|
|
|
139
139
|
"types": "./components/sidenav/index.d.ts",
|
|
140
140
|
"default": "./fesm2022/bootkit-ng0-components-sidenav.mjs"
|
|
141
141
|
},
|
|
142
|
-
"./components/stepper": {
|
|
143
|
-
"types": "./components/stepper/index.d.ts",
|
|
144
|
-
"default": "./fesm2022/bootkit-ng0-components-stepper.mjs"
|
|
145
|
-
},
|
|
146
142
|
"./components/table": {
|
|
147
143
|
"types": "./components/table/index.d.ts",
|
|
148
144
|
"default": "./fesm2022/bootkit-ng0-components-table.mjs"
|
|
149
145
|
},
|
|
146
|
+
"./components/stepper": {
|
|
147
|
+
"types": "./components/stepper/index.d.ts",
|
|
148
|
+
"default": "./fesm2022/bootkit-ng0-components-stepper.mjs"
|
|
149
|
+
},
|
|
150
150
|
"./components/toast": {
|
|
151
151
|
"types": "./components/toast/index.d.ts",
|
|
152
152
|
"default": "./fesm2022/bootkit-ng0-components-toast.mjs"
|