Skip to content

Commit b9283d3

Browse files
tibing-old-emailnnixaa
authored andcommitted
feat(theme): add cdk (#679)
Add Nebular cdk module, which is a wrapper over Angular cdk and provides some Nebular specific features, such as overrides of the overlay module. Closes #661, closes #660.
1 parent 22e39eb commit b9283d3

23 files changed

+875
-0
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@
110110
"@angular/cli": "^6.0.0",
111111
"@angular/compiler-cli": "6.0.0",
112112
"@angular/language-service": "6.0.0",
113+
"@angular/cdk": "6.0.0",
113114
"@types/gulp": "3.8.36",
114115
"@types/highlight.js": "9.12.2",
115116
"@types/jasmine": "2.8.3",

scripts/gulp/tasks/bundle/rollup-config.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ const ROLLUP_GLOBALS = {
1717
'@angular/core/testing': 'ng.core.testing',
1818
'@angular/common/testing': 'ng.common.testing',
1919
'@angular/common/http/testing': 'ng.common.http.testing',
20+
'@angular/cdk/overlay': 'ng.cdk.overlay',
21+
'@angular/cdk/platform': 'ng.cdk.platform',
22+
'@angular/cdk/portal': 'ng.cdk.portal',
2023

2124

2225
// RxJS dependencies
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { NgModule } from '@angular/core';
2+
import { OverlayContainer, ScrollDispatcher } from '@angular/cdk/overlay';
3+
4+
import { NbOverlayContainerAdapter } from './overlay-container-adapter';
5+
import { NbScrollDispatcherAdapter } from './scroll-dispatcher-adapter';
6+
import { NbViewportRulerAdapter } from './viewport-ruler-adapter';
7+
8+
9+
@NgModule({
10+
providers: [
11+
NbViewportRulerAdapter,
12+
{ provide: OverlayContainer, useClass: NbOverlayContainerAdapter },
13+
{ provide: ScrollDispatcher, useClass: NbScrollDispatcherAdapter },
14+
],
15+
})
16+
export class NbCdkAdapterModule {
17+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { Injectable } from '@angular/core';
2+
3+
import { NbOverlayContainer } from '../overlay/mapping';
4+
5+
6+
@Injectable()
7+
export class NbOverlayContainerAdapter extends NbOverlayContainer {
8+
protected _createContainer(): void {
9+
const container = this._document.createElement('div');
10+
11+
container.classList.add('cdk-overlay-container');
12+
this._document.querySelector('nb-layout').appendChild(container);
13+
this._containerElement = container;
14+
}
15+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { Injectable, NgZone } from '@angular/core';
2+
import { CdkScrollable, ScrollDispatcher } from '@angular/cdk/overlay';
3+
import { Observable } from 'rxjs';
4+
5+
import { NbPlatform } from '../overlay/mapping';
6+
import { NbLayoutScrollService } from '../../../services/scroll.service';
7+
8+
@Injectable()
9+
export class NbScrollDispatcherAdapter extends ScrollDispatcher {
10+
constructor(ngZone: NgZone, platform: NbPlatform, protected scrollService: NbLayoutScrollService) {
11+
super(ngZone, platform);
12+
}
13+
14+
scrolled(auditTimeInMs?: number): Observable<CdkScrollable | void> {
15+
return this.scrollService.onScroll();
16+
}
17+
}
18+
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import { Injectable, NgZone } from '@angular/core';
2+
import { ViewportRuler } from '@angular/cdk/overlay';
3+
import { map } from 'rxjs/operators';
4+
5+
import { NbPlatform } from '../overlay/mapping';
6+
import { NbLayoutRulerService } from '../../../services/ruler.service';
7+
import { NbLayoutScrollService, NbScrollPosition } from '../../../services/scroll.service';
8+
9+
10+
@Injectable()
11+
export class NbViewportRulerAdapter extends ViewportRuler {
12+
constructor(platform: NbPlatform, ngZone: NgZone,
13+
protected ruler: NbLayoutRulerService,
14+
protected scroll: NbLayoutScrollService) {
15+
super(platform, ngZone);
16+
}
17+
18+
getViewportSize(): Readonly<{ width: number; height: number; }> {
19+
let res;
20+
/*
21+
* getDimensions call is really synchronous operation.
22+
* And we have to conform with the interface of the original service.
23+
* */
24+
this.ruler.getDimensions()
25+
.pipe(map(dimensions => ({ width: dimensions.clientWidth, height: dimensions.clientHeight })))
26+
.subscribe(rect => res = rect);
27+
return res;
28+
}
29+
30+
getViewportScrollPosition(): { left: number; top: number } {
31+
let res;
32+
/*
33+
* getPosition call is really synchronous operation.
34+
* And we have to conform with the interface of the original service.
35+
* */
36+
this.scroll.getPosition()
37+
.pipe(map((position: NbScrollPosition) => ({ top: position.y, left: position.x })))
38+
.subscribe(position => res = position);
39+
return res;
40+
}
41+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export * from './overlay/mapping';
2+
export * from './overlay';
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
@import '~@angular/cdk/overlay-prebuilt.css';
2+
3+
@mixin nb-overlay-theme {
4+
.overlay-backdrop {
5+
background: nb-theme(overlay-backdrop-bg);
6+
}
7+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
export * from './overlay.module';
2+
export * from './overlay';
3+
export * from './overlay-position';
4+
export * from './overlay-container';
5+
export * from './overlay-trigger';
6+
export * from './mapping';
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
import { Directive, Injectable, NgModule, TemplateRef, ViewContainerRef } from '@angular/core';
2+
import { CdkPortal, ComponentPortal, Portal, PortalModule, TemplatePortal } from '@angular/cdk/portal';
3+
import {
4+
ComponentType,
5+
ConnectedOverlayPositionChange,
6+
ConnectedPosition,
7+
ConnectionPositionPair,
8+
FlexibleConnectedPositionStrategy,
9+
GlobalPositionStrategy,
10+
Overlay,
11+
OverlayContainer,
12+
OverlayModule,
13+
OverlayPositionBuilder,
14+
OverlayRef,
15+
PositionStrategy,
16+
} from '@angular/cdk/overlay';
17+
import { Platform } from '@angular/cdk/platform';
18+
19+
20+
@Directive({ selector: '[nbPortal]' })
21+
export class NbPortalDirective extends CdkPortal {
22+
}
23+
24+
@Injectable()
25+
export class NbOverlayService extends Overlay {
26+
}
27+
28+
@Injectable()
29+
export class NbPlatform extends Platform {
30+
}
31+
32+
@Injectable()
33+
export class NbOverlayPositionBuilder extends OverlayPositionBuilder {
34+
}
35+
36+
export class NbComponentPortal<T = any> extends ComponentPortal<T> {
37+
}
38+
39+
export class NbTemplatePortal<T = any> extends TemplatePortal<T> {
40+
constructor(template: TemplateRef<T>, viewContainerRef?: ViewContainerRef, context?: T) {
41+
super(template, viewContainerRef, context);
42+
}
43+
}
44+
45+
export class NbOverlayContainer extends OverlayContainer {
46+
}
47+
48+
export class NbFlexibleConnectedPositionStrategy extends FlexibleConnectedPositionStrategy {
49+
}
50+
51+
export type NbPortal<T = any> = Portal<T>;
52+
export type NbOverlayRef = OverlayRef;
53+
export type NbComponentType<T = any> = ComponentType<T>;
54+
export type NbGlobalPositionStrategy = GlobalPositionStrategy;
55+
export type NbPositionStrategy = PositionStrategy;
56+
export type NbConnectedPosition = ConnectedPosition;
57+
export type NbConnectedOverlayPositionChange = ConnectedOverlayPositionChange;
58+
export type NbConnectionPositionPair = ConnectionPositionPair;
59+
60+
const CDK_MODULES = [OverlayModule, PortalModule];
61+
62+
const CDK_PROVIDERS = [
63+
NbOverlayService,
64+
NbPlatform,
65+
NbOverlayPositionBuilder,
66+
];
67+
68+
/**
69+
* This module helps us to keep all angular/cdk deps inside our cdk module via providing aliases.
70+
* Approach will help us move cdk in separate npm package and refactor nebular/theme code.
71+
* */
72+
@NgModule({
73+
imports: [...CDK_MODULES],
74+
exports: [
75+
...CDK_MODULES,
76+
NbPortalDirective,
77+
],
78+
declarations: [NbPortalDirective],
79+
providers: [...CDK_PROVIDERS],
80+
})
81+
export class NbCdkMappingModule {
82+
}

0 commit comments

Comments
 (0)