@enigmatry/entry-components 15.0.0-preview.2 → 15.0.0-preview.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/common/README.md +58 -0
  2. package/common/common.module.d.ts +11 -0
  3. package/common/constants.d.ts +2 -0
  4. package/common/directives/index.d.ts +1 -0
  5. package/common/directives/scroll-to-invalid-control.directive.d.ts +18 -0
  6. package/common/event-plugins/abstract.plugin.d.ts +40 -0
  7. package/common/event-plugins/debounce.plugin.d.ts +15 -0
  8. package/common/event-plugins/index.d.ts +2 -0
  9. package/common/event-plugins/throttle.plugin.d.ts +15 -0
  10. package/common/public-api.d.ts +3 -0
  11. package/esm2020/common/common.module.mjs +46 -0
  12. package/esm2020/common/constants.mjs +3 -0
  13. package/esm2020/common/directives/index.mjs +2 -0
  14. package/esm2020/common/directives/scroll-to-invalid-control.directive.mjs +51 -0
  15. package/esm2020/common/event-plugins/abstract.plugin.mjs +35 -0
  16. package/esm2020/common/event-plugins/debounce.plugin.mjs +34 -0
  17. package/esm2020/common/event-plugins/index.mjs +3 -0
  18. package/esm2020/common/event-plugins/throttle.plugin.mjs +34 -0
  19. package/esm2020/common/public-api.mjs +4 -1
  20. package/esm2020/modules/entry-components.module.mjs +6 -2
  21. package/esm2020/public-api.mjs +2 -1
  22. package/fesm2015/enigmatry-entry-components-common.mjs +191 -2
  23. package/fesm2015/enigmatry-entry-components-common.mjs.map +1 -1
  24. package/fesm2015/enigmatry-entry-components.mjs +6 -1
  25. package/fesm2015/enigmatry-entry-components.mjs.map +1 -1
  26. package/fesm2020/enigmatry-entry-components-common.mjs +189 -2
  27. package/fesm2020/enigmatry-entry-components-common.mjs.map +1 -1
  28. package/fesm2020/enigmatry-entry-components.mjs +6 -1
  29. package/fesm2020/enigmatry-entry-components.mjs.map +1 -1
  30. package/modules/entry-components.module.d.ts +8 -7
  31. package/package.json +3 -2
  32. package/public-api.d.ts +1 -0
@@ -0,0 +1,58 @@
1
+ # Entry common
2
+
3
+ EntryCommonModule includes a set of commonly used directives, pipes, services and utilities.
4
+
5
+ `import { EntryCommonModule } from '@enigmatry/entry-components/common';`
6
+
7
+ ## Directives
8
+
9
+ ### `ScrollToInvalidControlDirective`
10
+
11
+ Scrolls to first invalid form control when form is submitted.
12
+
13
+ Selector: `form[formGroup],form[ngForm]`
14
+
15
+ Directive is applied to reactive or template driven forms, no additional selectors are required. Directive will listen to form submit event and scroll to first invalid form control when form is invalid. For this to work, submit button should be enabled so users always get feedback of what is wrong.
16
+
17
+ ## Event plugins
18
+
19
+ Extending Angular events binding syntax with debounce and throttle event plugins.
20
+
21
+ When binding to events in Angular we can add debounce or throttle modifier after the event name:
22
+ * using the event binding syntax "`(click.debounce)="onSave()`"
23
+ * or HostListener "`@HostListener('keyup.throttle')`".
24
+
25
+ Example: Debouncing a click event with default delay
26
+ ```html
27
+ <button (click.debounce)="onClick($event)">
28
+ ```
29
+ Example: Debouncing a keyup event with custom delay
30
+ ```html
31
+ <input (keyup.debounce.1000)="doSomething($event)">
32
+ ```
33
+
34
+ Example: Throttling a click event with default delay
35
+ ```html
36
+ <input (keyup.throttle)="onKeyUp($event)">
37
+ ```
38
+ Example: Throttle a keyup event with custom delay
39
+ ```html
40
+ <input (keyup.throttle.1000)="onKeyUp($event)">
41
+ ```
42
+
43
+ Modifier options `keyup.debounce.1000.leading`
44
+ * event name e.g. `keyup`
45
+ * modifier: `debounce` or `throttle`
46
+ * milliseconds: delay in milliseconds before the event handler is executed
47
+ * option: `leading` or `trailing`. If set to 'leading', the event handler is executed on the leading edge of the debounce timeout. If set to 'trailing', it's executed on the trailing edge.
48
+
49
+
50
+ Difference between `debounce` and `throttle`
51
+ * Debouncing waits for a certain time before invoking the function again.
52
+ * Debouncing ensures that the function is called only once, even if the event is triggered multiple times.
53
+ * Throttling limits the number of times the function can be called over a certain period.
54
+ * Throttling ensures that the function is called at a regular interval, even if the event is triggered multiple times.
55
+
56
+ ## Pipes
57
+
58
+ ## Services
@@ -0,0 +1,11 @@
1
+ import { ModuleWithProviders, Provider } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/common";
4
+ import * as i2 from "./directives/scroll-to-invalid-control.directive";
5
+ export declare const NG_EVENT_PLUGINS: Provider[];
6
+ export declare class EntryCommonModule {
7
+ static forRoot(): ModuleWithProviders<EntryCommonModule>;
8
+ static ɵfac: i0.ɵɵFactoryDeclaration<EntryCommonModule, never>;
9
+ static ɵmod: i0.ɵɵNgModuleDeclaration<EntryCommonModule, never, [typeof i1.CommonModule, typeof i2.ScrollToInvalidControlDirective], [typeof i2.ScrollToInvalidControlDirective]>;
10
+ static ɵinj: i0.ɵɵInjectorDeclaration<EntryCommonModule>;
11
+ }
@@ -0,0 +1,2 @@
1
+ export declare const NG_VALID_CLASS = ".ng-valid";
2
+ export declare const NG_INVALID_CLASS = ".ng-invalid";
@@ -0,0 +1 @@
1
+ export * from './scroll-to-invalid-control.directive';
@@ -0,0 +1,18 @@
1
+ import { ElementRef, OnDestroy, OnInit } from '@angular/core';
2
+ import { ControlContainer } from '@angular/forms';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * Scroll to first invalid control when form is submitted.
6
+ * Directive is applied to 'form[formGroup],form[ngForm]' (reactive or template driven forms)
7
+ */
8
+ export declare class ScrollToInvalidControlDirective implements OnInit, OnDestroy {
9
+ private form;
10
+ private elementRef;
11
+ private destroy$;
12
+ constructor(form: ControlContainer, elementRef: ElementRef<HTMLFormElement>);
13
+ ngOnInit(): void;
14
+ ngOnDestroy(): void;
15
+ private scrollToInvalidControl;
16
+ static ɵfac: i0.ɵɵFactoryDeclaration<ScrollToInvalidControlDirective, [{ self: true; }, null]>;
17
+ static ɵdir: i0.ɵɵDirectiveDeclaration<ScrollToInvalidControlDirective, "form[formGroup],form[ngForm]", never, {}, {}, never, never, true, never>;
18
+ }
@@ -0,0 +1,40 @@
1
+ import { EventManager } from '@angular/platform-browser';
2
+ /**
3
+ * abstract class EventManagerPlugin will be exposed in the public api
4
+ * https://github.com/angular/angular/pull/49969
5
+ *
6
+ * Until then creating it from reference
7
+ * https://github.com/angular/angular/blob/main/packages/platform-browser/src/dom/events/event_manager.ts#L93
8
+ *
9
+ * How to create custom event modifiers
10
+ * https://github.com/Tinkoff/ng-event-plugins,
11
+ * https://github.com/angular/angular/blob/main/packages/platform-browser/src/dom/events/key_events.ts
12
+ * https://netbasal.com/lifting-the-veil-insights-into-angulars-eventmanagerplugin-ed9d14cbb31a
13
+ */
14
+ export declare abstract class EventManagerPlugin {
15
+ manager: EventManager;
16
+ /** Should return `true` for every event name that should be supported by this plugin */
17
+ abstract supports(eventName: string): boolean;
18
+ /**
19
+ * Registers a handler for a specific element and event.
20
+ *
21
+ * @param element The HTML element to receive event notifications.
22
+ * @param eventName The name of the event to listen for.
23
+ * @param handler A function to call when the notification occurs. Receives the
24
+ * event object as an argument.
25
+ * @returns A callback function that can be used to remove the handler.
26
+ */
27
+ abstract addEventListener(element: HTMLElement, eventName: string, handler: Function): Function;
28
+ }
29
+ /**
30
+ * Entry event plugin base class
31
+ */
32
+ export declare abstract class EntryEventManagerPlugin extends EventManagerPlugin {
33
+ abstract modifier: string;
34
+ /** return `true` for every event name that has specified modifier */
35
+ supports(eventName: string): boolean;
36
+ /** unwrap params e.g. (click.debounce.500) => ['debounce', 500] */
37
+ unwrapParams(eventName: string): string[];
38
+ /** get event name e.g. (click.debounce.500) => click */
39
+ unwrapEventName(eventName: string): string;
40
+ }
@@ -0,0 +1,15 @@
1
+ import { EntryEventManagerPlugin } from './abstract.plugin';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * Provides event plugin for debouncing events.
5
+ *
6
+ * How to use:
7
+ * <button (click.debounce)="doSomething($event)">
8
+ * <input (keyup.debounce.500)="doSomething($event)">
9
+ */
10
+ export declare class DebounceEventPlugin extends EntryEventManagerPlugin {
11
+ modifier: string;
12
+ addEventListener(element: HTMLElement, eventName: string, originalHandler: Function): Function;
13
+ static ɵfac: i0.ɵɵFactoryDeclaration<DebounceEventPlugin, never>;
14
+ static ɵprov: i0.ɵɵInjectableDeclaration<DebounceEventPlugin>;
15
+ }
@@ -0,0 +1,2 @@
1
+ export { ThrottleEventPlugin } from './throttle.plugin';
2
+ export { DebounceEventPlugin } from './debounce.plugin';
@@ -0,0 +1,15 @@
1
+ import { EntryEventManagerPlugin } from './abstract.plugin';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * Provides event plugin for throttling events.
5
+ *
6
+ * How to use:
7
+ * <button (click.throttle)="doSomething($event)">
8
+ * <input (keyup.throttle.500)="doSomething($event)">
9
+ */
10
+ export declare class ThrottleEventPlugin extends EntryEventManagerPlugin {
11
+ modifier: string;
12
+ addEventListener(element: HTMLElement, eventName: string, originalHandler: Function): Function;
13
+ static ɵfac: i0.ɵɵFactoryDeclaration<ThrottleEventPlugin, never>;
14
+ static ɵprov: i0.ɵɵInjectableDeclaration<ThrottleEventPlugin>;
15
+ }
@@ -1 +1,4 @@
1
+ export { EntryCommonModule, NG_EVENT_PLUGINS } from './common.module';
1
2
  export * from './utils';
3
+ export * from './directives';
4
+ export * from './event-plugins';
@@ -0,0 +1,46 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ /** Directives */
4
+ import { ScrollToInvalidControlDirective } from './directives/scroll-to-invalid-control.directive';
5
+ /** Event plugins */
6
+ import { DebounceEventPlugin } from './event-plugins/debounce.plugin';
7
+ import { ThrottleEventPlugin } from './event-plugins/throttle.plugin';
8
+ import { EVENT_MANAGER_PLUGINS } from '@angular/platform-browser';
9
+ import * as i0 from "@angular/core";
10
+ const DIRECTIVES = [
11
+ ScrollToInvalidControlDirective
12
+ ];
13
+ const EVENT_PLUGINS = [
14
+ DebounceEventPlugin,
15
+ ThrottleEventPlugin
16
+ ];
17
+ export const NG_EVENT_PLUGINS = EVENT_PLUGINS.map(useClass => ({
18
+ provide: EVENT_MANAGER_PLUGINS,
19
+ multi: true,
20
+ useClass
21
+ }));
22
+ export class EntryCommonModule {
23
+ static forRoot() {
24
+ return {
25
+ ngModule: EntryCommonModule,
26
+ providers: NG_EVENT_PLUGINS
27
+ };
28
+ }
29
+ }
30
+ EntryCommonModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: EntryCommonModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
31
+ EntryCommonModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.9", ngImport: i0, type: EntryCommonModule, imports: [CommonModule, ScrollToInvalidControlDirective], exports: [ScrollToInvalidControlDirective] });
32
+ EntryCommonModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: EntryCommonModule, imports: [CommonModule] });
33
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: EntryCommonModule, decorators: [{
34
+ type: NgModule,
35
+ args: [{
36
+ declarations: [],
37
+ imports: [
38
+ CommonModule,
39
+ ...DIRECTIVES
40
+ ],
41
+ exports: [
42
+ ...DIRECTIVES
43
+ ]
44
+ }]
45
+ }] });
46
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvZW50cnktY29tcG9uZW50cy9jb21tb24vY29tbW9uLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXVCLFFBQVEsRUFBWSxNQUFNLGVBQWUsQ0FBQztBQUN4RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFL0MsaUJBQWlCO0FBRWpCLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBTW5HLG9CQUFvQjtBQUVwQixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN0RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN0RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQzs7QUFSbEUsTUFBTSxVQUFVLEdBQUc7SUFDakIsK0JBQStCO0NBQ2hDLENBQUM7QUFRRixNQUFNLGFBQWEsR0FBRztJQUNwQixtQkFBbUI7SUFDbkIsbUJBQW1CO0NBQ3BCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBZSxhQUFhLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN6RSxPQUFPLEVBQUUscUJBQXFCO0lBQzlCLEtBQUssRUFBRSxJQUFJO0lBQ1gsUUFBUTtDQUNULENBQUMsQ0FBQyxDQUFDO0FBY0osTUFBTSxPQUFPLGlCQUFpQjtJQUM1QixNQUFNLENBQUMsT0FBTztRQUNaLE9BQU87WUFDTCxRQUFRLEVBQUUsaUJBQWlCO1lBQzNCLFNBQVMsRUFBRSxnQkFBZ0I7U0FDNUIsQ0FBQztJQUNKLENBQUM7OzhHQU5VLGlCQUFpQjsrR0FBakIsaUJBQWlCLFlBUDFCLFlBQVksRUF6QmQsK0JBQStCLGFBQS9CLCtCQUErQjsrR0FnQ3BCLGlCQUFpQixZQVAxQixZQUFZOzJGQU9ILGlCQUFpQjtrQkFYN0IsUUFBUTttQkFBQztvQkFDUixZQUFZLEVBQUUsRUFDYjtvQkFDRCxPQUFPLEVBQUU7d0JBQ1AsWUFBWTt3QkFDWixHQUFHLFVBQVU7cUJBQ2Q7b0JBQ0QsT0FBTyxFQUFFO3dCQUNQLEdBQUcsVUFBVTtxQkFDZDtpQkFDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1vZHVsZVdpdGhQcm92aWRlcnMsIE5nTW9kdWxlLCBQcm92aWRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuLyoqIERpcmVjdGl2ZXMgKi9cblxuaW1wb3J0IHsgU2Nyb2xsVG9JbnZhbGlkQ29udHJvbERpcmVjdGl2ZSB9IGZyb20gJy4vZGlyZWN0aXZlcy9zY3JvbGwtdG8taW52YWxpZC1jb250cm9sLmRpcmVjdGl2ZSc7XG5cbmNvbnN0IERJUkVDVElWRVMgPSBbXG4gIFNjcm9sbFRvSW52YWxpZENvbnRyb2xEaXJlY3RpdmVcbl07XG5cbi8qKiBFdmVudCBwbHVnaW5zICovXG5cbmltcG9ydCB7IERlYm91bmNlRXZlbnRQbHVnaW4gfSBmcm9tICcuL2V2ZW50LXBsdWdpbnMvZGVib3VuY2UucGx1Z2luJztcbmltcG9ydCB7IFRocm90dGxlRXZlbnRQbHVnaW4gfSBmcm9tICcuL2V2ZW50LXBsdWdpbnMvdGhyb3R0bGUucGx1Z2luJztcbmltcG9ydCB7IEVWRU5UX01BTkFHRVJfUExVR0lOUyB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuXG5jb25zdCBFVkVOVF9QTFVHSU5TID0gW1xuICBEZWJvdW5jZUV2ZW50UGx1Z2luLFxuICBUaHJvdHRsZUV2ZW50UGx1Z2luXG5dO1xuXG5leHBvcnQgY29uc3QgTkdfRVZFTlRfUExVR0lOUzogUHJvdmlkZXJbXSA9IEVWRU5UX1BMVUdJTlMubWFwKHVzZUNsYXNzID0+ICh7XG4gIHByb3ZpZGU6IEVWRU5UX01BTkFHRVJfUExVR0lOUyxcbiAgbXVsdGk6IHRydWUsXG4gIHVzZUNsYXNzXG59KSk7XG5cblxuQE5nTW9kdWxlKHtcbiAgZGVjbGFyYXRpb25zOiBbXG4gIF0sXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgLi4uRElSRUNUSVZFU1xuICBdLFxuICBleHBvcnRzOiBbXG4gICAgLi4uRElSRUNUSVZFU1xuICBdXG59KVxuZXhwb3J0IGNsYXNzIEVudHJ5Q29tbW9uTW9kdWxlIHtcbiAgc3RhdGljIGZvclJvb3QoKTogTW9kdWxlV2l0aFByb3ZpZGVyczxFbnRyeUNvbW1vbk1vZHVsZT4ge1xuICAgIHJldHVybiB7XG4gICAgICBuZ01vZHVsZTogRW50cnlDb21tb25Nb2R1bGUsXG4gICAgICBwcm92aWRlcnM6IE5HX0VWRU5UX1BMVUdJTlNcbiAgICB9O1xuICB9XG59XG4iXX0=
@@ -0,0 +1,3 @@
1
+ export const NG_VALID_CLASS = '.ng-valid';
2
+ export const NG_INVALID_CLASS = '.ng-invalid';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9lbnRyeS1jb21wb25lbnRzL2NvbW1vbi9jb25zdGFudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLFdBQVcsQ0FBQztBQUMxQyxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxhQUFhLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgTkdfVkFMSURfQ0xBU1MgPSAnLm5nLXZhbGlkJztcclxuZXhwb3J0IGNvbnN0IE5HX0lOVkFMSURfQ0xBU1MgPSAnLm5nLWludmFsaWQnO1xyXG4iXX0=
@@ -0,0 +1,2 @@
1
+ export * from './scroll-to-invalid-control.directive';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2VudHJ5LWNvbXBvbmVudHMvY29tbW9uL2RpcmVjdGl2ZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyx1Q0FBdUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vc2Nyb2xsLXRvLWludmFsaWQtY29udHJvbC5kaXJlY3RpdmUnO1xyXG4iXX0=
@@ -0,0 +1,51 @@
1
+ import { Directive, Self } from '@angular/core';
2
+ import { Subject, fromEvent } from 'rxjs';
3
+ import { takeUntil } from 'rxjs/operators';
4
+ import { NG_INVALID_CLASS } from '../constants';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/forms";
7
+ /**
8
+ * Scroll to first invalid control when form is submitted.
9
+ * Directive is applied to 'form[formGroup],form[ngForm]' (reactive or template driven forms)
10
+ */
11
+ export class ScrollToInvalidControlDirective {
12
+ constructor(form, elementRef) {
13
+ this.form = form;
14
+ this.elementRef = elementRef;
15
+ this.destroy$ = new Subject();
16
+ }
17
+ ngOnInit() {
18
+ fromEvent(this.elementRef.nativeElement, 'submit')
19
+ .pipe(takeUntil(this.destroy$))
20
+ .subscribe(_ => {
21
+ if (this.form.invalid) {
22
+ this.scrollToInvalidControl();
23
+ }
24
+ });
25
+ }
26
+ ngOnDestroy() {
27
+ this.destroy$.next();
28
+ this.destroy$.complete();
29
+ }
30
+ scrollToInvalidControl() {
31
+ const firstInvalidControl = this.elementRef.nativeElement.querySelector(NG_INVALID_CLASS);
32
+ if (firstInvalidControl) {
33
+ firstInvalidControl.scrollIntoView({
34
+ behavior: 'smooth',
35
+ block: 'center' // vertical alignment
36
+ });
37
+ }
38
+ }
39
+ }
40
+ ScrollToInvalidControlDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ScrollToInvalidControlDirective, deps: [{ token: i1.ControlContainer, self: true }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
41
+ ScrollToInvalidControlDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.9", type: ScrollToInvalidControlDirective, isStandalone: true, selector: "form[formGroup],form[ngForm]", ngImport: i0 });
42
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ScrollToInvalidControlDirective, decorators: [{
43
+ type: Directive,
44
+ args: [{
45
+ standalone: true,
46
+ selector: 'form[formGroup],form[ngForm]'
47
+ }]
48
+ }], ctorParameters: function () { return [{ type: i1.ControlContainer, decorators: [{
49
+ type: Self
50
+ }] }, { type: i0.ElementRef }]; } });
51
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nyb2xsLXRvLWludmFsaWQtY29udHJvbC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2VudHJ5LWNvbXBvbmVudHMvY29tbW9uL2RpcmVjdGl2ZXMvc2Nyb2xsLXRvLWludmFsaWQtY29udHJvbC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBaUMsSUFBSSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRS9FLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxjQUFjLENBQUM7OztBQUVoRDs7O0dBR0c7QUFLSCxNQUFNLE9BQU8sK0JBQStCO0lBSTFDLFlBQ2tCLElBQXNCLEVBQzlCLFVBQXVDO1FBRC9CLFNBQUksR0FBSixJQUFJLENBQWtCO1FBQzlCLGVBQVUsR0FBVixVQUFVLENBQTZCO1FBSnpDLGFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO0lBSWMsQ0FBQztJQUV0RCxRQUFRO1FBQ04sU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUFFLFFBQVEsQ0FBQzthQUMvQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUM5QixTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDYixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO2dCQUNyQixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQzthQUMvQjtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVPLHNCQUFzQjtRQUM1QixNQUFNLG1CQUFtQixHQUN2QixJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUVoRSxJQUFJLG1CQUFtQixFQUFFO1lBQ3ZCLG1CQUFtQixDQUFDLGNBQWMsQ0FBQztnQkFDakMsUUFBUSxFQUFFLFFBQVE7Z0JBQ2xCLEtBQUssRUFBRSxRQUFRLENBQUUscUJBQXFCO2FBQ3ZDLENBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQzs7NEhBakNVLCtCQUErQjtnSEFBL0IsK0JBQStCOzJGQUEvQiwrQkFBK0I7a0JBSjNDLFNBQVM7bUJBQUM7b0JBQ1QsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFFBQVEsRUFBRSw4QkFBOEI7aUJBQ3pDOzswQkFNSSxJQUFJIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBPbkRlc3Ryb3ksIE9uSW5pdCwgU2VsZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb250cm9sQ29udGFpbmVyIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBTdWJqZWN0LCBmcm9tRXZlbnQgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBOR19JTlZBTElEX0NMQVNTIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcclxuXHJcbi8qKlxyXG4gKiBTY3JvbGwgdG8gZmlyc3QgaW52YWxpZCBjb250cm9sIHdoZW4gZm9ybSBpcyBzdWJtaXR0ZWQuXHJcbiAqIERpcmVjdGl2ZSBpcyBhcHBsaWVkIHRvICdmb3JtW2Zvcm1Hcm91cF0sZm9ybVtuZ0Zvcm1dJyAocmVhY3RpdmUgb3IgdGVtcGxhdGUgZHJpdmVuIGZvcm1zKVxyXG4gKi9cclxuQERpcmVjdGl2ZSh7XHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBzZWxlY3RvcjogJ2Zvcm1bZm9ybUdyb3VwXSxmb3JtW25nRm9ybV0nXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTY3JvbGxUb0ludmFsaWRDb250cm9sRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG5cclxuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBAU2VsZigpIHByaXZhdGUgZm9ybTogQ29udHJvbENvbnRhaW5lcixcclxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRm9ybUVsZW1lbnQ+KSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBmcm9tRXZlbnQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdzdWJtaXQnKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoXyA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuZm9ybS5pbnZhbGlkKSB7XHJcbiAgICAgICAgICB0aGlzLnNjcm9sbFRvSW52YWxpZENvbnRyb2woKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2Nyb2xsVG9JbnZhbGlkQ29udHJvbCgpIHtcclxuICAgIGNvbnN0IGZpcnN0SW52YWxpZENvbnRyb2w6IEhUTUxFbGVtZW50ID1cclxuICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihOR19JTlZBTElEX0NMQVNTKTtcclxuXHJcbiAgICBpZiAoZmlyc3RJbnZhbGlkQ29udHJvbCkge1xyXG4gICAgICBmaXJzdEludmFsaWRDb250cm9sLnNjcm9sbEludG9WaWV3KHtcclxuICAgICAgICBiZWhhdmlvcjogJ3Ntb290aCcsXHJcbiAgICAgICAgYmxvY2s6ICdjZW50ZXInICAvLyB2ZXJ0aWNhbCBhbGlnbm1lbnRcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==
@@ -0,0 +1,35 @@
1
+ /**
2
+ * abstract class EventManagerPlugin will be exposed in the public api
3
+ * https://github.com/angular/angular/pull/49969
4
+ *
5
+ * Until then creating it from reference
6
+ * https://github.com/angular/angular/blob/main/packages/platform-browser/src/dom/events/event_manager.ts#L93
7
+ *
8
+ * How to create custom event modifiers
9
+ * https://github.com/Tinkoff/ng-event-plugins,
10
+ * https://github.com/angular/angular/blob/main/packages/platform-browser/src/dom/events/key_events.ts
11
+ * https://netbasal.com/lifting-the-veil-insights-into-angulars-eventmanagerplugin-ed9d14cbb31a
12
+ */
13
+ export class EventManagerPlugin {
14
+ }
15
+ /**
16
+ * Entry event plugin base class
17
+ */
18
+ export class EntryEventManagerPlugin extends EventManagerPlugin {
19
+ /** return `true` for every event name that has specified modifier */
20
+ supports(eventName) {
21
+ return eventName.includes(this.modifier);
22
+ }
23
+ /** unwrap params e.g. (click.debounce.500) => ['debounce', 500] */
24
+ unwrapParams(eventName) {
25
+ return eventName
26
+ .substring(eventName.indexOf(this.modifier))
27
+ .split('.')
28
+ .filter(x => !!x);
29
+ }
30
+ /** get event name e.g. (click.debounce.500) => click */
31
+ unwrapEventName(eventName) {
32
+ return eventName.substring(0, eventName.indexOf(this.modifier));
33
+ }
34
+ }
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QucGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9lbnRyeS1jb21wb25lbnRzL2NvbW1vbi9ldmVudC1wbHVnaW5zL2Fic3RyYWN0LnBsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQTs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sT0FBZ0Isa0JBQWtCO0NBbUJ2QztBQUVEOztHQUVHO0FBQ0gsTUFBTSxPQUFnQix1QkFBd0IsU0FBUSxrQkFBa0I7SUFHdEUscUVBQXFFO0lBQ3JFLFFBQVEsQ0FBQyxTQUFpQjtRQUN4QixPQUFPLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRCxtRUFBbUU7SUFDbkUsWUFBWSxDQUFDLFNBQWlCO1FBQzVCLE9BQU8sU0FBUzthQUNiLFNBQVMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUMzQyxLQUFLLENBQUMsR0FBRyxDQUFDO2FBQ1YsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RCLENBQUM7SUFFRCx3REFBd0Q7SUFDeEQsZUFBZSxDQUFDLFNBQWlCO1FBQy9CLE9BQU8sU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUNsRSxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFdmVudE1hbmFnZXIgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcclxuXHJcbi8qKlxyXG4gKiBhYnN0cmFjdCBjbGFzcyBFdmVudE1hbmFnZXJQbHVnaW4gd2lsbCBiZSBleHBvc2VkIGluIHRoZSBwdWJsaWMgYXBpXHJcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvcHVsbC80OTk2OVxyXG4gKlxyXG4gKiBVbnRpbCB0aGVuIGNyZWF0aW5nIGl0IGZyb20gcmVmZXJlbmNlXHJcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvYmxvYi9tYWluL3BhY2thZ2VzL3BsYXRmb3JtLWJyb3dzZXIvc3JjL2RvbS9ldmVudHMvZXZlbnRfbWFuYWdlci50cyNMOTNcclxuICpcclxuICogSG93IHRvIGNyZWF0ZSBjdXN0b20gZXZlbnQgbW9kaWZpZXJzXHJcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9UaW5rb2ZmL25nLWV2ZW50LXBsdWdpbnMsXHJcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvYmxvYi9tYWluL3BhY2thZ2VzL3BsYXRmb3JtLWJyb3dzZXIvc3JjL2RvbS9ldmVudHMva2V5X2V2ZW50cy50c1xyXG4gKiBodHRwczovL25ldGJhc2FsLmNvbS9saWZ0aW5nLXRoZS12ZWlsLWluc2lnaHRzLWludG8tYW5ndWxhcnMtZXZlbnRtYW5hZ2VycGx1Z2luLWVkOWQxNGNiYjMxYVxyXG4gKi9cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEV2ZW50TWFuYWdlclBsdWdpbiB7XHJcblxyXG4gIC8vIFVzaW5nIG5vbi1udWxsIGFzc2VydGlvbiBiZWNhdXNlIGl0J3Mgc2V0IGJ5IEV2ZW50TWFuYWdlcidzIGNvbnN0cnVjdG9yXHJcbiAgbWFuYWdlciE6IEV2ZW50TWFuYWdlcjtcclxuXHJcbiAgLyoqIFNob3VsZCByZXR1cm4gYHRydWVgIGZvciBldmVyeSBldmVudCBuYW1lIHRoYXQgc2hvdWxkIGJlIHN1cHBvcnRlZCBieSB0aGlzIHBsdWdpbiAqL1xyXG4gIGFic3RyYWN0IHN1cHBvcnRzKGV2ZW50TmFtZTogc3RyaW5nKTogYm9vbGVhbjtcclxuXHJcbiAgLyoqXHJcbiAgICogUmVnaXN0ZXJzIGEgaGFuZGxlciBmb3IgYSBzcGVjaWZpYyBlbGVtZW50IGFuZCBldmVudC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSBlbGVtZW50IFRoZSBIVE1MIGVsZW1lbnQgdG8gcmVjZWl2ZSBldmVudCBub3RpZmljYXRpb25zLlxyXG4gICAqIEBwYXJhbSBldmVudE5hbWUgVGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIGxpc3RlbiBmb3IuXHJcbiAgICogQHBhcmFtIGhhbmRsZXIgQSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIG5vdGlmaWNhdGlvbiBvY2N1cnMuIFJlY2VpdmVzIHRoZVxyXG4gICAqIGV2ZW50IG9iamVjdCBhcyBhbiBhcmd1bWVudC5cclxuICAgKiBAcmV0dXJucyAgQSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlbW92ZSB0aGUgaGFuZGxlci5cclxuICAgKi9cclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlc1xyXG4gIGFic3RyYWN0IGFkZEV2ZW50TGlzdGVuZXIoZWxlbWVudDogSFRNTEVsZW1lbnQsIGV2ZW50TmFtZTogc3RyaW5nLCBoYW5kbGVyOiBGdW5jdGlvbik6IEZ1bmN0aW9uO1xyXG59XHJcblxyXG4vKipcclxuICogRW50cnkgZXZlbnQgcGx1Z2luIGJhc2UgY2xhc3NcclxuICovXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBFbnRyeUV2ZW50TWFuYWdlclBsdWdpbiBleHRlbmRzIEV2ZW50TWFuYWdlclBsdWdpbiB7XHJcbiAgYWJzdHJhY3QgbW9kaWZpZXI6IHN0cmluZztcclxuXHJcbiAgLyoqIHJldHVybiBgdHJ1ZWAgZm9yIGV2ZXJ5IGV2ZW50IG5hbWUgdGhhdCBoYXMgc3BlY2lmaWVkIG1vZGlmaWVyICovXHJcbiAgc3VwcG9ydHMoZXZlbnROYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBldmVudE5hbWUuaW5jbHVkZXModGhpcy5tb2RpZmllcik7XHJcbiAgfVxyXG5cclxuICAvKiogdW53cmFwIHBhcmFtcyBlLmcuIChjbGljay5kZWJvdW5jZS41MDApID0+IFsnZGVib3VuY2UnLCA1MDBdICovXHJcbiAgdW53cmFwUGFyYW1zKGV2ZW50TmFtZTogc3RyaW5nKTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIGV2ZW50TmFtZVxyXG4gICAgICAuc3Vic3RyaW5nKGV2ZW50TmFtZS5pbmRleE9mKHRoaXMubW9kaWZpZXIpKVxyXG4gICAgICAuc3BsaXQoJy4nKVxyXG4gICAgICAuZmlsdGVyKHggPT4gISF4KTtcclxuICB9XHJcblxyXG4gIC8qKiBnZXQgZXZlbnQgbmFtZSBlLmcuIChjbGljay5kZWJvdW5jZS41MDApID0+IGNsaWNrICovXHJcbiAgdW53cmFwRXZlbnROYW1lKGV2ZW50TmFtZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBldmVudE5hbWUuc3Vic3RyaW5nKDAsIGV2ZW50TmFtZS5pbmRleE9mKHRoaXMubW9kaWZpZXIpKTtcclxuICB9XHJcbn1cclxuIl19
@@ -0,0 +1,34 @@
1
+ /* eslint-disable @typescript-eslint/ban-types */
2
+ import { Injectable } from '@angular/core';
3
+ import { EntryEventManagerPlugin } from './abstract.plugin';
4
+ import { debounce } from 'lodash-es';
5
+ import * as i0 from "@angular/core";
6
+ /**
7
+ * Provides event plugin for debouncing events.
8
+ *
9
+ * How to use:
10
+ * <button (click.debounce)="doSomething($event)">
11
+ * <input (keyup.debounce.500)="doSomething($event)">
12
+ */
13
+ export class DebounceEventPlugin extends EntryEventManagerPlugin {
14
+ constructor() {
15
+ super(...arguments);
16
+ this.modifier = '.debounce';
17
+ }
18
+ addEventListener(element, eventName, originalHandler) {
19
+ // e.g. (click.debounce.500)
20
+ const [_modifier, milliseconds = 500, option = 'leading'] = this.unwrapParams(eventName);
21
+ // run original handler inside ngZone in which the event occurred
22
+ const innerHandler = (event) => this.manager.getZone().runGuarded(() => originalHandler(event));
23
+ // create debounced handler
24
+ const debouncedHandler = debounce(innerHandler, milliseconds, { leading: option === 'leading', trailing: option === 'trailing' });
25
+ // register event with debounced handler
26
+ return this.manager.addEventListener(element, this.unwrapEventName(eventName), debouncedHandler);
27
+ }
28
+ }
29
+ DebounceEventPlugin.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DebounceEventPlugin, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
30
+ DebounceEventPlugin.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DebounceEventPlugin });
31
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DebounceEventPlugin, decorators: [{
32
+ type: Injectable
33
+ }] });
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVib3VuY2UucGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9lbnRyeS1jb21wb25lbnRzL2NvbW1vbi9ldmVudC1wbHVnaW5zL2RlYm91bmNlLnBsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxpREFBaUQ7QUFDakQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDOztBQUVyQzs7Ozs7O0dBTUc7QUFFSCxNQUFNLE9BQU8sbUJBQW9CLFNBQVEsdUJBQXVCO0lBRGhFOztRQUdFLGFBQVEsR0FBRyxXQUFXLENBQUM7S0FnQnhCO0lBZEMsZ0JBQWdCLENBQUMsT0FBb0IsRUFBRSxTQUFpQixFQUFFLGVBQXlCO1FBQ2pGLDRCQUE0QjtRQUM1QixNQUFNLENBQUMsU0FBUyxFQUFFLFlBQVksR0FBRyxHQUFHLEVBQUUsTUFBTSxHQUFHLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFekYsaUVBQWlFO1FBQ2pFLE1BQU0sWUFBWSxHQUFHLENBQUMsS0FBVSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUVyRywyQkFBMkI7UUFDM0IsTUFBTSxnQkFBZ0IsR0FBRyxRQUFRLENBQUMsWUFBWSxFQUFFLFlBQVksRUFDMUQsRUFBRSxPQUFPLEVBQUUsTUFBTSxLQUFLLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxLQUFLLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFFdEUsd0NBQXdDO1FBQ3hDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ25HLENBQUM7O2dIQWpCVSxtQkFBbUI7b0hBQW5CLG1CQUFtQjsyRkFBbkIsbUJBQW1CO2tCQUQvQixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlcyAqL1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEVudHJ5RXZlbnRNYW5hZ2VyUGx1Z2luIH0gZnJvbSAnLi9hYnN0cmFjdC5wbHVnaW4nO1xyXG5pbXBvcnQgeyBkZWJvdW5jZSB9IGZyb20gJ2xvZGFzaC1lcyc7XHJcblxyXG4vKipcclxuICogUHJvdmlkZXMgZXZlbnQgcGx1Z2luIGZvciBkZWJvdW5jaW5nIGV2ZW50cy5cclxuICpcclxuICogSG93IHRvIHVzZTpcclxuICogPGJ1dHRvbiAoY2xpY2suZGVib3VuY2UpPVwiZG9Tb21ldGhpbmcoJGV2ZW50KVwiPlxyXG4gKiA8aW5wdXQgKGtleXVwLmRlYm91bmNlLjUwMCk9XCJkb1NvbWV0aGluZygkZXZlbnQpXCI+XHJcbiAqL1xyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBEZWJvdW5jZUV2ZW50UGx1Z2luIGV4dGVuZHMgRW50cnlFdmVudE1hbmFnZXJQbHVnaW4ge1xyXG5cclxuICBtb2RpZmllciA9ICcuZGVib3VuY2UnO1xyXG5cclxuICBhZGRFdmVudExpc3RlbmVyKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBldmVudE5hbWU6IHN0cmluZywgb3JpZ2luYWxIYW5kbGVyOiBGdW5jdGlvbik6IEZ1bmN0aW9uIHtcclxuICAgIC8vIGUuZy4gKGNsaWNrLmRlYm91bmNlLjUwMClcclxuICAgIGNvbnN0IFtfbW9kaWZpZXIsIG1pbGxpc2Vjb25kcyA9IDUwMCwgb3B0aW9uID0gJ2xlYWRpbmcnXSA9IHRoaXMudW53cmFwUGFyYW1zKGV2ZW50TmFtZSk7XHJcblxyXG4gICAgLy8gcnVuIG9yaWdpbmFsIGhhbmRsZXIgaW5zaWRlIG5nWm9uZSBpbiB3aGljaCB0aGUgZXZlbnQgb2NjdXJyZWRcclxuICAgIGNvbnN0IGlubmVySGFuZGxlciA9IChldmVudDogYW55KSA9PiB0aGlzLm1hbmFnZXIuZ2V0Wm9uZSgpLnJ1bkd1YXJkZWQoKCkgPT4gb3JpZ2luYWxIYW5kbGVyKGV2ZW50KSk7XHJcblxyXG4gICAgLy8gY3JlYXRlIGRlYm91bmNlZCBoYW5kbGVyXHJcbiAgICBjb25zdCBkZWJvdW5jZWRIYW5kbGVyID0gZGVib3VuY2UoaW5uZXJIYW5kbGVyLCBtaWxsaXNlY29uZHMsXHJcbiAgICAgIHsgbGVhZGluZzogb3B0aW9uID09PSAnbGVhZGluZycsIHRyYWlsaW5nOiBvcHRpb24gPT09ICd0cmFpbGluZycgfSk7XHJcblxyXG4gICAgLy8gcmVnaXN0ZXIgZXZlbnQgd2l0aCBkZWJvdW5jZWQgaGFuZGxlclxyXG4gICAgcmV0dXJuIHRoaXMubWFuYWdlci5hZGRFdmVudExpc3RlbmVyKGVsZW1lbnQsIHRoaXMudW53cmFwRXZlbnROYW1lKGV2ZW50TmFtZSksIGRlYm91bmNlZEhhbmRsZXIpO1xyXG4gIH1cclxufVxyXG4iXX0=
@@ -0,0 +1,3 @@
1
+ export { ThrottleEventPlugin } from './throttle.plugin';
2
+ export { DebounceEventPlugin } from './debounce.plugin';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2VudHJ5LWNvbXBvbmVudHMvY29tbW9uL2V2ZW50LXBsdWdpbnMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDeEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sbUJBQW1CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBUaHJvdHRsZUV2ZW50UGx1Z2luIH0gZnJvbSAnLi90aHJvdHRsZS5wbHVnaW4nO1xyXG5leHBvcnQgeyBEZWJvdW5jZUV2ZW50UGx1Z2luIH0gZnJvbSAnLi9kZWJvdW5jZS5wbHVnaW4nO1xyXG4iXX0=
@@ -0,0 +1,34 @@
1
+ /* eslint-disable @typescript-eslint/ban-types */
2
+ import { Injectable } from '@angular/core';
3
+ import { EntryEventManagerPlugin } from './abstract.plugin';
4
+ import { throttle } from 'lodash-es';
5
+ import * as i0 from "@angular/core";
6
+ /**
7
+ * Provides event plugin for throttling events.
8
+ *
9
+ * How to use:
10
+ * <button (click.throttle)="doSomething($event)">
11
+ * <input (keyup.throttle.500)="doSomething($event)">
12
+ */
13
+ export class ThrottleEventPlugin extends EntryEventManagerPlugin {
14
+ constructor() {
15
+ super(...arguments);
16
+ this.modifier = '.throttle';
17
+ }
18
+ addEventListener(element, eventName, originalHandler) {
19
+ // e.g. (keyup.throttle.500)
20
+ const [_modifier, milliseconds = 500] = this.unwrapParams(eventName);
21
+ // run original handler inside ngZone in which the event occurred
22
+ const innerHandler = (event) => this.manager.getZone().runGuarded(() => originalHandler(event));
23
+ // create throttled handler
24
+ const throttledHandler = throttle(innerHandler, milliseconds);
25
+ // register event with throttled handler
26
+ return this.manager.addEventListener(element, this.unwrapEventName(eventName), throttledHandler);
27
+ }
28
+ }
29
+ ThrottleEventPlugin.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ThrottleEventPlugin, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
30
+ ThrottleEventPlugin.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ThrottleEventPlugin });
31
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ThrottleEventPlugin, decorators: [{
32
+ type: Injectable
33
+ }] });
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhyb3R0bGUucGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9lbnRyeS1jb21wb25lbnRzL2NvbW1vbi9ldmVudC1wbHVnaW5zL3Rocm90dGxlLnBsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxpREFBaUQ7QUFDakQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDOztBQUVyQzs7Ozs7O0dBTUc7QUFFSCxNQUFNLE9BQU8sbUJBQW9CLFNBQVEsdUJBQXVCO0lBRGhFOztRQUdFLGFBQVEsR0FBRyxXQUFXLENBQUM7S0FleEI7SUFiQyxnQkFBZ0IsQ0FBQyxPQUFvQixFQUFFLFNBQWlCLEVBQUUsZUFBeUI7UUFDakYsNEJBQTRCO1FBQzVCLE1BQU0sQ0FBQyxTQUFTLEVBQUUsWUFBWSxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFckUsaUVBQWlFO1FBQ2pFLE1BQU0sWUFBWSxHQUFHLENBQUMsS0FBVSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUVyRywyQkFBMkI7UUFDM0IsTUFBTSxnQkFBZ0IsR0FBRyxRQUFRLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBRTlELHdDQUF3QztRQUN4QyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztJQUNuRyxDQUFDOztnSEFoQlUsbUJBQW1CO29IQUFuQixtQkFBbUI7MkZBQW5CLG1CQUFtQjtrQkFEL0IsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHlwZXMgKi9cclxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBFbnRyeUV2ZW50TWFuYWdlclBsdWdpbiB9IGZyb20gJy4vYWJzdHJhY3QucGx1Z2luJztcclxuaW1wb3J0IHsgdGhyb3R0bGUgfSBmcm9tICdsb2Rhc2gtZXMnO1xyXG5cclxuLyoqXHJcbiAqIFByb3ZpZGVzIGV2ZW50IHBsdWdpbiBmb3IgdGhyb3R0bGluZyBldmVudHMuXHJcbiAqXHJcbiAqIEhvdyB0byB1c2U6XHJcbiAqIDxidXR0b24gKGNsaWNrLnRocm90dGxlKT1cImRvU29tZXRoaW5nKCRldmVudClcIj5cclxuICogPGlucHV0IChrZXl1cC50aHJvdHRsZS41MDApPVwiZG9Tb21ldGhpbmcoJGV2ZW50KVwiPlxyXG4gKi9cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgVGhyb3R0bGVFdmVudFBsdWdpbiBleHRlbmRzIEVudHJ5RXZlbnRNYW5hZ2VyUGx1Z2luIHtcclxuXHJcbiAgbW9kaWZpZXIgPSAnLnRocm90dGxlJztcclxuXHJcbiAgYWRkRXZlbnRMaXN0ZW5lcihlbGVtZW50OiBIVE1MRWxlbWVudCwgZXZlbnROYW1lOiBzdHJpbmcsIG9yaWdpbmFsSGFuZGxlcjogRnVuY3Rpb24pOiBGdW5jdGlvbiB7XHJcbiAgICAvLyBlLmcuIChrZXl1cC50aHJvdHRsZS41MDApXHJcbiAgICBjb25zdCBbX21vZGlmaWVyLCBtaWxsaXNlY29uZHMgPSA1MDBdID0gdGhpcy51bndyYXBQYXJhbXMoZXZlbnROYW1lKTtcclxuXHJcbiAgICAvLyBydW4gb3JpZ2luYWwgaGFuZGxlciBpbnNpZGUgbmdab25lIGluIHdoaWNoIHRoZSBldmVudCBvY2N1cnJlZFxyXG4gICAgY29uc3QgaW5uZXJIYW5kbGVyID0gKGV2ZW50OiBhbnkpID0+IHRoaXMubWFuYWdlci5nZXRab25lKCkucnVuR3VhcmRlZCgoKSA9PiBvcmlnaW5hbEhhbmRsZXIoZXZlbnQpKTtcclxuXHJcbiAgICAvLyBjcmVhdGUgdGhyb3R0bGVkIGhhbmRsZXJcclxuICAgIGNvbnN0IHRocm90dGxlZEhhbmRsZXIgPSB0aHJvdHRsZShpbm5lckhhbmRsZXIsIG1pbGxpc2Vjb25kcyk7XHJcblxyXG4gICAgLy8gcmVnaXN0ZXIgZXZlbnQgd2l0aCB0aHJvdHRsZWQgaGFuZGxlclxyXG4gICAgcmV0dXJuIHRoaXMubWFuYWdlci5hZGRFdmVudExpc3RlbmVyKGVsZW1lbnQsIHRoaXMudW53cmFwRXZlbnROYW1lKGV2ZW50TmFtZSksIHRocm90dGxlZEhhbmRsZXIpO1xyXG4gIH1cclxufVxyXG4iXX0=
@@ -1,2 +1,5 @@
1
+ export { EntryCommonModule, NG_EVENT_PLUGINS } from './common.module';
1
2
  export * from './utils';
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvZW50cnktY29tcG9uZW50cy9jb21tb24vcHVibGljLWFwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vdXRpbHMnO1xuIl19
3
+ export * from './directives';
4
+ export * from './event-plugins';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvZW50cnktY29tcG9uZW50cy9jb21tb24vcHVibGljLWFwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV0RSxjQUFjLFNBQVMsQ0FBQztBQUN4QixjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLGlCQUFpQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiXG5leHBvcnQgeyBFbnRyeUNvbW1vbk1vZHVsZSwgTkdfRVZFTlRfUExVR0lOUyB9IGZyb20gJy4vY29tbW9uLm1vZHVsZSc7XG5cbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMnO1xuZXhwb3J0ICogZnJvbSAnLi9kaXJlY3RpdmVzJztcbmV4cG9ydCAqIGZyb20gJy4vZXZlbnQtcGx1Z2lucyc7XG4iXX0=
@@ -6,6 +6,7 @@ import { EntrySearchFilterModule } from '@enigmatry/entry-components/search-filt
6
6
  import { EntryValidationModule } from '@enigmatry/entry-components/validation';
7
7
  import { EntryFileInputModule } from '@enigmatry/entry-components/file-input';
8
8
  import { EntryTableModule } from '@enigmatry/entry-components/table';
9
+ import { EntryCommonModule, NG_EVENT_PLUGINS } from '@enigmatry/entry-components/common';
9
10
  import * as i0 from "@angular/core";
10
11
  /**
11
12
  * Exports all entry components.
@@ -19,7 +20,7 @@ export class EntryComponentsModule {
19
20
  const permissionServiceProvider = options.permissionService
20
21
  ? [{ provide: EntryPermissionService, useClass: options.permissionService }]
21
22
  : [];
22
- const providers = [...permissionServiceProvider];
23
+ const providers = [...permissionServiceProvider, ...NG_EVENT_PLUGINS];
23
24
  return {
24
25
  ngModule: EntryComponentsModule,
25
26
  providers
@@ -28,6 +29,7 @@ export class EntryComponentsModule {
28
29
  }
29
30
  EntryComponentsModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: EntryComponentsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
30
31
  EntryComponentsModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.9", ngImport: i0, type: EntryComponentsModule, exports: [EntryButtonModule,
32
+ EntryCommonModule,
31
33
  EntryDialogModule,
32
34
  EntryFileInputModule,
33
35
  EntryValidationModule,
@@ -35,6 +37,7 @@ EntryComponentsModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", v
35
37
  EntrySearchFilterModule,
36
38
  EntryTableModule] });
37
39
  EntryComponentsModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: EntryComponentsModule, imports: [EntryButtonModule,
40
+ EntryCommonModule,
38
41
  EntryDialogModule,
39
42
  EntryFileInputModule,
40
43
  EntryValidationModule,
@@ -47,6 +50,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
47
50
  declarations: [],
48
51
  exports: [
49
52
  EntryButtonModule,
53
+ EntryCommonModule,
50
54
  EntryDialogModule,
51
55
  EntryFileInputModule,
52
56
  EntryValidationModule,
@@ -56,4 +60,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
56
60
  ]
57
61
  }]
58
62
  }] });
59
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50cnktY29tcG9uZW50cy5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2VudHJ5LWNvbXBvbmVudHMvbW9kdWxlcy9lbnRyeS1jb21wb25lbnRzLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXVCLFFBQVEsRUFBa0IsTUFBTSxlQUFlLENBQUM7QUFDOUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDdkUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDdkUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLHNCQUFzQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDeEcsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDcEYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDL0UsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDOUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7O0FBTXJFOzs7Ozs7R0FNRztBQWFILE1BQU0sT0FBTyxxQkFBcUI7SUFDaEMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUF3QyxFQUFFO1FBRXZELE1BQU0seUJBQXlCLEdBQWUsT0FBTyxDQUFDLGlCQUFpQjtZQUNyRSxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDNUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUVQLE1BQU0sU0FBUyxHQUFlLENBQUMsR0FBRyx5QkFBeUIsQ0FBQyxDQUFDO1FBQzdELE9BQU87WUFDTCxRQUFRLEVBQUUscUJBQXFCO1lBQy9CLFNBQVM7U0FDVixDQUFDO0lBQ0osQ0FBQzs7a0hBWlUscUJBQXFCO21IQUFyQixxQkFBcUIsWUFUOUIsaUJBQWlCO1FBQ2pCLGlCQUFpQjtRQUNqQixvQkFBb0I7UUFDcEIscUJBQXFCO1FBQ3JCLHFCQUFxQjtRQUNyQix1QkFBdUI7UUFDdkIsZ0JBQWdCO21IQUdQLHFCQUFxQixZQVQ5QixpQkFBaUI7UUFDakIsaUJBQWlCO1FBQ2pCLG9CQUFvQjtRQUNwQixxQkFBcUI7UUFDckIscUJBQXFCO1FBQ3JCLHVCQUF1QjtRQUN2QixnQkFBZ0I7MkZBR1AscUJBQXFCO2tCQVpqQyxRQUFRO21CQUFDO29CQUNSLFlBQVksRUFBRSxFQUFFO29CQUNoQixPQUFPLEVBQUU7d0JBQ1AsaUJBQWlCO3dCQUNqQixpQkFBaUI7d0JBQ2pCLG9CQUFvQjt3QkFDcEIscUJBQXFCO3dCQUNyQixxQkFBcUI7d0JBQ3JCLHVCQUF1Qjt3QkFDdkIsZ0JBQWdCO3FCQUNqQjtpQkFDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1vZHVsZVdpdGhQcm92aWRlcnMsIE5nTW9kdWxlLCBQcm92aWRlciwgVHlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBFbnRyeUJ1dHRvbk1vZHVsZSB9IGZyb20gJ0BlbmlnbWF0cnkvZW50cnktY29tcG9uZW50cy9idXR0b24nO1xyXG5pbXBvcnQgeyBFbnRyeURpYWxvZ01vZHVsZSB9IGZyb20gJ0BlbmlnbWF0cnkvZW50cnktY29tcG9uZW50cy9kaWFsb2cnO1xyXG5pbXBvcnQgeyBFbnRyeVBlcm1pc3Npb25Nb2R1bGUsIEVudHJ5UGVybWlzc2lvblNlcnZpY2UgfSBmcm9tICdAZW5pZ21hdHJ5L2VudHJ5LWNvbXBvbmVudHMvcGVybWlzc2lvbnMnO1xyXG5pbXBvcnQgeyBFbnRyeVNlYXJjaEZpbHRlck1vZHVsZSB9IGZyb20gJ0BlbmlnbWF0cnkvZW50cnktY29tcG9uZW50cy9zZWFyY2gtZmlsdGVyJztcclxuaW1wb3J0IHsgRW50cnlWYWxpZGF0aW9uTW9kdWxlIH0gZnJvbSAnQGVuaWdtYXRyeS9lbnRyeS1jb21wb25lbnRzL3ZhbGlkYXRpb24nO1xyXG5pbXBvcnQgeyBFbnRyeUZpbGVJbnB1dE1vZHVsZSB9IGZyb20gJ0BlbmlnbWF0cnkvZW50cnktY29tcG9uZW50cy9maWxlLWlucHV0JztcclxuaW1wb3J0IHsgRW50cnlUYWJsZU1vZHVsZSB9IGZyb20gJ0BlbmlnbWF0cnkvZW50cnktY29tcG9uZW50cy90YWJsZSc7XHJcblxyXG5pbnRlcmZhY2UgRW50cnlDb21wb25lbnRzTW9kdWxlT3B0aW9ucyB7XHJcbiAgcGVybWlzc2lvblNlcnZpY2U/OiBUeXBlPGFueT47XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBFeHBvcnRzIGFsbCBlbnRyeSBjb21wb25lbnRzLlxyXG4gKlxyXG4gKiBVc2FnZVxyXG4gKiBpbXBvcnQgRW50cnlDb21wb25lbnRzTW9kdWxlIGluIHNoYXJlZC5tb2R1bGUudHMgdG8gaGF2ZSBhY2Nlc3MgdG8gYWxsIGNvbXBvbmVudHMsIGRpcmVjdGl2ZXMsIHBpcGVzLlxyXG4gKiBpbXBvcnQgRW50cnlDb21wb25lbnRzTW9kdWxlLmZvclJvb3QoKSBpbiBhcHAubW9kdWxlLnRzIHRvIHJlZ2lzdGVyIHJvb3QgbW9kdWxlIHByb3ZpZGVycy5cclxuICovXHJcbkBOZ01vZHVsZSh7XHJcbiAgZGVjbGFyYXRpb25zOiBbXSxcclxuICBleHBvcnRzOiBbXHJcbiAgICBFbnRyeUJ1dHRvbk1vZHVsZSxcclxuICAgIEVudHJ5RGlhbG9nTW9kdWxlLFxyXG4gICAgRW50cnlGaWxlSW5wdXRNb2R1bGUsXHJcbiAgICBFbnRyeVZhbGlkYXRpb25Nb2R1bGUsXHJcbiAgICBFbnRyeVBlcm1pc3Npb25Nb2R1bGUsXHJcbiAgICBFbnRyeVNlYXJjaEZpbHRlck1vZHVsZSxcclxuICAgIEVudHJ5VGFibGVNb2R1bGVcclxuICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBFbnRyeUNvbXBvbmVudHNNb2R1bGUge1xyXG4gIHN0YXRpYyBmb3JSb290KG9wdGlvbnM6IEVudHJ5Q29tcG9uZW50c01vZHVsZU9wdGlvbnMgPSB7fSk6IE1vZHVsZVdpdGhQcm92aWRlcnM8RW50cnlDb21wb25lbnRzTW9kdWxlPiB7XHJcblxyXG4gICAgY29uc3QgcGVybWlzc2lvblNlcnZpY2VQcm92aWRlcjogUHJvdmlkZXJbXSA9IG9wdGlvbnMucGVybWlzc2lvblNlcnZpY2VcclxuICAgICAgPyBbeyBwcm92aWRlOiBFbnRyeVBlcm1pc3Npb25TZXJ2aWNlLCB1c2VDbGFzczogb3B0aW9ucy5wZXJtaXNzaW9uU2VydmljZSB9XVxyXG4gICAgICA6IFtdO1xyXG5cclxuICAgIGNvbnN0IHByb3ZpZGVyczogUHJvdmlkZXJbXSA9IFsuLi5wZXJtaXNzaW9uU2VydmljZVByb3ZpZGVyXTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIG5nTW9kdWxlOiBFbnRyeUNvbXBvbmVudHNNb2R1bGUsXHJcbiAgICAgIHByb3ZpZGVyc1xyXG4gICAgfTtcclxuICB9XHJcbn1cclxuIl19
63
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50cnktY29tcG9uZW50cy5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2VudHJ5LWNvbXBvbmVudHMvbW9kdWxlcy9lbnRyeS1jb21wb25lbnRzLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXVCLFFBQVEsRUFBa0IsTUFBTSxlQUFlLENBQUM7QUFDOUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDdkUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDdkUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLHNCQUFzQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDeEcsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDcEYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDL0UsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDOUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDckUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7O0FBTXpGOzs7Ozs7R0FNRztBQWNILE1BQU0sT0FBTyxxQkFBcUI7SUFDaEMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUF3QyxFQUFFO1FBRXZELE1BQU0seUJBQXlCLEdBQWUsT0FBTyxDQUFDLGlCQUFpQjtZQUNyRSxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDNUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUVQLE1BQU0sU0FBUyxHQUFlLENBQUMsR0FBRyx5QkFBeUIsRUFBRSxHQUFHLGdCQUFnQixDQUFDLENBQUM7UUFDbEYsT0FBTztZQUNMLFFBQVEsRUFBRSxxQkFBcUI7WUFDL0IsU0FBUztTQUNWLENBQUM7SUFDSixDQUFDOztrSEFaVSxxQkFBcUI7bUhBQXJCLHFCQUFxQixZQVY5QixpQkFBaUI7UUFDakIsaUJBQWlCO1FBQ2pCLGlCQUFpQjtRQUNqQixvQkFBb0I7UUFDcEIscUJBQXFCO1FBQ3JCLHFCQUFxQjtRQUNyQix1QkFBdUI7UUFDdkIsZ0JBQWdCO21IQUdQLHFCQUFxQixZQVY5QixpQkFBaUI7UUFDakIsaUJBQWlCO1FBQ2pCLGlCQUFpQjtRQUNqQixvQkFBb0I7UUFDcEIscUJBQXFCO1FBQ3JCLHFCQUFxQjtRQUNyQix1QkFBdUI7UUFDdkIsZ0JBQWdCOzJGQUdQLHFCQUFxQjtrQkFiakMsUUFBUTttQkFBQztvQkFDUixZQUFZLEVBQUUsRUFBRTtvQkFDaEIsT0FBTyxFQUFFO3dCQUNQLGlCQUFpQjt3QkFDakIsaUJBQWlCO3dCQUNqQixpQkFBaUI7d0JBQ2pCLG9CQUFvQjt3QkFDcEIscUJBQXFCO3dCQUNyQixxQkFBcUI7d0JBQ3JCLHVCQUF1Qjt3QkFDdkIsZ0JBQWdCO3FCQUNqQjtpQkFDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1vZHVsZVdpdGhQcm92aWRlcnMsIE5nTW9kdWxlLCBQcm92aWRlciwgVHlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBFbnRyeUJ1dHRvbk1vZHVsZSB9IGZyb20gJ0BlbmlnbWF0cnkvZW50cnktY29tcG9uZW50cy9idXR0b24nO1xyXG5pbXBvcnQgeyBFbnRyeURpYWxvZ01vZHVsZSB9IGZyb20gJ0BlbmlnbWF0cnkvZW50cnktY29tcG9uZW50cy9kaWFsb2cnO1xyXG5pbXBvcnQgeyBFbnRyeVBlcm1pc3Npb25Nb2R1bGUsIEVudHJ5UGVybWlzc2lvblNlcnZpY2UgfSBmcm9tICdAZW5pZ21hdHJ5L2VudHJ5LWNvbXBvbmVudHMvcGVybWlzc2lvbnMnO1xyXG5pbXBvcnQgeyBFbnRyeVNlYXJjaEZpbHRlck1vZHVsZSB9IGZyb20gJ0BlbmlnbWF0cnkvZW50cnktY29tcG9uZW50cy9zZWFyY2gtZmlsdGVyJztcclxuaW1wb3J0IHsgRW50cnlWYWxpZGF0aW9uTW9kdWxlIH0gZnJvbSAnQGVuaWdtYXRyeS9lbnRyeS1jb21wb25lbnRzL3ZhbGlkYXRpb24nO1xyXG5pbXBvcnQgeyBFbnRyeUZpbGVJbnB1dE1vZHVsZSB9IGZyb20gJ0BlbmlnbWF0cnkvZW50cnktY29tcG9uZW50cy9maWxlLWlucHV0JztcclxuaW1wb3J0IHsgRW50cnlUYWJsZU1vZHVsZSB9IGZyb20gJ0BlbmlnbWF0cnkvZW50cnktY29tcG9uZW50cy90YWJsZSc7XHJcbmltcG9ydCB7IEVudHJ5Q29tbW9uTW9kdWxlLCBOR19FVkVOVF9QTFVHSU5TIH0gZnJvbSAnQGVuaWdtYXRyeS9lbnRyeS1jb21wb25lbnRzL2NvbW1vbic7XHJcblxyXG5pbnRlcmZhY2UgRW50cnlDb21wb25lbnRzTW9kdWxlT3B0aW9ucyB7XHJcbiAgcGVybWlzc2lvblNlcnZpY2U/OiBUeXBlPGFueT47XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBFeHBvcnRzIGFsbCBlbnRyeSBjb21wb25lbnRzLlxyXG4gKlxyXG4gKiBVc2FnZVxyXG4gKiBpbXBvcnQgRW50cnlDb21wb25lbnRzTW9kdWxlIGluIHNoYXJlZC5tb2R1bGUudHMgdG8gaGF2ZSBhY2Nlc3MgdG8gYWxsIGNvbXBvbmVudHMsIGRpcmVjdGl2ZXMsIHBpcGVzLlxyXG4gKiBpbXBvcnQgRW50cnlDb21wb25lbnRzTW9kdWxlLmZvclJvb3QoKSBpbiBhcHAubW9kdWxlLnRzIHRvIHJlZ2lzdGVyIHJvb3QgbW9kdWxlIHByb3ZpZGVycy5cclxuICovXHJcbkBOZ01vZHVsZSh7XHJcbiAgZGVjbGFyYXRpb25zOiBbXSxcclxuICBleHBvcnRzOiBbXHJcbiAgICBFbnRyeUJ1dHRvbk1vZHVsZSxcclxuICAgIEVudHJ5Q29tbW9uTW9kdWxlLFxyXG4gICAgRW50cnlEaWFsb2dNb2R1bGUsXHJcbiAgICBFbnRyeUZpbGVJbnB1dE1vZHVsZSxcclxuICAgIEVudHJ5VmFsaWRhdGlvbk1vZHVsZSxcclxuICAgIEVudHJ5UGVybWlzc2lvbk1vZHVsZSxcclxuICAgIEVudHJ5U2VhcmNoRmlsdGVyTW9kdWxlLFxyXG4gICAgRW50cnlUYWJsZU1vZHVsZVxyXG4gIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIEVudHJ5Q29tcG9uZW50c01vZHVsZSB7XHJcbiAgc3RhdGljIGZvclJvb3Qob3B0aW9uczogRW50cnlDb21wb25lbnRzTW9kdWxlT3B0aW9ucyA9IHt9KTogTW9kdWxlV2l0aFByb3ZpZGVyczxFbnRyeUNvbXBvbmVudHNNb2R1bGU+IHtcclxuXHJcbiAgICBjb25zdCBwZXJtaXNzaW9uU2VydmljZVByb3ZpZGVyOiBQcm92aWRlcltdID0gb3B0aW9ucy5wZXJtaXNzaW9uU2VydmljZVxyXG4gICAgICA/IFt7IHByb3ZpZGU6IEVudHJ5UGVybWlzc2lvblNlcnZpY2UsIHVzZUNsYXNzOiBvcHRpb25zLnBlcm1pc3Npb25TZXJ2aWNlIH1dXHJcbiAgICAgIDogW107XHJcblxyXG4gICAgY29uc3QgcHJvdmlkZXJzOiBQcm92aWRlcltdID0gWy4uLnBlcm1pc3Npb25TZXJ2aWNlUHJvdmlkZXIsIC4uLk5HX0VWRU5UX1BMVUdJTlNdO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgbmdNb2R1bGU6IEVudHJ5Q29tcG9uZW50c01vZHVsZSxcclxuICAgICAgcHJvdmlkZXJzXHJcbiAgICB9O1xyXG4gIH1cclxufVxyXG4iXX0=
@@ -2,6 +2,7 @@
2
2
  * Public API Surface of entry-components
3
3
  */
4
4
  export * from '@enigmatry/entry-components/button';
5
+ export * from '@enigmatry/entry-components/common';
5
6
  export * from '@enigmatry/entry-components/dialog';
6
7
  export * from '@enigmatry/entry-components/file-input';
7
8
  export * from '@enigmatry/entry-components/permissions';
@@ -9,4 +10,4 @@ export * from '@enigmatry/entry-components/search-filter';
9
10
  export * from '@enigmatry/entry-components/validation';
10
11
  export * from '@enigmatry/entry-components/table';
11
12
  export { EntryComponentsModule } from './modules/entry-components.module';
12
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYnMvZW50cnktY29tcG9uZW50cy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBOztHQUVHO0FBQ0gsY0FBYyxvQ0FBb0MsQ0FBQztBQUNuRCxjQUFjLG9DQUFvQyxDQUFDO0FBQ25ELGNBQWMsd0NBQXdDLENBQUM7QUFDdkQsY0FBYyx5Q0FBeUMsQ0FBQztBQUN4RCxjQUFjLDJDQUEyQyxDQUFDO0FBQzFELGNBQWMsd0NBQXdDLENBQUM7QUFDdkQsY0FBYyxtQ0FBbUMsQ0FBQztBQUVsRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIlxuLypcbiAqIFB1YmxpYyBBUEkgU3VyZmFjZSBvZiBlbnRyeS1jb21wb25lbnRzXG4gKi9cbmV4cG9ydCAqIGZyb20gJ0BlbmlnbWF0cnkvZW50cnktY29tcG9uZW50cy9idXR0b24nO1xuZXhwb3J0ICogZnJvbSAnQGVuaWdtYXRyeS9lbnRyeS1jb21wb25lbnRzL2RpYWxvZyc7XG5leHBvcnQgKiBmcm9tICdAZW5pZ21hdHJ5L2VudHJ5LWNvbXBvbmVudHMvZmlsZS1pbnB1dCc7XG5leHBvcnQgKiBmcm9tICdAZW5pZ21hdHJ5L2VudHJ5LWNvbXBvbmVudHMvcGVybWlzc2lvbnMnO1xuZXhwb3J0ICogZnJvbSAnQGVuaWdtYXRyeS9lbnRyeS1jb21wb25lbnRzL3NlYXJjaC1maWx0ZXInO1xuZXhwb3J0ICogZnJvbSAnQGVuaWdtYXRyeS9lbnRyeS1jb21wb25lbnRzL3ZhbGlkYXRpb24nO1xuZXhwb3J0ICogZnJvbSAnQGVuaWdtYXRyeS9lbnRyeS1jb21wb25lbnRzL3RhYmxlJztcblxuZXhwb3J0IHsgRW50cnlDb21wb25lbnRzTW9kdWxlIH0gZnJvbSAnLi9tb2R1bGVzL2VudHJ5LWNvbXBvbmVudHMubW9kdWxlJztcbiJdfQ==
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYnMvZW50cnktY29tcG9uZW50cy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBOztHQUVHO0FBQ0gsY0FBYyxvQ0FBb0MsQ0FBQztBQUNuRCxjQUFjLG9DQUFvQyxDQUFDO0FBQ25ELGNBQWMsb0NBQW9DLENBQUM7QUFDbkQsY0FBYyx3Q0FBd0MsQ0FBQztBQUN2RCxjQUFjLHlDQUF5QyxDQUFDO0FBQ3hELGNBQWMsMkNBQTJDLENBQUM7QUFDMUQsY0FBYyx3Q0FBd0MsQ0FBQztBQUN2RCxjQUFjLG1DQUFtQyxDQUFDO0FBRWxELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiXG4vKlxuICogUHVibGljIEFQSSBTdXJmYWNlIG9mIGVudHJ5LWNvbXBvbmVudHNcbiAqL1xuZXhwb3J0ICogZnJvbSAnQGVuaWdtYXRyeS9lbnRyeS1jb21wb25lbnRzL2J1dHRvbic7XG5leHBvcnQgKiBmcm9tICdAZW5pZ21hdHJ5L2VudHJ5LWNvbXBvbmVudHMvY29tbW9uJztcbmV4cG9ydCAqIGZyb20gJ0BlbmlnbWF0cnkvZW50cnktY29tcG9uZW50cy9kaWFsb2cnO1xuZXhwb3J0ICogZnJvbSAnQGVuaWdtYXRyeS9lbnRyeS1jb21wb25lbnRzL2ZpbGUtaW5wdXQnO1xuZXhwb3J0ICogZnJvbSAnQGVuaWdtYXRyeS9lbnRyeS1jb21wb25lbnRzL3Blcm1pc3Npb25zJztcbmV4cG9ydCAqIGZyb20gJ0BlbmlnbWF0cnkvZW50cnktY29tcG9uZW50cy9zZWFyY2gtZmlsdGVyJztcbmV4cG9ydCAqIGZyb20gJ0BlbmlnbWF0cnkvZW50cnktY29tcG9uZW50cy92YWxpZGF0aW9uJztcbmV4cG9ydCAqIGZyb20gJ0BlbmlnbWF0cnkvZW50cnktY29tcG9uZW50cy90YWJsZSc7XG5cbmV4cG9ydCB7IEVudHJ5Q29tcG9uZW50c01vZHVsZSB9IGZyb20gJy4vbW9kdWxlcy9lbnRyeS1jb21wb25lbnRzLm1vZHVsZSc7XG4iXX0=
@@ -1,4 +1,193 @@
1
- import { InjectionToken } from '@angular/core';
1
+ import * as i0 from '@angular/core';
2
+ import { Directive, Self, Injectable, NgModule, InjectionToken } from '@angular/core';
3
+ import { CommonModule } from '@angular/common';
4
+ import { Subject, fromEvent } from 'rxjs';
5
+ import { takeUntil } from 'rxjs/operators';
6
+ import * as i1 from '@angular/forms';
7
+ import { debounce, throttle } from 'lodash-es';
8
+ import { EVENT_MANAGER_PLUGINS } from '@angular/platform-browser';
9
+
10
+ const NG_VALID_CLASS = '.ng-valid';
11
+ const NG_INVALID_CLASS = '.ng-invalid';
12
+
13
+ /**
14
+ * Scroll to first invalid control when form is submitted.
15
+ * Directive is applied to 'form[formGroup],form[ngForm]' (reactive or template driven forms)
16
+ */
17
+ class ScrollToInvalidControlDirective {
18
+ constructor(form, elementRef) {
19
+ this.form = form;
20
+ this.elementRef = elementRef;
21
+ this.destroy$ = new Subject();
22
+ }
23
+ ngOnInit() {
24
+ fromEvent(this.elementRef.nativeElement, 'submit')
25
+ .pipe(takeUntil(this.destroy$))
26
+ .subscribe(_ => {
27
+ if (this.form.invalid) {
28
+ this.scrollToInvalidControl();
29
+ }
30
+ });
31
+ }
32
+ ngOnDestroy() {
33
+ this.destroy$.next();
34
+ this.destroy$.complete();
35
+ }
36
+ scrollToInvalidControl() {
37
+ const firstInvalidControl = this.elementRef.nativeElement.querySelector(NG_INVALID_CLASS);
38
+ if (firstInvalidControl) {
39
+ firstInvalidControl.scrollIntoView({
40
+ behavior: 'smooth',
41
+ block: 'center' // vertical alignment
42
+ });
43
+ }
44
+ }
45
+ }
46
+ ScrollToInvalidControlDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ScrollToInvalidControlDirective, deps: [{ token: i1.ControlContainer, self: true }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
47
+ ScrollToInvalidControlDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.9", type: ScrollToInvalidControlDirective, isStandalone: true, selector: "form[formGroup],form[ngForm]", ngImport: i0 });
48
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ScrollToInvalidControlDirective, decorators: [{
49
+ type: Directive,
50
+ args: [{
51
+ standalone: true,
52
+ selector: 'form[formGroup],form[ngForm]'
53
+ }]
54
+ }], ctorParameters: function () {
55
+ return [{ type: i1.ControlContainer, decorators: [{
56
+ type: Self
57
+ }] }, { type: i0.ElementRef }];
58
+ } });
59
+
60
+ /**
61
+ * abstract class EventManagerPlugin will be exposed in the public api
62
+ * https://github.com/angular/angular/pull/49969
63
+ *
64
+ * Until then creating it from reference
65
+ * https://github.com/angular/angular/blob/main/packages/platform-browser/src/dom/events/event_manager.ts#L93
66
+ *
67
+ * How to create custom event modifiers
68
+ * https://github.com/Tinkoff/ng-event-plugins,
69
+ * https://github.com/angular/angular/blob/main/packages/platform-browser/src/dom/events/key_events.ts
70
+ * https://netbasal.com/lifting-the-veil-insights-into-angulars-eventmanagerplugin-ed9d14cbb31a
71
+ */
72
+ class EventManagerPlugin {
73
+ }
74
+ /**
75
+ * Entry event plugin base class
76
+ */
77
+ class EntryEventManagerPlugin extends EventManagerPlugin {
78
+ /** return `true` for every event name that has specified modifier */
79
+ supports(eventName) {
80
+ return eventName.includes(this.modifier);
81
+ }
82
+ /** unwrap params e.g. (click.debounce.500) => ['debounce', 500] */
83
+ unwrapParams(eventName) {
84
+ return eventName
85
+ .substring(eventName.indexOf(this.modifier))
86
+ .split('.')
87
+ .filter(x => !!x);
88
+ }
89
+ /** get event name e.g. (click.debounce.500) => click */
90
+ unwrapEventName(eventName) {
91
+ return eventName.substring(0, eventName.indexOf(this.modifier));
92
+ }
93
+ }
94
+
95
+ /* eslint-disable @typescript-eslint/ban-types */
96
+ /**
97
+ * Provides event plugin for debouncing events.
98
+ *
99
+ * How to use:
100
+ * <button (click.debounce)="doSomething($event)">
101
+ * <input (keyup.debounce.500)="doSomething($event)">
102
+ */
103
+ class DebounceEventPlugin extends EntryEventManagerPlugin {
104
+ constructor() {
105
+ super(...arguments);
106
+ this.modifier = '.debounce';
107
+ }
108
+ addEventListener(element, eventName, originalHandler) {
109
+ // e.g. (click.debounce.500)
110
+ const [_modifier, milliseconds = 500, option = 'leading'] = this.unwrapParams(eventName);
111
+ // run original handler inside ngZone in which the event occurred
112
+ const innerHandler = (event) => this.manager.getZone().runGuarded(() => originalHandler(event));
113
+ // create debounced handler
114
+ const debouncedHandler = debounce(innerHandler, milliseconds, { leading: option === 'leading', trailing: option === 'trailing' });
115
+ // register event with debounced handler
116
+ return this.manager.addEventListener(element, this.unwrapEventName(eventName), debouncedHandler);
117
+ }
118
+ }
119
+ DebounceEventPlugin.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DebounceEventPlugin, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
120
+ DebounceEventPlugin.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DebounceEventPlugin });
121
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DebounceEventPlugin, decorators: [{
122
+ type: Injectable
123
+ }] });
124
+
125
+ /* eslint-disable @typescript-eslint/ban-types */
126
+ /**
127
+ * Provides event plugin for throttling events.
128
+ *
129
+ * How to use:
130
+ * <button (click.throttle)="doSomething($event)">
131
+ * <input (keyup.throttle.500)="doSomething($event)">
132
+ */
133
+ class ThrottleEventPlugin extends EntryEventManagerPlugin {
134
+ constructor() {
135
+ super(...arguments);
136
+ this.modifier = '.throttle';
137
+ }
138
+ addEventListener(element, eventName, originalHandler) {
139
+ // e.g. (keyup.throttle.500)
140
+ const [_modifier, milliseconds = 500] = this.unwrapParams(eventName);
141
+ // run original handler inside ngZone in which the event occurred
142
+ const innerHandler = (event) => this.manager.getZone().runGuarded(() => originalHandler(event));
143
+ // create throttled handler
144
+ const throttledHandler = throttle(innerHandler, milliseconds);
145
+ // register event with throttled handler
146
+ return this.manager.addEventListener(element, this.unwrapEventName(eventName), throttledHandler);
147
+ }
148
+ }
149
+ ThrottleEventPlugin.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ThrottleEventPlugin, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
150
+ ThrottleEventPlugin.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ThrottleEventPlugin });
151
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ThrottleEventPlugin, decorators: [{
152
+ type: Injectable
153
+ }] });
154
+
155
+ const DIRECTIVES = [
156
+ ScrollToInvalidControlDirective
157
+ ];
158
+ const EVENT_PLUGINS = [
159
+ DebounceEventPlugin,
160
+ ThrottleEventPlugin
161
+ ];
162
+ const NG_EVENT_PLUGINS = EVENT_PLUGINS.map(useClass => ({
163
+ provide: EVENT_MANAGER_PLUGINS,
164
+ multi: true,
165
+ useClass
166
+ }));
167
+ class EntryCommonModule {
168
+ static forRoot() {
169
+ return {
170
+ ngModule: EntryCommonModule,
171
+ providers: NG_EVENT_PLUGINS
172
+ };
173
+ }
174
+ }
175
+ EntryCommonModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: EntryCommonModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
176
+ EntryCommonModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.9", ngImport: i0, type: EntryCommonModule, imports: [CommonModule, ScrollToInvalidControlDirective], exports: [ScrollToInvalidControlDirective] });
177
+ EntryCommonModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: EntryCommonModule, imports: [CommonModule] });
178
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: EntryCommonModule, decorators: [{
179
+ type: NgModule,
180
+ args: [{
181
+ declarations: [],
182
+ imports: [
183
+ CommonModule,
184
+ ...DIRECTIVES
185
+ ],
186
+ exports: [
187
+ ...DIRECTIVES
188
+ ]
189
+ }]
190
+ }] });
2
191
 
3
192
  function createInjectionToken(defaultValue) {
4
193
  return new InjectionToken(defaultValue.constructor.name, {
@@ -17,5 +206,5 @@ function provideConfig(token, factory) {
17
206
  * Generated bundle index. Do not edit.
18
207
  */
19
208
 
20
- export { createInjectionToken, provideConfig };
209
+ export { DebounceEventPlugin, EntryCommonModule, NG_EVENT_PLUGINS, ScrollToInvalidControlDirective, ThrottleEventPlugin, createInjectionToken, provideConfig };
21
210
  //# sourceMappingURL=enigmatry-entry-components-common.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"enigmatry-entry-components-common.mjs","sources":["../../../../libs/entry-components/common/utils/provide-config.ts","../../../../libs/entry-components/common/enigmatry-entry-components-common.ts"],"sourcesContent":["import { InjectionToken, Provider } from '@angular/core';\r\n\r\nexport function createInjectionToken<T>(defaultValue: T): InjectionToken<T> {\r\n return new InjectionToken<T>(defaultValue.constructor.name,\r\n {\r\n providedIn: 'root',\r\n factory: () => defaultValue\r\n }\r\n );\r\n}\r\n\r\nexport function provideConfig<T>(token: InjectionToken<T>, factory: () => T): Provider {\r\n return {\r\n provide: token,\r\n useFactory: factory\r\n };\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;AAEM,SAAU,oBAAoB,CAAI,YAAe,EAAA;IACrD,OAAO,IAAI,cAAc,CAAI,YAAY,CAAC,WAAW,CAAC,IAAI,EACxD;AACE,QAAA,UAAU,EAAE,MAAM;AAClB,QAAA,OAAO,EAAE,MAAM,YAAY;AAC5B,KAAA,CACF,CAAC;AACJ,CAAC;AAEe,SAAA,aAAa,CAAI,KAAwB,EAAE,OAAgB,EAAA;IACzE,OAAO;AACL,QAAA,OAAO,EAAE,KAAK;AACd,QAAA,UAAU,EAAE,OAAO;KACpB,CAAC;AACJ;;AChBA;;AAEG;;;;"}
1
+ {"version":3,"file":"enigmatry-entry-components-common.mjs","sources":["../../../../libs/entry-components/common/constants.ts","../../../../libs/entry-components/common/directives/scroll-to-invalid-control.directive.ts","../../../../libs/entry-components/common/event-plugins/abstract.plugin.ts","../../../../libs/entry-components/common/event-plugins/debounce.plugin.ts","../../../../libs/entry-components/common/event-plugins/throttle.plugin.ts","../../../../libs/entry-components/common/common.module.ts","../../../../libs/entry-components/common/utils/provide-config.ts","../../../../libs/entry-components/common/enigmatry-entry-components-common.ts"],"sourcesContent":["export const NG_VALID_CLASS = '.ng-valid';\r\nexport const NG_INVALID_CLASS = '.ng-invalid';\r\n","import { Directive, ElementRef, OnDestroy, OnInit, Self } from '@angular/core';\r\nimport { ControlContainer } from '@angular/forms';\r\nimport { Subject, fromEvent } from 'rxjs';\r\nimport { takeUntil } from 'rxjs/operators';\r\nimport { NG_INVALID_CLASS } from '../constants';\r\n\r\n/**\r\n * Scroll to first invalid control when form is submitted.\r\n * Directive is applied to 'form[formGroup],form[ngForm]' (reactive or template driven forms)\r\n */\r\n@Directive({\r\n standalone: true,\r\n selector: 'form[formGroup],form[ngForm]'\r\n})\r\nexport class ScrollToInvalidControlDirective implements OnInit, OnDestroy {\r\n\r\n private destroy$ = new Subject<void>();\r\n\r\n constructor(\r\n @Self() private form: ControlContainer,\r\n private elementRef: ElementRef<HTMLFormElement>) { }\r\n\r\n ngOnInit(): void {\r\n fromEvent(this.elementRef.nativeElement, 'submit')\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe(_ => {\r\n if (this.form.invalid) {\r\n this.scrollToInvalidControl();\r\n }\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n\r\n private scrollToInvalidControl() {\r\n const firstInvalidControl: HTMLElement =\r\n this.elementRef.nativeElement.querySelector(NG_INVALID_CLASS);\r\n\r\n if (firstInvalidControl) {\r\n firstInvalidControl.scrollIntoView({\r\n behavior: 'smooth',\r\n block: 'center' // vertical alignment\r\n });\r\n }\r\n }\r\n}\r\n","import { EventManager } from '@angular/platform-browser';\r\n\r\n/**\r\n * abstract class EventManagerPlugin will be exposed in the public api\r\n * https://github.com/angular/angular/pull/49969\r\n *\r\n * Until then creating it from reference\r\n * https://github.com/angular/angular/blob/main/packages/platform-browser/src/dom/events/event_manager.ts#L93\r\n *\r\n * How to create custom event modifiers\r\n * https://github.com/Tinkoff/ng-event-plugins,\r\n * https://github.com/angular/angular/blob/main/packages/platform-browser/src/dom/events/key_events.ts\r\n * https://netbasal.com/lifting-the-veil-insights-into-angulars-eventmanagerplugin-ed9d14cbb31a\r\n */\r\nexport abstract class EventManagerPlugin {\r\n\r\n // Using non-null assertion because it's set by EventManager's constructor\r\n manager!: EventManager;\r\n\r\n /** Should return `true` for every event name that should be supported by this plugin */\r\n abstract supports(eventName: string): boolean;\r\n\r\n /**\r\n * Registers a handler for a specific element and event.\r\n *\r\n * @param element The HTML element to receive event notifications.\r\n * @param eventName The name of the event to listen for.\r\n * @param handler A function to call when the notification occurs. Receives the\r\n * event object as an argument.\r\n * @returns A callback function that can be used to remove the handler.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/ban-types\r\n abstract addEventListener(element: HTMLElement, eventName: string, handler: Function): Function;\r\n}\r\n\r\n/**\r\n * Entry event plugin base class\r\n */\r\nexport abstract class EntryEventManagerPlugin extends EventManagerPlugin {\r\n abstract modifier: string;\r\n\r\n /** return `true` for every event name that has specified modifier */\r\n supports(eventName: string): boolean {\r\n return eventName.includes(this.modifier);\r\n }\r\n\r\n /** unwrap params e.g. (click.debounce.500) => ['debounce', 500] */\r\n unwrapParams(eventName: string): string[] {\r\n return eventName\r\n .substring(eventName.indexOf(this.modifier))\r\n .split('.')\r\n .filter(x => !!x);\r\n }\r\n\r\n /** get event name e.g. (click.debounce.500) => click */\r\n unwrapEventName(eventName: string): string {\r\n return eventName.substring(0, eventName.indexOf(this.modifier));\r\n }\r\n}\r\n","/* eslint-disable @typescript-eslint/ban-types */\r\nimport { Injectable } from '@angular/core';\r\nimport { EntryEventManagerPlugin } from './abstract.plugin';\r\nimport { debounce } from 'lodash-es';\r\n\r\n/**\r\n * Provides event plugin for debouncing events.\r\n *\r\n * How to use:\r\n * <button (click.debounce)=\"doSomething($event)\">\r\n * <input (keyup.debounce.500)=\"doSomething($event)\">\r\n */\r\n@Injectable()\r\nexport class DebounceEventPlugin extends EntryEventManagerPlugin {\r\n\r\n modifier = '.debounce';\r\n\r\n addEventListener(element: HTMLElement, eventName: string, originalHandler: Function): Function {\r\n // e.g. (click.debounce.500)\r\n const [_modifier, milliseconds = 500, option = 'leading'] = this.unwrapParams(eventName);\r\n\r\n // run original handler inside ngZone in which the event occurred\r\n const innerHandler = (event: any) => this.manager.getZone().runGuarded(() => originalHandler(event));\r\n\r\n // create debounced handler\r\n const debouncedHandler = debounce(innerHandler, milliseconds,\r\n { leading: option === 'leading', trailing: option === 'trailing' });\r\n\r\n // register event with debounced handler\r\n return this.manager.addEventListener(element, this.unwrapEventName(eventName), debouncedHandler);\r\n }\r\n}\r\n","/* eslint-disable @typescript-eslint/ban-types */\r\nimport { Injectable } from '@angular/core';\r\nimport { EntryEventManagerPlugin } from './abstract.plugin';\r\nimport { throttle } from 'lodash-es';\r\n\r\n/**\r\n * Provides event plugin for throttling events.\r\n *\r\n * How to use:\r\n * <button (click.throttle)=\"doSomething($event)\">\r\n * <input (keyup.throttle.500)=\"doSomething($event)\">\r\n */\r\n@Injectable()\r\nexport class ThrottleEventPlugin extends EntryEventManagerPlugin {\r\n\r\n modifier = '.throttle';\r\n\r\n addEventListener(element: HTMLElement, eventName: string, originalHandler: Function): Function {\r\n // e.g. (keyup.throttle.500)\r\n const [_modifier, milliseconds = 500] = this.unwrapParams(eventName);\r\n\r\n // run original handler inside ngZone in which the event occurred\r\n const innerHandler = (event: any) => this.manager.getZone().runGuarded(() => originalHandler(event));\r\n\r\n // create throttled handler\r\n const throttledHandler = throttle(innerHandler, milliseconds);\r\n\r\n // register event with throttled handler\r\n return this.manager.addEventListener(element, this.unwrapEventName(eventName), throttledHandler);\r\n }\r\n}\r\n","import { ModuleWithProviders, NgModule, Provider } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n/** Directives */\n\nimport { ScrollToInvalidControlDirective } from './directives/scroll-to-invalid-control.directive';\n\nconst DIRECTIVES = [\n ScrollToInvalidControlDirective\n];\n\n/** Event plugins */\n\nimport { DebounceEventPlugin } from './event-plugins/debounce.plugin';\nimport { ThrottleEventPlugin } from './event-plugins/throttle.plugin';\nimport { EVENT_MANAGER_PLUGINS } from '@angular/platform-browser';\n\nconst EVENT_PLUGINS = [\n DebounceEventPlugin,\n ThrottleEventPlugin\n];\n\nexport const NG_EVENT_PLUGINS: Provider[] = EVENT_PLUGINS.map(useClass => ({\n provide: EVENT_MANAGER_PLUGINS,\n multi: true,\n useClass\n}));\n\n\n@NgModule({\n declarations: [\n ],\n imports: [\n CommonModule,\n ...DIRECTIVES\n ],\n exports: [\n ...DIRECTIVES\n ]\n})\nexport class EntryCommonModule {\n static forRoot(): ModuleWithProviders<EntryCommonModule> {\n return {\n ngModule: EntryCommonModule,\n providers: NG_EVENT_PLUGINS\n };\n }\n}\n","import { InjectionToken, Provider } from '@angular/core';\r\n\r\nexport function createInjectionToken<T>(defaultValue: T): InjectionToken<T> {\r\n return new InjectionToken<T>(defaultValue.constructor.name,\r\n {\r\n providedIn: 'root',\r\n factory: () => defaultValue\r\n }\r\n );\r\n}\r\n\r\nexport function provideConfig<T>(token: InjectionToken<T>, factory: () => T): Provider {\r\n return {\r\n provide: token,\r\n useFactory: factory\r\n };\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,7 @@
1
1
  import { EntryButtonModule } from '@enigmatry/entry-components/button';
2
2
  export * from '@enigmatry/entry-components/button';
3
+ import { NG_EVENT_PLUGINS, EntryCommonModule } from '@enigmatry/entry-components/common';
4
+ export * from '@enigmatry/entry-components/common';
3
5
  import { EntryDialogModule } from '@enigmatry/entry-components/dialog';
4
6
  export * from '@enigmatry/entry-components/dialog';
5
7
  import { EntryFileInputModule } from '@enigmatry/entry-components/file-input';
@@ -27,7 +29,7 @@ class EntryComponentsModule {
27
29
  const permissionServiceProvider = options.permissionService
28
30
  ? [{ provide: EntryPermissionService, useClass: options.permissionService }]
29
31
  : [];
30
- const providers = [...permissionServiceProvider];
32
+ const providers = [...permissionServiceProvider, ...NG_EVENT_PLUGINS];
31
33
  return {
32
34
  ngModule: EntryComponentsModule,
33
35
  providers
@@ -36,6 +38,7 @@ class EntryComponentsModule {
36
38
  }
37
39
  EntryComponentsModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: EntryComponentsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
38
40
  EntryComponentsModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.9", ngImport: i0, type: EntryComponentsModule, exports: [EntryButtonModule,
41
+ EntryCommonModule,
39
42
  EntryDialogModule,
40
43
  EntryFileInputModule,
41
44
  EntryValidationModule,
@@ -43,6 +46,7 @@ EntryComponentsModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", v
43
46
  EntrySearchFilterModule,
44
47
  EntryTableModule] });
45
48
  EntryComponentsModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: EntryComponentsModule, imports: [EntryButtonModule,
49
+ EntryCommonModule,
46
50
  EntryDialogModule,
47
51
  EntryFileInputModule,
48
52
  EntryValidationModule,
@@ -55,6 +59,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
55
59
  declarations: [],
56
60
  exports: [
57
61
  EntryButtonModule,
62
+ EntryCommonModule,
58
63
  EntryDialogModule,
59
64
  EntryFileInputModule,
60
65
  EntryValidationModule,
@@ -1 +1 @@
1
- {"version":3,"file":"enigmatry-entry-components.mjs","sources":["../../../../libs/entry-components/modules/entry-components.module.ts","../../../../libs/entry-components/public-api.ts","../../../../libs/entry-components/enigmatry-entry-components.ts"],"sourcesContent":["import { ModuleWithProviders, NgModule, Provider, Type } from '@angular/core';\r\nimport { EntryButtonModule } from '@enigmatry/entry-components/button';\r\nimport { EntryDialogModule } from '@enigmatry/entry-components/dialog';\r\nimport { EntryPermissionModule, EntryPermissionService } from '@enigmatry/entry-components/permissions';\r\nimport { EntrySearchFilterModule } from '@enigmatry/entry-components/search-filter';\r\nimport { EntryValidationModule } from '@enigmatry/entry-components/validation';\r\nimport { EntryFileInputModule } from '@enigmatry/entry-components/file-input';\r\nimport { EntryTableModule } from '@enigmatry/entry-components/table';\r\n\r\ninterface EntryComponentsModuleOptions {\r\n permissionService?: Type<any>;\r\n}\r\n\r\n/**\r\n * Exports all entry components.\r\n *\r\n * Usage\r\n * import EntryComponentsModule in shared.module.ts to have access to all components, directives, pipes.\r\n * import EntryComponentsModule.forRoot() in app.module.ts to register root module providers.\r\n */\r\n@NgModule({\r\n declarations: [],\r\n exports: [\r\n EntryButtonModule,\r\n EntryDialogModule,\r\n EntryFileInputModule,\r\n EntryValidationModule,\r\n EntryPermissionModule,\r\n EntrySearchFilterModule,\r\n EntryTableModule\r\n ]\r\n})\r\nexport class EntryComponentsModule {\r\n static forRoot(options: EntryComponentsModuleOptions = {}): ModuleWithProviders<EntryComponentsModule> {\r\n\r\n const permissionServiceProvider: Provider[] = options.permissionService\r\n ? [{ provide: EntryPermissionService, useClass: options.permissionService }]\r\n : [];\r\n\r\n const providers: Provider[] = [...permissionServiceProvider];\r\n return {\r\n ngModule: EntryComponentsModule,\r\n providers\r\n };\r\n }\r\n}\r\n","\n/*\n * Public API Surface of entry-components\n */\nexport * from '@enigmatry/entry-components/button';\nexport * from '@enigmatry/entry-components/dialog';\nexport * from '@enigmatry/entry-components/file-input';\nexport * from '@enigmatry/entry-components/permissions';\nexport * from '@enigmatry/entry-components/search-filter';\nexport * from '@enigmatry/entry-components/validation';\nexport * from '@enigmatry/entry-components/table';\n\nexport { EntryComponentsModule } from './modules/entry-components.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAaA;;;;;;AAMG;MAaU,qBAAqB,CAAA;AAChC,IAAA,OAAO,OAAO,CAAC,OAAA,GAAwC,EAAE,EAAA;AAEvD,QAAA,MAAM,yBAAyB,GAAe,OAAO,CAAC,iBAAiB;AACrE,cAAE,CAAC,EAAE,OAAO,EAAE,sBAAsB,EAAE,QAAQ,EAAE,OAAO,CAAC,iBAAiB,EAAE,CAAC;cAC1E,EAAE,CAAC;AAEP,QAAA,MAAM,SAAS,GAAe,CAAC,GAAG,yBAAyB,CAAC,CAAC;QAC7D,OAAO;AACL,YAAA,QAAQ,EAAE,qBAAqB;YAC/B,SAAS;SACV,CAAC;KACH;;kHAZU,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;AAArB,qBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,YAT9B,iBAAiB;QACjB,iBAAiB;QACjB,oBAAoB;QACpB,qBAAqB;QACrB,qBAAqB;QACrB,uBAAuB;QACvB,gBAAgB,CAAA,EAAA,CAAA,CAAA;AAGP,qBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,YAT9B,iBAAiB;QACjB,iBAAiB;QACjB,oBAAoB;QACpB,qBAAqB;QACrB,qBAAqB;QACrB,uBAAuB;QACvB,gBAAgB,CAAA,EAAA,CAAA,CAAA;2FAGP,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAZjC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,YAAY,EAAE,EAAE;AAChB,oBAAA,OAAO,EAAE;wBACP,iBAAiB;wBACjB,iBAAiB;wBACjB,oBAAoB;wBACpB,qBAAqB;wBACrB,qBAAqB;wBACrB,uBAAuB;wBACvB,gBAAgB;AACjB,qBAAA;iBACF,CAAA;;;AC9BD;;AAEG;;ACHH;;AAEG;;;;"}
1
+ {"version":3,"file":"enigmatry-entry-components.mjs","sources":["../../../../libs/entry-components/modules/entry-components.module.ts","../../../../libs/entry-components/public-api.ts","../../../../libs/entry-components/enigmatry-entry-components.ts"],"sourcesContent":["import { ModuleWithProviders, NgModule, Provider, Type } from '@angular/core';\r\nimport { EntryButtonModule } from '@enigmatry/entry-components/button';\r\nimport { EntryDialogModule } from '@enigmatry/entry-components/dialog';\r\nimport { EntryPermissionModule, EntryPermissionService } from '@enigmatry/entry-components/permissions';\r\nimport { EntrySearchFilterModule } from '@enigmatry/entry-components/search-filter';\r\nimport { EntryValidationModule } from '@enigmatry/entry-components/validation';\r\nimport { EntryFileInputModule } from '@enigmatry/entry-components/file-input';\r\nimport { EntryTableModule } from '@enigmatry/entry-components/table';\r\nimport { EntryCommonModule, NG_EVENT_PLUGINS } from '@enigmatry/entry-components/common';\r\n\r\ninterface EntryComponentsModuleOptions {\r\n permissionService?: Type<any>;\r\n}\r\n\r\n/**\r\n * Exports all entry components.\r\n *\r\n * Usage\r\n * import EntryComponentsModule in shared.module.ts to have access to all components, directives, pipes.\r\n * import EntryComponentsModule.forRoot() in app.module.ts to register root module providers.\r\n */\r\n@NgModule({\r\n declarations: [],\r\n exports: [\r\n EntryButtonModule,\r\n EntryCommonModule,\r\n EntryDialogModule,\r\n EntryFileInputModule,\r\n EntryValidationModule,\r\n EntryPermissionModule,\r\n EntrySearchFilterModule,\r\n EntryTableModule\r\n ]\r\n})\r\nexport class EntryComponentsModule {\r\n static forRoot(options: EntryComponentsModuleOptions = {}): ModuleWithProviders<EntryComponentsModule> {\r\n\r\n const permissionServiceProvider: Provider[] = options.permissionService\r\n ? [{ provide: EntryPermissionService, useClass: options.permissionService }]\r\n : [];\r\n\r\n const providers: Provider[] = [...permissionServiceProvider, ...NG_EVENT_PLUGINS];\r\n return {\r\n ngModule: EntryComponentsModule,\r\n providers\r\n };\r\n }\r\n}\r\n","\n/*\n * Public API Surface of entry-components\n */\nexport * from '@enigmatry/entry-components/button';\nexport * from '@enigmatry/entry-components/common';\nexport * from '@enigmatry/entry-components/dialog';\nexport * from '@enigmatry/entry-components/file-input';\nexport * from '@enigmatry/entry-components/permissions';\nexport * from '@enigmatry/entry-components/search-filter';\nexport * from '@enigmatry/entry-components/validation';\nexport * from '@enigmatry/entry-components/table';\n\nexport { EntryComponentsModule } from './modules/entry-components.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AAcA;;;;;;AAMG;MAcU,qBAAqB,CAAA;AAChC,IAAA,OAAO,OAAO,CAAC,OAAA,GAAwC,EAAE,EAAA;AAEvD,QAAA,MAAM,yBAAyB,GAAe,OAAO,CAAC,iBAAiB;AACrE,cAAE,CAAC,EAAE,OAAO,EAAE,sBAAsB,EAAE,QAAQ,EAAE,OAAO,CAAC,iBAAiB,EAAE,CAAC;cAC1E,EAAE,CAAC;QAEP,MAAM,SAAS,GAAe,CAAC,GAAG,yBAAyB,EAAE,GAAG,gBAAgB,CAAC,CAAC;QAClF,OAAO;AACL,YAAA,QAAQ,EAAE,qBAAqB;YAC/B,SAAS;SACV,CAAC;KACH;;kHAZU,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;AAArB,qBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,YAV9B,iBAAiB;QACjB,iBAAiB;QACjB,iBAAiB;QACjB,oBAAoB;QACpB,qBAAqB;QACrB,qBAAqB;QACrB,uBAAuB;QACvB,gBAAgB,CAAA,EAAA,CAAA,CAAA;AAGP,qBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,YAV9B,iBAAiB;QACjB,iBAAiB;QACjB,iBAAiB;QACjB,oBAAoB;QACpB,qBAAqB;QACrB,qBAAqB;QACrB,uBAAuB;QACvB,gBAAgB,CAAA,EAAA,CAAA,CAAA;2FAGP,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAbjC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,YAAY,EAAE,EAAE;AAChB,oBAAA,OAAO,EAAE;wBACP,iBAAiB;wBACjB,iBAAiB;wBACjB,iBAAiB;wBACjB,oBAAoB;wBACpB,qBAAqB;wBACrB,qBAAqB;wBACrB,uBAAuB;wBACvB,gBAAgB;AACjB,qBAAA;iBACF,CAAA;;;AChCD;;AAEG;;ACHH;;AAEG;;;;"}
@@ -1,4 +1,191 @@
1
- import { InjectionToken } from '@angular/core';
1
+ import * as i0 from '@angular/core';
2
+ import { Directive, Self, Injectable, NgModule, InjectionToken } from '@angular/core';
3
+ import { CommonModule } from '@angular/common';
4
+ import { Subject, fromEvent } from 'rxjs';
5
+ import { takeUntil } from 'rxjs/operators';
6
+ import * as i1 from '@angular/forms';
7
+ import { debounce, throttle } from 'lodash-es';
8
+ import { EVENT_MANAGER_PLUGINS } from '@angular/platform-browser';
9
+
10
+ const NG_VALID_CLASS = '.ng-valid';
11
+ const NG_INVALID_CLASS = '.ng-invalid';
12
+
13
+ /**
14
+ * Scroll to first invalid control when form is submitted.
15
+ * Directive is applied to 'form[formGroup],form[ngForm]' (reactive or template driven forms)
16
+ */
17
+ class ScrollToInvalidControlDirective {
18
+ constructor(form, elementRef) {
19
+ this.form = form;
20
+ this.elementRef = elementRef;
21
+ this.destroy$ = new Subject();
22
+ }
23
+ ngOnInit() {
24
+ fromEvent(this.elementRef.nativeElement, 'submit')
25
+ .pipe(takeUntil(this.destroy$))
26
+ .subscribe(_ => {
27
+ if (this.form.invalid) {
28
+ this.scrollToInvalidControl();
29
+ }
30
+ });
31
+ }
32
+ ngOnDestroy() {
33
+ this.destroy$.next();
34
+ this.destroy$.complete();
35
+ }
36
+ scrollToInvalidControl() {
37
+ const firstInvalidControl = this.elementRef.nativeElement.querySelector(NG_INVALID_CLASS);
38
+ if (firstInvalidControl) {
39
+ firstInvalidControl.scrollIntoView({
40
+ behavior: 'smooth',
41
+ block: 'center' // vertical alignment
42
+ });
43
+ }
44
+ }
45
+ }
46
+ ScrollToInvalidControlDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ScrollToInvalidControlDirective, deps: [{ token: i1.ControlContainer, self: true }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
47
+ ScrollToInvalidControlDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.9", type: ScrollToInvalidControlDirective, isStandalone: true, selector: "form[formGroup],form[ngForm]", ngImport: i0 });
48
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ScrollToInvalidControlDirective, decorators: [{
49
+ type: Directive,
50
+ args: [{
51
+ standalone: true,
52
+ selector: 'form[formGroup],form[ngForm]'
53
+ }]
54
+ }], ctorParameters: function () { return [{ type: i1.ControlContainer, decorators: [{
55
+ type: Self
56
+ }] }, { type: i0.ElementRef }]; } });
57
+
58
+ /**
59
+ * abstract class EventManagerPlugin will be exposed in the public api
60
+ * https://github.com/angular/angular/pull/49969
61
+ *
62
+ * Until then creating it from reference
63
+ * https://github.com/angular/angular/blob/main/packages/platform-browser/src/dom/events/event_manager.ts#L93
64
+ *
65
+ * How to create custom event modifiers
66
+ * https://github.com/Tinkoff/ng-event-plugins,
67
+ * https://github.com/angular/angular/blob/main/packages/platform-browser/src/dom/events/key_events.ts
68
+ * https://netbasal.com/lifting-the-veil-insights-into-angulars-eventmanagerplugin-ed9d14cbb31a
69
+ */
70
+ class EventManagerPlugin {
71
+ }
72
+ /**
73
+ * Entry event plugin base class
74
+ */
75
+ class EntryEventManagerPlugin extends EventManagerPlugin {
76
+ /** return `true` for every event name that has specified modifier */
77
+ supports(eventName) {
78
+ return eventName.includes(this.modifier);
79
+ }
80
+ /** unwrap params e.g. (click.debounce.500) => ['debounce', 500] */
81
+ unwrapParams(eventName) {
82
+ return eventName
83
+ .substring(eventName.indexOf(this.modifier))
84
+ .split('.')
85
+ .filter(x => !!x);
86
+ }
87
+ /** get event name e.g. (click.debounce.500) => click */
88
+ unwrapEventName(eventName) {
89
+ return eventName.substring(0, eventName.indexOf(this.modifier));
90
+ }
91
+ }
92
+
93
+ /* eslint-disable @typescript-eslint/ban-types */
94
+ /**
95
+ * Provides event plugin for debouncing events.
96
+ *
97
+ * How to use:
98
+ * <button (click.debounce)="doSomething($event)">
99
+ * <input (keyup.debounce.500)="doSomething($event)">
100
+ */
101
+ class DebounceEventPlugin extends EntryEventManagerPlugin {
102
+ constructor() {
103
+ super(...arguments);
104
+ this.modifier = '.debounce';
105
+ }
106
+ addEventListener(element, eventName, originalHandler) {
107
+ // e.g. (click.debounce.500)
108
+ const [_modifier, milliseconds = 500, option = 'leading'] = this.unwrapParams(eventName);
109
+ // run original handler inside ngZone in which the event occurred
110
+ const innerHandler = (event) => this.manager.getZone().runGuarded(() => originalHandler(event));
111
+ // create debounced handler
112
+ const debouncedHandler = debounce(innerHandler, milliseconds, { leading: option === 'leading', trailing: option === 'trailing' });
113
+ // register event with debounced handler
114
+ return this.manager.addEventListener(element, this.unwrapEventName(eventName), debouncedHandler);
115
+ }
116
+ }
117
+ DebounceEventPlugin.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DebounceEventPlugin, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
118
+ DebounceEventPlugin.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DebounceEventPlugin });
119
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DebounceEventPlugin, decorators: [{
120
+ type: Injectable
121
+ }] });
122
+
123
+ /* eslint-disable @typescript-eslint/ban-types */
124
+ /**
125
+ * Provides event plugin for throttling events.
126
+ *
127
+ * How to use:
128
+ * <button (click.throttle)="doSomething($event)">
129
+ * <input (keyup.throttle.500)="doSomething($event)">
130
+ */
131
+ class ThrottleEventPlugin extends EntryEventManagerPlugin {
132
+ constructor() {
133
+ super(...arguments);
134
+ this.modifier = '.throttle';
135
+ }
136
+ addEventListener(element, eventName, originalHandler) {
137
+ // e.g. (keyup.throttle.500)
138
+ const [_modifier, milliseconds = 500] = this.unwrapParams(eventName);
139
+ // run original handler inside ngZone in which the event occurred
140
+ const innerHandler = (event) => this.manager.getZone().runGuarded(() => originalHandler(event));
141
+ // create throttled handler
142
+ const throttledHandler = throttle(innerHandler, milliseconds);
143
+ // register event with throttled handler
144
+ return this.manager.addEventListener(element, this.unwrapEventName(eventName), throttledHandler);
145
+ }
146
+ }
147
+ ThrottleEventPlugin.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ThrottleEventPlugin, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
148
+ ThrottleEventPlugin.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ThrottleEventPlugin });
149
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ThrottleEventPlugin, decorators: [{
150
+ type: Injectable
151
+ }] });
152
+
153
+ const DIRECTIVES = [
154
+ ScrollToInvalidControlDirective
155
+ ];
156
+ const EVENT_PLUGINS = [
157
+ DebounceEventPlugin,
158
+ ThrottleEventPlugin
159
+ ];
160
+ const NG_EVENT_PLUGINS = EVENT_PLUGINS.map(useClass => ({
161
+ provide: EVENT_MANAGER_PLUGINS,
162
+ multi: true,
163
+ useClass
164
+ }));
165
+ class EntryCommonModule {
166
+ static forRoot() {
167
+ return {
168
+ ngModule: EntryCommonModule,
169
+ providers: NG_EVENT_PLUGINS
170
+ };
171
+ }
172
+ }
173
+ EntryCommonModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: EntryCommonModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
174
+ EntryCommonModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.9", ngImport: i0, type: EntryCommonModule, imports: [CommonModule, ScrollToInvalidControlDirective], exports: [ScrollToInvalidControlDirective] });
175
+ EntryCommonModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: EntryCommonModule, imports: [CommonModule] });
176
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: EntryCommonModule, decorators: [{
177
+ type: NgModule,
178
+ args: [{
179
+ declarations: [],
180
+ imports: [
181
+ CommonModule,
182
+ ...DIRECTIVES
183
+ ],
184
+ exports: [
185
+ ...DIRECTIVES
186
+ ]
187
+ }]
188
+ }] });
2
189
 
3
190
  function createInjectionToken(defaultValue) {
4
191
  return new InjectionToken(defaultValue.constructor.name, {
@@ -17,5 +204,5 @@ function provideConfig(token, factory) {
17
204
  * Generated bundle index. Do not edit.
18
205
  */
19
206
 
20
- export { createInjectionToken, provideConfig };
207
+ export { DebounceEventPlugin, EntryCommonModule, NG_EVENT_PLUGINS, ScrollToInvalidControlDirective, ThrottleEventPlugin, createInjectionToken, provideConfig };
21
208
  //# sourceMappingURL=enigmatry-entry-components-common.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"enigmatry-entry-components-common.mjs","sources":["../../../../libs/entry-components/common/utils/provide-config.ts","../../../../libs/entry-components/common/enigmatry-entry-components-common.ts"],"sourcesContent":["import { InjectionToken, Provider } from '@angular/core';\r\n\r\nexport function createInjectionToken<T>(defaultValue: T): InjectionToken<T> {\r\n return new InjectionToken<T>(defaultValue.constructor.name,\r\n {\r\n providedIn: 'root',\r\n factory: () => defaultValue\r\n }\r\n );\r\n}\r\n\r\nexport function provideConfig<T>(token: InjectionToken<T>, factory: () => T): Provider {\r\n return {\r\n provide: token,\r\n useFactory: factory\r\n };\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;AAEM,SAAU,oBAAoB,CAAI,YAAe,EAAA;IACrD,OAAO,IAAI,cAAc,CAAI,YAAY,CAAC,WAAW,CAAC,IAAI,EACxD;AACE,QAAA,UAAU,EAAE,MAAM;AAClB,QAAA,OAAO,EAAE,MAAM,YAAY;AAC5B,KAAA,CACF,CAAC;AACJ,CAAC;AAEe,SAAA,aAAa,CAAI,KAAwB,EAAE,OAAgB,EAAA;IACzE,OAAO;AACL,QAAA,OAAO,EAAE,KAAK;AACd,QAAA,UAAU,EAAE,OAAO;KACpB,CAAC;AACJ;;AChBA;;AAEG;;;;"}
1
+ {"version":3,"file":"enigmatry-entry-components-common.mjs","sources":["../../../../libs/entry-components/common/constants.ts","../../../../libs/entry-components/common/directives/scroll-to-invalid-control.directive.ts","../../../../libs/entry-components/common/event-plugins/abstract.plugin.ts","../../../../libs/entry-components/common/event-plugins/debounce.plugin.ts","../../../../libs/entry-components/common/event-plugins/throttle.plugin.ts","../../../../libs/entry-components/common/common.module.ts","../../../../libs/entry-components/common/utils/provide-config.ts","../../../../libs/entry-components/common/enigmatry-entry-components-common.ts"],"sourcesContent":["export const NG_VALID_CLASS = '.ng-valid';\r\nexport const NG_INVALID_CLASS = '.ng-invalid';\r\n","import { Directive, ElementRef, OnDestroy, OnInit, Self } from '@angular/core';\r\nimport { ControlContainer } from '@angular/forms';\r\nimport { Subject, fromEvent } from 'rxjs';\r\nimport { takeUntil } from 'rxjs/operators';\r\nimport { NG_INVALID_CLASS } from '../constants';\r\n\r\n/**\r\n * Scroll to first invalid control when form is submitted.\r\n * Directive is applied to 'form[formGroup],form[ngForm]' (reactive or template driven forms)\r\n */\r\n@Directive({\r\n standalone: true,\r\n selector: 'form[formGroup],form[ngForm]'\r\n})\r\nexport class ScrollToInvalidControlDirective implements OnInit, OnDestroy {\r\n\r\n private destroy$ = new Subject<void>();\r\n\r\n constructor(\r\n @Self() private form: ControlContainer,\r\n private elementRef: ElementRef<HTMLFormElement>) { }\r\n\r\n ngOnInit(): void {\r\n fromEvent(this.elementRef.nativeElement, 'submit')\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe(_ => {\r\n if (this.form.invalid) {\r\n this.scrollToInvalidControl();\r\n }\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n\r\n private scrollToInvalidControl() {\r\n const firstInvalidControl: HTMLElement =\r\n this.elementRef.nativeElement.querySelector(NG_INVALID_CLASS);\r\n\r\n if (firstInvalidControl) {\r\n firstInvalidControl.scrollIntoView({\r\n behavior: 'smooth',\r\n block: 'center' // vertical alignment\r\n });\r\n }\r\n }\r\n}\r\n","import { EventManager } from '@angular/platform-browser';\r\n\r\n/**\r\n * abstract class EventManagerPlugin will be exposed in the public api\r\n * https://github.com/angular/angular/pull/49969\r\n *\r\n * Until then creating it from reference\r\n * https://github.com/angular/angular/blob/main/packages/platform-browser/src/dom/events/event_manager.ts#L93\r\n *\r\n * How to create custom event modifiers\r\n * https://github.com/Tinkoff/ng-event-plugins,\r\n * https://github.com/angular/angular/blob/main/packages/platform-browser/src/dom/events/key_events.ts\r\n * https://netbasal.com/lifting-the-veil-insights-into-angulars-eventmanagerplugin-ed9d14cbb31a\r\n */\r\nexport abstract class EventManagerPlugin {\r\n\r\n // Using non-null assertion because it's set by EventManager's constructor\r\n manager!: EventManager;\r\n\r\n /** Should return `true` for every event name that should be supported by this plugin */\r\n abstract supports(eventName: string): boolean;\r\n\r\n /**\r\n * Registers a handler for a specific element and event.\r\n *\r\n * @param element The HTML element to receive event notifications.\r\n * @param eventName The name of the event to listen for.\r\n * @param handler A function to call when the notification occurs. Receives the\r\n * event object as an argument.\r\n * @returns A callback function that can be used to remove the handler.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/ban-types\r\n abstract addEventListener(element: HTMLElement, eventName: string, handler: Function): Function;\r\n}\r\n\r\n/**\r\n * Entry event plugin base class\r\n */\r\nexport abstract class EntryEventManagerPlugin extends EventManagerPlugin {\r\n abstract modifier: string;\r\n\r\n /** return `true` for every event name that has specified modifier */\r\n supports(eventName: string): boolean {\r\n return eventName.includes(this.modifier);\r\n }\r\n\r\n /** unwrap params e.g. (click.debounce.500) => ['debounce', 500] */\r\n unwrapParams(eventName: string): string[] {\r\n return eventName\r\n .substring(eventName.indexOf(this.modifier))\r\n .split('.')\r\n .filter(x => !!x);\r\n }\r\n\r\n /** get event name e.g. (click.debounce.500) => click */\r\n unwrapEventName(eventName: string): string {\r\n return eventName.substring(0, eventName.indexOf(this.modifier));\r\n }\r\n}\r\n","/* eslint-disable @typescript-eslint/ban-types */\r\nimport { Injectable } from '@angular/core';\r\nimport { EntryEventManagerPlugin } from './abstract.plugin';\r\nimport { debounce } from 'lodash-es';\r\n\r\n/**\r\n * Provides event plugin for debouncing events.\r\n *\r\n * How to use:\r\n * <button (click.debounce)=\"doSomething($event)\">\r\n * <input (keyup.debounce.500)=\"doSomething($event)\">\r\n */\r\n@Injectable()\r\nexport class DebounceEventPlugin extends EntryEventManagerPlugin {\r\n\r\n modifier = '.debounce';\r\n\r\n addEventListener(element: HTMLElement, eventName: string, originalHandler: Function): Function {\r\n // e.g. (click.debounce.500)\r\n const [_modifier, milliseconds = 500, option = 'leading'] = this.unwrapParams(eventName);\r\n\r\n // run original handler inside ngZone in which the event occurred\r\n const innerHandler = (event: any) => this.manager.getZone().runGuarded(() => originalHandler(event));\r\n\r\n // create debounced handler\r\n const debouncedHandler = debounce(innerHandler, milliseconds,\r\n { leading: option === 'leading', trailing: option === 'trailing' });\r\n\r\n // register event with debounced handler\r\n return this.manager.addEventListener(element, this.unwrapEventName(eventName), debouncedHandler);\r\n }\r\n}\r\n","/* eslint-disable @typescript-eslint/ban-types */\r\nimport { Injectable } from '@angular/core';\r\nimport { EntryEventManagerPlugin } from './abstract.plugin';\r\nimport { throttle } from 'lodash-es';\r\n\r\n/**\r\n * Provides event plugin for throttling events.\r\n *\r\n * How to use:\r\n * <button (click.throttle)=\"doSomething($event)\">\r\n * <input (keyup.throttle.500)=\"doSomething($event)\">\r\n */\r\n@Injectable()\r\nexport class ThrottleEventPlugin extends EntryEventManagerPlugin {\r\n\r\n modifier = '.throttle';\r\n\r\n addEventListener(element: HTMLElement, eventName: string, originalHandler: Function): Function {\r\n // e.g. (keyup.throttle.500)\r\n const [_modifier, milliseconds = 500] = this.unwrapParams(eventName);\r\n\r\n // run original handler inside ngZone in which the event occurred\r\n const innerHandler = (event: any) => this.manager.getZone().runGuarded(() => originalHandler(event));\r\n\r\n // create throttled handler\r\n const throttledHandler = throttle(innerHandler, milliseconds);\r\n\r\n // register event with throttled handler\r\n return this.manager.addEventListener(element, this.unwrapEventName(eventName), throttledHandler);\r\n }\r\n}\r\n","import { ModuleWithProviders, NgModule, Provider } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n/** Directives */\n\nimport { ScrollToInvalidControlDirective } from './directives/scroll-to-invalid-control.directive';\n\nconst DIRECTIVES = [\n ScrollToInvalidControlDirective\n];\n\n/** Event plugins */\n\nimport { DebounceEventPlugin } from './event-plugins/debounce.plugin';\nimport { ThrottleEventPlugin } from './event-plugins/throttle.plugin';\nimport { EVENT_MANAGER_PLUGINS } from '@angular/platform-browser';\n\nconst EVENT_PLUGINS = [\n DebounceEventPlugin,\n ThrottleEventPlugin\n];\n\nexport const NG_EVENT_PLUGINS: Provider[] = EVENT_PLUGINS.map(useClass => ({\n provide: EVENT_MANAGER_PLUGINS,\n multi: true,\n useClass\n}));\n\n\n@NgModule({\n declarations: [\n ],\n imports: [\n CommonModule,\n ...DIRECTIVES\n ],\n exports: [\n ...DIRECTIVES\n ]\n})\nexport class EntryCommonModule {\n static forRoot(): ModuleWithProviders<EntryCommonModule> {\n return {\n ngModule: EntryCommonModule,\n providers: NG_EVENT_PLUGINS\n };\n }\n}\n","import { InjectionToken, Provider } from '@angular/core';\r\n\r\nexport function createInjectionToken<T>(defaultValue: T): InjectionToken<T> {\r\n return new InjectionToken<T>(defaultValue.constructor.name,\r\n {\r\n providedIn: 'root',\r\n factory: () => defaultValue\r\n }\r\n );\r\n}\r\n\r\nexport function provideConfig<T>(token: InjectionToken<T>, factory: () => T): Provider {\r\n return {\r\n provide: token,\r\n useFactory: factory\r\n };\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,7 @@
1
1
  import { EntryButtonModule } from '@enigmatry/entry-components/button';
2
2
  export * from '@enigmatry/entry-components/button';
3
+ import { NG_EVENT_PLUGINS, EntryCommonModule } from '@enigmatry/entry-components/common';
4
+ export * from '@enigmatry/entry-components/common';
3
5
  import { EntryDialogModule } from '@enigmatry/entry-components/dialog';
4
6
  export * from '@enigmatry/entry-components/dialog';
5
7
  import { EntryFileInputModule } from '@enigmatry/entry-components/file-input';
@@ -27,7 +29,7 @@ class EntryComponentsModule {
27
29
  const permissionServiceProvider = options.permissionService
28
30
  ? [{ provide: EntryPermissionService, useClass: options.permissionService }]
29
31
  : [];
30
- const providers = [...permissionServiceProvider];
32
+ const providers = [...permissionServiceProvider, ...NG_EVENT_PLUGINS];
31
33
  return {
32
34
  ngModule: EntryComponentsModule,
33
35
  providers
@@ -36,6 +38,7 @@ class EntryComponentsModule {
36
38
  }
37
39
  EntryComponentsModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: EntryComponentsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
38
40
  EntryComponentsModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.9", ngImport: i0, type: EntryComponentsModule, exports: [EntryButtonModule,
41
+ EntryCommonModule,
39
42
  EntryDialogModule,
40
43
  EntryFileInputModule,
41
44
  EntryValidationModule,
@@ -43,6 +46,7 @@ EntryComponentsModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", v
43
46
  EntrySearchFilterModule,
44
47
  EntryTableModule] });
45
48
  EntryComponentsModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: EntryComponentsModule, imports: [EntryButtonModule,
49
+ EntryCommonModule,
46
50
  EntryDialogModule,
47
51
  EntryFileInputModule,
48
52
  EntryValidationModule,
@@ -55,6 +59,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
55
59
  declarations: [],
56
60
  exports: [
57
61
  EntryButtonModule,
62
+ EntryCommonModule,
58
63
  EntryDialogModule,
59
64
  EntryFileInputModule,
60
65
  EntryValidationModule,
@@ -1 +1 @@
1
- {"version":3,"file":"enigmatry-entry-components.mjs","sources":["../../../../libs/entry-components/modules/entry-components.module.ts","../../../../libs/entry-components/public-api.ts","../../../../libs/entry-components/enigmatry-entry-components.ts"],"sourcesContent":["import { ModuleWithProviders, NgModule, Provider, Type } from '@angular/core';\r\nimport { EntryButtonModule } from '@enigmatry/entry-components/button';\r\nimport { EntryDialogModule } from '@enigmatry/entry-components/dialog';\r\nimport { EntryPermissionModule, EntryPermissionService } from '@enigmatry/entry-components/permissions';\r\nimport { EntrySearchFilterModule } from '@enigmatry/entry-components/search-filter';\r\nimport { EntryValidationModule } from '@enigmatry/entry-components/validation';\r\nimport { EntryFileInputModule } from '@enigmatry/entry-components/file-input';\r\nimport { EntryTableModule } from '@enigmatry/entry-components/table';\r\n\r\ninterface EntryComponentsModuleOptions {\r\n permissionService?: Type<any>;\r\n}\r\n\r\n/**\r\n * Exports all entry components.\r\n *\r\n * Usage\r\n * import EntryComponentsModule in shared.module.ts to have access to all components, directives, pipes.\r\n * import EntryComponentsModule.forRoot() in app.module.ts to register root module providers.\r\n */\r\n@NgModule({\r\n declarations: [],\r\n exports: [\r\n EntryButtonModule,\r\n EntryDialogModule,\r\n EntryFileInputModule,\r\n EntryValidationModule,\r\n EntryPermissionModule,\r\n EntrySearchFilterModule,\r\n EntryTableModule\r\n ]\r\n})\r\nexport class EntryComponentsModule {\r\n static forRoot(options: EntryComponentsModuleOptions = {}): ModuleWithProviders<EntryComponentsModule> {\r\n\r\n const permissionServiceProvider: Provider[] = options.permissionService\r\n ? [{ provide: EntryPermissionService, useClass: options.permissionService }]\r\n : [];\r\n\r\n const providers: Provider[] = [...permissionServiceProvider];\r\n return {\r\n ngModule: EntryComponentsModule,\r\n providers\r\n };\r\n }\r\n}\r\n","\n/*\n * Public API Surface of entry-components\n */\nexport * from '@enigmatry/entry-components/button';\nexport * from '@enigmatry/entry-components/dialog';\nexport * from '@enigmatry/entry-components/file-input';\nexport * from '@enigmatry/entry-components/permissions';\nexport * from '@enigmatry/entry-components/search-filter';\nexport * from '@enigmatry/entry-components/validation';\nexport * from '@enigmatry/entry-components/table';\n\nexport { EntryComponentsModule } from './modules/entry-components.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAaA;;;;;;AAMG;MAaU,qBAAqB,CAAA;AAChC,IAAA,OAAO,OAAO,CAAC,OAAA,GAAwC,EAAE,EAAA;AAEvD,QAAA,MAAM,yBAAyB,GAAe,OAAO,CAAC,iBAAiB;AACrE,cAAE,CAAC,EAAE,OAAO,EAAE,sBAAsB,EAAE,QAAQ,EAAE,OAAO,CAAC,iBAAiB,EAAE,CAAC;cAC1E,EAAE,CAAC;AAEP,QAAA,MAAM,SAAS,GAAe,CAAC,GAAG,yBAAyB,CAAC,CAAC;QAC7D,OAAO;AACL,YAAA,QAAQ,EAAE,qBAAqB;YAC/B,SAAS;SACV,CAAC;KACH;;kHAZU,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;AAArB,qBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,YAT9B,iBAAiB;QACjB,iBAAiB;QACjB,oBAAoB;QACpB,qBAAqB;QACrB,qBAAqB;QACrB,uBAAuB;QACvB,gBAAgB,CAAA,EAAA,CAAA,CAAA;AAGP,qBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,YAT9B,iBAAiB;QACjB,iBAAiB;QACjB,oBAAoB;QACpB,qBAAqB;QACrB,qBAAqB;QACrB,uBAAuB;QACvB,gBAAgB,CAAA,EAAA,CAAA,CAAA;2FAGP,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAZjC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,YAAY,EAAE,EAAE;AAChB,oBAAA,OAAO,EAAE;wBACP,iBAAiB;wBACjB,iBAAiB;wBACjB,oBAAoB;wBACpB,qBAAqB;wBACrB,qBAAqB;wBACrB,uBAAuB;wBACvB,gBAAgB;AACjB,qBAAA;AACF,iBAAA,CAAA;;;AC9BD;;AAEG;;ACHH;;AAEG;;;;"}
1
+ {"version":3,"file":"enigmatry-entry-components.mjs","sources":["../../../../libs/entry-components/modules/entry-components.module.ts","../../../../libs/entry-components/public-api.ts","../../../../libs/entry-components/enigmatry-entry-components.ts"],"sourcesContent":["import { ModuleWithProviders, NgModule, Provider, Type } from '@angular/core';\r\nimport { EntryButtonModule } from '@enigmatry/entry-components/button';\r\nimport { EntryDialogModule } from '@enigmatry/entry-components/dialog';\r\nimport { EntryPermissionModule, EntryPermissionService } from '@enigmatry/entry-components/permissions';\r\nimport { EntrySearchFilterModule } from '@enigmatry/entry-components/search-filter';\r\nimport { EntryValidationModule } from '@enigmatry/entry-components/validation';\r\nimport { EntryFileInputModule } from '@enigmatry/entry-components/file-input';\r\nimport { EntryTableModule } from '@enigmatry/entry-components/table';\r\nimport { EntryCommonModule, NG_EVENT_PLUGINS } from '@enigmatry/entry-components/common';\r\n\r\ninterface EntryComponentsModuleOptions {\r\n permissionService?: Type<any>;\r\n}\r\n\r\n/**\r\n * Exports all entry components.\r\n *\r\n * Usage\r\n * import EntryComponentsModule in shared.module.ts to have access to all components, directives, pipes.\r\n * import EntryComponentsModule.forRoot() in app.module.ts to register root module providers.\r\n */\r\n@NgModule({\r\n declarations: [],\r\n exports: [\r\n EntryButtonModule,\r\n EntryCommonModule,\r\n EntryDialogModule,\r\n EntryFileInputModule,\r\n EntryValidationModule,\r\n EntryPermissionModule,\r\n EntrySearchFilterModule,\r\n EntryTableModule\r\n ]\r\n})\r\nexport class EntryComponentsModule {\r\n static forRoot(options: EntryComponentsModuleOptions = {}): ModuleWithProviders<EntryComponentsModule> {\r\n\r\n const permissionServiceProvider: Provider[] = options.permissionService\r\n ? [{ provide: EntryPermissionService, useClass: options.permissionService }]\r\n : [];\r\n\r\n const providers: Provider[] = [...permissionServiceProvider, ...NG_EVENT_PLUGINS];\r\n return {\r\n ngModule: EntryComponentsModule,\r\n providers\r\n };\r\n }\r\n}\r\n","\n/*\n * Public API Surface of entry-components\n */\nexport * from '@enigmatry/entry-components/button';\nexport * from '@enigmatry/entry-components/common';\nexport * from '@enigmatry/entry-components/dialog';\nexport * from '@enigmatry/entry-components/file-input';\nexport * from '@enigmatry/entry-components/permissions';\nexport * from '@enigmatry/entry-components/search-filter';\nexport * from '@enigmatry/entry-components/validation';\nexport * from '@enigmatry/entry-components/table';\n\nexport { EntryComponentsModule } from './modules/entry-components.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AAcA;;;;;;AAMG;MAcU,qBAAqB,CAAA;AAChC,IAAA,OAAO,OAAO,CAAC,OAAA,GAAwC,EAAE,EAAA;AAEvD,QAAA,MAAM,yBAAyB,GAAe,OAAO,CAAC,iBAAiB;AACrE,cAAE,CAAC,EAAE,OAAO,EAAE,sBAAsB,EAAE,QAAQ,EAAE,OAAO,CAAC,iBAAiB,EAAE,CAAC;cAC1E,EAAE,CAAC;QAEP,MAAM,SAAS,GAAe,CAAC,GAAG,yBAAyB,EAAE,GAAG,gBAAgB,CAAC,CAAC;QAClF,OAAO;AACL,YAAA,QAAQ,EAAE,qBAAqB;YAC/B,SAAS;SACV,CAAC;KACH;;kHAZU,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;AAArB,qBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,YAV9B,iBAAiB;QACjB,iBAAiB;QACjB,iBAAiB;QACjB,oBAAoB;QACpB,qBAAqB;QACrB,qBAAqB;QACrB,uBAAuB;QACvB,gBAAgB,CAAA,EAAA,CAAA,CAAA;AAGP,qBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,YAV9B,iBAAiB;QACjB,iBAAiB;QACjB,iBAAiB;QACjB,oBAAoB;QACpB,qBAAqB;QACrB,qBAAqB;QACrB,uBAAuB;QACvB,gBAAgB,CAAA,EAAA,CAAA,CAAA;2FAGP,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAbjC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,YAAY,EAAE,EAAE;AAChB,oBAAA,OAAO,EAAE;wBACP,iBAAiB;wBACjB,iBAAiB;wBACjB,iBAAiB;wBACjB,oBAAoB;wBACpB,qBAAqB;wBACrB,qBAAqB;wBACrB,uBAAuB;wBACvB,gBAAgB;AACjB,qBAAA;AACF,iBAAA,CAAA;;;AChCD;;AAEG;;ACHH;;AAEG;;;;"}
@@ -1,12 +1,13 @@
1
1
  import { ModuleWithProviders, Type } from '@angular/core';
2
2
  import * as i0 from "@angular/core";
3
3
  import * as i1 from "@enigmatry/entry-components/button";
4
- import * as i2 from "@enigmatry/entry-components/dialog";
5
- import * as i3 from "@enigmatry/entry-components/file-input";
6
- import * as i4 from "@enigmatry/entry-components/validation";
7
- import * as i5 from "@enigmatry/entry-components/permissions";
8
- import * as i6 from "@enigmatry/entry-components/search-filter";
9
- import * as i7 from "@enigmatry/entry-components/table";
4
+ import * as i2 from "@enigmatry/entry-components/common";
5
+ import * as i3 from "@enigmatry/entry-components/dialog";
6
+ import * as i4 from "@enigmatry/entry-components/file-input";
7
+ import * as i5 from "@enigmatry/entry-components/validation";
8
+ import * as i6 from "@enigmatry/entry-components/permissions";
9
+ import * as i7 from "@enigmatry/entry-components/search-filter";
10
+ import * as i8 from "@enigmatry/entry-components/table";
10
11
  interface EntryComponentsModuleOptions {
11
12
  permissionService?: Type<any>;
12
13
  }
@@ -20,7 +21,7 @@ interface EntryComponentsModuleOptions {
20
21
  export declare class EntryComponentsModule {
21
22
  static forRoot(options?: EntryComponentsModuleOptions): ModuleWithProviders<EntryComponentsModule>;
22
23
  static ɵfac: i0.ɵɵFactoryDeclaration<EntryComponentsModule, never>;
23
- static ɵmod: i0.ɵɵNgModuleDeclaration<EntryComponentsModule, never, never, [typeof i1.EntryButtonModule, typeof i2.EntryDialogModule, typeof i3.EntryFileInputModule, typeof i4.EntryValidationModule, typeof i5.EntryPermissionModule, typeof i6.EntrySearchFilterModule, typeof i7.EntryTableModule]>;
24
+ static ɵmod: i0.ɵɵNgModuleDeclaration<EntryComponentsModule, never, never, [typeof i1.EntryButtonModule, typeof i2.EntryCommonModule, typeof i3.EntryDialogModule, typeof i4.EntryFileInputModule, typeof i5.EntryValidationModule, typeof i6.EntryPermissionModule, typeof i7.EntrySearchFilterModule, typeof i8.EntryTableModule]>;
24
25
  static ɵinj: i0.ɵɵInjectorDeclaration<EntryComponentsModule>;
25
26
  }
26
27
  export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@enigmatry/entry-components",
3
- "version": "15.0.0-preview.2",
3
+ "version": "15.0.0-preview.4",
4
4
  "author": "Enigmatry",
5
5
  "description": "Enigmatry entry angular material components",
6
6
  "homepage": "https://github.com/enigmatry/entry-angular-building-blocks/tree/master/libs/entry-components#readme",
@@ -16,7 +16,8 @@
16
16
  "@angular/core": "^15.0.0",
17
17
  "@angular/material": "^15.0.0",
18
18
  "@angular/forms": "^15.0.0",
19
- "@angular/platform-browser": "^15.0.0"
19
+ "@angular/platform-browser": "^15.0.0",
20
+ "lodash-es": "^4.17.21"
20
21
  },
21
22
  "dependencies": {
22
23
  "tslib": "^2.3.0"
package/public-api.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export * from '@enigmatry/entry-components/button';
2
+ export * from '@enigmatry/entry-components/common';
2
3
  export * from '@enigmatry/entry-components/dialog';
3
4
  export * from '@enigmatry/entry-components/file-input';
4
5
  export * from '@enigmatry/entry-components/permissions';