mirror of https://github.com/abpframework/abp.git
37 changed files with 798 additions and 389 deletions
@ -0,0 +1,34 @@ |
|||
import { NgModule } from '@angular/core'; |
|||
import { RouterModule, Routes } from '@angular/router'; |
|||
|
|||
const routes: Routes = [ |
|||
{ |
|||
path: '', |
|||
pathMatch: 'full', |
|||
loadChildren: () => import('./home/home.module').then(m => m.HomeModule), |
|||
}, |
|||
{ |
|||
path: 'account', |
|||
loadChildren: () => import('@abp/ng.account').then(m => m.AccountModule.forLazy()), |
|||
}, |
|||
{ |
|||
path: 'identity', |
|||
loadChildren: () => import('@abp/ng.identity').then(m => m.IdentityModule.forLazy()), |
|||
}, |
|||
{ |
|||
path: 'tenant-management', |
|||
loadChildren: () => |
|||
import('@abp/ng.tenant-management').then(m => m.TenantManagementModule.forLazy()), |
|||
}, |
|||
{ |
|||
path: 'setting-management', |
|||
loadChildren: () => |
|||
import('@abp/ng.setting-management').then(m => m.SettingManagementModule.forLazy()), |
|||
}, |
|||
]; |
|||
|
|||
@NgModule({ |
|||
imports: [RouterModule.forRoot(routes, { relativeLinkResolution: 'legacy' })], |
|||
exports: [RouterModule], |
|||
}) |
|||
export class AppRoutingModule {} |
|||
@ -1,138 +0,0 @@ |
|||
<header class="flex"> |
|||
<svg width="40" height="40" viewBox="0 0 262 163"> |
|||
<polygon |
|||
id="Path" |
|||
fill="#ffffff" |
|||
points="130.68 104.59 97.49 52.71 97.44 96.3 40.24 0 0 0 0 162.57 39.79 162.57 39.92 66.39 96.53 158.26" |
|||
></polygon> |
|||
<polygon |
|||
id="Path" |
|||
fill="#ffffff" |
|||
points="97.5 41.79 137.24 41.79 137.33 41.33 137.33 0 97.54 0 97.49 41.33" |
|||
></polygon> |
|||
<path |
|||
d="M198.66,86.86 C189.139872,86.6795216 180.538723,92.516445 177.19,101.43 C182.764789,93.0931021 193.379673,89.7432211 202.73,93.37 C207.05,95.13 212.73,97.97 217.23,96.45 C212.950306,90.4438814 206.034895,86.8725952 198.66,86.86 L198.66,86.86 Z" |
|||
id="Path" |
|||
fill="#96D8E9" |
|||
></path> |
|||
<path |
|||
d="M243.75,106.42 C243.75,101.55 241.1,100.42 235.6,98.42 C231.52,97 226.89,95.4 223.52,91 C222.86,90.13 222.25,89.15 221.6,88.11 C220.14382,85.4164099 218.169266,83.037429 215.79,81.11 C212.58,78.75 208.37,77.6 202.91,77.6 C191.954261,77.6076705 182.084192,84.2206169 177.91,94.35 C183.186964,87.0278244 191.956716,83.0605026 200.940147,83.9314609 C209.923578,84.8024193 217.767888,90.3805017 221.54,98.58 C223.424615,101.689762 227.141337,103.174819 230.65,102.22 C236.02,101.07 235.65,106.15 243.76,107.87 L243.75,106.42 Z" |
|||
id="Path" |
|||
fill="#48C4E5" |
|||
></path> |
|||
<path |
|||
d="M261.46,105.38 L261.46,105.27 C261.34,73.03 235.17,45.45 202.91,45.45 C183.207085,45.4363165 164.821777,55.3450614 154,71.81 L153.79,71.45 L137.23,45.45 L97.5,45.4499858 L135.25,104.57 L98.41,162.57 L137,162.57 L153.79,136.78 L170.88,162.57 L209.48,162.57 L174.48,107.49 C173.899005,106.416838 173.583536,105.220114 173.56,104 C173.557346,96.2203871 176.64661,88.7586448 182.147627,83.2576275 C187.648645,77.7566101 195.110387,74.6673462 202.89,74.67 C219.11,74.67 221.82,84.37 225.32,88.93 C232.23,97.93 246.03,93.99 246.03,105.73 L246.03,105.73 C246.071086,108.480945 247.576662,111.001004 249.979593,112.340896 C252.382524,113.680787 255.317747,113.636949 257.679593,112.225896 C260.041438,110.814842 261.471086,108.250945 261.43,105.5 L261.43,105.5 L261.43,105.38 L261.46,105.38 Z" |
|||
id="Path" |
|||
fill="#ffffff" |
|||
></path> |
|||
<path |
|||
d="M261.5,113.68 C261.892278,116.421801 261.504116,119.218653 260.38,121.75 C258.18,126.84 254.51,125.14 254.51,125.14 C254.51,125.14 251.35,123.6 253.27,120.65 C255.4,117.36 259.61,117.74 261.5,113.68 Z" |
|||
id="Path" |
|||
fill="#022f56" |
|||
></path> |
|||
</svg> |
|||
<h1>Welcome to {{ title }}!</h1> |
|||
</header> |
|||
<main> |
|||
<h2>Resources & Tools</h2> |
|||
<p>Thank you for using and showing some ♥ for Nx.</p> |
|||
<div class="flex github-star-container"> |
|||
<a |
|||
href="https://github.com/nrwl/nx" |
|||
target="_blank" |
|||
rel="noopener noreferrer" |
|||
> |
|||
If you like Nx, please give it a star: |
|||
<div class="github-star-badge"> |
|||
<svg |
|||
class="material-icons" |
|||
xmlns="http://www.w3.org/2000/svg" |
|||
width="24" |
|||
height="24" |
|||
viewBox="0 0 24 24" |
|||
> |
|||
<path d="M0 0h24v24H0z" fill="none" /> |
|||
<path |
|||
d="M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z" |
|||
/> |
|||
</svg> |
|||
Star |
|||
</div> |
|||
</a> |
|||
</div> |
|||
<p>Here are some links to help you get started.</p> |
|||
<ul class="resources"> |
|||
<li class="col-span-2"> |
|||
<a class="resource flex" href="https://nxplaybook.com/p/nx-workspaces"> |
|||
Nx video course |
|||
</a> |
|||
</li> |
|||
<li class="col-span-2"> |
|||
<a |
|||
class="resource flex" |
|||
href="https://nx.dev/latest/angular/getting-started/intro" |
|||
> |
|||
Nx video tutorial |
|||
</a> |
|||
</li> |
|||
<li class="col-span-2"> |
|||
<a |
|||
class="resource flex" |
|||
href="https://nx.dev/latest/angular/tutorial/01-create-application" |
|||
> |
|||
Interactive tutorial |
|||
</a> |
|||
</li> |
|||
<li class="col-span-2"> |
|||
<a class="resource flex" href="https://nx.app/"> |
|||
<svg |
|||
width="36" |
|||
height="36" |
|||
viewBox="0 0 120 120" |
|||
fill="none" |
|||
xmlns="http://www.w3.org/2000/svg" |
|||
> |
|||
<path |
|||
d="M120 15V30C103.44 30 90 43.44 90 60C90 76.56 76.56 90 60 90C43.44 90 30 103.44 30 120H15C6.72 120 0 113.28 0 105V15C0 6.72 6.72 0 15 0H105C113.28 0 120 6.72 120 15Z" |
|||
fill="#0E2039" |
|||
/> |
|||
<path |
|||
d="M120 30V105C120 113.28 113.28 120 105 120H30C30 103.44 43.44 90 60 90C76.56 90 90 76.56 90 60C90 43.44 103.44 30 120 30Z" |
|||
fill="white" |
|||
/> |
|||
</svg> |
|||
<span class="gutter-left">Nx Cloud</span> |
|||
</a> |
|||
</li> |
|||
</ul> |
|||
<h2>Next Steps</h2> |
|||
<p>Here are some things you can do with Nx.</p> |
|||
<details open> |
|||
<summary>Add UI library</summary> |
|||
<pre> |
|||
# Generate UI lib |
|||
nx g @nrwl/angular:lib ui |
|||
|
|||
# Add a component |
|||
nx g @nrwl/angular:component xyz --project ui</pre |
|||
> |
|||
</details> |
|||
<details> |
|||
<summary>View dependency graph</summary> |
|||
<pre>nx dep-graph</pre> |
|||
</details> |
|||
<details> |
|||
<summary>Run affected commands</summary> |
|||
<pre> |
|||
# see what's been affected by changes |
|||
nx affected:dep-graph |
|||
|
|||
# run tests for current changes |
|||
nx affected:test |
|||
|
|||
# run e2e tests for current changes |
|||
nx affected:e2e |
|||
</pre |
|||
> |
|||
</details> |
|||
</main> |
|||
@ -1,133 +0,0 @@ |
|||
/* |
|||
* Remove template code below |
|||
*/ |
|||
:host { |
|||
display: block; |
|||
font-family: sans-serif; |
|||
min-width: 300px; |
|||
max-width: 600px; |
|||
margin: 50px auto; |
|||
} |
|||
|
|||
.gutter-left { |
|||
margin-left: 9px; |
|||
} |
|||
|
|||
.col-span-2 { |
|||
grid-column: span 2; |
|||
} |
|||
|
|||
.flex { |
|||
display: flex; |
|||
align-items: center; |
|||
justify-content: center; |
|||
} |
|||
|
|||
header { |
|||
background-color: #143055; |
|||
color: white; |
|||
padding: 5px; |
|||
border-radius: 3px; |
|||
} |
|||
|
|||
main { |
|||
padding: 0 36px; |
|||
} |
|||
|
|||
p { |
|||
text-align: center; |
|||
} |
|||
|
|||
h1 { |
|||
text-align: center; |
|||
margin-left: 18px; |
|||
font-size: 24px; |
|||
} |
|||
|
|||
h2 { |
|||
text-align: center; |
|||
font-size: 20px; |
|||
margin: 40px 0 10px 0; |
|||
} |
|||
|
|||
.resources { |
|||
text-align: center; |
|||
list-style: none; |
|||
padding: 0; |
|||
display: grid; |
|||
grid-gap: 9px; |
|||
grid-template-columns: 1fr 1fr; |
|||
} |
|||
|
|||
.resource { |
|||
color: #0094ba; |
|||
height: 36px; |
|||
background-color: rgba(0, 0, 0, 0); |
|||
border: 1px solid rgba(0, 0, 0, 0.12); |
|||
border-radius: 4px; |
|||
padding: 3px 9px; |
|||
text-decoration: none; |
|||
} |
|||
|
|||
.resource:hover { |
|||
background-color: rgba(68, 138, 255, 0.04); |
|||
} |
|||
|
|||
pre { |
|||
padding: 9px; |
|||
border-radius: 4px; |
|||
background-color: black; |
|||
color: #eee; |
|||
} |
|||
|
|||
details { |
|||
border-radius: 4px; |
|||
color: #333; |
|||
background-color: rgba(0, 0, 0, 0); |
|||
border: 1px solid rgba(0, 0, 0, 0.12); |
|||
padding: 3px 9px; |
|||
margin-bottom: 9px; |
|||
} |
|||
|
|||
summary { |
|||
cursor: pointer; |
|||
outline: none; |
|||
height: 36px; |
|||
line-height: 36px; |
|||
} |
|||
|
|||
.github-star-container { |
|||
margin-top: 12px; |
|||
line-height: 20px; |
|||
} |
|||
|
|||
.github-star-container a { |
|||
display: flex; |
|||
align-items: center; |
|||
text-decoration: none; |
|||
color: #333; |
|||
} |
|||
|
|||
.github-star-badge { |
|||
color: #24292e; |
|||
display: flex; |
|||
align-items: center; |
|||
font-size: 12px; |
|||
padding: 3px 10px; |
|||
border: 1px solid rgba(27, 31, 35, 0.2); |
|||
border-radius: 3px; |
|||
background-image: linear-gradient(-180deg, #fafbfc, #eff3f6 90%); |
|||
margin-left: 4px; |
|||
font-weight: 600; |
|||
} |
|||
|
|||
.github-star-badge:hover { |
|||
background-image: linear-gradient(-180deg, #f0f3f6, #e6ebf1 90%); |
|||
border-color: rgba(27, 31, 35, 0.35); |
|||
background-position: -0.5em; |
|||
} |
|||
.github-star-badge .material-icons { |
|||
height: 16px; |
|||
width: 16px; |
|||
margin-right: 4px; |
|||
} |
|||
@ -1,31 +0,0 @@ |
|||
import { TestBed } from '@angular/core/testing'; |
|||
import { AppComponent } from './app.component'; |
|||
|
|||
describe('AppComponent', () => { |
|||
beforeEach(async () => { |
|||
await TestBed.configureTestingModule({ |
|||
declarations: [AppComponent], |
|||
}).compileComponents(); |
|||
}); |
|||
|
|||
it('should create the app', () => { |
|||
const fixture = TestBed.createComponent(AppComponent); |
|||
const app = fixture.componentInstance; |
|||
expect(app).toBeTruthy(); |
|||
}); |
|||
|
|||
it(`should have as title 'dev-app'`, () => { |
|||
const fixture = TestBed.createComponent(AppComponent); |
|||
const app = fixture.componentInstance; |
|||
expect(app.title).toEqual('dev-app'); |
|||
}); |
|||
|
|||
it('should render title', () => { |
|||
const fixture = TestBed.createComponent(AppComponent); |
|||
fixture.detectChanges(); |
|||
const compiled = fixture.nativeElement as HTMLElement; |
|||
expect(compiled.querySelector('h1')?.textContent).toContain( |
|||
'Welcome to dev-app!' |
|||
); |
|||
}); |
|||
}); |
|||
@ -1,10 +1,10 @@ |
|||
import { Component } from '@angular/core'; |
|||
|
|||
@Component({ |
|||
selector: 'abp-root', |
|||
templateUrl: './app.component.html', |
|||
styleUrls: ['./app.component.scss'], |
|||
selector: 'app-root', |
|||
template: ` |
|||
<abp-loader-bar></abp-loader-bar> |
|||
<abp-dynamic-layout></abp-dynamic-layout> |
|||
`,
|
|||
}) |
|||
export class AppComponent { |
|||
title = 'dev-app'; |
|||
} |
|||
export class AppComponent {} |
|||
|
|||
@ -1,12 +1,45 @@ |
|||
import { AccountConfigModule } from '@abp/ng.account/config'; |
|||
import { CoreModule } from '@abp/ng.core'; |
|||
import { registerLocale } from '@abp/ng.core/locale'; |
|||
import { IdentityConfigModule } from '@abp/ng.identity/config'; |
|||
import { SettingManagementConfigModule } from '@abp/ng.setting-management/config'; |
|||
import { TenantManagementConfigModule } from '@abp/ng.tenant-management/config'; |
|||
import { ThemeBasicModule } from '@abp/ng.theme.basic'; |
|||
import { ThemeSharedModule } from '@abp/ng.theme.shared'; |
|||
import { NgModule } from '@angular/core'; |
|||
import { BrowserModule } from '@angular/platform-browser'; |
|||
|
|||
import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; |
|||
import { NgxsLoggerPluginModule } from '@ngxs/logger-plugin'; |
|||
import { NgxsModule } from '@ngxs/store'; |
|||
import { environment } from '../environments/environment'; |
|||
import { AppRoutingModule } from './app-routing.module'; |
|||
import { AppComponent } from './app.component'; |
|||
import { APP_ROUTE_PROVIDER } from './route.provider'; |
|||
|
|||
const INSPECTION_TOOLS = [NgxsLoggerPluginModule.forRoot({ disabled: true })]; |
|||
|
|||
@NgModule({ |
|||
imports: [ |
|||
BrowserModule, |
|||
BrowserAnimationsModule, |
|||
AppRoutingModule, |
|||
CoreModule.forRoot({ |
|||
environment, |
|||
registerLocaleFn: registerLocale(), |
|||
sendNullsAsQueryParam: false, |
|||
skipGetAppConfiguration: false, |
|||
}), |
|||
ThemeSharedModule.forRoot(), |
|||
AccountConfigModule.forRoot(), |
|||
IdentityConfigModule.forRoot(), |
|||
TenantManagementConfigModule.forRoot(), |
|||
SettingManagementConfigModule.forRoot(), |
|||
NgxsModule.forRoot(), |
|||
ThemeBasicModule.forRoot(), |
|||
...(environment.production || environment.test ? [] : INSPECTION_TOOLS), |
|||
], |
|||
providers: [APP_ROUTE_PROVIDER], |
|||
declarations: [AppComponent], |
|||
imports: [BrowserModule], |
|||
providers: [], |
|||
bootstrap: [AppComponent], |
|||
}) |
|||
export class AppModule {} |
|||
|
|||
@ -0,0 +1,11 @@ |
|||
import { NgModule } from '@angular/core'; |
|||
import { Routes, RouterModule } from '@angular/router'; |
|||
import { HomeComponent } from './home.component'; |
|||
|
|||
const routes: Routes = [{ path: '', component: HomeComponent }]; |
|||
|
|||
@NgModule({ |
|||
imports: [RouterModule.forChild(routes)], |
|||
exports: [RouterModule], |
|||
}) |
|||
export class HomeRoutingModule {} |
|||
@ -0,0 +1,333 @@ |
|||
<div class="container"> |
|||
<div class="p-5 text-center"> |
|||
<div class="d-inline-block bg-success text-white p-1 h5 rounded mb-4" role="alert"> |
|||
<h5 class="m-1"> |
|||
<i class="fas fa-rocket"></i> Congratulations, <strong>MyProjectName</strong> is |
|||
successfully running! |
|||
</h5> |
|||
</div> |
|||
<h1>{{ '::Welcome' | abpLocalization }}</h1> |
|||
|
|||
<p class="lead px-lg-5 mx-lg-5">{{ '::LongWelcomeMessage' | abpLocalization }}</p> |
|||
|
|||
<a *ngIf="!hasLoggedIn" (click)="login()" class="px-4 btn btn-primary ml-1" role="button" |
|||
><i class="fa fa-sign-in"></i> {{ 'AbpAccount::Login' | abpLocalization }}</a |
|||
> |
|||
</div> |
|||
<div class="my-3 text-center"> |
|||
<h3>Let's improve your application!</h3> |
|||
<p>Here are some links to help you get started:</p> |
|||
</div> |
|||
<div class="card mt-4 mb-5"> |
|||
<div class="card-body"> |
|||
<div class="row text-center justify-content-md-center"> |
|||
<ng-container |
|||
*ngTemplateOutlet=" |
|||
starterLinkTemplate; |
|||
context: { |
|||
$implicit: { |
|||
title: 'Learn the ABP Framework', |
|||
description: |
|||
'Explore the compherensive documentation to learn how to build a modern web application.', |
|||
links: [ |
|||
{ |
|||
href: 'https://docs.abp.io/en/abp/latest?ref=tmpl', |
|||
label: 'See Documents' |
|||
} |
|||
] |
|||
} |
|||
} |
|||
" |
|||
></ng-container> |
|||
|
|||
<ng-container |
|||
*ngTemplateOutlet=" |
|||
starterLinkTemplate; |
|||
context: { |
|||
$implicit: { |
|||
title: 'Samples', |
|||
description: 'See the example projects built with the ABP Framework.', |
|||
links: [ |
|||
{ |
|||
href: 'https://docs.abp.io/en/abp/latest/Samples/Index?ref=tmpl', |
|||
label: 'All samples' |
|||
} |
|||
] |
|||
} |
|||
} |
|||
" |
|||
></ng-container> |
|||
|
|||
<ng-container |
|||
*ngTemplateOutlet=" |
|||
starterLinkTemplate; |
|||
context: { |
|||
$implicit: { |
|||
title: 'ABP Community', |
|||
description: 'Get involved with a vibrant community and become a contributor.', |
|||
links: [ |
|||
{ |
|||
href: 'https://community.abp.io/', |
|||
label: 'Community' |
|||
}, |
|||
{ |
|||
href: 'https://docs.abp.io/en/abp/latest/Contribution/Index?ref=tmpl', |
|||
label: 'Contribute' |
|||
} |
|||
] |
|||
} |
|||
} |
|||
" |
|||
></ng-container> |
|||
</div> |
|||
<div class="row text-center mt-lg-3 justify-content-md-center"> |
|||
<ng-container |
|||
*ngTemplateOutlet=" |
|||
starterLinkTemplate; |
|||
context: { |
|||
$implicit: { |
|||
title: 'ABP Blog', |
|||
description: 'Take a look at our recently published articles.', |
|||
links: [ |
|||
{ |
|||
href: 'https://blog.abp.io/abp?ref=tmpl', |
|||
label: 'See Blog' |
|||
} |
|||
] |
|||
} |
|||
} |
|||
" |
|||
></ng-container> |
|||
|
|||
<ng-template #githubButtonsTemplate> |
|||
<p class="mb-1"> |
|||
<iframe |
|||
scrolling="no" |
|||
src="https://buttons.github.io/buttons.html#href=https%3A%2F%2Fgithub.com%2Fabpframework%2Fabp&title=&aria-label=Star%20tabalinas%2Fjsgrid%20on%20GitHub&data-icon=octicon-star&data-text=Star&data-size=large&data-show-count=true" |
|||
style=" |
|||
width: 122px; |
|||
height: 28px; |
|||
border: none; |
|||
display: inline-block; |
|||
margin-right: 4px; |
|||
" |
|||
></iframe> |
|||
<iframe |
|||
scrolling="no" |
|||
src="https://buttons.github.io/buttons.html#href=https%3A%2F%2Fgithub.com%2Fabpframework%2Fabp%2Fissues&title=&aria-label=Issue%20tabalinas%2Fjsgrid%20on%20GitHub&data-icon=octicon-issue-opened&data-text=Issue&data-size=large" |
|||
style=" |
|||
width: 72px; |
|||
height: 28px; |
|||
border: none; |
|||
display: inline-block; |
|||
margin-right: 4px; |
|||
" |
|||
></iframe> |
|||
|
|||
<iframe |
|||
scrolling="no" |
|||
src="https://buttons.github.io/buttons.html#href=https%3A%2F%2Fgithub.com%2Fabpframework%2Fabp%2Ffork&title=&aria-label=Fork%20tabalinas%2Fjsgrid%20on%20GitHub&data-icon=octicon-repo-forked&data-text=Fork&data-size=large&" |
|||
style="width: 72px; height: 28px; border: none; display: inline-block" |
|||
></iframe> |
|||
</p> |
|||
</ng-template> |
|||
|
|||
<ng-container |
|||
*ngTemplateOutlet=" |
|||
starterLinkTemplate; |
|||
context: { |
|||
$implicit: { |
|||
title: 'Github', |
|||
description: |
|||
'Do you love the ABP Framework? Please <strong>give a star</strong> to support it!', |
|||
links: [ |
|||
{ |
|||
href: 'https://github.com/abpframework/abp/issues/new?template=feature.md', |
|||
label: 'Request a feature' |
|||
} |
|||
], |
|||
customTemplate: githubButtonsTemplate |
|||
} |
|||
} |
|||
" |
|||
></ng-container> |
|||
|
|||
<ng-container |
|||
*ngTemplateOutlet=" |
|||
starterLinkTemplate; |
|||
context: { |
|||
$implicit: { |
|||
title: 'Stackoverflow', |
|||
description: 'See answers to previously asked questions or ask a new one.', |
|||
links: [ |
|||
{ |
|||
href: 'https://stackoverflow.com/questions/tagged/abp', |
|||
label: 'Questions' |
|||
}, |
|||
{ |
|||
href: 'https://stackoverflow.com/questions/ask', |
|||
label: 'Ask a Question' |
|||
} |
|||
] |
|||
} |
|||
} |
|||
" |
|||
></ng-container> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
|
|||
<div class="mt-5 my-3 text-center"> |
|||
<h3>Meet the ABP Commercial</h3> |
|||
<p>A Complete Web Application Platform Built on the ABP Framework</p> |
|||
</div> |
|||
|
|||
<div class="card mt-4 mb-5"> |
|||
<div class="card-body"> |
|||
<p class="px-lg-5 mx-lg-5 py-3 text-center"> |
|||
<a href="https://commercial.abp.io/" target="_blank">ABP Commercial</a> is a platform based |
|||
on the open source ABP framework. It provides pre-built application modules, rapid |
|||
application development tooling, professional UI themes, premium support and more. |
|||
</p> |
|||
|
|||
<div class="row text-center justify-content-md-center"> |
|||
<ng-container |
|||
*ngTemplateOutlet=" |
|||
featuresTemplate; |
|||
context: { |
|||
$implicit: { |
|||
title: 'Startup Templates', |
|||
href: 'https://commercial.abp.io/startup-templates?ref=tmpl' |
|||
} |
|||
} |
|||
" |
|||
></ng-container> |
|||
|
|||
<ng-container |
|||
*ngTemplateOutlet=" |
|||
featuresTemplate; |
|||
context: { |
|||
$implicit: { |
|||
title: 'Application Modules', |
|||
href: 'https://commercial.abp.io/modules?ref=tmpl' |
|||
} |
|||
} |
|||
" |
|||
></ng-container> |
|||
|
|||
<ng-container |
|||
*ngTemplateOutlet=" |
|||
featuresTemplate; |
|||
context: { |
|||
$implicit: { |
|||
title: 'Developer<br />Tools', |
|||
href: 'https://commercial.abp.io/tools?ref=tmpl' |
|||
} |
|||
} |
|||
" |
|||
></ng-container> |
|||
|
|||
<ng-container |
|||
*ngTemplateOutlet=" |
|||
featuresTemplate; |
|||
context: { |
|||
$implicit: { |
|||
title: 'UI<br />Themes', |
|||
href: 'https://commercial.abp.io/themes?ref=tmpl' |
|||
} |
|||
} |
|||
" |
|||
></ng-container> |
|||
|
|||
<ng-container |
|||
*ngTemplateOutlet=" |
|||
featuresTemplate; |
|||
context: { |
|||
$implicit: { |
|||
title: 'Premium Support', |
|||
href: 'https://support.abp.io/QA/Questions?ref=tmpl' |
|||
} |
|||
} |
|||
" |
|||
></ng-container> |
|||
|
|||
<ng-container |
|||
*ngTemplateOutlet=" |
|||
featuresTemplate; |
|||
context: { |
|||
$implicit: { |
|||
title: 'Additional Services', |
|||
href: 'https://commercial.abp.io/additional-services?ref=tmpl' |
|||
} |
|||
} |
|||
" |
|||
></ng-container> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div class="mb-5 text-center"> |
|||
<p class="align-middle"> |
|||
<a href="https://twitter.com/abpframework" target="_blank" class="mx-2" |
|||
><i class="fa fa-twitter"></i><span class="text-secondary"> Abp Framework</span></a |
|||
> |
|||
<a href="https://twitter.com/abpcommercial" target="_blank" class="mx-2" |
|||
><i class="fa fa-twitter"></i><span class="text-secondary"> Abp Commercial</span></a |
|||
> |
|||
<a href="https://github.com/abpframework/abp" target="_blank" class="mx-2" |
|||
><i class="fa fa-github"></i><span class="text-secondary"> abpframework</span></a |
|||
> |
|||
</p> |
|||
</div> |
|||
</div> |
|||
|
|||
<ng-template #starterLinkTemplate let-context> |
|||
<div class="col-lg-4 border-left"> |
|||
<div class="p-4"> |
|||
<h5 class="mb-3"> |
|||
<i class="fas fa-cubes text-secondary d-block my-3 fa-2x"></i> {{ context.title }} |
|||
</h5> |
|||
<p [innerHTML]="context.description"></p> |
|||
<ng-container |
|||
*ngIf="context.customTemplate" |
|||
[ngTemplateOutlet]="context.customTemplate" |
|||
></ng-container> |
|||
<a |
|||
*ngFor="let link of context.links" |
|||
[href]="link.href" |
|||
target="_blank" |
|||
class="btn btn-link px-1" |
|||
>{{ link.label }} <i class="fas fa-chevron-right"></i |
|||
></a> |
|||
</div> |
|||
</div> |
|||
</ng-template> |
|||
|
|||
<ng-template #featuresTemplate let-context> |
|||
<div class="col-lg-2 border-left"> |
|||
<div class="p-3"> |
|||
<h6> |
|||
<i class="fas fa-plus d-block mb-3 fa- 2x text-secondary"></i> |
|||
<span [innerHTML]="context.title"></span> |
|||
<a [href]="context.href" target="_blank" class="d-block mt-2 btn btn-sm btn-link" |
|||
>Details <i class="fas fa-chevron-right"></i |
|||
></a> |
|||
</h6> |
|||
</div> |
|||
</div> |
|||
</ng-template> |
|||
|
|||
<style scoped> |
|||
.col-lg-2.border-left:nth-of-type(6n + 1) { |
|||
border-left: 0 !important; |
|||
} |
|||
|
|||
.col-lg-4.border-left:nth-of-type(3n + 1) { |
|||
border-left: 0 !important; |
|||
} |
|||
|
|||
@media (max-width: 991px) { |
|||
.border-left { |
|||
border-left: 0 !important; |
|||
} |
|||
} |
|||
</style> |
|||
@ -0,0 +1,19 @@ |
|||
import { AuthService } from '@abp/ng.core'; |
|||
import { Component } from '@angular/core'; |
|||
import { OAuthService } from 'angular-oauth2-oidc'; |
|||
|
|||
@Component({ |
|||
selector: 'app-home', |
|||
templateUrl: './home.component.html', |
|||
}) |
|||
export class HomeComponent { |
|||
get hasLoggedIn(): boolean { |
|||
return this.oAuthService.hasValidAccessToken(); |
|||
} |
|||
|
|||
constructor(private oAuthService: OAuthService, private authService: AuthService) {} |
|||
|
|||
login() { |
|||
this.authService.navigateToLogin(); |
|||
} |
|||
} |
|||
@ -0,0 +1,10 @@ |
|||
import { NgModule } from '@angular/core'; |
|||
import { SharedModule } from '../shared/shared.module'; |
|||
import { HomeRoutingModule } from './home-routing.module'; |
|||
import { HomeComponent } from './home.component'; |
|||
|
|||
@NgModule({ |
|||
declarations: [HomeComponent], |
|||
imports: [SharedModule, HomeRoutingModule], |
|||
}) |
|||
export class HomeModule {} |
|||
@ -0,0 +1,20 @@ |
|||
import { eLayoutType, RoutesService } from '@abp/ng.core'; |
|||
import { APP_INITIALIZER } from '@angular/core'; |
|||
|
|||
export const APP_ROUTE_PROVIDER = [ |
|||
{ provide: APP_INITIALIZER, useFactory: configureRoutes, deps: [RoutesService], multi: true }, |
|||
]; |
|||
|
|||
function configureRoutes(routesService: RoutesService) { |
|||
return () => { |
|||
routesService.add([ |
|||
{ |
|||
path: '/', |
|||
name: '::Menu:Home', |
|||
iconClass: 'fas fa-home', |
|||
order: 1, |
|||
layout: eLayoutType.application, |
|||
}, |
|||
]); |
|||
}; |
|||
} |
|||
@ -0,0 +1,23 @@ |
|||
import { CoreModule } from '@abp/ng.core'; |
|||
import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; |
|||
import { NgModule } from '@angular/core'; |
|||
import { ThemeSharedModule } from '@abp/ng.theme.shared'; |
|||
import { NgxValidateCoreModule } from '@ngx-validate/core'; |
|||
|
|||
@NgModule({ |
|||
declarations: [], |
|||
imports: [ |
|||
CoreModule, |
|||
ThemeSharedModule, |
|||
NgbDropdownModule, |
|||
NgxValidateCoreModule, |
|||
], |
|||
exports: [ |
|||
CoreModule, |
|||
ThemeSharedModule, |
|||
NgbDropdownModule, |
|||
NgxValidateCoreModule, |
|||
], |
|||
providers: [], |
|||
}) |
|||
export class SharedModule {} |
|||
@ -1,3 +1,25 @@ |
|||
import { Config } from '@abp/ng.core'; |
|||
|
|||
const baseUrl = 'http://localhost:4200'; |
|||
|
|||
export const environment = { |
|||
production: true, |
|||
}; |
|||
hmr: false, |
|||
application: { |
|||
baseUrl, |
|||
name: 'MyProjectName', |
|||
logoUrl: '', |
|||
}, |
|||
oAuthConfig: { |
|||
issuer: 'https://localhost:44305', |
|||
redirectUri: baseUrl, |
|||
clientId: 'MyProjectName_App', |
|||
responseType: 'code', |
|||
scope: 'offline_access MyProjectName', |
|||
}, |
|||
apis: { |
|||
default: { |
|||
url: 'https://localhost:44305', |
|||
}, |
|||
}, |
|||
} as Config.Environment; |
|||
|
|||
@ -0,0 +1,43 @@ |
|||
import { Config } from '@abp/ng.core'; |
|||
|
|||
const baseUrl = 'http://localhost:4200'; |
|||
|
|||
export const environment = { |
|||
test: true, |
|||
production: false, |
|||
hmr: false, |
|||
application: { |
|||
baseUrl, |
|||
name: 'MyProjectName', |
|||
logoUrl: '', |
|||
}, |
|||
oAuthConfig: { |
|||
issuer: 'https://localhost:44305', |
|||
redirectUri: baseUrl, |
|||
clientId: 'MyProjectName_App', |
|||
responseType: 'code', |
|||
scope: 'offline_access MyProjectName', |
|||
}, |
|||
apis: { |
|||
default: { |
|||
url: 'https://localhost:44305', |
|||
rootNamespace: 'MyCompanyName.MyProjectName', |
|||
}, |
|||
AbpFeatureManagement: { |
|||
url: 'https://localhost:44305', |
|||
rootNamespace: 'Volo.Abp', |
|||
}, |
|||
AbpPermissionManagement: { |
|||
url: 'https://localhost:44305', |
|||
rootNamespace: 'Volo.Abp.PermissionManagement', |
|||
}, |
|||
AbpTenantManagement: { |
|||
url: 'https://localhost:44305', |
|||
rootNamespace: 'Volo.Abp.TenantManagement', |
|||
}, |
|||
AbpIdentity: { |
|||
url: 'https://localhost:44305', |
|||
rootNamespace: 'Volo.Abp', |
|||
}, |
|||
}, |
|||
} as Config.Environment; |
|||
@ -1,16 +1,45 @@ |
|||
// This file can be replaced during build by using the `fileReplacements` array.
|
|||
// `ng build` replaces `environment.ts` with `environment.prod.ts`.
|
|||
// The list of file replacements can be found in `angular.json`.
|
|||
import { Environment } from '@abp/ng.core'; |
|||
|
|||
const baseUrl = 'http://localhost:4200'; |
|||
|
|||
export const environment = { |
|||
production: false, |
|||
}; |
|||
|
|||
/* |
|||
* For easier debugging in development mode, you can import the following file |
|||
* to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`. |
|||
* |
|||
* This import should be commented out in production mode because it will have a negative impact |
|||
* on performance if an error is thrown. |
|||
*/ |
|||
// import 'zone.js/plugins/zone-error'; // Included with Angular CLI.
|
|||
hmr: false, |
|||
application: { |
|||
baseUrl, |
|||
name: 'MyProjectName', |
|||
logoUrl: '', |
|||
}, |
|||
oAuthConfig: { |
|||
issuer: 'https://localhost:44305', |
|||
clientId: 'MyProjectName_App', |
|||
dummyClientSecret: '1q2w3e*', |
|||
scope: 'offline_access MyProjectName', |
|||
responseType: 'code', |
|||
redirectUri: baseUrl, |
|||
}, |
|||
apis: { |
|||
default: { |
|||
url: 'https://localhost:44305', |
|||
rootNamespace: 'MyCompanyName.MyProjectName', |
|||
}, |
|||
AbpAccount: { |
|||
rootNamespace: 'Volo.Abp', |
|||
}, |
|||
AbpFeatureManagement: { |
|||
rootNamespace: 'Volo.Abp', |
|||
}, |
|||
AbpPermissionManagement: { |
|||
rootNamespace: 'Volo.Abp.PermissionManagement', |
|||
}, |
|||
AbpTenantManagement: { |
|||
rootNamespace: 'Volo.Abp.TenantManagement', |
|||
}, |
|||
AbpIdentity: { |
|||
rootNamespace: 'Volo.Abp', |
|||
}, |
|||
AbpSettingManagement: { |
|||
rootNamespace: 'Volo.Abp.SettingManagement', |
|||
}, |
|||
}, |
|||
} as Environment; |
|||
|
|||
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 101 KiB |
@ -1 +1,26 @@ |
|||
/* You can add global styles to this file, and also import other style files */ |
|||
|
|||
@keyframes donut-spin { |
|||
0% { |
|||
transform: rotate(0deg); |
|||
} |
|||
100% { |
|||
transform: rotate(360deg); |
|||
} |
|||
} |
|||
.donut { |
|||
display: inline-block; |
|||
border: 4px solid rgba(0, 0, 0, 0.1); |
|||
border-left-color: #7983ff; |
|||
border-radius: 50%; |
|||
width: 30px; |
|||
height: 30px; |
|||
animation: donut-spin 1.2s linear infinite; |
|||
|
|||
&.centered { |
|||
position: fixed; |
|||
top: 50%; |
|||
left: 50%; |
|||
transform: translate(-50%, -50%); |
|||
} |
|||
} |
|||
|
|||
@ -0,0 +1,49 @@ |
|||
{ |
|||
"compileOnSave": false, |
|||
"compilerOptions": { |
|||
"rootDir": ".", |
|||
"sourceMap": true, |
|||
"declaration": false, |
|||
"moduleResolution": "node", |
|||
"emitDecoratorMetadata": true, |
|||
"experimentalDecorators": true, |
|||
"importHelpers": true, |
|||
"target": "es2015", |
|||
"module": "esnext", |
|||
"lib": ["es2017", "dom"], |
|||
"skipLibCheck": true, |
|||
"skipDefaultLibCheck": true, |
|||
"baseUrl": ".", |
|||
"paths": { |
|||
"@abp/ng.account": ["dist/packages/account"], |
|||
"@abp/ng.account.core": ["dist/packages/account-core"], |
|||
"@abp/ng.account/config": ["dist/packages/account/config"], |
|||
"@abp/ng.components": ["dist/packages/components"], |
|||
"@abp/ng.components/page": ["dist/packages/components/page"], |
|||
"@abp/ng.components/tree": ["dist/packages/components/tree"], |
|||
"@abp/ng.core": ["dist/packages/core"], |
|||
"@abp/ng.core/locale": ["dist/packages/core/locale"], |
|||
"@abp/ng.core/testing": ["dist/packages/core/testing"], |
|||
"@abp/ng.feature-management": ["dist/packages/feature-management"], |
|||
"@abp/ng.identity": ["dist/packages/identity/"], |
|||
"@abp/ng.identity/config": ["dist/packages/identity/config"], |
|||
"@abp/ng.permission-management": ["dist/packages/permission-management"], |
|||
"@abp/ng.setting-management": ["dist/packages/setting-management"], |
|||
"@abp/ng.setting-management/config": [ |
|||
"dist/packages/setting-management/config" |
|||
], |
|||
"@abp/ng.tenant-management": ["dist/packages/tenant-management"], |
|||
"@abp/ng.tenant-management/config": [ |
|||
"dist/packages/tenant-management/config" |
|||
], |
|||
"@abp/ng.theme.basic": ["dist/packages/theme-basic"], |
|||
"@abp/ng.theme.basic/testing": ["dist/packages/theme-basic/testing"], |
|||
"@abp/ng.theme.shared": ["dist/packages/theme-shared"], |
|||
"@abp/ng.theme.shared/extensions": [ |
|||
"dist/packages/theme-shared/extensions" |
|||
], |
|||
"@abp/ng.theme.shared/testing": ["dist/packages/theme-shared/testing"] |
|||
} |
|||
}, |
|||
"exclude": ["node_modules", "tmp"] |
|||
} |
|||
@ -0,0 +1,23 @@ |
|||
{ |
|||
"compileOnSave": false, |
|||
"compilerOptions": { |
|||
"baseUrl": "./", |
|||
"outDir": "./dist/out-tsc", |
|||
"sourceMap": true, |
|||
"declaration": false, |
|||
"downlevelIteration": true, |
|||
"experimentalDecorators": true, |
|||
"allowSyntheticDefaultImports": true, |
|||
"module": "esnext", |
|||
"moduleResolution": "node", |
|||
"importHelpers": true, |
|||
"target": "es2015", |
|||
"typeRoots": ["node_modules/@types"], |
|||
"lib": ["es2018", "dom"], |
|||
"types": ["jest"] |
|||
}, |
|||
"angularCompilerOptions": { |
|||
"fullTemplateTypeCheck": true, |
|||
"strictInjectionParameters": true |
|||
} |
|||
} |
|||
Loading…
Reference in new issue