@odx/angular 2.12.0 → 2.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/cdk/autocomplete-control/lib/pipes/base-search-filter-pipe.d.ts +6 -1
- package/esm2020/cdk/autocomplete-control/lib/pipes/base-search-filter-pipe.mjs +12 -8
- package/esm2020/sdk/index.mjs +2 -0
- package/esm2020/sdk/lib/application-environment.mjs +37 -0
- package/esm2020/sdk/odx-angular-sdk.mjs +5 -0
- package/fesm2015/odx-angular-cdk-autocomplete-control.mjs +10 -6
- package/fesm2015/odx-angular-cdk-autocomplete-control.mjs.map +1 -1
- package/fesm2015/odx-angular-sdk.mjs +47 -0
- package/fesm2015/odx-angular-sdk.mjs.map +1 -0
- package/fesm2020/odx-angular-cdk-autocomplete-control.mjs +10 -6
- package/fesm2020/odx-angular-cdk-autocomplete-control.mjs.map +1 -1
- package/fesm2020/odx-angular-sdk.mjs +44 -0
- package/fesm2020/odx-angular-sdk.mjs.map +1 -0
- package/package.json +11 -3
- package/sdk/README.md +3 -0
- package/sdk/index.d.ts +1 -0
- package/sdk/lib/application-environment.d.ts +9 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
# @odx/angular 2.14.0 (2023-10-06)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Features
|
|
5
|
+
|
|
6
|
+
* **angular/sdk:** add application environment ([165bcc9](https://dev.azure.com/draeger/ODXP/_git/odx-libraries/commit/165bcc991be66f84315215fd5ffcbdca2e87c8ce))
|
|
7
|
+
|
|
8
|
+
# @odx/angular 2.13.0 (2023-09-18)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Features
|
|
12
|
+
|
|
13
|
+
* **angular:** add option to the BaseSearchFilterPipe transform fn to override stringify fn ([475645d](https://dev.azure.com/draeger/ODXP/_git/odx-libraries/commit/475645db98b1c7aff3f0c2666ec373cfcdbf505a))
|
|
14
|
+
|
|
1
15
|
# @odx/angular 2.12.0 (2023-09-13)
|
|
2
16
|
|
|
3
17
|
|
|
@@ -5,6 +5,10 @@ interface HostController {
|
|
|
5
5
|
searchField?: InputControlDirective;
|
|
6
6
|
stringify?: StringifyFn<unknown>;
|
|
7
7
|
}
|
|
8
|
+
interface SearchFilterPipeOptions<T> {
|
|
9
|
+
searchHandler?: StringSearchHandler;
|
|
10
|
+
stringify?: StringifyFn<T>;
|
|
11
|
+
}
|
|
8
12
|
export declare const ODX_SEARCH_FILTER_HOST: InjectionToken<HostController>;
|
|
9
13
|
export declare abstract class BaseSearchFilterPipe implements PipeTransform {
|
|
10
14
|
private readonly stringSearchHandler;
|
|
@@ -12,8 +16,9 @@ export declare abstract class BaseSearchFilterPipe implements PipeTransform {
|
|
|
12
16
|
protected readonly hostController: HostController | null;
|
|
13
17
|
protected get searchField(): InputControlDirective | undefined;
|
|
14
18
|
protected get stringify(): StringifyFn<unknown>;
|
|
15
|
-
transform<T>(items: T[] | null,
|
|
19
|
+
transform<T>(items: T[] | null, optionsOrHandler?: SearchFilterPipeOptions<T> | StringSearchHandler): T[] | null;
|
|
16
20
|
protected queryHandler(query: string): string;
|
|
17
21
|
private filter;
|
|
22
|
+
private isStringSearchHandler;
|
|
18
23
|
}
|
|
19
24
|
export {};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { __decorate, __metadata } from "tslib";
|
|
2
2
|
import { inject, InjectionToken } from '@angular/core';
|
|
3
3
|
import { ODX_STRINGIFY, ODX_STRING_SEARCH_HANDLER } from '@odx/angular';
|
|
4
|
-
import { Pure } from '@odx/angular/utils';
|
|
4
|
+
import { isFunction, Pure } from '@odx/angular/utils';
|
|
5
5
|
export const ODX_SEARCH_FILTER_HOST = new InjectionToken('@odx/angular/cdk/autocomplete-control::SearchFilterHost');
|
|
6
6
|
export class BaseSearchFilterPipe {
|
|
7
7
|
constructor() {
|
|
@@ -15,29 +15,33 @@ export class BaseSearchFilterPipe {
|
|
|
15
15
|
get stringify() {
|
|
16
16
|
return this.hostController?.stringify ?? this.defaultStringify;
|
|
17
17
|
}
|
|
18
|
-
transform(items,
|
|
18
|
+
transform(items, optionsOrHandler) {
|
|
19
|
+
const searchHandler = this.isStringSearchHandler(optionsOrHandler) ? optionsOrHandler : optionsOrHandler?.searchHandler;
|
|
20
|
+
const stringify = this.isStringSearchHandler(optionsOrHandler) ? null : optionsOrHandler?.stringify;
|
|
19
21
|
if (this.searchField) {
|
|
20
|
-
return this.filter(items, this.searchField.nativeElementValue, searchHandler);
|
|
22
|
+
return this.filter(items, this.searchField.nativeElementValue, stringify ?? this.stringify, searchHandler ?? this.stringSearchHandler);
|
|
21
23
|
}
|
|
22
24
|
return items;
|
|
23
25
|
}
|
|
24
26
|
queryHandler(query) {
|
|
25
27
|
return query?.trim() || '';
|
|
26
28
|
}
|
|
27
|
-
filter(items, query, searchHandler) {
|
|
29
|
+
filter(items, query, stringify, searchHandler) {
|
|
28
30
|
if (!items)
|
|
29
31
|
return null;
|
|
30
32
|
query = this.queryHandler(query);
|
|
31
33
|
if (query === '')
|
|
32
34
|
return items;
|
|
33
|
-
|
|
34
|
-
|
|
35
|
+
return items.filter((item) => searchHandler(stringify(item), query));
|
|
36
|
+
}
|
|
37
|
+
isStringSearchHandler(optionsOrHandler) {
|
|
38
|
+
return isFunction(optionsOrHandler);
|
|
35
39
|
}
|
|
36
40
|
}
|
|
37
41
|
__decorate([
|
|
38
42
|
Pure,
|
|
39
43
|
__metadata("design:type", Function),
|
|
40
|
-
__metadata("design:paramtypes", [Object, String, Function]),
|
|
44
|
+
__metadata("design:paramtypes", [Object, String, Function, Function]),
|
|
41
45
|
__metadata("design:returntype", Object)
|
|
42
46
|
], BaseSearchFilterPipe.prototype, "filter", null);
|
|
43
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
47
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1zZWFyY2gtZmlsdGVyLXBpcGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvY2RrL2F1dG9jb21wbGV0ZS1jb250cm9sL3NyYy9saWIvcGlwZXMvYmFzZS1zZWFyY2gtZmlsdGVyLXBpcGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUN0RSxPQUFPLEVBQUUsYUFBYSxFQUFFLHlCQUF5QixFQUFvQyxNQUFNLGNBQWMsQ0FBQztBQUUxRyxPQUFPLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBWXRELE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLElBQUksY0FBYyxDQUFpQix5REFBeUQsQ0FBQyxDQUFDO0FBRXBJLE1BQU0sT0FBZ0Isb0JBQW9CO0lBQTFDO1FBQ21CLHdCQUFtQixHQUFHLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQ3hELHFCQUFnQixHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN2QyxtQkFBYyxHQUFHLE1BQU0sQ0FBQyxzQkFBc0IsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBcUN6RixDQUFDO0lBbkNDLElBQWMsV0FBVztRQUN2QixPQUFPLElBQUksQ0FBQyxjQUFjLEVBQUUsV0FBVyxDQUFDO0lBQzFDLENBQUM7SUFFRCxJQUFjLFNBQVM7UUFDckIsT0FBTyxJQUFJLENBQUMsY0FBYyxFQUFFLFNBQVMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUM7SUFDakUsQ0FBQztJQUVNLFNBQVMsQ0FBSSxLQUFpQixFQUFFLGdCQUFtRTtRQUN4RyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixFQUFFLGFBQWEsQ0FBQztRQUN4SCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsRUFBRSxTQUFTLENBQUM7UUFDcEcsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ3BCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsRUFBRSxTQUFTLElBQUssSUFBSSxDQUFDLFNBQW1CLEVBQUUsYUFBYSxJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1NBQ25KO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRVMsWUFBWSxDQUFDLEtBQWE7UUFDbEMsT0FBTyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFHTyxNQUFNLENBQUksS0FBaUIsRUFBRSxLQUFhLEVBQUUsU0FBeUIsRUFBRSxhQUFrQztRQUMvRyxJQUFJLENBQUMsS0FBSztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRXhCLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWpDLElBQUksS0FBSyxLQUFLLEVBQUU7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUUvQixPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBRU8scUJBQXFCLENBQUksZ0JBQW1FO1FBQ2xHLE9BQU8sVUFBVSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDdEMsQ0FBQztDQUNGO0FBZEM7SUFBQyxJQUFJOzs7O2tEQVNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0LCBJbmplY3Rpb25Ub2tlbiwgUGlwZVRyYW5zZm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT0RYX1NUUklOR0lGWSwgT0RYX1NUUklOR19TRUFSQ0hfSEFORExFUiwgU3RyaW5naWZ5Rm4sIFN0cmluZ1NlYXJjaEhhbmRsZXIgfSBmcm9tICdAb2R4L2FuZ3VsYXInO1xuaW1wb3J0IHsgSW5wdXRDb250cm9sRGlyZWN0aXZlIH0gZnJvbSAnQG9keC9hbmd1bGFyL2Nkay9jdXN0b20tZm9ybS1jb250cm9sJztcbmltcG9ydCB7IGlzRnVuY3Rpb24sIFB1cmUgfSBmcm9tICdAb2R4L2FuZ3VsYXIvdXRpbHMnO1xuXG5pbnRlcmZhY2UgSG9zdENvbnRyb2xsZXIge1xuICBzZWFyY2hGaWVsZD86IElucHV0Q29udHJvbERpcmVjdGl2ZTtcbiAgc3RyaW5naWZ5PzogU3RyaW5naWZ5Rm48dW5rbm93bj47XG59XG5cbmludGVyZmFjZSBTZWFyY2hGaWx0ZXJQaXBlT3B0aW9uczxUPiB7XG4gIHNlYXJjaEhhbmRsZXI/OiBTdHJpbmdTZWFyY2hIYW5kbGVyO1xuICBzdHJpbmdpZnk/OiBTdHJpbmdpZnlGbjxUPjtcbn1cblxuZXhwb3J0IGNvbnN0IE9EWF9TRUFSQ0hfRklMVEVSX0hPU1QgPSBuZXcgSW5qZWN0aW9uVG9rZW48SG9zdENvbnRyb2xsZXI+KCdAb2R4L2FuZ3VsYXIvY2RrL2F1dG9jb21wbGV0ZS1jb250cm9sOjpTZWFyY2hGaWx0ZXJIb3N0Jyk7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlU2VhcmNoRmlsdGVyUGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xuICBwcml2YXRlIHJlYWRvbmx5IHN0cmluZ1NlYXJjaEhhbmRsZXIgPSBpbmplY3QoT0RYX1NUUklOR19TRUFSQ0hfSEFORExFUik7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdFN0cmluZ2lmeSA9IGluamVjdChPRFhfU1RSSU5HSUZZKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGhvc3RDb250cm9sbGVyID0gaW5qZWN0KE9EWF9TRUFSQ0hfRklMVEVSX0hPU1QsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG5cbiAgcHJvdGVjdGVkIGdldCBzZWFyY2hGaWVsZCgpOiBJbnB1dENvbnRyb2xEaXJlY3RpdmUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmhvc3RDb250cm9sbGVyPy5zZWFyY2hGaWVsZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgc3RyaW5naWZ5KCk6IFN0cmluZ2lmeUZuPHVua25vd24+IHtcbiAgICByZXR1cm4gdGhpcy5ob3N0Q29udHJvbGxlcj8uc3RyaW5naWZ5ID8/IHRoaXMuZGVmYXVsdFN0cmluZ2lmeTtcbiAgfVxuXG4gIHB1YmxpYyB0cmFuc2Zvcm08VD4oaXRlbXM6IFRbXSB8IG51bGwsIG9wdGlvbnNPckhhbmRsZXI/OiBTZWFyY2hGaWx0ZXJQaXBlT3B0aW9uczxUPiB8IFN0cmluZ1NlYXJjaEhhbmRsZXIpOiBUW10gfCBudWxsIHtcbiAgICBjb25zdCBzZWFyY2hIYW5kbGVyID0gdGhpcy5pc1N0cmluZ1NlYXJjaEhhbmRsZXIob3B0aW9uc09ySGFuZGxlcikgPyBvcHRpb25zT3JIYW5kbGVyIDogb3B0aW9uc09ySGFuZGxlcj8uc2VhcmNoSGFuZGxlcjtcbiAgICBjb25zdCBzdHJpbmdpZnkgPSB0aGlzLmlzU3RyaW5nU2VhcmNoSGFuZGxlcihvcHRpb25zT3JIYW5kbGVyKSA/IG51bGwgOiBvcHRpb25zT3JIYW5kbGVyPy5zdHJpbmdpZnk7XG4gICAgaWYgKHRoaXMuc2VhcmNoRmllbGQpIHtcbiAgICAgIHJldHVybiB0aGlzLmZpbHRlcihpdGVtcywgdGhpcy5zZWFyY2hGaWVsZC5uYXRpdmVFbGVtZW50VmFsdWUsIHN0cmluZ2lmeSA/PyAodGhpcy5zdHJpbmdpZnkgYXMgbmV2ZXIpLCBzZWFyY2hIYW5kbGVyID8/IHRoaXMuc3RyaW5nU2VhcmNoSGFuZGxlcik7XG4gICAgfVxuICAgIHJldHVybiBpdGVtcztcbiAgfVxuXG4gIHByb3RlY3RlZCBxdWVyeUhhbmRsZXIocXVlcnk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHF1ZXJ5Py50cmltKCkgfHwgJyc7XG4gIH1cblxuICBAUHVyZVxuICBwcml2YXRlIGZpbHRlcjxUPihpdGVtczogVFtdIHwgbnVsbCwgcXVlcnk6IHN0cmluZywgc3RyaW5naWZ5OiBTdHJpbmdpZnlGbjxUPiwgc2VhcmNoSGFuZGxlcjogU3RyaW5nU2VhcmNoSGFuZGxlcik6IFRbXSB8IG51bGwge1xuICAgIGlmICghaXRlbXMpIHJldHVybiBudWxsO1xuXG4gICAgcXVlcnkgPSB0aGlzLnF1ZXJ5SGFuZGxlcihxdWVyeSk7XG5cbiAgICBpZiAocXVlcnkgPT09ICcnKSByZXR1cm4gaXRlbXM7XG5cbiAgICByZXR1cm4gaXRlbXMuZmlsdGVyKChpdGVtKSA9PiBzZWFyY2hIYW5kbGVyKHN0cmluZ2lmeShpdGVtKSwgcXVlcnkpKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNTdHJpbmdTZWFyY2hIYW5kbGVyPFQ+KG9wdGlvbnNPckhhbmRsZXI/OiBTZWFyY2hGaWx0ZXJQaXBlT3B0aW9uczxUPiB8IFN0cmluZ1NlYXJjaEhhbmRsZXIpOiBvcHRpb25zT3JIYW5kbGVyIGlzIFN0cmluZ1NlYXJjaEhhbmRsZXIge1xuICAgIHJldHVybiBpc0Z1bmN0aW9uKG9wdGlvbnNPckhhbmRsZXIpO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export * from './lib/application-environment';
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvc2RrL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLCtCQUErQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9saWIvYXBwbGljYXRpb24tZW52aXJvbm1lbnQnO1xuIl19
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { APP_INITIALIZER, inject, InjectionToken, makeEnvironmentProviders } from '@angular/core';
|
|
2
|
+
export function createHttpApplicationEnvironmentLoader(handler) {
|
|
3
|
+
return (...args) => fetch(...args).then((res) => handler(res));
|
|
4
|
+
}
|
|
5
|
+
export async function loadApplicationEnvironment(loader, ...args) {
|
|
6
|
+
const environment = await loader(...args);
|
|
7
|
+
if (!environment) {
|
|
8
|
+
throw new Error('[@odx/angular/sdk] Failed load application environment');
|
|
9
|
+
}
|
|
10
|
+
return environment;
|
|
11
|
+
}
|
|
12
|
+
export function createApplicationEnvironment(loader) {
|
|
13
|
+
const APPLICATION_ENVIRONMENT = new InjectionToken('@odx/angular/sdk::ApplicationEnvironment');
|
|
14
|
+
let environment = null;
|
|
15
|
+
return {
|
|
16
|
+
provideApplicationEnvironment(...args) {
|
|
17
|
+
return makeEnvironmentProviders([
|
|
18
|
+
{
|
|
19
|
+
provide: APP_INITIALIZER,
|
|
20
|
+
useValue: async () => {
|
|
21
|
+
environment = await loadApplicationEnvironment(loader, ...args);
|
|
22
|
+
},
|
|
23
|
+
multi: true,
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
provide: APPLICATION_ENVIRONMENT,
|
|
27
|
+
useFactory: () => environment,
|
|
28
|
+
},
|
|
29
|
+
]);
|
|
30
|
+
},
|
|
31
|
+
injectApplicationEnvironment() {
|
|
32
|
+
return inject(APPLICATION_ENVIRONMENT);
|
|
33
|
+
},
|
|
34
|
+
APPLICATION_ENVIRONMENT,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwbGljYXRpb24tZW52aXJvbm1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvc2RrL3NyYy9saWIvYXBwbGljYXRpb24tZW52aXJvbm1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGVBQWUsRUFBd0IsTUFBTSxFQUFFLGNBQWMsRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUl4SCxNQUFNLFVBQVUsc0NBQXNDLENBQ3BELE9BQXlDO0lBRXpDLE9BQU8sQ0FBQyxHQUFHLElBQThCLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDM0YsQ0FBQztBQUVELE1BQU0sQ0FBQyxLQUFLLFVBQVUsMEJBQTBCLENBQzlDLE1BQWtELEVBQ2xELEdBQUcsSUFBWTtJQUVmLE1BQU0sV0FBVyxHQUFHLE1BQU0sTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDMUMsSUFBSSxDQUFDLFdBQVcsRUFBRTtRQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLHdEQUF3RCxDQUFDLENBQUM7S0FDM0U7SUFDRCxPQUFPLFdBQVcsQ0FBQztBQUNyQixDQUFDO0FBRUQsTUFBTSxVQUFVLDRCQUE0QixDQUFpQyxNQUFrRDtJQUM3SCxNQUFNLHVCQUF1QixHQUFHLElBQUksY0FBYyxDQUF5QiwwQ0FBMEMsQ0FBQyxDQUFDO0lBRXZILElBQUksV0FBVyxHQUFnQixJQUFJLENBQUM7SUFFcEMsT0FBTztRQUNMLDZCQUE2QixDQUFDLEdBQUcsSUFBK0I7WUFDOUQsT0FBTyx3QkFBd0IsQ0FBQztnQkFDOUI7b0JBQ0UsT0FBTyxFQUFFLGVBQWU7b0JBQ3hCLFFBQVEsRUFBRSxLQUFLLElBQUksRUFBRTt3QkFDbkIsV0FBVyxHQUFHLE1BQU0sMEJBQTBCLENBQUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7b0JBQ2xFLENBQUM7b0JBQ0QsS0FBSyxFQUFFLElBQUk7aUJBQ1o7Z0JBQ0Q7b0JBQ0UsT0FBTyxFQUFFLHVCQUF1QjtvQkFDaEMsVUFBVSxFQUFFLEdBQUcsRUFBRSxDQUFDLFdBQVc7aUJBQzlCO2FBQ0YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELDRCQUE0QjtZQUMxQixPQUFPLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQ3pDLENBQUM7UUFDRCx1QkFBdUI7S0FDeEIsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBUFBfSU5JVElBTElaRVIsIEVudmlyb25tZW50UHJvdmlkZXJzLCBpbmplY3QsIEluamVjdGlvblRva2VuLCBtYWtlRW52aXJvbm1lbnRQcm92aWRlcnMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuZXhwb3J0IHR5cGUgQXBwbGljYXRpb25FbnZpcm9ubWVudExvYWRlcjxFbnZpcm9ubWVudERhdGEsIFBhcmFtcyBleHRlbmRzIHVua25vd25bXT4gPSAoLi4uYXJnczogUGFyYW1zKSA9PiBQcm9taXNlPEVudmlyb25tZW50RGF0YT47XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVIdHRwQXBwbGljYXRpb25FbnZpcm9ubWVudExvYWRlcjxEYXRhPihcbiAgaGFuZGxlcjogKHJlczogUmVzcG9uc2UpID0+IFByb21pc2U8RGF0YT4sXG4pOiBBcHBsaWNhdGlvbkVudmlyb25tZW50TG9hZGVyPERhdGEsIFBhcmFtZXRlcnM8dHlwZW9mIGZldGNoPj4ge1xuICByZXR1cm4gKC4uLmFyZ3M6IFBhcmFtZXRlcnM8dHlwZW9mIGZldGNoPikgPT4gZmV0Y2goLi4uYXJncykudGhlbigocmVzKSA9PiBoYW5kbGVyKHJlcykpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZEFwcGxpY2F0aW9uRW52aXJvbm1lbnQ8RGF0YSwgUGFyYW1zIGV4dGVuZHMgdW5rbm93bltdPihcbiAgbG9hZGVyOiBBcHBsaWNhdGlvbkVudmlyb25tZW50TG9hZGVyPERhdGEsIFBhcmFtcz4sXG4gIC4uLmFyZ3M6IFBhcmFtc1xuKTogUHJvbWlzZTxEYXRhPiB7XG4gIGNvbnN0IGVudmlyb25tZW50ID0gYXdhaXQgbG9hZGVyKC4uLmFyZ3MpO1xuICBpZiAoIWVudmlyb25tZW50KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdbQG9keC9hbmd1bGFyL3Nka10gRmFpbGVkIGxvYWQgYXBwbGljYXRpb24gZW52aXJvbm1lbnQnKTtcbiAgfVxuICByZXR1cm4gZW52aXJvbm1lbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBcHBsaWNhdGlvbkVudmlyb25tZW50PERhdGEsIFBhcmFtcyBleHRlbmRzIHVua25vd25bXT4obG9hZGVyOiBBcHBsaWNhdGlvbkVudmlyb25tZW50TG9hZGVyPERhdGEsIFBhcmFtcz4pIHtcbiAgY29uc3QgQVBQTElDQVRJT05fRU5WSVJPTk1FTlQgPSBuZXcgSW5qZWN0aW9uVG9rZW48QXBwbGljYXRpb25FbnZpcm9ubWVudD4oJ0BvZHgvYW5ndWxhci9zZGs6OkFwcGxpY2F0aW9uRW52aXJvbm1lbnQnKTtcbiAgdHlwZSBBcHBsaWNhdGlvbkVudmlyb25tZW50ID0gTm9uTnVsbGFibGU8dHlwZW9mIGVudmlyb25tZW50PjtcbiAgbGV0IGVudmlyb25tZW50OiBEYXRhIHwgbnVsbCA9IG51bGw7XG5cbiAgcmV0dXJuIHtcbiAgICBwcm92aWRlQXBwbGljYXRpb25FbnZpcm9ubWVudCguLi5hcmdzOiBQYXJhbWV0ZXJzPHR5cGVvZiBsb2FkZXI+KTogRW52aXJvbm1lbnRQcm92aWRlcnMge1xuICAgICAgcmV0dXJuIG1ha2VFbnZpcm9ubWVudFByb3ZpZGVycyhbXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlOiBBUFBfSU5JVElBTElaRVIsXG4gICAgICAgICAgdXNlVmFsdWU6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGVudmlyb25tZW50ID0gYXdhaXQgbG9hZEFwcGxpY2F0aW9uRW52aXJvbm1lbnQobG9hZGVyLCAuLi5hcmdzKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogQVBQTElDQVRJT05fRU5WSVJPTk1FTlQsXG4gICAgICAgICAgdXNlRmFjdG9yeTogKCkgPT4gZW52aXJvbm1lbnQsXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICB9LFxuICAgIGluamVjdEFwcGxpY2F0aW9uRW52aXJvbm1lbnQoKTogQXBwbGljYXRpb25FbnZpcm9ubWVudCB7XG4gICAgICByZXR1cm4gaW5qZWN0KEFQUExJQ0FUSU9OX0VOVklST05NRU5UKTtcbiAgICB9LFxuICAgIEFQUExJQ0FUSU9OX0VOVklST05NRU5ULFxuICB9O1xufVxuIl19
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated bundle index. Do not edit.
|
|
3
|
+
*/
|
|
4
|
+
export * from './index';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2R4LWFuZ3VsYXItc2RrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyL3Nkay9zcmMvb2R4LWFuZ3VsYXItc2RrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vaW5kZXgnO1xuIl19
|
|
@@ -108,29 +108,33 @@ class BaseSearchFilterPipe {
|
|
|
108
108
|
var _a, _b;
|
|
109
109
|
return (_b = (_a = this.hostController) === null || _a === void 0 ? void 0 : _a.stringify) !== null && _b !== void 0 ? _b : this.defaultStringify;
|
|
110
110
|
}
|
|
111
|
-
transform(items,
|
|
111
|
+
transform(items, optionsOrHandler) {
|
|
112
|
+
const searchHandler = this.isStringSearchHandler(optionsOrHandler) ? optionsOrHandler : optionsOrHandler === null || optionsOrHandler === void 0 ? void 0 : optionsOrHandler.searchHandler;
|
|
113
|
+
const stringify = this.isStringSearchHandler(optionsOrHandler) ? null : optionsOrHandler === null || optionsOrHandler === void 0 ? void 0 : optionsOrHandler.stringify;
|
|
112
114
|
if (this.searchField) {
|
|
113
|
-
return this.filter(items, this.searchField.nativeElementValue, searchHandler);
|
|
115
|
+
return this.filter(items, this.searchField.nativeElementValue, stringify !== null && stringify !== void 0 ? stringify : this.stringify, searchHandler !== null && searchHandler !== void 0 ? searchHandler : this.stringSearchHandler);
|
|
114
116
|
}
|
|
115
117
|
return items;
|
|
116
118
|
}
|
|
117
119
|
queryHandler(query) {
|
|
118
120
|
return (query === null || query === void 0 ? void 0 : query.trim()) || '';
|
|
119
121
|
}
|
|
120
|
-
filter(items, query, searchHandler) {
|
|
122
|
+
filter(items, query, stringify, searchHandler) {
|
|
121
123
|
if (!items)
|
|
122
124
|
return null;
|
|
123
125
|
query = this.queryHandler(query);
|
|
124
126
|
if (query === '')
|
|
125
127
|
return items;
|
|
126
|
-
|
|
127
|
-
|
|
128
|
+
return items.filter((item) => searchHandler(stringify(item), query));
|
|
129
|
+
}
|
|
130
|
+
isStringSearchHandler(optionsOrHandler) {
|
|
131
|
+
return isFunction(optionsOrHandler);
|
|
128
132
|
}
|
|
129
133
|
}
|
|
130
134
|
__decorate([
|
|
131
135
|
Pure,
|
|
132
136
|
__metadata("design:type", Function),
|
|
133
|
-
__metadata("design:paramtypes", [Object, String, Function]),
|
|
137
|
+
__metadata("design:paramtypes", [Object, String, Function, Function]),
|
|
134
138
|
__metadata("design:returntype", Object)
|
|
135
139
|
], BaseSearchFilterPipe.prototype, "filter", null);
|
|
136
140
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"odx-angular-cdk-autocomplete-control.mjs","sources":["../../../../libs/angular/cdk/autocomplete-control/src/lib/autocomplete-control.ts","../../../../libs/angular/cdk/autocomplete-control/src/lib/pipes/base-search-filter-pipe.ts","../../../../libs/angular/cdk/autocomplete-control/src/odx-angular-cdk-autocomplete-control.ts"],"sourcesContent":["import { ActiveDescendantKeyManager } from '@angular/cdk/a11y';\nimport { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { AfterViewInit, ChangeDetectorRef, Directive, EventEmitter, HostListener, inject, Input, Output, QueryList, ViewChild } from '@angular/core';\nimport { detectControllerChanges, StringifyFn } from '@odx/angular';\nimport { CustomFormControl, InputControlDirective } from '@odx/angular/cdk/custom-form-control';\nimport { OptionControl } from '@odx/angular/cdk/option-control';\nimport { DropdownDirective } from '@odx/angular/components/dropdown';\nimport { injectElement, isFunction, Transform, untilDestroyed } from '@odx/angular/utils';\n\n@Directive({\n standalone: true,\n host: {\n '[class.is-open]': 'isOpen',\n '[attr.aria-disabled]': 'isDisabled || null',\n },\n})\nexport abstract class AutocompleteControl<T> extends CustomFormControl<T | null> implements AfterViewInit {\n public static ngAcceptInputType_isLoading: BooleanInput;\n\n protected keyManager?: ActiveDescendantKeyManager<OptionControl<T>>;\n\n protected smoothScrollEnabled = false;\n\n @ViewChild(DropdownDirective)\n protected readonly dropdown?: DropdownDirective;\n\n protected abstract readonly options?: QueryList<OptionControl<T>>;\n\n protected readonly takeUntilDestroyed = untilDestroyed();\n\n protected readonly changeDetector = inject(ChangeDetectorRef);\n\n public abstract searchField?: InputControlDirective;\n\n public readonly element = injectElement();\n\n public get hasOptions(): boolean {\n return !!this.options?.length;\n }\n\n public get isOpen(): boolean {\n return !!this.dropdown?.isOpen;\n }\n\n @Transform(coerceBooleanProperty)\n @Input()\n public isLoading = false;\n\n @Input()\n public stringify?: StringifyFn<T>;\n\n @Output()\n public optionSelected = new EventEmitter<T>();\n\n constructor() {\n super(null);\n detectControllerChanges(this).subscribe();\n }\n\n public ngAfterViewInit(): void {\n if (!this.options) return;\n\n this.initKeyManager(this.options);\n this.handleQueryListOption(this.options);\n this.handleSearchFieldChanges();\n }\n\n public scrollOptionIntoView({ element }: OptionControl<T>): void {\n const behavior = this.smoothScrollEnabled ? 'smooth' : undefined;\n if (isFunction(element.nativeElement.scrollIntoView)) {\n element.nativeElement.scrollIntoView({ block: 'center', behavior });\n }\n }\n\n protected abstract handleQueryListOption(options: QueryList<OptionControl<T>>): void;\n\n protected abstract handleSearchFieldChanges(): void;\n\n protected abstract activateSelectedOption(): void;\n\n protected initKeyManager(options: QueryList<OptionControl<T>>): void {\n this.keyManager = new ActiveDescendantKeyManager(options).withHomeAndEnd();\n }\n\n protected disableSmoothScroll(): void {\n this.smoothScrollEnabled = false;\n }\n\n protected enableSmoothScroll(): void {\n this.smoothScrollEnabled = true;\n }\n\n protected openDropdown(): void {\n this.dropdown?.open();\n }\n\n protected closeDropdown(): void {\n this.dropdown?.close();\n }\n\n @HostListener('focusout', ['$event'])\n protected handleFocusOut(event: FocusEvent): void {\n if (this.isOpen) {\n event.stopImmediatePropagation();\n }\n this.onTouched();\n }\n}\n","import { inject, InjectionToken, PipeTransform } from '@angular/core';\nimport { ODX_STRINGIFY, ODX_STRING_SEARCH_HANDLER, StringifyFn, StringSearchHandler } from '@odx/angular';\nimport { InputControlDirective } from '@odx/angular/cdk/custom-form-control';\nimport { Pure } from '@odx/angular/utils';\n\ninterface HostController {\n searchField?: InputControlDirective;\n stringify?: StringifyFn<unknown>;\n}\n\nexport const ODX_SEARCH_FILTER_HOST = new InjectionToken<HostController>('@odx/angular/cdk/autocomplete-control::SearchFilterHost');\n\nexport abstract class BaseSearchFilterPipe implements PipeTransform {\n private readonly stringSearchHandler = inject(ODX_STRING_SEARCH_HANDLER);\n private readonly defaultStringify = inject(ODX_STRINGIFY);\n protected readonly hostController = inject(ODX_SEARCH_FILTER_HOST, { optional: true });\n\n protected get searchField(): InputControlDirective | undefined {\n return this.hostController?.searchField;\n }\n\n protected get stringify(): StringifyFn<unknown> {\n return this.hostController?.stringify ?? this.defaultStringify;\n }\n\n public transform<T>(items: T[] | null, searchHandler?: StringSearchHandler): T[] | null {\n if (this.searchField) {\n return this.filter(items, this.searchField.nativeElementValue, searchHandler);\n }\n return items;\n }\n\n protected queryHandler(query: string): string {\n return query?.trim() || '';\n }\n\n @Pure\n private filter<T>(items: T[] | null, query: string, searchHandler?: StringSearchHandler): T[] | null {\n if (!items) return null;\n\n query = this.queryHandler(query);\n\n if (query === '') return items;\n\n const search = searchHandler ?? this.stringSearchHandler;\n\n return items.filter((item) => search(this.stringify(item), query));\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"odx-angular-cdk-autocomplete-control.mjs","sources":["../../../../libs/angular/cdk/autocomplete-control/src/lib/autocomplete-control.ts","../../../../libs/angular/cdk/autocomplete-control/src/lib/pipes/base-search-filter-pipe.ts","../../../../libs/angular/cdk/autocomplete-control/src/odx-angular-cdk-autocomplete-control.ts"],"sourcesContent":["import { ActiveDescendantKeyManager } from '@angular/cdk/a11y';\nimport { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { AfterViewInit, ChangeDetectorRef, Directive, EventEmitter, HostListener, inject, Input, Output, QueryList, ViewChild } from '@angular/core';\nimport { detectControllerChanges, StringifyFn } from '@odx/angular';\nimport { CustomFormControl, InputControlDirective } from '@odx/angular/cdk/custom-form-control';\nimport { OptionControl } from '@odx/angular/cdk/option-control';\nimport { DropdownDirective } from '@odx/angular/components/dropdown';\nimport { injectElement, isFunction, Transform, untilDestroyed } from '@odx/angular/utils';\n\n@Directive({\n standalone: true,\n host: {\n '[class.is-open]': 'isOpen',\n '[attr.aria-disabled]': 'isDisabled || null',\n },\n})\nexport abstract class AutocompleteControl<T> extends CustomFormControl<T | null> implements AfterViewInit {\n public static ngAcceptInputType_isLoading: BooleanInput;\n\n protected keyManager?: ActiveDescendantKeyManager<OptionControl<T>>;\n\n protected smoothScrollEnabled = false;\n\n @ViewChild(DropdownDirective)\n protected readonly dropdown?: DropdownDirective;\n\n protected abstract readonly options?: QueryList<OptionControl<T>>;\n\n protected readonly takeUntilDestroyed = untilDestroyed();\n\n protected readonly changeDetector = inject(ChangeDetectorRef);\n\n public abstract searchField?: InputControlDirective;\n\n public readonly element = injectElement();\n\n public get hasOptions(): boolean {\n return !!this.options?.length;\n }\n\n public get isOpen(): boolean {\n return !!this.dropdown?.isOpen;\n }\n\n @Transform(coerceBooleanProperty)\n @Input()\n public isLoading = false;\n\n @Input()\n public stringify?: StringifyFn<T>;\n\n @Output()\n public optionSelected = new EventEmitter<T>();\n\n constructor() {\n super(null);\n detectControllerChanges(this).subscribe();\n }\n\n public ngAfterViewInit(): void {\n if (!this.options) return;\n\n this.initKeyManager(this.options);\n this.handleQueryListOption(this.options);\n this.handleSearchFieldChanges();\n }\n\n public scrollOptionIntoView({ element }: OptionControl<T>): void {\n const behavior = this.smoothScrollEnabled ? 'smooth' : undefined;\n if (isFunction(element.nativeElement.scrollIntoView)) {\n element.nativeElement.scrollIntoView({ block: 'center', behavior });\n }\n }\n\n protected abstract handleQueryListOption(options: QueryList<OptionControl<T>>): void;\n\n protected abstract handleSearchFieldChanges(): void;\n\n protected abstract activateSelectedOption(): void;\n\n protected initKeyManager(options: QueryList<OptionControl<T>>): void {\n this.keyManager = new ActiveDescendantKeyManager(options).withHomeAndEnd();\n }\n\n protected disableSmoothScroll(): void {\n this.smoothScrollEnabled = false;\n }\n\n protected enableSmoothScroll(): void {\n this.smoothScrollEnabled = true;\n }\n\n protected openDropdown(): void {\n this.dropdown?.open();\n }\n\n protected closeDropdown(): void {\n this.dropdown?.close();\n }\n\n @HostListener('focusout', ['$event'])\n protected handleFocusOut(event: FocusEvent): void {\n if (this.isOpen) {\n event.stopImmediatePropagation();\n }\n this.onTouched();\n }\n}\n","import { inject, InjectionToken, PipeTransform } from '@angular/core';\nimport { ODX_STRINGIFY, ODX_STRING_SEARCH_HANDLER, StringifyFn, StringSearchHandler } from '@odx/angular';\nimport { InputControlDirective } from '@odx/angular/cdk/custom-form-control';\nimport { isFunction, Pure } from '@odx/angular/utils';\n\ninterface HostController {\n searchField?: InputControlDirective;\n stringify?: StringifyFn<unknown>;\n}\n\ninterface SearchFilterPipeOptions<T> {\n searchHandler?: StringSearchHandler;\n stringify?: StringifyFn<T>;\n}\n\nexport const ODX_SEARCH_FILTER_HOST = new InjectionToken<HostController>('@odx/angular/cdk/autocomplete-control::SearchFilterHost');\n\nexport abstract class BaseSearchFilterPipe implements PipeTransform {\n private readonly stringSearchHandler = inject(ODX_STRING_SEARCH_HANDLER);\n private readonly defaultStringify = inject(ODX_STRINGIFY);\n protected readonly hostController = inject(ODX_SEARCH_FILTER_HOST, { optional: true });\n\n protected get searchField(): InputControlDirective | undefined {\n return this.hostController?.searchField;\n }\n\n protected get stringify(): StringifyFn<unknown> {\n return this.hostController?.stringify ?? this.defaultStringify;\n }\n\n public transform<T>(items: T[] | null, optionsOrHandler?: SearchFilterPipeOptions<T> | StringSearchHandler): T[] | null {\n const searchHandler = this.isStringSearchHandler(optionsOrHandler) ? optionsOrHandler : optionsOrHandler?.searchHandler;\n const stringify = this.isStringSearchHandler(optionsOrHandler) ? null : optionsOrHandler?.stringify;\n if (this.searchField) {\n return this.filter(items, this.searchField.nativeElementValue, stringify ?? (this.stringify as never), searchHandler ?? this.stringSearchHandler);\n }\n return items;\n }\n\n protected queryHandler(query: string): string {\n return query?.trim() || '';\n }\n\n @Pure\n private filter<T>(items: T[] | null, query: string, stringify: StringifyFn<T>, searchHandler: StringSearchHandler): T[] | null {\n if (!items) return null;\n\n query = this.queryHandler(query);\n\n if (query === '') return items;\n\n return items.filter((item) => searchHandler(stringify(item), query));\n }\n\n private isStringSearchHandler<T>(optionsOrHandler?: SearchFilterPipeOptions<T> | StringSearchHandler): optionsOrHandler is StringSearchHandler {\n return isFunction(optionsOrHandler);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { __awaiter } from 'tslib';
|
|
2
|
+
import { InjectionToken, makeEnvironmentProviders, APP_INITIALIZER, inject } from '@angular/core';
|
|
3
|
+
|
|
4
|
+
function createHttpApplicationEnvironmentLoader(handler) {
|
|
5
|
+
return (...args) => fetch(...args).then((res) => handler(res));
|
|
6
|
+
}
|
|
7
|
+
function loadApplicationEnvironment(loader, ...args) {
|
|
8
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
9
|
+
const environment = yield loader(...args);
|
|
10
|
+
if (!environment) {
|
|
11
|
+
throw new Error('[@odx/angular/sdk] Failed load application environment');
|
|
12
|
+
}
|
|
13
|
+
return environment;
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
function createApplicationEnvironment(loader) {
|
|
17
|
+
const APPLICATION_ENVIRONMENT = new InjectionToken('@odx/angular/sdk::ApplicationEnvironment');
|
|
18
|
+
let environment = null;
|
|
19
|
+
return {
|
|
20
|
+
provideApplicationEnvironment(...args) {
|
|
21
|
+
return makeEnvironmentProviders([
|
|
22
|
+
{
|
|
23
|
+
provide: APP_INITIALIZER,
|
|
24
|
+
useValue: () => __awaiter(this, void 0, void 0, function* () {
|
|
25
|
+
environment = yield loadApplicationEnvironment(loader, ...args);
|
|
26
|
+
}),
|
|
27
|
+
multi: true,
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
provide: APPLICATION_ENVIRONMENT,
|
|
31
|
+
useFactory: () => environment,
|
|
32
|
+
},
|
|
33
|
+
]);
|
|
34
|
+
},
|
|
35
|
+
injectApplicationEnvironment() {
|
|
36
|
+
return inject(APPLICATION_ENVIRONMENT);
|
|
37
|
+
},
|
|
38
|
+
APPLICATION_ENVIRONMENT,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Generated bundle index. Do not edit.
|
|
44
|
+
*/
|
|
45
|
+
|
|
46
|
+
export { createApplicationEnvironment, createHttpApplicationEnvironmentLoader, loadApplicationEnvironment };
|
|
47
|
+
//# sourceMappingURL=odx-angular-sdk.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"odx-angular-sdk.mjs","sources":["../../../../libs/angular/sdk/src/lib/application-environment.ts","../../../../libs/angular/sdk/src/odx-angular-sdk.ts"],"sourcesContent":["import { APP_INITIALIZER, EnvironmentProviders, inject, InjectionToken, makeEnvironmentProviders } from '@angular/core';\n\nexport type ApplicationEnvironmentLoader<EnvironmentData, Params extends unknown[]> = (...args: Params) => Promise<EnvironmentData>;\n\nexport function createHttpApplicationEnvironmentLoader<Data>(\n handler: (res: Response) => Promise<Data>,\n): ApplicationEnvironmentLoader<Data, Parameters<typeof fetch>> {\n return (...args: Parameters<typeof fetch>) => fetch(...args).then((res) => handler(res));\n}\n\nexport async function loadApplicationEnvironment<Data, Params extends unknown[]>(\n loader: ApplicationEnvironmentLoader<Data, Params>,\n ...args: Params\n): Promise<Data> {\n const environment = await loader(...args);\n if (!environment) {\n throw new Error('[@odx/angular/sdk] Failed load application environment');\n }\n return environment;\n}\n\nexport function createApplicationEnvironment<Data, Params extends unknown[]>(loader: ApplicationEnvironmentLoader<Data, Params>) {\n const APPLICATION_ENVIRONMENT = new InjectionToken<ApplicationEnvironment>('@odx/angular/sdk::ApplicationEnvironment');\n type ApplicationEnvironment = NonNullable<typeof environment>;\n let environment: Data | null = null;\n\n return {\n provideApplicationEnvironment(...args: Parameters<typeof loader>): EnvironmentProviders {\n return makeEnvironmentProviders([\n {\n provide: APP_INITIALIZER,\n useValue: async () => {\n environment = await loadApplicationEnvironment(loader, ...args);\n },\n multi: true,\n },\n {\n provide: APPLICATION_ENVIRONMENT,\n useFactory: () => environment,\n },\n ]);\n },\n injectApplicationEnvironment(): ApplicationEnvironment {\n return inject(APPLICATION_ENVIRONMENT);\n },\n APPLICATION_ENVIRONMENT,\n };\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;AAIM,SAAU,sCAAsC,CACpD,OAAyC,EAAA;IAEzC,OAAO,CAAC,GAAG,IAA8B,KAAK,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;AAC3F,CAAC;SAEqB,0BAA0B,CAC9C,MAAkD,EAClD,GAAG,IAAY,EAAA;;QAEf,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;QAC1C,IAAI,CAAC,WAAW,EAAE;AAChB,YAAA,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;AAC3E,SAAA;AACD,QAAA,OAAO,WAAW,CAAC;KACpB,CAAA,CAAA;AAAA,CAAA;AAEK,SAAU,4BAA4B,CAAiC,MAAkD,EAAA;AAC7H,IAAA,MAAM,uBAAuB,GAAG,IAAI,cAAc,CAAyB,0CAA0C,CAAC,CAAC;IAEvH,IAAI,WAAW,GAAgB,IAAI,CAAC;IAEpC,OAAO;QACL,6BAA6B,CAAC,GAAG,IAA+B,EAAA;AAC9D,YAAA,OAAO,wBAAwB,CAAC;AAC9B,gBAAA;AACE,oBAAA,OAAO,EAAE,eAAe;oBACxB,QAAQ,EAAE,MAAW,SAAA,CAAA,IAAA,EAAA,KAAA,CAAA,EAAA,KAAA,CAAA,EAAA,aAAA;wBACnB,WAAW,GAAG,MAAM,0BAA0B,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;AAClE,qBAAC,CAAA;AACD,oBAAA,KAAK,EAAE,IAAI;AACZ,iBAAA;AACD,gBAAA;AACE,oBAAA,OAAO,EAAE,uBAAuB;AAChC,oBAAA,UAAU,EAAE,MAAM,WAAW;AAC9B,iBAAA;AACF,aAAA,CAAC,CAAC;SACJ;QACD,4BAA4B,GAAA;AAC1B,YAAA,OAAO,MAAM,CAAC,uBAAuB,CAAC,CAAC;SACxC;QACD,uBAAuB;KACxB,CAAC;AACJ;;AC/CA;;AAEG;;;;"}
|
|
@@ -102,29 +102,33 @@ class BaseSearchFilterPipe {
|
|
|
102
102
|
get stringify() {
|
|
103
103
|
return this.hostController?.stringify ?? this.defaultStringify;
|
|
104
104
|
}
|
|
105
|
-
transform(items,
|
|
105
|
+
transform(items, optionsOrHandler) {
|
|
106
|
+
const searchHandler = this.isStringSearchHandler(optionsOrHandler) ? optionsOrHandler : optionsOrHandler?.searchHandler;
|
|
107
|
+
const stringify = this.isStringSearchHandler(optionsOrHandler) ? null : optionsOrHandler?.stringify;
|
|
106
108
|
if (this.searchField) {
|
|
107
|
-
return this.filter(items, this.searchField.nativeElementValue, searchHandler);
|
|
109
|
+
return this.filter(items, this.searchField.nativeElementValue, stringify ?? this.stringify, searchHandler ?? this.stringSearchHandler);
|
|
108
110
|
}
|
|
109
111
|
return items;
|
|
110
112
|
}
|
|
111
113
|
queryHandler(query) {
|
|
112
114
|
return query?.trim() || '';
|
|
113
115
|
}
|
|
114
|
-
filter(items, query, searchHandler) {
|
|
116
|
+
filter(items, query, stringify, searchHandler) {
|
|
115
117
|
if (!items)
|
|
116
118
|
return null;
|
|
117
119
|
query = this.queryHandler(query);
|
|
118
120
|
if (query === '')
|
|
119
121
|
return items;
|
|
120
|
-
|
|
121
|
-
|
|
122
|
+
return items.filter((item) => searchHandler(stringify(item), query));
|
|
123
|
+
}
|
|
124
|
+
isStringSearchHandler(optionsOrHandler) {
|
|
125
|
+
return isFunction(optionsOrHandler);
|
|
122
126
|
}
|
|
123
127
|
}
|
|
124
128
|
__decorate([
|
|
125
129
|
Pure,
|
|
126
130
|
__metadata("design:type", Function),
|
|
127
|
-
__metadata("design:paramtypes", [Object, String, Function]),
|
|
131
|
+
__metadata("design:paramtypes", [Object, String, Function, Function]),
|
|
128
132
|
__metadata("design:returntype", Object)
|
|
129
133
|
], BaseSearchFilterPipe.prototype, "filter", null);
|
|
130
134
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"odx-angular-cdk-autocomplete-control.mjs","sources":["../../../../libs/angular/cdk/autocomplete-control/src/lib/autocomplete-control.ts","../../../../libs/angular/cdk/autocomplete-control/src/lib/pipes/base-search-filter-pipe.ts","../../../../libs/angular/cdk/autocomplete-control/src/odx-angular-cdk-autocomplete-control.ts"],"sourcesContent":["import { ActiveDescendantKeyManager } from '@angular/cdk/a11y';\nimport { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { AfterViewInit, ChangeDetectorRef, Directive, EventEmitter, HostListener, inject, Input, Output, QueryList, ViewChild } from '@angular/core';\nimport { detectControllerChanges, StringifyFn } from '@odx/angular';\nimport { CustomFormControl, InputControlDirective } from '@odx/angular/cdk/custom-form-control';\nimport { OptionControl } from '@odx/angular/cdk/option-control';\nimport { DropdownDirective } from '@odx/angular/components/dropdown';\nimport { injectElement, isFunction, Transform, untilDestroyed } from '@odx/angular/utils';\n\n@Directive({\n standalone: true,\n host: {\n '[class.is-open]': 'isOpen',\n '[attr.aria-disabled]': 'isDisabled || null',\n },\n})\nexport abstract class AutocompleteControl<T> extends CustomFormControl<T | null> implements AfterViewInit {\n public static ngAcceptInputType_isLoading: BooleanInput;\n\n protected keyManager?: ActiveDescendantKeyManager<OptionControl<T>>;\n\n protected smoothScrollEnabled = false;\n\n @ViewChild(DropdownDirective)\n protected readonly dropdown?: DropdownDirective;\n\n protected abstract readonly options?: QueryList<OptionControl<T>>;\n\n protected readonly takeUntilDestroyed = untilDestroyed();\n\n protected readonly changeDetector = inject(ChangeDetectorRef);\n\n public abstract searchField?: InputControlDirective;\n\n public readonly element = injectElement();\n\n public get hasOptions(): boolean {\n return !!this.options?.length;\n }\n\n public get isOpen(): boolean {\n return !!this.dropdown?.isOpen;\n }\n\n @Transform(coerceBooleanProperty)\n @Input()\n public isLoading = false;\n\n @Input()\n public stringify?: StringifyFn<T>;\n\n @Output()\n public optionSelected = new EventEmitter<T>();\n\n constructor() {\n super(null);\n detectControllerChanges(this).subscribe();\n }\n\n public ngAfterViewInit(): void {\n if (!this.options) return;\n\n this.initKeyManager(this.options);\n this.handleQueryListOption(this.options);\n this.handleSearchFieldChanges();\n }\n\n public scrollOptionIntoView({ element }: OptionControl<T>): void {\n const behavior = this.smoothScrollEnabled ? 'smooth' : undefined;\n if (isFunction(element.nativeElement.scrollIntoView)) {\n element.nativeElement.scrollIntoView({ block: 'center', behavior });\n }\n }\n\n protected abstract handleQueryListOption(options: QueryList<OptionControl<T>>): void;\n\n protected abstract handleSearchFieldChanges(): void;\n\n protected abstract activateSelectedOption(): void;\n\n protected initKeyManager(options: QueryList<OptionControl<T>>): void {\n this.keyManager = new ActiveDescendantKeyManager(options).withHomeAndEnd();\n }\n\n protected disableSmoothScroll(): void {\n this.smoothScrollEnabled = false;\n }\n\n protected enableSmoothScroll(): void {\n this.smoothScrollEnabled = true;\n }\n\n protected openDropdown(): void {\n this.dropdown?.open();\n }\n\n protected closeDropdown(): void {\n this.dropdown?.close();\n }\n\n @HostListener('focusout', ['$event'])\n protected handleFocusOut(event: FocusEvent): void {\n if (this.isOpen) {\n event.stopImmediatePropagation();\n }\n this.onTouched();\n }\n}\n","import { inject, InjectionToken, PipeTransform } from '@angular/core';\nimport { ODX_STRINGIFY, ODX_STRING_SEARCH_HANDLER, StringifyFn, StringSearchHandler } from '@odx/angular';\nimport { InputControlDirective } from '@odx/angular/cdk/custom-form-control';\nimport { Pure } from '@odx/angular/utils';\n\ninterface HostController {\n searchField?: InputControlDirective;\n stringify?: StringifyFn<unknown>;\n}\n\nexport const ODX_SEARCH_FILTER_HOST = new InjectionToken<HostController>('@odx/angular/cdk/autocomplete-control::SearchFilterHost');\n\nexport abstract class BaseSearchFilterPipe implements PipeTransform {\n private readonly stringSearchHandler = inject(ODX_STRING_SEARCH_HANDLER);\n private readonly defaultStringify = inject(ODX_STRINGIFY);\n protected readonly hostController = inject(ODX_SEARCH_FILTER_HOST, { optional: true });\n\n protected get searchField(): InputControlDirective | undefined {\n return this.hostController?.searchField;\n }\n\n protected get stringify(): StringifyFn<unknown> {\n return this.hostController?.stringify ?? this.defaultStringify;\n }\n\n public transform<T>(items: T[] | null, searchHandler?: StringSearchHandler): T[] | null {\n if (this.searchField) {\n return this.filter(items, this.searchField.nativeElementValue, searchHandler);\n }\n return items;\n }\n\n protected queryHandler(query: string): string {\n return query?.trim() || '';\n }\n\n @Pure\n private filter<T>(items: T[] | null, query: string, searchHandler?: StringSearchHandler): T[] | null {\n if (!items) return null;\n\n query = this.queryHandler(query);\n\n if (query === '') return items;\n\n const search = searchHandler ?? this.stringSearchHandler;\n\n return items.filter((item) => search(this.stringify(item), query));\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;AAgBM,MAAgB,mBAAuB,SAAQ,iBAA2B,CAAA;AAoB9E,IAAA,IAAW,UAAU,GAAA;AACnB,QAAA,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC;KAC/B;AAED,IAAA,IAAW,MAAM,GAAA;AACf,QAAA,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC;KAChC;AAYD,IAAA,WAAA,GAAA;QACE,KAAK,CAAC,IAAI,CAAC,CAAC;QAlCJ,IAAmB,CAAA,mBAAA,GAAG,KAAK,CAAC;QAOnB,IAAkB,CAAA,kBAAA,GAAG,cAAc,EAAE,CAAC;AAEtC,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;QAI9C,IAAO,CAAA,OAAA,GAAG,aAAa,EAAE,CAAC;QAYnC,IAAS,CAAA,SAAA,GAAG,KAAK,CAAC;AAMlB,QAAA,IAAA,CAAA,cAAc,GAAG,IAAI,YAAY,EAAK,CAAC;AAI5C,QAAA,uBAAuB,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;KAC3C;IAEM,eAAe,GAAA;QACpB,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;AAE1B,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAClC,QAAA,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzC,IAAI,CAAC,wBAAwB,EAAE,CAAC;KACjC;IAEM,oBAAoB,CAAC,EAAE,OAAO,EAAoB,EAAA;AACvD,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,mBAAmB,GAAG,QAAQ,GAAG,SAAS,CAAC;QACjE,IAAI,UAAU,CAAC,OAAO,CAAC,aAAa,CAAC,cAAc,CAAC,EAAE;AACpD,YAAA,OAAO,CAAC,aAAa,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;AACrE,SAAA;KACF;AAQS,IAAA,cAAc,CAAC,OAAoC,EAAA;QAC3D,IAAI,CAAC,UAAU,GAAG,IAAI,0BAA0B,CAAC,OAAO,CAAC,CAAC,cAAc,EAAE,CAAC;KAC5E;IAES,mBAAmB,GAAA;AAC3B,QAAA,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC;KAClC;IAES,kBAAkB,GAAA;AAC1B,QAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;KACjC;IAES,YAAY,GAAA;AACpB,QAAA,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;KACvB;IAES,aAAa,GAAA;AACrB,QAAA,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC;KACxB;AAGS,IAAA,cAAc,CAAC,KAAiB,EAAA;QACxC,IAAI,IAAI,CAAC,MAAM,EAAE;YACf,KAAK,CAAC,wBAAwB,EAAE,CAAC;AAClC,SAAA;QACD,IAAI,CAAC,SAAS,EAAE,CAAC;KAClB;;gHA1FmB,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAnB,mBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,mBAAmB,yVAO5B,iBAAiB,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;AAqB5B,UAAA,CAAA;IAAC,SAAS,CAAC,qBAAqB,CAAC;;AAER,CAAA,EAAA,mBAAA,CAAA,SAAA,EAAA,WAAA,EAAA,KAAA,CAAA,CAAA,CAAA;2FA9BL,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAPxC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,IAAI,EAAE;AACJ,wBAAA,iBAAiB,EAAE,QAAQ;AAC3B,wBAAA,sBAAsB,EAAE,oBAAoB;AAC7C,qBAAA;AACF,iBAAA,CAAA;0EASoB,QAAQ,EAAA,CAAA;sBAD1B,SAAS;uBAAC,iBAAiB,CAAA;gBAuBrB,SAAS,EAAA,CAAA;sBADf,KAAK;gBAIC,SAAS,EAAA,CAAA;sBADf,KAAK;gBAIC,cAAc,EAAA,CAAA;sBADpB,MAAM;gBAkDG,cAAc,EAAA,CAAA;sBADvB,YAAY;uBAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,CAAA;;;MC1FzB,sBAAsB,GAAG,IAAI,cAAc,CAAiB,yDAAyD,EAAE;MAE9G,oBAAoB,CAAA;AAA1C,IAAA,WAAA,GAAA;AACmB,QAAA,IAAA,CAAA,mBAAmB,GAAG,MAAM,CAAC,yBAAyB,CAAC,CAAC;AACxD,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC;QACvC,IAAc,CAAA,cAAA,GAAG,MAAM,CAAC,sBAAsB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;KAiCxF;AA/BC,IAAA,IAAc,WAAW,GAAA;AACvB,QAAA,OAAO,IAAI,CAAC,cAAc,EAAE,WAAW,CAAC;KACzC;AAED,IAAA,IAAc,SAAS,GAAA;QACrB,OAAO,IAAI,CAAC,cAAc,EAAE,SAAS,IAAI,IAAI,CAAC,gBAAgB,CAAC;KAChE;IAEM,SAAS,CAAI,KAAiB,EAAE,aAAmC,EAAA;QACxE,IAAI,IAAI,CAAC,WAAW,EAAE;AACpB,YAAA,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,kBAAkB,EAAE,aAAa,CAAC,CAAC;AAC/E,SAAA;AACD,QAAA,OAAO,KAAK,CAAC;KACd;AAES,IAAA,YAAY,CAAC,KAAa,EAAA;AAClC,QAAA,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;KAC5B;AAGO,IAAA,MAAM,CAAI,KAAiB,EAAE,KAAa,EAAE,aAAmC,EAAA;AACrF,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,IAAI,CAAC;AAExB,QAAA,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QAEjC,IAAI,KAAK,KAAK,EAAE;AAAE,YAAA,OAAO,KAAK,CAAC;AAE/B,QAAA,MAAM,MAAM,GAAG,aAAa,IAAI,IAAI,CAAC,mBAAmB,CAAC;QAEzD,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;KACpE;AACF,CAAA;AAZC,UAAA,CAAA;IAAC,IAAI;;;;AAWJ,CAAA,EAAA,oBAAA,CAAA,SAAA,EAAA,QAAA,EAAA,IAAA,CAAA;;AC/CH;;AAEG;;;;"}
|
|
1
|
+
{"version":3,"file":"odx-angular-cdk-autocomplete-control.mjs","sources":["../../../../libs/angular/cdk/autocomplete-control/src/lib/autocomplete-control.ts","../../../../libs/angular/cdk/autocomplete-control/src/lib/pipes/base-search-filter-pipe.ts","../../../../libs/angular/cdk/autocomplete-control/src/odx-angular-cdk-autocomplete-control.ts"],"sourcesContent":["import { ActiveDescendantKeyManager } from '@angular/cdk/a11y';\nimport { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { AfterViewInit, ChangeDetectorRef, Directive, EventEmitter, HostListener, inject, Input, Output, QueryList, ViewChild } from '@angular/core';\nimport { detectControllerChanges, StringifyFn } from '@odx/angular';\nimport { CustomFormControl, InputControlDirective } from '@odx/angular/cdk/custom-form-control';\nimport { OptionControl } from '@odx/angular/cdk/option-control';\nimport { DropdownDirective } from '@odx/angular/components/dropdown';\nimport { injectElement, isFunction, Transform, untilDestroyed } from '@odx/angular/utils';\n\n@Directive({\n standalone: true,\n host: {\n '[class.is-open]': 'isOpen',\n '[attr.aria-disabled]': 'isDisabled || null',\n },\n})\nexport abstract class AutocompleteControl<T> extends CustomFormControl<T | null> implements AfterViewInit {\n public static ngAcceptInputType_isLoading: BooleanInput;\n\n protected keyManager?: ActiveDescendantKeyManager<OptionControl<T>>;\n\n protected smoothScrollEnabled = false;\n\n @ViewChild(DropdownDirective)\n protected readonly dropdown?: DropdownDirective;\n\n protected abstract readonly options?: QueryList<OptionControl<T>>;\n\n protected readonly takeUntilDestroyed = untilDestroyed();\n\n protected readonly changeDetector = inject(ChangeDetectorRef);\n\n public abstract searchField?: InputControlDirective;\n\n public readonly element = injectElement();\n\n public get hasOptions(): boolean {\n return !!this.options?.length;\n }\n\n public get isOpen(): boolean {\n return !!this.dropdown?.isOpen;\n }\n\n @Transform(coerceBooleanProperty)\n @Input()\n public isLoading = false;\n\n @Input()\n public stringify?: StringifyFn<T>;\n\n @Output()\n public optionSelected = new EventEmitter<T>();\n\n constructor() {\n super(null);\n detectControllerChanges(this).subscribe();\n }\n\n public ngAfterViewInit(): void {\n if (!this.options) return;\n\n this.initKeyManager(this.options);\n this.handleQueryListOption(this.options);\n this.handleSearchFieldChanges();\n }\n\n public scrollOptionIntoView({ element }: OptionControl<T>): void {\n const behavior = this.smoothScrollEnabled ? 'smooth' : undefined;\n if (isFunction(element.nativeElement.scrollIntoView)) {\n element.nativeElement.scrollIntoView({ block: 'center', behavior });\n }\n }\n\n protected abstract handleQueryListOption(options: QueryList<OptionControl<T>>): void;\n\n protected abstract handleSearchFieldChanges(): void;\n\n protected abstract activateSelectedOption(): void;\n\n protected initKeyManager(options: QueryList<OptionControl<T>>): void {\n this.keyManager = new ActiveDescendantKeyManager(options).withHomeAndEnd();\n }\n\n protected disableSmoothScroll(): void {\n this.smoothScrollEnabled = false;\n }\n\n protected enableSmoothScroll(): void {\n this.smoothScrollEnabled = true;\n }\n\n protected openDropdown(): void {\n this.dropdown?.open();\n }\n\n protected closeDropdown(): void {\n this.dropdown?.close();\n }\n\n @HostListener('focusout', ['$event'])\n protected handleFocusOut(event: FocusEvent): void {\n if (this.isOpen) {\n event.stopImmediatePropagation();\n }\n this.onTouched();\n }\n}\n","import { inject, InjectionToken, PipeTransform } from '@angular/core';\nimport { ODX_STRINGIFY, ODX_STRING_SEARCH_HANDLER, StringifyFn, StringSearchHandler } from '@odx/angular';\nimport { InputControlDirective } from '@odx/angular/cdk/custom-form-control';\nimport { isFunction, Pure } from '@odx/angular/utils';\n\ninterface HostController {\n searchField?: InputControlDirective;\n stringify?: StringifyFn<unknown>;\n}\n\ninterface SearchFilterPipeOptions<T> {\n searchHandler?: StringSearchHandler;\n stringify?: StringifyFn<T>;\n}\n\nexport const ODX_SEARCH_FILTER_HOST = new InjectionToken<HostController>('@odx/angular/cdk/autocomplete-control::SearchFilterHost');\n\nexport abstract class BaseSearchFilterPipe implements PipeTransform {\n private readonly stringSearchHandler = inject(ODX_STRING_SEARCH_HANDLER);\n private readonly defaultStringify = inject(ODX_STRINGIFY);\n protected readonly hostController = inject(ODX_SEARCH_FILTER_HOST, { optional: true });\n\n protected get searchField(): InputControlDirective | undefined {\n return this.hostController?.searchField;\n }\n\n protected get stringify(): StringifyFn<unknown> {\n return this.hostController?.stringify ?? this.defaultStringify;\n }\n\n public transform<T>(items: T[] | null, optionsOrHandler?: SearchFilterPipeOptions<T> | StringSearchHandler): T[] | null {\n const searchHandler = this.isStringSearchHandler(optionsOrHandler) ? optionsOrHandler : optionsOrHandler?.searchHandler;\n const stringify = this.isStringSearchHandler(optionsOrHandler) ? null : optionsOrHandler?.stringify;\n if (this.searchField) {\n return this.filter(items, this.searchField.nativeElementValue, stringify ?? (this.stringify as never), searchHandler ?? this.stringSearchHandler);\n }\n return items;\n }\n\n protected queryHandler(query: string): string {\n return query?.trim() || '';\n }\n\n @Pure\n private filter<T>(items: T[] | null, query: string, stringify: StringifyFn<T>, searchHandler: StringSearchHandler): T[] | null {\n if (!items) return null;\n\n query = this.queryHandler(query);\n\n if (query === '') return items;\n\n return items.filter((item) => searchHandler(stringify(item), query));\n }\n\n private isStringSearchHandler<T>(optionsOrHandler?: SearchFilterPipeOptions<T> | StringSearchHandler): optionsOrHandler is StringSearchHandler {\n return isFunction(optionsOrHandler);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { InjectionToken, makeEnvironmentProviders, APP_INITIALIZER, inject } from '@angular/core';
|
|
2
|
+
|
|
3
|
+
function createHttpApplicationEnvironmentLoader(handler) {
|
|
4
|
+
return (...args) => fetch(...args).then((res) => handler(res));
|
|
5
|
+
}
|
|
6
|
+
async function loadApplicationEnvironment(loader, ...args) {
|
|
7
|
+
const environment = await loader(...args);
|
|
8
|
+
if (!environment) {
|
|
9
|
+
throw new Error('[@odx/angular/sdk] Failed load application environment');
|
|
10
|
+
}
|
|
11
|
+
return environment;
|
|
12
|
+
}
|
|
13
|
+
function createApplicationEnvironment(loader) {
|
|
14
|
+
const APPLICATION_ENVIRONMENT = new InjectionToken('@odx/angular/sdk::ApplicationEnvironment');
|
|
15
|
+
let environment = null;
|
|
16
|
+
return {
|
|
17
|
+
provideApplicationEnvironment(...args) {
|
|
18
|
+
return makeEnvironmentProviders([
|
|
19
|
+
{
|
|
20
|
+
provide: APP_INITIALIZER,
|
|
21
|
+
useValue: async () => {
|
|
22
|
+
environment = await loadApplicationEnvironment(loader, ...args);
|
|
23
|
+
},
|
|
24
|
+
multi: true,
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
provide: APPLICATION_ENVIRONMENT,
|
|
28
|
+
useFactory: () => environment,
|
|
29
|
+
},
|
|
30
|
+
]);
|
|
31
|
+
},
|
|
32
|
+
injectApplicationEnvironment() {
|
|
33
|
+
return inject(APPLICATION_ENVIRONMENT);
|
|
34
|
+
},
|
|
35
|
+
APPLICATION_ENVIRONMENT,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Generated bundle index. Do not edit.
|
|
41
|
+
*/
|
|
42
|
+
|
|
43
|
+
export { createApplicationEnvironment, createHttpApplicationEnvironmentLoader, loadApplicationEnvironment };
|
|
44
|
+
//# sourceMappingURL=odx-angular-sdk.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"odx-angular-sdk.mjs","sources":["../../../../libs/angular/sdk/src/lib/application-environment.ts","../../../../libs/angular/sdk/src/odx-angular-sdk.ts"],"sourcesContent":["import { APP_INITIALIZER, EnvironmentProviders, inject, InjectionToken, makeEnvironmentProviders } from '@angular/core';\n\nexport type ApplicationEnvironmentLoader<EnvironmentData, Params extends unknown[]> = (...args: Params) => Promise<EnvironmentData>;\n\nexport function createHttpApplicationEnvironmentLoader<Data>(\n handler: (res: Response) => Promise<Data>,\n): ApplicationEnvironmentLoader<Data, Parameters<typeof fetch>> {\n return (...args: Parameters<typeof fetch>) => fetch(...args).then((res) => handler(res));\n}\n\nexport async function loadApplicationEnvironment<Data, Params extends unknown[]>(\n loader: ApplicationEnvironmentLoader<Data, Params>,\n ...args: Params\n): Promise<Data> {\n const environment = await loader(...args);\n if (!environment) {\n throw new Error('[@odx/angular/sdk] Failed load application environment');\n }\n return environment;\n}\n\nexport function createApplicationEnvironment<Data, Params extends unknown[]>(loader: ApplicationEnvironmentLoader<Data, Params>) {\n const APPLICATION_ENVIRONMENT = new InjectionToken<ApplicationEnvironment>('@odx/angular/sdk::ApplicationEnvironment');\n type ApplicationEnvironment = NonNullable<typeof environment>;\n let environment: Data | null = null;\n\n return {\n provideApplicationEnvironment(...args: Parameters<typeof loader>): EnvironmentProviders {\n return makeEnvironmentProviders([\n {\n provide: APP_INITIALIZER,\n useValue: async () => {\n environment = await loadApplicationEnvironment(loader, ...args);\n },\n multi: true,\n },\n {\n provide: APPLICATION_ENVIRONMENT,\n useFactory: () => environment,\n },\n ]);\n },\n injectApplicationEnvironment(): ApplicationEnvironment {\n return inject(APPLICATION_ENVIRONMENT);\n },\n APPLICATION_ENVIRONMENT,\n };\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;AAIM,SAAU,sCAAsC,CACpD,OAAyC,EAAA;IAEzC,OAAO,CAAC,GAAG,IAA8B,KAAK,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;AAC3F,CAAC;AAEM,eAAe,0BAA0B,CAC9C,MAAkD,EAClD,GAAG,IAAY,EAAA;IAEf,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;IAC1C,IAAI,CAAC,WAAW,EAAE;AAChB,QAAA,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;AAC3E,KAAA;AACD,IAAA,OAAO,WAAW,CAAC;AACrB,CAAC;AAEK,SAAU,4BAA4B,CAAiC,MAAkD,EAAA;AAC7H,IAAA,MAAM,uBAAuB,GAAG,IAAI,cAAc,CAAyB,0CAA0C,CAAC,CAAC;IAEvH,IAAI,WAAW,GAAgB,IAAI,CAAC;IAEpC,OAAO;QACL,6BAA6B,CAAC,GAAG,IAA+B,EAAA;AAC9D,YAAA,OAAO,wBAAwB,CAAC;AAC9B,gBAAA;AACE,oBAAA,OAAO,EAAE,eAAe;oBACxB,QAAQ,EAAE,YAAW;wBACnB,WAAW,GAAG,MAAM,0BAA0B,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;qBACjE;AACD,oBAAA,KAAK,EAAE,IAAI;AACZ,iBAAA;AACD,gBAAA;AACE,oBAAA,OAAO,EAAE,uBAAuB;AAChC,oBAAA,UAAU,EAAE,MAAM,WAAW;AAC9B,iBAAA;AACF,aAAA,CAAC,CAAC;SACJ;QACD,4BAA4B,GAAA;AAC1B,YAAA,OAAO,MAAM,CAAC,uBAAuB,CAAC,CAAC;SACxC;QACD,uBAAuB;KACxB,CAAC;AACJ;;AC/CA;;AAEG;;;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@odx/angular",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.14.0",
|
|
4
4
|
"author": "Drägerwerk AG & Co.KGaA",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE",
|
|
6
6
|
"peerDependencies": {
|
|
@@ -17,8 +17,8 @@
|
|
|
17
17
|
"chart.js": "^4.3.0",
|
|
18
18
|
"ng2-charts": "^4.1.1",
|
|
19
19
|
"date-fns": "2.30.0",
|
|
20
|
-
"@storybook/channels": "7.4.
|
|
21
|
-
"@storybook/core-events": "7.4.
|
|
20
|
+
"@storybook/channels": "7.4.6",
|
|
21
|
+
"@storybook/core-events": "7.4.6"
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
24
|
"@floating-ui/dom": "^1.4.0",
|
|
@@ -561,6 +561,14 @@
|
|
|
561
561
|
"node": "./fesm2015/odx-angular-rxjs.mjs",
|
|
562
562
|
"default": "./fesm2020/odx-angular-rxjs.mjs"
|
|
563
563
|
},
|
|
564
|
+
"./sdk": {
|
|
565
|
+
"types": "./sdk/index.d.ts",
|
|
566
|
+
"esm2020": "./esm2020/sdk/odx-angular-sdk.mjs",
|
|
567
|
+
"es2020": "./fesm2020/odx-angular-sdk.mjs",
|
|
568
|
+
"es2015": "./fesm2015/odx-angular-sdk.mjs",
|
|
569
|
+
"node": "./fesm2015/odx-angular-sdk.mjs",
|
|
570
|
+
"default": "./fesm2020/odx-angular-sdk.mjs"
|
|
571
|
+
},
|
|
564
572
|
"./theming": {
|
|
565
573
|
"types": "./theming/index.d.ts",
|
|
566
574
|
"esm2020": "./esm2020/theming/odx-angular-theming.mjs",
|
package/sdk/README.md
ADDED
package/sdk/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './lib/application-environment';
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { EnvironmentProviders, InjectionToken } from '@angular/core';
|
|
2
|
+
export type ApplicationEnvironmentLoader<EnvironmentData, Params extends unknown[]> = (...args: Params) => Promise<EnvironmentData>;
|
|
3
|
+
export declare function createHttpApplicationEnvironmentLoader<Data>(handler: (res: Response) => Promise<Data>): ApplicationEnvironmentLoader<Data, Parameters<typeof fetch>>;
|
|
4
|
+
export declare function loadApplicationEnvironment<Data, Params extends unknown[]>(loader: ApplicationEnvironmentLoader<Data, Params>, ...args: Params): Promise<Data>;
|
|
5
|
+
export declare function createApplicationEnvironment<Data, Params extends unknown[]>(loader: ApplicationEnvironmentLoader<Data, Params>): {
|
|
6
|
+
provideApplicationEnvironment(...args: Parameters<typeof loader>): EnvironmentProviders;
|
|
7
|
+
injectApplicationEnvironment(): Data & {};
|
|
8
|
+
APPLICATION_ENVIRONMENT: InjectionToken<Data & {}>;
|
|
9
|
+
};
|