@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 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 AsyncDataSource to load data asynchronously.
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 { of, Subject, catchError, tap, Observable } from 'rxjs';
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, numberAttribute, NgModule } from '@angular/core';
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
- el;
63
- renderer;
64
- /** */
65
- minFractionDigits = input(3, ...(ngDevMode ? [{ debugName: "minFractionDigits" }] : []));
66
- maxFractionDigits = input(10, ...(ngDevMode ? [{ debugName: "maxFractionDigits" }] : []));
67
- useGrouping = input(false, ...(ngDevMode ? [{ debugName: "useGrouping" }] : []));
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
- onChange = (_) => { };
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.decimalSeparator = formatted.replace(/\d/g, '') || '.';
101
+ this._decimalSeparator = formatted.replace(/\d/g, '') || '.';
87
102
  }
88
103
  registerOnChange(fn) {
89
- this.onChange = fn;
104
+ this._onChangeCallback = fn;
90
105
  }
91
106
  registerOnTouched(fn) {
92
- this.onTouched = fn;
107
+ this._onTouchedCallback = fn;
93
108
  }
94
109
  setDisabledState(isDisabled) {
95
- this.setProperty('disabled', isDisabled);
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.value = undefined;
116
+ this._value = undefined;
102
117
  }
103
118
  else if (typeof value === 'number') {
104
- inputValue = this.formatNumber(value);
105
- this.value = value;
119
+ inputValue = this._formatNumber(value);
120
+ this._value = value;
106
121
  }
107
122
  else if (typeof value === 'string') {
108
- const parsedValue = this.value = Number.parseFloat(value);
109
- inputValue = this.formatNumber(parsedValue);
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.setProperty('value', inputValue);
130
+ this._setProperty('value', inputValue);
116
131
  }
117
- onKeyDown(event) {
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
- if (key == Keys.backspace) {
125
- if (this.selectionStart > 1 && (this.selectionStart === this.selectionEnd)) {
126
- let value = this.el.nativeElement.value;
127
- let beforeSelection = value.charAt(this.selectionStart - 1);
128
- if (beforeSelection === ',') {
129
- // If the character before the cursor is a comma, we need to skip it
130
- this.setProperty('selectionStart', this.selectionStart - 2);
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
- onInput(s) {
136
- if (s === '') {
137
- this.value = undefined;
138
- this.onChange(undefined);
151
+ _onInput(value) {
152
+ if (value === '') {
153
+ this._value = undefined;
154
+ this._onChangeCallback?.(undefined);
139
155
  return;
140
156
  }
141
- this.updateCursorInfo();
142
- if (this.isCursorInsideIntegerPart) {
143
- this.formatIntegerPart(s);
157
+ const state = this._getInputState();
158
+ if (state.isCursorInsideIntegerPart && this.useGrouping()) {
159
+ this._formatIntegerPart(value);
144
160
  }
145
- var number = Number(removeChar(this.el.nativeElement.value, this.thousandsSeparator));
146
- this.value = isNaN(number) ? undefined : number;
147
- this.onChange(this.value);
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
- formatIntegerPart(value) {
165
+ _formatIntegerPart(value) {
150
166
  // Format the input value
151
- const integerPart = value.split(this.decimalSeparator)[0];
152
- const decimalPart = value.split(this.decimalSeparator)[1];
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.thousandsSeparator); // Remove commas
172
+ let normalizedIntegerPart = removeChar(integerPart, this._thousandsSeparator); // Remove commas
157
173
  let formattedValue = addThousandsSeparator(normalizedIntegerPart);
158
174
  if (decimalPart !== undefined) {
159
- formattedValue += this.decimalSeparator + decimalPart;
175
+ formattedValue += this._decimalSeparator + decimalPart;
160
176
  }
161
- this.setProperty('value', formattedValue);
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, this.selectionStart + cursorJump);
187
+ newSelectionStart = Math.max(0, state.selectionStart + cursorJump);
171
188
  }
172
- this.setProperty('selectionStart', newSelectionStart);
173
- this.setProperty('selectionEnd', newSelectionStart);
189
+ this._setProperty('selectionStart', newSelectionStart);
190
+ this._setProperty('selectionEnd', newSelectionStart);
174
191
  // return formattedValue;
175
192
  }
176
- onBlur() {
177
- if (this.value !== undefined) {
178
- let formattedValue = this.formatNumber(this.value);
179
- this.setProperty('value', formattedValue);
193
+ _onBlur() {
194
+ if (this._value !== undefined) {
195
+ let formattedValue = this._formatNumber(this._value);
196
+ this._setProperty('value', formattedValue);
180
197
  }
181
- this.onTouched();
198
+ this._onTouchedCallback?.();
182
199
  }
183
- onPaste(event) {
200
+ _onPaste(event) {
184
201
  // event.
185
202
  // value = value.trim();
186
203
  }
187
- updateCursorInfo() {
188
- let value = this.el.nativeElement.value;
189
- this.selectionStart = this.el.nativeElement.selectionStart || 0;
190
- this.selectionEnd = this.el.nativeElement.selectionEnd || 0;
191
- this.decimalSeparatorPosition = value.indexOf(this.decimalSeparator);
192
- if (this.decimalSeparatorPosition > -1) {
193
- this.isCursorInsideIntegerPart = (this.selectionStart <= this.decimalSeparatorPosition);
194
- }
195
- else {
196
- this.isCursorInsideIntegerPart = true;
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
- formatNumber(n) {
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
- isKeyAllowed(key) {
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.el.nativeElement;
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.decimalSeparator) {
238
+ if (key === this._decimalSeparator) {
221
239
  return (this.numberType() == 'decimal') &&
222
- (!value.includes(this.decimalSeparator)) &&
223
- (this.selectionStart == input.value.length);
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 (this.isCursorInsideIntegerPart) {
245
+ if (state.isCursorInsideIntegerPart) {
228
246
  return true;
229
247
  }
230
248
  else {
231
- var decimalPart = value.split(this.decimalSeparator)[1];
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 this.selectionStart !== this.selectionEnd; // allow a new digit if a substring is selected
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
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: NumberDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive });
244
- 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: [
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: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }], propDecorators: { onKeyDown: [{
286
+ }], ctorParameters: () => [], propDecorators: { _onKeyDown: [{
265
287
  type: HostListener,
266
288
  args: ['keydown', ['$event']]
267
- }], onInput: [{
289
+ }], _onInput: [{
268
290
  type: HostListener,
269
291
  args: ['input', ['$event.target.value']]
270
- }], onBlur: [{
292
+ }], _onBlur: [{
271
293
  type: HostListener,
272
294
  args: ['blur']
273
- }], onPaste: [{
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":";;;;;MAOa,cAAc,CAAA;AAQL,IAAA,UAAA;AAPpB;;AAEG;IACM,WAAW,GAAG,IAAI;AAClB,IAAA,SAAS;IACV,OAAO,GAAG,KAAK;AAEvB,IAAA,WAAA,CAAoB,UAAsB,EAAA;QAAtB,IAAA,CAAA,UAAU,GAAV,UAAU;IAC9B;IAEA,QAAQ,GAAA;AACN,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE;YACpB,UAAU,CAAC,MAAK;AACd,gBAAA,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,KAAK,EAAE;AACvC,YAAA,CAAC,CAAC;QACJ;IACF;AAEA,IAAA,WAAW,CAAC,OAAsB,EAAA;AAChC,QAAA,IAAI,OAAO,CAAC,WAAW,CAAC,EAAE;AACxB,YAAA,IAAI,IAAI,CAAC,SAAS,EAAE;gBAClB,UAAU,CAAC,MAAK;AACd,oBAAA,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,KAAK,EAAE;AACvC,gBAAA,CAAC,CAAC;YACJ;QACF;IACF;uGA3BW,cAAc,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAd,cAAc,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAd,cAAc,EAAA,UAAA,EAAA,CAAA;kBAL1B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,YAAY;AACtB,oBAAA,QAAQ,EAAE,UAAU;AACpB,oBAAA,UAAU,EAAE;AACb,iBAAA;+EAKU,WAAW,EAAA,CAAA;sBAAnB;gBACQ,SAAS,EAAA,CAAA;sBAAjB;;;ACRH,MAAM,qBAAqB,GAAG,CAAC,GAAW,KAAK,GAAG,CAAC,OAAO,CAAC,uBAAuB,EAAE,GAAG,CAAC;AACxF,MAAM,aAAa,GAAG,CAAC,GAAW,KAAK,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAC/E,MAAM,UAAU,GAAG,CAAC,GAAW,EAAE,YAAoB,KAAK,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;AAE1F,MAAM,IAAI,GAAG;AACX,IAAA,SAAS,EAAE,WAAW;AACtB,IAAA,GAAG,EAAE,KAAK;AACV,IAAA,SAAS,EAAE,WAAW;AACtB,IAAA,UAAU,EAAE,YAAY;AACxB,IAAA,MAAM,EAAE,QAAQ;AAChB,IAAA,IAAI,EAAE,MAAM;AACZ,IAAA,GAAG,EAAE;CACN;MAYY,eAAe,CAAA;AAkBhB,IAAA,EAAA;AACA,IAAA,QAAA;;AAjBV,IAAA,iBAAiB,GAAG,KAAK,CAAqB,CAAC,6DAAC;AAChD,IAAA,iBAAiB,GAAG,KAAK,CAAoB,EAAE,6DAAC;AAChD,IAAA,WAAW,GAAG,KAAK,CAAU,KAAK,uDAAC;AACnC,IAAA,UAAU,GAAG,KAAK,CAAwB,SAAS,sDAAC;AAC5C,IAAA,QAAQ,GAAG,CAAC,CAAM,KAAI,EAAG,CAAC;AAC1B,IAAA,SAAS,GAAG,MAAK,EAAG,CAAC;AACrB,IAAA,gBAAgB;IAChB,kBAAkB,GAAW,GAAG;IAChC,cAAc,GAAW,CAAC;IAC1B,YAAY,GAAW,CAAC;IACxB,yBAAyB,GAAY,KAAK;IAC1C,wBAAwB,GAAG,CAAC,CAAC;AAC7B,IAAA,KAAK;IACL,WAAW,GAAG,CAAC,IAAY,EAAE,KAAU,KAAK,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,IAAI,EAAE,KAAK,CAAC;IAEjH,WAAA,CACU,EAAgC,EAChC,QAAmB,EAAA;QADnB,IAAA,CAAA,EAAE,GAAF,EAAE;QACF,IAAA,CAAA,QAAQ,GAAR,QAAQ;IAEd;IAEJ,QAAQ,GAAA;;QAEN,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC;AAClD,QAAA,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,GAAG;IAC7D;AAEA,IAAA,gBAAgB,CAAC,EAAO,EAAA;AACtB,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;IACpB;AAEA,IAAA,iBAAiB,CAAC,EAAO,EAAA;AACvB,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;AAEA,IAAA,gBAAgB,CAAE,UAAmB,EAAA;AACnC,QAAA,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,UAAU,CAAC;IAC1C;AAEA,IAAA,UAAU,CAAC,KAAU,EAAA;AACnB,QAAA,IAAI,UAAkB;QAEtB,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE;YACzC,UAAU,GAAG,EAAE;AACf,YAAA,IAAI,CAAC,KAAK,GAAG,SAAS;QACxB;AAAO,aAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AACpC,YAAA,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;AACrC,YAAA,IAAI,CAAC,KAAK,GAAG,KAAK;QACpB;AACK,aAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAClC,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC;AACzD,YAAA,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC;QAC7C;aAAO;AACL,YAAA,OAAO,CAAC,KAAK,CAAC,yCAAyC,EAAE,KAAK,CAAC;YAC/D,UAAU,GAAG,SAAS;QACxB;AAEA,QAAA,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,UAAU,CAAC;IACvC;AAGQ,IAAA,SAAS,CAAC,KAAoB,EAAA;QACpC,IAAI,CAAC,gBAAgB,EAAE;QAEvB,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;YACjC,KAAK,CAAC,cAAc,EAAE;YACtB;QACF;AAEA,QAAA,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG;AAErB,QAAA,IAAI,GAAG,IAAI,IAAI,CAAC,SAAS,EAAE;AACzB,YAAA,IAAI,IAAI,CAAC,cAAc,GAAG,CAAC,KAAK,IAAI,CAAC,cAAc,KAAK,IAAI,CAAC,YAAY,CAAC,EAAE;gBAC1E,IAAI,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,KAAK;AACvC,gBAAA,IAAI,eAAe,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC;AAC3D,gBAAA,IAAI,eAAe,KAAK,GAAG,EAAE;;oBAE3B,IAAI,CAAC,WAAW,CAAC,gBAAgB,EAAE,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC;gBAC7D;YACF;QACF;IACF;AAGQ,IAAA,OAAO,CAAC,CAAS,EAAA;AACvB,QAAA,IAAI,CAAC,KAAK,EAAE,EAAE;AACZ,YAAA,IAAI,CAAC,KAAK,GAAG,SAAS;AACtB,YAAA,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;YACxB;QACF;QAEA,IAAI,CAAC,gBAAgB,EAAE;AAEvB,QAAA,IAAI,IAAI,CAAC,yBAAyB,EAAE;AAClC,YAAA,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;QAC3B;AAEA,QAAA,IAAI,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;AACrF,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,SAAS,GAAG,MAAM;AAC/C,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;IAC3B;AAEQ,IAAA,iBAAiB,CAAC,KAAa,EAAA;;AAErC,QAAA,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;AACzD,QAAA,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;AAEzD,QAAA,IAAI,WAAW,CAAC,MAAM,IAAI,CAAC,EAAE;YAC3B;QACF;AAEA,QAAA,IAAI,qBAAqB,GAAG,UAAU,CAAC,WAAW,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;AAE7E,QAAA,IAAI,cAAc,GAAG,qBAAqB,CAAC,qBAAqB,CAAC;AACjE,QAAA,IAAI,WAAW,KAAK,SAAS,EAAE;AAC7B,YAAA,cAAc,IAAI,IAAI,CAAC,gBAAgB,GAAG,WAAW;QACvD;AAEA,QAAA,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,cAAc,CAAC;AACzC,QAAA,IAAI,iBAAyB;;AAG7B,QAAA,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE;YACrB,iBAAiB,GAAG,CAAC;QACvB;aAAO;AACL,YAAA,MAAM,cAAc,GAAG,cAAc,CAAC,MAAM;AAC5C,YAAA,MAAM,UAAU,GAAG,cAAc,GAAG,KAAK,CAAC,MAAM;AAChD,YAAA,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC;QACnE;AAEA,QAAA,IAAI,CAAC,WAAW,CAAC,gBAAgB,EAAE,iBAAiB,CAAC;AACrD,QAAA,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,iBAAiB,CAAC;;IAGrD;IAGQ,MAAM,GAAA;AACZ,QAAA,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE;YAC5B,IAAI,cAAc,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;AAClD,YAAA,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,cAAc,CAAC;QAC3C;QAEA,IAAI,CAAC,SAAS,EAAE;IAClB;AAGQ,IAAA,OAAO,CAAC,KAAqB,EAAA;;;IAGrC;IAEQ,gBAAgB,GAAA;QACtB,IAAI,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,KAAK;AACvC,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,cAAc,IAAI,CAAC;AAC/D,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,YAAY,IAAI,CAAC;QAE3D,IAAI,CAAC,wBAAwB,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC;AACpE,QAAA,IAAI,IAAI,CAAC,wBAAwB,GAAG,CAAC,CAAC,EAAE;AACtC,YAAA,IAAI,CAAC,yBAAyB,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,wBAAwB,CAAC;QACzF;aAAO;AACL,YAAA,IAAI,CAAC,yBAAyB,GAAG,IAAI;QACvC;IACF;AAEQ,IAAA,YAAY,CAAC,CAAS,EAAA;QAC5B,IAAI,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,SAAS;AAC9C,QAAA,OAAO,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;AACpC,YAAA,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE;AAC/B,YAAA,qBAAqB,EAAE,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,iBAAiB,EAAE;AAC/D,YAAA,qBAAqB,EAAE,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,iBAAiB,EAAE;AAC/D,YAAA,KAAK,EAAE,SAAS;AACjB,SAAA,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IACd;AAEQ,IAAA,YAAY,CAAC,GAAW,EAAA;AAC9B,QAAA,MAAM,WAAW,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC;AACjH,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa;AACnC,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK;AAEzB,QAAA,IAAI,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;YAC7B,OAAO,IAAI,CAAC;QACd;;AAGA,QAAA,IAAI,GAAG,KAAK,GAAG,EAAE;YACf,OAAO,CAAC,KAAK,CAAC,cAAc,KAAK,CAAC,IAAI,KAAK,CAAC,YAAY,KAAK,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG;QAC5F;;AAGA,QAAA,IAAI,GAAG,KAAK,IAAI,CAAC,gBAAgB,EAAE;AACjC,YAAA,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,SAAS;iBACnC,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;iBACvC,IAAI,CAAC,cAAc,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC;QAC/C;;AAGA,QAAA,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;AACpB,YAAA,IAAI,IAAI,CAAC,yBAAyB,EAAE;AAClC,gBAAA,OAAO,IAAI;YACb;iBAAO;AACL,gBAAA,IAAI,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;AACvD,gBAAA,IAAI,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,EAAE;gBAChD,IAAI,iBAAiB,IAAI,SAAS,IAAI,WAAW,CAAC,MAAM,GAAG,iBAAiB,EAAE;AAC5E,oBAAA,OAAO,IAAI;gBACb;qBAAO;oBACL,OAAO,IAAI,CAAC,cAAc,KAAK,IAAI,CAAC,YAAY,CAAC;gBACnD;YACF;QACF;AAEA,QAAA,OAAO,KAAK;IACd;uGAtNW,eAAe,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,SAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAf,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,SAAA,EAAA,mBAAA,EAAA,OAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,UAAA,EAAA,OAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,SAAA,EARf;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,eAAe,CAAC;AAC9C,gBAAA,KAAK,EAAE;AACR;AACF,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAEU,eAAe,EAAA,UAAA,EAAA,CAAA;kBAV3B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,aAAa;AACvB,oBAAA,SAAS,EAAE;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,qBAAqB,CAAC;AAC9C,4BAAA,KAAK,EAAE;AACR;AACF;AACF,iBAAA;uGAgES,SAAS,EAAA,CAAA;sBADhB,YAAY;uBAAC,SAAS,EAAE,CAAC,QAAQ,CAAC;gBAwB3B,OAAO,EAAA,CAAA;sBADd,YAAY;uBAAC,OAAO,EAAE,CAAC,qBAAqB,CAAC;gBAsDtC,MAAM,EAAA,CAAA;sBADb,YAAY;uBAAC,MAAM;gBAWZ,OAAO,EAAA,CAAA;sBADd,YAAY;uBAAC,OAAO,EAAE,CAAC,QAAQ,CAAC;;;AC9K7B,SAAU,kBAAkB,CAAC,WAAoB,EAAE,iBAA0B,EAAA;IAC7E,OAAO,CAAC,OAAwB,KAAmC;AAC7D,QAAA,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,KAAK,WAAW;AAE7C,QAAA,OAAO,OAAO,GAAG,IAAI;AACf,YAAA;AACM,gBAAA,SAAS,EAAE;oBACL,KAAK,EAAE,OAAO,CAAC,KAAK;AACpB,oBAAA,OAAO,EAAE;AACd;aACN;AACb,IAAA,CAAC;AACP;;MCFa,2BAA2B,CAAA;AACX,IAAA,WAAW;AACzB,IAAA,iBAAiB;AAE1B,IAAA,WAAA,GAAA;IACA;AAEA,IAAA,QAAQ,CAAC,OAAwB,EAAA;AAC3B,QAAA,OAAO,kBAAkB,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC;IAClF;uGATO,2BAA2B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAA3B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,2BAA2B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,WAAA,EAAA,CAAA,cAAA,EAAA,aAAA,CAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,EAAA,SAAA,EAJvB;YACL,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,2BAA2B,EAAE,KAAK,EAAE,IAAI;AACpF,SAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAEM,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBARvC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACL,oBAAA,QAAQ,EAAE,gBAAgB;AAC1B,oBAAA,QAAQ,EAAE,cAAc;AACxB,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,SAAS,EAAE;wBACL,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,6BAA6B,EAAE,KAAK,EAAE,IAAI;AACpF;AACN,iBAAA;wDAE4B,WAAW,EAAA,CAAA;sBAAjC,KAAK;uBAAC,cAAc;gBACZ,iBAAiB,EAAA,CAAA;sBAAzB;;;ACbP,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,uDAAuD,CAAC;SAEpE,YAAY,GAAA;IACtB,OAAO,CAAC,OAAwB,KAAmC;AAC7D,QAAA,MAAM,KAAK,GAAI,OAAO,CAAC,KAAgB;QACvC,IAAI,CAAC,KAAK,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;AAC9B,YAAA,OAAO,IAAI;QACjB;aAAO;YACD,OAAO;AACD,gBAAA,KAAK,EAAE;oBACD;AACL;aACN;QACP;AACN,IAAA,CAAC;AACP;;MCNa,qBAAqB,CAAA;;IAEvB,MAAM,GAAsB,IAAI;AAEzC,IAAA,QAAQ,CAAC,OAAoB,EAAA;AAC3B,QAAA,OAAO,YAAY,EAAE,CAAC,OAAO,CAAC;IAChC;uGANW,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAArB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,SAAA,EAFrB,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,qBAAqB,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAE7E,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBANjC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,eAAe;AACzB,oBAAA,QAAQ,EAAE,QAAQ;AAClB,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAA,qBAAuB,EAAE,KAAK,EAAE,IAAI,EAAE;AACxF,iBAAA;8BAGU,MAAM,EAAA,CAAA;sBAAd;;;MCDU,wBAAwB,CAAA;AAC/B,IAAA,SAAS,GAAG,KAAK,CAAC,QAAQ,4CAA2C,KAAK,EAAE,oBAAoB,EAAA,CAAA,GAAA,CAA5B,EAAC,KAAK,EAAE,oBAAoB,EAAC,GAAC;AAElG,IAAA,WAAA,GAAA,EAAgB;AAEhB,IAAA,QAAQ,CAAC,OAAwB,EAAA;AAC3B,QAAA,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC;IACtC;uGAPO,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAxB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,wBAAwB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,SAAA,EAJpB;YACL,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,wBAAwB,EAAE,KAAK,EAAE,IAAI;AACjF,SAAA,EAAA,QAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAEM,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBARpC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACL,oBAAA,QAAQ,EAAE,sBAAsB;AAChC,oBAAA,QAAQ,EAAE,oBAAoB;AAC9B,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,SAAS,EAAE;wBACL,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,0BAA0B,EAAE,KAAK,EAAE,IAAI;AACjF;AACN,iBAAA;;;ACPD;MAWa,qBAAqB,CAAA;IAChC,GAAG,GAAG,KAAK,CAAC,QAAQ,sCAClB,SAAS,EAAE,eAAe,EAAA,CAAA,GAAA,CADqC;AAC/D,YAAA,SAAS,EAAE,eAAe;AAC3B,SAAA,CAAA,CAAA,CAAC;AAEF,IAAA,QAAQ,CAAC,OAAwB,EAAA;AAC/B,QAAA,OAAO,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC;IAC5C;uGAPW,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAArB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,qBAAqB,4MANrB,CAAC;AACV,gBAAA,OAAO,EAAE,aAAa;AACtB,gBAAA,WAAW,EAAE,qBAAqB;AAClC,gBAAA,KAAK,EAAE;aACR,CAAC,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAES,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAVjC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,kCAAkC;AAC5C,oBAAA,QAAQ,EAAE,QAAQ;AAClB,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,SAAS,EAAE,CAAC;AACV,4BAAA,OAAO,EAAE,aAAa;AACtB,4BAAA,WAAW,EAAA,qBAAuB;AAClC,4BAAA,KAAK,EAAE;yBACR;AACF,iBAAA;;;ACVD;MAWa,qBAAqB,CAAA;IAChC,GAAG,GAAG,KAAK,CAAC,QAAQ,sCAClB,SAAS,EAAE,eAAe,EAAA,CAAA,GAAA,CADqC;AAC/D,YAAA,SAAS,EAAE,eAAe;AAC3B,SAAA,CAAA,CAAA,CAAC;AAEF,IAAA,QAAQ,CAAC,OAAwB,EAAA;AAC/B,QAAA,OAAO,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC;IAC5C;uGAPW,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAArB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,qBAAqB,4MANrB,CAAC;AACV,gBAAA,OAAO,EAAE,aAAa;AACtB,gBAAA,WAAW,EAAE,qBAAqB;AAClC,gBAAA,KAAK,EAAE;aACR,CAAC,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAES,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAVjC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,kCAAkC;AAC5C,oBAAA,QAAQ,EAAE,QAAQ;AAClB,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,SAAS,EAAE,CAAC;AACV,4BAAA,OAAO,EAAE,aAAa;AACtB,4BAAA,WAAW,EAAA,qBAAuB;AAClC,4BAAA,KAAK,EAAE;yBACR;AACF,iBAAA;;;ACLD,MAAM,KAAK,GAAG;;;IAGZ,eAAe;;IAGf,qBAAqB;IACrB,qBAAqB;IACrB,2BAA2B;IAC3B,qBAAqB;IACrB,wBAAwB;CACzB;MAMY,UAAU,CAAA;uGAAV,UAAU,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA;wGAAV,UAAU,EAAA,OAAA,EAAA;;;YAdrB,eAAe;;YAGf,qBAAqB;YACrB,qBAAqB;YACrB,2BAA2B;YAC3B,qBAAqB;YACrB,wBAAwB,CAAA,EAAA,OAAA,EAAA;;;YAPxB,eAAe;;YAGf,qBAAqB;YACrB,qBAAqB;YACrB,2BAA2B;YAC3B,qBAAqB;YACrB,wBAAwB,CAAA,EAAA,CAAA;wGAOb,UAAU,EAAA,CAAA;;2FAAV,UAAU,EAAA,UAAA,EAAA,CAAA;kBAJtB,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE,KAAK;AACd,oBAAA,OAAO,EAAE,KAAK;AACf,iBAAA;;;ACZD;AACA;;ACbA;;AAEG;;;;"}
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, Renderer2 } from '@angular/core';
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 el;
22
- private renderer;
23
- /** */
24
- minFractionDigits: i0.InputSignal<number | undefined>;
25
- maxFractionDigits: i0.InputSignal<number | undefined>;
26
- useGrouping: i0.InputSignal<boolean>;
27
- numberType: i0.InputSignal<"decimal" | "integer">;
28
- private onChange;
29
- private onTouched;
30
- private decimalSeparator;
31
- private thousandsSeparator;
32
- private selectionStart;
33
- private selectionEnd;
34
- private isCursorInsideIntegerPart;
35
- private decimalSeparatorPosition;
36
- private value?;
37
- private setProperty;
38
- constructor(el: ElementRef<HTMLInputElement>, renderer: Renderer2);
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 onKeyDown;
45
- private onInput;
46
- private formatIntegerPart;
47
- private onBlur;
48
- private onPaste;
49
- private updateCursorInfo;
50
- private formatNumber;
51
- private isKeyAllowed;
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.18",
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"