未验证 提交 fbbf9444 编写于 作者: E Evgeny Lupanov 提交者: GitHub

feat: upgrade to Angular 9 and Nebular 5 (#5628)

BREAKING CHANGE:
Angular updated to version 9.
Nebular updated to version 5.
`@agm/core` replaced with `@angular/google-maps`.
`ng2-completer` replaced with `@akveo/ng2-completer`, read details [here](https://github.com/akveo/ng2-smart-table/pull/1140#issue-392285957).
上级 df3bc2a6
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
"build": { "build": {
"builder": "@angular-devkit/build-angular:browser", "builder": "@angular-devkit/build-angular:browser",
"options": { "options": {
"aot": true,
"preserveSymlinks": true, "preserveSymlinks": true,
"rebaseRootRelativeCssUrls": true, "rebaseRootRelativeCssUrls": true,
"outputPath": "dist", "outputPath": "dist",
...@@ -36,7 +37,6 @@ ...@@ -36,7 +37,6 @@
"node_modules/@fortawesome/fontawesome-free/css/all.css", "node_modules/@fortawesome/fontawesome-free/css/all.css",
"node_modules/socicon/css/socicon.css", "node_modules/socicon/css/socicon.css",
"node_modules/nebular-icons/scss/nebular-icons.scss", "node_modules/nebular-icons/scss/nebular-icons.scss",
"node_modules/angular-tree-component/dist/angular-tree-component.css",
"node_modules/pace-js/templates/pace-theme-flash.tmpl.css", "node_modules/pace-js/templates/pace-theme-flash.tmpl.css",
"node_modules/leaflet/dist/leaflet.css", "node_modules/leaflet/dist/leaflet.css",
"src/app/@theme/styles/styles.scss" "src/app/@theme/styles/styles.scss"
...@@ -55,6 +55,12 @@ ...@@ -55,6 +55,12 @@
}, },
"configurations": { "configurations": {
"production": { "production": {
"budgets": [
{
"type": "anyComponentStyle",
"maximumWarning": "6kb"
}
],
"optimization": true, "optimization": true,
"outputHashing": "all", "outputHashing": "all",
"sourceMap": false, "sourceMap": false,
...@@ -172,7 +178,7 @@ ...@@ -172,7 +178,7 @@
"schematics": { "schematics": {
"@schematics/angular:component": { "@schematics/angular:component": {
"prefix": "ngx", "prefix": "ngx",
"styleext": "scss" "style": "scss"
}, },
"@schematics/angular:directive": { "@schematics/angular:directive": {
"prefix": "ngx" "prefix": "ngx"
......
此差异已折叠。
...@@ -26,70 +26,70 @@ ...@@ -26,70 +26,70 @@
"docs": "compodoc -p src/tsconfig.app.json -d docs", "docs": "compodoc -p src/tsconfig.app.json -d docs",
"docs:serve": "compodoc -p src/tsconfig.app.json -d docs -s", "docs:serve": "compodoc -p src/tsconfig.app.json -d docs -s",
"prepush": "npm run lint:ci", "prepush": "npm run lint:ci",
"release:changelog": "npm run conventional-changelog -- -p angular -i CHANGELOG.md -s" "release:changelog": "npm run conventional-changelog -- -p angular -i CHANGELOG.md -s",
"postinstall": "ngcc --properties es2015 es5 browser module main --first-only --create-ivy-entry-points"
}, },
"dependencies": { "dependencies": {
"@agm/core": "^1.0.0-beta.5", "@akveo/ng2-completer": "^9.0.1",
"@angular/animations": "^8.0.0", "@angular/animations": "^9.0.4",
"@angular/cdk": "^8.0.0", "@angular/cdk": "^9.1.2",
"@angular/common": "^8.0.0", "@angular/common": "^9.0.4",
"@angular/compiler": "^8.0.0", "@angular/compiler": "^9.0.4",
"@angular/core": "^8.0.0", "@angular/core": "^9.0.4",
"@angular/forms": "^8.0.0", "@angular/forms": "^9.0.4",
"@angular/platform-browser": "^8.0.0", "@angular/google-maps": "^9.1.0",
"@angular/platform-browser-dynamic": "^8.0.0", "@angular/platform-browser": "^9.0.4",
"@angular/router": "^8.0.0", "@angular/platform-browser-dynamic": "^9.0.4",
"@angular/router": "^9.0.4",
"@asymmetrik/ngx-leaflet": "3.0.1", "@asymmetrik/ngx-leaflet": "3.0.1",
"@nebular/auth": "4.4.0", "@nebular/auth": "5.0.0",
"@nebular/eva-icons": "4.4.0", "@nebular/eva-icons": "5.0.0",
"@nebular/security": "4.4.0", "@nebular/security": "5.0.0",
"@nebular/theme": "4.4.0", "@nebular/theme": "5.0.0",
"@swimlane/ngx-charts": "^10.0.0", "@swimlane/ngx-charts": "^13.0.2",
"angular-tree-component": "7.2.0",
"angular2-chartjs": "0.4.1", "angular2-chartjs": "0.4.1",
"angular2-toaster": "^7.0.0",
"bootstrap": "4.3.1", "bootstrap": "4.3.1",
"chart.js": "2.7.1", "chart.js": "2.7.1",
"ckeditor": "4.7.3", "ckeditor": "4.7.3",
"classlist.js": "1.1.20150312", "classlist.js": "1.1.20150312",
"core-js": "2.5.1", "core-js": "2.5.1",
"echarts": "^4.0.2", "echarts": "^4.0.2",
"eva-icons": "^1.1.0", "eva-icons": "^1.1.3",
"intl": "1.2.5", "intl": "1.2.5",
"ionicons": "2.0.1", "ionicons": "2.0.1",
"leaflet": "1.2.0", "leaflet": "1.2.0",
"nebular-icons": "1.1.0", "nebular-icons": "1.1.0",
"ng2-ckeditor": "^1.2.2", "ng2-ckeditor": "^1.2.2",
"ng2-completer": "2.0.8", "ng2-smart-table": "^1.6.0",
"ng2-smart-table": "1.3.5", "ngx-echarts": "^4.2.2",
"ngx-echarts": "^4.0.1",
"node-sass": "^4.12.0", "node-sass": "^4.12.0",
"normalize.css": "6.0.0", "normalize.css": "6.0.0",
"pace-js": "1.0.2", "pace-js": "1.0.2",
"roboto-fontface": "0.8.0", "roboto-fontface": "0.8.0",
"rxjs": "6.5.2", "rxjs": "6.5.4",
"rxjs-compat": "6.3.0", "rxjs-compat": "6.3.0",
"socicon": "3.0.5", "socicon": "3.0.5",
"style-loader": "^1.1.3",
"tinymce": "4.5.7", "tinymce": "4.5.7",
"tslib": "^1.9.0", "tslib": "^1.10.0",
"typeface-exo": "0.0.22", "typeface-exo": "0.0.22",
"web-animations-js": "github:angular/web-animations-js#release_pr208", "web-animations-js": "^2.3.2",
"zone.js": "~0.9.1" "zone.js": "~0.10.2"
}, },
"devDependencies": { "devDependencies": {
"@angular-devkit/build-angular": "~0.800.2", "@angular-devkit/build-angular": "~0.900.4",
"@angular/cli": "^8.0.2", "@angular/cli": "^9.0.4",
"@angular/compiler-cli": "^8.0.0", "@angular/compiler-cli": "^9.0.4",
"@angular/language-service": "8.0.0", "@angular/language-service": "9.0.4",
"@compodoc/compodoc": "1.0.1", "@compodoc/compodoc": "1.0.1",
"@fortawesome/fontawesome-free": "^5.2.0", "@fortawesome/fontawesome-free": "^5.2.0",
"@types/d3-color": "1.0.5", "@types/d3-color": "1.0.5",
"@types/googlemaps": "^3.30.4", "@types/googlemaps": "^3.39.3",
"@types/jasmine": "2.5.54", "@types/jasmine": "2.5.54",
"@types/jasminewd2": "2.0.3", "@types/jasminewd2": "2.0.3",
"@types/leaflet": "1.2.3", "@types/leaflet": "1.2.3",
"@types/node": "6.0.90", "@types/node": "^12.11.1",
"codelyzer": "^5.0.1", "codelyzer": "^5.1.2",
"conventional-changelog-cli": "1.3.4", "conventional-changelog-cli": "1.3.4",
"husky": "0.13.3", "husky": "0.13.3",
"jasmine-core": "2.6.4", "jasmine-core": "2.6.4",
...@@ -107,6 +107,6 @@ ...@@ -107,6 +107,6 @@
"ts-node": "3.2.2", "ts-node": "3.2.2",
"tslint": "^5.7.0", "tslint": "^5.7.0",
"tslint-language-service": "^0.9.9", "tslint-language-service": "^0.9.9",
"typescript": "3.4.5" "typescript": "3.7.5"
} }
} }
...@@ -159,8 +159,8 @@ export class CoreModule { ...@@ -159,8 +159,8 @@ export class CoreModule {
throwIfAlreadyLoaded(parentModule, 'CoreModule'); throwIfAlreadyLoaded(parentModule, 'CoreModule');
} }
static forRoot(): ModuleWithProviders { static forRoot(): ModuleWithProviders<CoreModule> {
return <ModuleWithProviders>{ return {
ngModule: CoreModule, ngModule: CoreModule,
providers: [ providers: [
...NB_CORE_PROVIDERS, ...NB_CORE_PROVIDERS,
......
...@@ -54,8 +54,8 @@ const SERVICES = [ ...@@ -54,8 +54,8 @@ const SERVICES = [
], ],
}) })
export class MockDataModule { export class MockDataModule {
static forRoot(): ModuleWithProviders { static forRoot(): ModuleWithProviders<MockDataModule> {
return <ModuleWithProviders>{ return {
ngModule: MockDataModule, ngModule: MockDataModule,
providers: [ providers: [
...SERVICES, ...SERVICES,
......
...@@ -76,8 +76,8 @@ const PIPES = [ ...@@ -76,8 +76,8 @@ const PIPES = [
declarations: [...COMPONENTS, ...PIPES], declarations: [...COMPONENTS, ...PIPES],
}) })
export class ThemeModule { export class ThemeModule {
static forRoot(): ModuleWithProviders { static forRoot(): ModuleWithProviders<ThemeModule> {
return <ModuleWithProviders>{ return {
ngModule: ThemeModule, ngModule: ThemeModule,
providers: [ providers: [
...NbThemeModule.forRoot( ...NbThemeModule.forRoot(
......
...@@ -9,10 +9,10 @@ import { ...@@ -9,10 +9,10 @@ import {
NbResetPasswordComponent, NbResetPasswordComponent,
} from '@nebular/auth'; } from '@nebular/auth';
const routes: Routes = [ export const routes: Routes = [
{ {
path: 'pages', path: 'pages',
loadChildren: () => import('app/pages/pages.module') loadChildren: () => import('./pages/pages.module')
.then(m => m.PagesModule), .then(m => m.PagesModule),
}, },
{ {
......
...@@ -28,9 +28,6 @@ import { ...@@ -28,9 +28,6 @@ import {
BrowserAnimationsModule, BrowserAnimationsModule,
HttpClientModule, HttpClientModule,
AppRoutingModule, AppRoutingModule,
ThemeModule.forRoot(),
NbSidebarModule.forRoot(), NbSidebarModule.forRoot(),
NbMenuModule.forRoot(), NbMenuModule.forRoot(),
NbDatepickerModule.forRoot(), NbDatepickerModule.forRoot(),
...@@ -41,6 +38,7 @@ import { ...@@ -41,6 +38,7 @@ import {
messageGoogleMapKey: 'AIzaSyA_wNuCzia92MAmdLRzmqitRGvCF7wCZPY', messageGoogleMapKey: 'AIzaSyA_wNuCzia92MAmdLRzmqitRGvCF7wCZPY',
}), }),
CoreModule.forRoot(), CoreModule.forRoot(),
ThemeModule.forRoot(),
], ],
bootstrap: [AppComponent], bootstrap: [AppComponent],
}) })
......
import { Component, OnDestroy } from '@angular/core'; import { Component, OnDestroy, OnInit } from '@angular/core';
import { NbMediaBreakpoint, NbMediaBreakpointsService, NbThemeService } from '@nebular/theme'; import { NbMediaBreakpoint, NbMediaBreakpointsService, NbThemeService } from '@nebular/theme';
import { takeWhile } from 'rxjs/operators'; import { takeWhile } from 'rxjs/operators';
import { CountryOrderData } from '../../../@core/data/country-order'; import { CountryOrderData } from '../../../@core/data/country-order';
...@@ -22,7 +22,7 @@ import { CountryOrderData } from '../../../@core/data/country-order'; ...@@ -22,7 +22,7 @@ import { CountryOrderData } from '../../../@core/data/country-order';
</nb-card> </nb-card>
`, `,
}) })
export class CountryOrdersComponent implements OnDestroy { export class CountryOrdersComponent implements OnInit, OnDestroy {
private alive = true; private alive = true;
...@@ -36,6 +36,9 @@ export class CountryOrdersComponent implements OnDestroy { ...@@ -36,6 +36,9 @@ export class CountryOrdersComponent implements OnDestroy {
private breakpointService: NbMediaBreakpointsService, private breakpointService: NbMediaBreakpointsService,
private countryOrderService: CountryOrderData) { private countryOrderService: CountryOrderData) {
this.breakpoints = this.breakpointService.getBreakpointsMap(); this.breakpoints = this.breakpointService.getBreakpointsMap();
}
ngOnInit() {
this.themeService.onMediaQueryChange() this.themeService.onMediaQueryChange()
.pipe(takeWhile(() => this.alive)) .pipe(takeWhile(() => this.alive))
.subscribe(([oldValue, newValue]) => { .subscribe(([oldValue, newValue]) => {
......
<nb-card>
<nb-card-header>Google Maps</nb-card-header>
<nb-card-body>
<google-map [center]="position" [zoom]="8" width="100%" height="36.5625rem">
<map-marker [position]="position"></map-marker>
</google-map>
</nb-card-body>
</nb-card>
\ No newline at end of file
...@@ -3,19 +3,8 @@ import { Component } from '@angular/core'; ...@@ -3,19 +3,8 @@ import { Component } from '@angular/core';
@Component({ @Component({
selector: 'ngx-gmaps', selector: 'ngx-gmaps',
styleUrls: ['./gmaps.component.scss'], styleUrls: ['./gmaps.component.scss'],
template: ` templateUrl: './gmaps.component.html',
<nb-card>
<nb-card-header>Google Maps</nb-card-header>
<nb-card-body>
<agm-map [latitude]="lat" [longitude]="lng">
<agm-marker [latitude]="lat" [longitude]="lng"></agm-marker>
</agm-map>
</nb-card-body>
</nb-card>
`,
}) })
export class GmapsComponent { export class GmapsComponent {
readonly position = { lat: 51.678418, lng: 7.809007 };
lat = 51.678418;
lng = 7.809007;
} }
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { AgmCoreModule } from '@agm/core'; import { GoogleMapsModule } from '@angular/google-maps';
import { LeafletModule } from '@asymmetrik/ngx-leaflet'; import { LeafletModule } from '@asymmetrik/ngx-leaflet';
import { NgxEchartsModule } from 'ngx-echarts'; import { NgxEchartsModule } from 'ngx-echarts';
import { NbCardModule } from '@nebular/theme'; import { NbCardModule } from '@nebular/theme';
...@@ -10,10 +10,7 @@ import { MapsRoutingModule, routedComponents } from './maps-routing.module'; ...@@ -10,10 +10,7 @@ import { MapsRoutingModule, routedComponents } from './maps-routing.module';
@NgModule({ @NgModule({
imports: [ imports: [
ThemeModule, ThemeModule,
AgmCoreModule.forRoot({ GoogleMapsModule,
apiKey: 'AIzaSyCpVhQiwAllg1RAFaxMWSpQruuGARy0Y1k',
libraries: ['places'],
}),
LeafletModule.forRoot(), LeafletModule.forRoot(),
MapsRoutingModule, MapsRoutingModule,
NgxEchartsModule, NgxEchartsModule,
......
export class Location {
constructor(public latitude: number = 53.9, public longitude: number = 27.5667) {
}
}
export class PositionModel {
constructor(
public lat = 53.9,
public lng = 27.5667,
) {}
}
<agm-map [latitude]="latitude" <google-map [center]="position" [zoom]="zoom" width="100%" height="36.5625rem">
[longitude]="longitude" <map-marker [position]="position"></map-marker>
[scrollwheel]="false" </google-map>
[zoom]="zoom"> \ No newline at end of file
<agm-marker [latitude]="latitude"
[longitude]="longitude"></agm-marker>
</agm-map>
import { Component, Input, OnInit } from '@angular/core'; import { Component, Input, OnInit } from '@angular/core';
import { Location } from '../entity/Location'; import { PositionModel } from '../entity/position.model';
@Component({ @Component({
selector: 'ngx-map', selector: 'ngx-map',
...@@ -7,23 +7,24 @@ import { Location } from '../entity/Location'; ...@@ -7,23 +7,24 @@ import { Location } from '../entity/Location';
styleUrls: ['./map.component.scss'], styleUrls: ['./map.component.scss'],
}) })
export class MapComponent implements OnInit { export class MapComponent implements OnInit {
latitude: number; position: PositionModel = null;
longitude: number; zoom: number = 1;
zoom: number;
@Input() @Input()
public set searchedLocation(searchedLocation: Location) { public set searchedPosition(position: PositionModel) {
this.latitude = searchedLocation.latitude; if (position) {
this.longitude = searchedLocation.longitude; this.position = position;
this.zoom = 12; this.zoom = 12;
}
} }
ngOnInit(): void { ngOnInit() {
// set up current location // set up current location
if ('geolocation' in navigator) { if ('geolocation' in navigator) {
navigator.geolocation.getCurrentPosition((position) => { navigator.geolocation.getCurrentPosition((position) => {
this.searchedLocation = new Location( this.searchedPosition = new PositionModel(
position.coords.latitude, position.coords.longitude, position.coords.latitude,
position.coords.longitude,
); );
}); });
} }
......
<nb-card> <nb-card>
<nb-card-header>Google Maps with search</nb-card-header> <nb-card-header>Google Maps with search</nb-card-header>
<nb-card-body> <nb-card-body>
<ngx-search (positionChanged)="updateLocation($event)"></ngx-search> <ngx-search (positionChanged)="setPosition($event)"></ngx-search>
<ngx-map [searchedLocation]="searchedLocation"></ngx-map> <ngx-map [searchedPosition]="searchedPosition"></ngx-map>
</nb-card-body> </nb-card-body>
</nb-card> </nb-card>
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { Location } from './entity/Location'; import { PositionModel } from './entity/position.model';
@Component({ @Component({
selector: 'ngx-search-map', selector: 'ngx-search-map',
templateUrl: './search-map.component.html', templateUrl: './search-map.component.html',
}) })
export class SearchMapComponent { export class SearchMapComponent {
searchedPosition: PositionModel = new PositionModel();
searchedLocation: Location = new Location(); setPosition(position: PositionModel) {
this.searchedPosition = position;
updateLocation(event: Location) {
this.searchedLocation = new Location(event.latitude, event.longitude);
} }
} }
import { Component, ElementRef, EventEmitter, NgZone, OnInit, Output, ViewChild } from '@angular/core'; import { Component, ElementRef, EventEmitter, NgZone, OnInit, Output, ViewChild } from '@angular/core';
import { MapsAPILoader } from '@agm/core'; import { PositionModel } from '../entity/position.model';
import { Location } from '../entity/Location';
@Component({ @Component({
selector: 'ngx-search', selector: 'ngx-search',
...@@ -9,35 +7,33 @@ import { Location } from '../entity/Location'; ...@@ -9,35 +7,33 @@ import { Location } from '../entity/Location';
}) })
export class SearchComponent implements OnInit { export class SearchComponent implements OnInit {
@Output() positionChanged = new EventEmitter<Location>(); @Output()
positionChanged: EventEmitter<PositionModel> = new EventEmitter<PositionModel>();
@ViewChild('search', { static: true }) @ViewChild('search', { static: true })
public searchElementRef: ElementRef; searchElementRef: ElementRef;
constructor(private mapsAPILoader: MapsAPILoader, constructor(private ngZone: NgZone) {}
private ngZone: NgZone) {
}
ngOnInit() { ngOnInit() {
// load Places Autocomplete const autocomplete = new google.maps.places.Autocomplete(
this.mapsAPILoader.load().then(() => { this.searchElementRef.nativeElement, { types: ['address'] },
const autocomplete = new google.maps.places.Autocomplete(this.searchElementRef.nativeElement, { );
types: ['address'],
}); autocomplete.addListener('place_changed', () => {
autocomplete.addListener('place_changed', () => { this.ngZone.run(() => {
this.ngZone.run(() => { // get the place result
// get the place result const place: google.maps.places.PlaceResult = autocomplete.getPlace();
const place: google.maps.places.PlaceResult = autocomplete.getPlace();
// verify result
// verify result if (place.geometry === undefined || place.geometry === null) {
if (place.geometry === undefined || place.geometry === null) { return;
return; }
}
this.positionChanged.emit(new PositionModel(
this.positionChanged.emit( place.geometry.location.lat(),
new Location(place.geometry.location.lat(), place.geometry.location.lng(),
place.geometry.location.lng())); ));
});
}); });
}); });
} }
......
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { ToasterConfig } from 'angular2-toaster';
import 'style-loader!angular2-toaster/toaster.css';
import { import {
NbComponentStatus, NbComponentStatus,
NbGlobalLogicalPosition, NbGlobalLogicalPosition,
NbGlobalPhysicalPosition, NbGlobalPhysicalPosition,
NbGlobalPosition, NbGlobalPosition,
NbToastrService, NbToastrService,
NbToastrConfig,
} from '@nebular/theme'; } from '@nebular/theme';
@Component({ @Component({
...@@ -18,7 +16,7 @@ import { ...@@ -18,7 +16,7 @@ import {
export class ToastrComponent { export class ToastrComponent {
constructor(private toastrService: NbToastrService) {} constructor(private toastrService: NbToastrService) {}
config: ToasterConfig; config: NbToastrConfig;
index = 1; index = 1;
destroyByClick = true; destroyByClick = true;
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/png" href="favicon.png"> <link rel="icon" type="image/png" href="favicon.png">
<link rel="icon" type="image/x-icon" href="favicon.ico"> <link rel="icon" type="image/x-icon" href="favicon.ico">
<script defer src="https://maps.googleapis.com/maps/api/js?key=AIzaSyCpVhQiwAllg1RAFaxMWSpQruuGARy0Y1k&libraries=places"></script>
</head> </head>
<body> <body>
<ngx-app>Loading...</ngx-app> <ngx-app>Loading...</ngx-app>
......
...@@ -2,15 +2,7 @@ ...@@ -2,15 +2,7 @@
"extends": "../tsconfig.json", "extends": "../tsconfig.json",
"compilerOptions": { "compilerOptions": {
"outDir": "../out-tsc/app", "outDir": "../out-tsc/app",
"baseUrl": "./", "baseUrl": "./"
"paths": {
"@angular/*": [
"../node_modules/@angular/*"
],
"@nebular/*": [
"../node_modules/@nebular/*"
]
}
}, },
"exclude": [ "exclude": [
"test.ts", "test.ts",
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册