Skip to content

Commit

Permalink
feat(config): add scroll strategy provider module extra config (#555)
Browse files Browse the repository at this point in the history
  • Loading branch information
Igor Milly authored and GitHub Enterprise committed Mar 17, 2022
1 parent c78c775 commit 5a999b8
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 1 deletion.
38 changes: 37 additions & 1 deletion projects/ng-aquila/src/config/nx-scroll-strategy.helpers.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
import { Overlay, ScrollStrategy } from '@angular/cdk/overlay';
import { FactoryProvider } from '@angular/core';
import { FactoryProvider, InjectionToken } from '@angular/core';
import { NX_AUTOCOMPLETE_SCROLL_STRATEGY } from '@aposin/ng-aquila/autocomplete';
import { NX_CONTEXT_MENU_SCROLL_STRATEGY } from '@aposin/ng-aquila/context-menu';
import { NX_DATEPICKER_SCROLL_STRATEGY } from '@aposin/ng-aquila/datefield';
import { NX_DROPDOWN_SCROLL_STRATEGY } from '@aposin/ng-aquila/dropdown';
import { NX_MODAL_SCROLL_STRATEGY } from '@aposin/ng-aquila/modal';
import { NX_NOTIFICATION_PANEL_SCROLL_STRATEGY } from '@aposin/ng-aquila/notification-panel';
import { NX_OVERLAY_SCROLL_STRATEGY } from '@aposin/ng-aquila/overlay';
import { NX_POPOVER_SCROLL_STRATEGY } from '@aposin/ng-aquila/popover';

import { NxScrollStrategy, NxScrollStrategyDefaultConfig, NxScrollStrategyFactoryConfig, NxScrollStrategyOptions } from './nx-scroll-strategy.models';

Expand Down Expand Up @@ -32,6 +35,7 @@ export function getScrollStrategyDefaultProviders(config: NxScrollStrategyDefaul
{ provide: NX_DATEPICKER_SCROLL_STRATEGY, useFactory: getFactoryFnByDefaultConfig(config, 'datepicker'), deps: [Overlay] },
{ provide: NX_DROPDOWN_SCROLL_STRATEGY, useFactory: getFactoryFnByDefaultConfig(config, 'dropdown'), deps: [Overlay] },
{ provide: NX_NOTIFICATION_PANEL_SCROLL_STRATEGY, useFactory: getFactoryFnByDefaultConfig(config, 'notificationPanel'), deps: [Overlay] },
...getExtraProvidersByDefaultConfig(config),
];
}

Expand All @@ -43,6 +47,14 @@ function getFactoryFnByDefaultConfig(
return (overlay: Overlay) => getScrollStrategyFactory(componentConfig.scrollStrategy, overlay, componentConfig.scrollStrategyOptions);
}

function getExtraProvidersByDefaultConfig(config: NxScrollStrategyDefaultConfig): FactoryProvider[] {
return Object.entries(config.extraComponents ?? {}).map(([componentName, { scrollStrategy, scrollStrategyOptions }]) => ({
provide: getInjectionToken(componentName),
useFactory: (overlay: Overlay) => getScrollStrategyFactory(scrollStrategy, overlay, scrollStrategyOptions),
deps: [Overlay],
}));
}

/** Return an array of scroll strategy providers based on the provided factory config. */
export function getScrollStrategyFactoryProviders(config: NxScrollStrategyFactoryConfig): FactoryProvider[] {
return [
Expand All @@ -51,6 +63,7 @@ export function getScrollStrategyFactoryProviders(config: NxScrollStrategyFactor
{ provide: NX_DATEPICKER_SCROLL_STRATEGY, useFactory: getFactoryFnByFactoryConfig(config, 'datepicker'), deps: [Overlay] },
{ provide: NX_DROPDOWN_SCROLL_STRATEGY, useFactory: getFactoryFnByFactoryConfig(config, 'dropdown'), deps: [Overlay] },
{ provide: NX_NOTIFICATION_PANEL_SCROLL_STRATEGY, useFactory: getFactoryFnByFactoryConfig(config, 'notificationPanel'), deps: [Overlay] },
...getExtraProvidersByFactoryConfig(config),
];
}

Expand All @@ -60,3 +73,26 @@ function getFactoryFnByFactoryConfig(
): (overlay: Overlay) => () => ScrollStrategy {
return (config.overrides?.[componentName] ?? config).scrollStrategyFactory;
}

function getExtraProvidersByFactoryConfig(config: NxScrollStrategyFactoryConfig): FactoryProvider[] {
return Object.entries(config.extraComponents ?? {}).map(([componentName, { scrollStrategyFactory }]) => ({
provide: getInjectionToken(componentName),
useFactory: scrollStrategyFactory,
deps: [Overlay],
}));
}

function getInjectionToken(componentName: string): InjectionToken<() => ScrollStrategy> {
switch (componentName) {
case 'dialog':
return NX_MODAL_SCROLL_STRATEGY;
case 'overlay':
return NX_OVERLAY_SCROLL_STRATEGY;
case 'popover':
return NX_POPOVER_SCROLL_STRATEGY;
// case 'tooltip':
// return NX_TOOLTIP_SCROLL_STRATEGY;
default:
throw new Error(`Injection token for ${componentName} scroll strategy not recognized.`);
}
}
14 changes: 14 additions & 0 deletions projects/ng-aquila/src/config/nx-scroll-strategy.models.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,13 @@ export interface NxScrollStrategyDefaultConfig {
dropdown?: Pick<NxScrollStrategyDefaultConfig, 'scrollStrategy' | 'scrollStrategyOptions'>;
notificationPanel?: Pick<NxScrollStrategyDefaultConfig, 'scrollStrategy' | 'scrollStrategyOptions'>;
};
/** Configure default behavior for additional overlay-based component types. */
extraComponents?: {
dialog?: Pick<NxScrollStrategyDefaultConfig, 'scrollStrategy' | 'scrollStrategyOptions'>;
overlay?: Pick<NxScrollStrategyDefaultConfig, 'scrollStrategy' | 'scrollStrategyOptions'>;
popover?: Pick<NxScrollStrategyDefaultConfig, 'scrollStrategy' | 'scrollStrategyOptions'>;
// tooltip?: Pick<NxScrollStrategyDefaultConfig, 'scrollStrategy' | 'scrollStrategyOptions'>;
};
}

/** Scroll strategy factory creator function. */
Expand All @@ -39,4 +46,11 @@ export interface NxScrollStrategyFactoryConfig {
dropdown?: Pick<NxScrollStrategyFactoryConfig, 'scrollStrategyFactory'>;
notificationPanel?: Pick<NxScrollStrategyFactoryConfig, 'scrollStrategyFactory'>;
};
/** Configure default behavior for additional overlay-based component types. */
extraComponents?: {
dialog?: Pick<NxScrollStrategyFactoryConfig, 'scrollStrategyFactory'>;
overlay?: Pick<NxScrollStrategyFactoryConfig, 'scrollStrategyFactory'>;
popover?: Pick<NxScrollStrategyFactoryConfig, 'scrollStrategyFactory'>;
// tooltip?: Pick<NxScrollStrategyFactoryConfig, 'scrollStrategyFactory'>;
};
}
6 changes: 6 additions & 0 deletions projects/ng-aquila/src/config/nx-scroll-strategy.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,12 @@ import { NxScrollStrategyDefaultConfig, NxScrollStrategyFactoryConfig } from './
* - dropdown
* - notification-panel
*
* These components will be affected only if configured separately in the `extraComponents` property:
*
* - dialog
* - overlay
* - popover
*
* @example
* NxScrollStrategyModule.withConfig({
* scrollStrategy: 'close',
Expand Down

0 comments on commit 5a999b8

Please sign in to comment.