Welcome to QuickApp
-
This application template provides a quick and convenient way to create ASP.NET Core 3.1 / Angular 9 applications
+
This application template provides a quick and convenient way to create ASP.NET Core 5.0 / Angular 11 applications
NOTE: To hire developers for your project please go to DevLink or send a mail to devlink@ebenmonney.com for more info.
Technologies
- - Template pages with Angular 9 and TypeScript
- - RESTful API Backend using ASP.NET Core 3.1 MVC Web API
+ - Template pages with Angular 11 and TypeScript
+ - RESTful API Backend using ASP.NET Core 5.0 MVC Web API
- Database using Entity Framework Core
- Authentication based on IdentityServer4 and ASP.NET Core Identity
- API Documentation using Swagger
diff --git a/QuickApp/ClientApp/src/app/components/app.component.spec.ts b/QuickApp/ClientApp/src/app/components/app.component.spec.ts
index 8c6a8e126..6b13a046d 100644
--- a/QuickApp/ClientApp/src/app/components/app.component.spec.ts
+++ b/QuickApp/ClientApp/src/app/components/app.component.spec.ts
@@ -3,7 +3,7 @@
// www.ebenmonney.com/templates
// =============================
-import { TestBed, async } from '@angular/core/testing';
+import { TestBed } from '@angular/core/testing';
import { RouterTestingModule } from '@angular/router/testing';
import { FormsModule } from '@angular/forms';
import { HttpClientModule } from '@angular/common/http';
@@ -34,63 +34,63 @@ import { AccountService } from '../services/account.service';
import { AccountEndpoint } from '../services/account-endpoint.service';
describe('AppComponent', () => {
- beforeEach(async(() => {
- TestBed.configureTestingModule({
- imports: [
- HttpClientModule,
- FormsModule,
- RouterTestingModule,
- TranslateModule.forRoot({
- loader: {
- provide: TranslateLoader,
- useClass: TranslateLanguageLoader
- }
- }),
- NgxDatatableModule,
- OAuthModule.forRoot(),
- ToastaModule.forRoot(),
- TooltipModule.forRoot(),
- PopoverModule.forRoot(),
- ModalModule.forRoot()
- ],
- declarations: [
- AppComponent,
- LoginComponent,
- NotificationsViewerComponent
- ],
- providers: [
- AuthService,
- AlertService,
- ConfigurationService,
- ThemeManager,
- AppTitleService,
- AppTranslationService,
- NotificationService,
- NotificationEndpoint,
- AccountService,
- AccountEndpoint,
- LocalStoreManager,
- OidcHelperService
- ]
- }).compileComponents();
- }));
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [
+ HttpClientModule,
+ FormsModule,
+ RouterTestingModule,
+ TranslateModule.forRoot({
+ loader: {
+ provide: TranslateLoader,
+ useClass: TranslateLanguageLoader
+ }
+ }),
+ NgxDatatableModule,
+ OAuthModule.forRoot(),
+ ToastaModule.forRoot(),
+ TooltipModule.forRoot(),
+ PopoverModule.forRoot(),
+ ModalModule.forRoot()
+ ],
+ declarations: [
+ AppComponent,
+ LoginComponent,
+ NotificationsViewerComponent
+ ],
+ providers: [
+ AuthService,
+ AlertService,
+ ConfigurationService,
+ ThemeManager,
+ AppTitleService,
+ AppTranslationService,
+ NotificationService,
+ NotificationEndpoint,
+ AccountService,
+ AccountEndpoint,
+ LocalStoreManager,
+ OidcHelperService
+ ]
+ }).compileComponents();
+ });
- it('should create the app', () => {
- const fixture = TestBed.createComponent(AppComponent);
- const app = fixture.componentInstance;
- expect(app).toBeTruthy();
- });
+ it('should create the app', () => {
+ const fixture = TestBed.createComponent(AppComponent);
+ const app = fixture.componentInstance;
+ expect(app).toBeTruthy();
+ });
- it(`should have as title 'QuickApp'`, () => {
- const fixture = TestBed.createComponent(AppComponent);
- const app = fixture.componentInstance as AppComponent;
- expect(app.appTitle).toEqual('QuickApp');
- });
+ it(`should have as title 'QuickApp'`, () => {
+ const fixture = TestBed.createComponent(AppComponent);
+ const app = fixture.componentInstance as AppComponent;
+ expect(app.appTitle).toEqual('QuickApp');
+ });
- it('should render Loaded! in a h1 tag', () => {
- const fixture = TestBed.createComponent(AppComponent);
- fixture.detectChanges();
- const compiled = fixture.nativeElement;
- expect(compiled.querySelector('h1').textContent).toContain('Loaded!');
- });
+ it('should render Loaded! in a h1 tag', () => {
+ const fixture = TestBed.createComponent(AppComponent);
+ fixture.detectChanges();
+ const compiled = fixture.nativeElement;
+ expect(compiled.querySelector('h1').textContent).toContain('Loaded!');
+ });
});
diff --git a/QuickApp/ClientApp/src/app/components/controls/banner-demo.component.html b/QuickApp/ClientApp/src/app/components/controls/banner-demo.component.html
index d5878e05a..2eda00679 100644
--- a/QuickApp/ClientApp/src/app/components/controls/banner-demo.component.html
+++ b/QuickApp/ClientApp/src/app/components/controls/banner-demo.component.html
@@ -54,7 +54,7 @@
Application uses
-
diff --git a/QuickApp/ClientApp/src/main.ts b/QuickApp/ClientApp/src/main.ts
index 7bb722673..b89f1be0e 100644
--- a/QuickApp/ClientApp/src/main.ts
+++ b/QuickApp/ClientApp/src/main.ts
@@ -9,18 +9,9 @@ import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app/app.module';
import { environment } from './environments/environment';
-export function getBaseUrl() {
- return document.getElementsByTagName('base')[0].href;
-}
-
-const providers = [
- { provide: 'BASE_URL', useFactory: getBaseUrl, deps: [] }
-];
-
-
if (environment.production) {
enableProdMode();
}
-platformBrowserDynamic(providers).bootstrapModule(AppModule)
+platformBrowserDynamic().bootstrapModule(AppModule)
.catch(err => console.error(err));
diff --git a/QuickApp/ClientApp/src/polyfills.ts b/QuickApp/ClientApp/src/polyfills.ts
index eada4f68a..236b8437d 100644
--- a/QuickApp/ClientApp/src/polyfills.ts
+++ b/QuickApp/ClientApp/src/polyfills.ts
@@ -23,7 +23,9 @@
* BROWSER POLYFILLS
*/
-/** IE10 and IE11 requires the following for NgClass support on SVG elements */
+/**
+ * IE11 requires the following for NgClass support on SVG elements
+ */
// import 'classlist.js'; // Run `npm install --save classlist.js`.
/**
diff --git a/QuickApp/ClientApp/tsconfig.app.json b/QuickApp/ClientApp/tsconfig.app.json
index 83ef0f26a..226adb49d 100644
--- a/QuickApp/ClientApp/tsconfig.app.json
+++ b/QuickApp/ClientApp/tsconfig.app.json
@@ -1,8 +1,11 @@
+/* To learn more about this file see: https://angular.io/config/tsconfig. */
{
"extends": "./tsconfig.json",
"compilerOptions": {
"outDir": "./out-tsc/app",
- "types": [ "node" ]
+ "types": [
+ "node"
+ ]
},
"files": [
"src/main.ts",
@@ -10,9 +13,5 @@
],
"include": [
"src/**/*.d.ts"
- ],
- "exclude": [
- "src/test.ts",
- "src/**/*.spec.ts"
]
}
diff --git a/QuickApp/ClientApp/tsconfig.json b/QuickApp/ClientApp/tsconfig.json
index 30956ae7e..4a4dc6288 100644
--- a/QuickApp/ClientApp/tsconfig.json
+++ b/QuickApp/ClientApp/tsconfig.json
@@ -1,3 +1,4 @@
+/* To learn more about this file see: https://angular.io/config/tsconfig. */
{
"compileOnSave": false,
"compilerOptions": {
@@ -7,20 +8,16 @@
"declaration": false,
"downlevelIteration": true,
"experimentalDecorators": true,
- "module": "esnext",
"moduleResolution": "node",
"importHelpers": true,
"target": "es2015",
- "typeRoots": [
- "node_modules/@types"
- ],
+ "module": "es2020",
"lib": [
"es2018",
"dom"
]
},
"angularCompilerOptions": {
- "fullTemplateTypeCheck": true,
- "strictInjectionParameters": true
+ "enableI18nLegacyMessageIdFormat": false
}
}
diff --git a/QuickApp/ClientApp/tsconfig.spec.json b/QuickApp/ClientApp/tsconfig.spec.json
index 6400fde7d..1762d0637 100644
--- a/QuickApp/ClientApp/tsconfig.spec.json
+++ b/QuickApp/ClientApp/tsconfig.spec.json
@@ -1,3 +1,4 @@
+/* To learn more about this file see: https://angular.io/config/tsconfig. */
{
"extends": "./tsconfig.json",
"compilerOptions": {
diff --git a/QuickApp/ClientApp/tslint.json b/QuickApp/ClientApp/tslint.json
index ed1768866..b6a55213a 100644
--- a/QuickApp/ClientApp/tslint.json
+++ b/QuickApp/ClientApp/tslint.json
@@ -1,5 +1,8 @@
{
"extends": "tslint:recommended",
+ "rulesDirectory": [
+ "codelyzer"
+ ],
"rules": {
"align": {
"options": [
@@ -13,21 +16,6 @@
"deprecation": {
"severity": "warning"
},
- "component-class-suffix": true,
- "contextual-lifecycle": true,
- "directive-class-suffix": true,
- "directive-selector": [
- true,
- "attribute",
- "app",
- "camelCase"
- ],
- "component-selector": [
- true,
- "element",
- "app",
- "kebab-case"
- ],
"eofline": true,
"import-blacklist": [
true,
@@ -40,7 +28,9 @@
]
},
"max-classes-per-file": false,
- "max-line-length": [ false ],
+ "max-line-length": [
+ false
+ ],
"member-ordering": [
true,
{
@@ -91,6 +81,10 @@
"named": "never"
}
},
+ "typedef": [
+ false,
+ "call-signature"
+ ],
"typedef-whitespace": {
"options": [
{
@@ -127,6 +121,9 @@
"check-typecast"
]
},
+ "component-class-suffix": true,
+ "contextual-lifecycle": true,
+ "directive-class-suffix": true,
"no-conflicting-lifecycle": true,
"no-host-metadata-property": true,
"no-input-rename": true,
@@ -139,9 +136,18 @@
"template-no-negated-async": true,
"use-lifecycle-interface": true,
"use-pipe-transform-interface": true,
- "unified-signatures": false
- },
- "rulesDirectory": [
- "codelyzer"
- ]
+ "unified-signatures": false,
+ "directive-selector": [
+ true,
+ "attribute",
+ "app",
+ "camelCase"
+ ],
+ "component-selector": [
+ true,
+ "element",
+ "app",
+ "kebab-case"
+ ]
+ }
}
diff --git a/QuickApp/IdentityServerConfig.cs b/QuickApp/IdentityServerConfig.cs
index 4f5d085d0..50e34e6b1 100644
--- a/QuickApp/IdentityServerConfig.cs
+++ b/QuickApp/IdentityServerConfig.cs
@@ -32,12 +32,12 @@ public static IEnumerable