Browse Source

Merge branch 'rel-8.3' into update-suite-docs

pull/21002/head
EngincanV 2 years ago
parent
commit
48197cd1e2
  1. 12
      .github/workflows/auto-pr.yml
  2. 2
      docs/en/deployment/ssl.md
  3. 98
      docs/en/docs-nav.json
  4. 143
      docs/en/framework/ui/angular/entity-filters.md
  5. 16
      docs/en/framework/ui/angular/environment.md
  6. BIN
      docs/en/framework/ui/angular/images/angular-advanced-entity-filters-with-custom-content-above-filter.png
  7. BIN
      docs/en/framework/ui/angular/images/angular-advanced-entity-filters-with-form.png
  8. BIN
      docs/en/framework/ui/angular/images/angular-advanced-entity-filters-without-form.png
  9. BIN
      docs/en/framework/ui/angular/images/angular-advanced-entity-filters.png
  10. BIN
      docs/en/framework/ui/angular/images/angular-lookup-select.gif
  11. BIN
      docs/en/framework/ui/angular/images/angular-lookup-typeahead.gif
  12. BIN
      docs/en/framework/ui/angular/images/grouped-menu-mobile.png
  13. BIN
      docs/en/framework/ui/angular/images/grouped-menu.png
  14. BIN
      docs/en/framework/ui/angular/images/manage-profile-page-new-tab.png
  15. BIN
      docs/en/framework/ui/angular/images/manage-profile-page.png
  16. 98
      docs/en/framework/ui/angular/lookup-components.md
  17. 77
      docs/en/framework/ui/angular/manage-profile-page-tabs.md
  18. 13
      docs/en/framework/ui/angular/modifying-the-menu.md
  19. 14
      docs/en/framework/ui/angular/overview.md
  20. 2
      docs/en/framework/ui/angular/quick-start.md
  21. 2
      docs/en/framework/ui/blazor/components/submit-button.md
  22. BIN
      docs/en/images/abp-overall-diagram-1600.png
  23. 10
      docs/en/index.md
  24. 2
      docs/en/modules/cms-kit-pro/index.md
  25. 2
      docs/en/solution-templates/application-module/index.md
  26. 4
      docs/en/solution-templates/layered-web-application/index.md
  27. 6
      docs/en/solution-templates/single-layer-web-application/index.md

12
.github/workflows/auto-pr.yml

@ -1,4 +1,4 @@
name: Merge branch dev with rel-8.3
name: Merge branch prerel-9.0 with rel-8.3
on:
push:
branches:
@ -7,7 +7,7 @@ permissions:
contents: read
jobs:
merge-dev-with-rel-8-3:
merge-prerel-9-0-with-rel-8-3:
permissions:
contents: write # for peter-evans/create-pull-request to create branch
pull-requests: write # for peter-evans/create-pull-request to create a PR
@ -15,7 +15,7 @@ jobs:
steps:
- uses: actions/checkout@v2
with:
ref: dev
ref: prerel-9.0
- name: Reset promotion branch
run: |
git fetch origin rel-8.3:rel-8.3
@ -24,8 +24,8 @@ jobs:
uses: peter-evans/create-pull-request@v3
with:
branch: auto-merge/rel-8-3/${{github.run_number}}
title: Merge branch dev with rel-8.3
body: This PR generated automatically to merge dev with rel-8.3. Please review the changed files before merging to prevent any errors that may occur.
title: Merge branch prerel-9.0 with rel-8.3
body: This PR generated automatically to merge prerel-9.0 with rel-8.3. Please review the changed files before merging to prevent any errors that may occur.
reviewers: maliming
token: ${{ github.token }}
- name: Merge Pull Request
@ -33,4 +33,4 @@ jobs:
GH_TOKEN: ${{ secrets.BOT_SECRET }}
run: |
gh pr review auto-merge/rel-8-3/${{github.run_number}} --approve
gh pr merge auto-merge/rel-8-3/${{github.run_number}} --merge --auto --delete-branch
gh pr merge auto-merge/rel-8-3/${{github.run_number}} --merge --auto --delete-branch

2
docs/en/deployment/ssl.md

@ -1,4 +1,4 @@
# Configuring Configuring SSL certificate(HTTPS)
# Configuring SSL certificate(HTTPS)
A website needs an SSL certificate in order to keep user data secure, verify ownership of the website, prevent attackers from creating a fake version of the site, and gain user trust.

98
docs/en/docs-nav.json

@ -1,41 +1,41 @@
{
"items": [
{
"text": "Get started",
"text": "Get Started",
"items": [
{
"text": "Overview",
"path": "get-started"
},
{
"text": "Single-layer solution",
"text": "Single Layer Web Application",
"path": "get-started/single-layer-web-application.md"
},
{
"text": "Layered solution",
"text": "Layered Web Application",
"path": "get-started/layered-web-application.md"
},
{
"text": "Microservice solution",
"text": "Microservice Solution",
"path": "get-started/microservice.md"
},
{
"text": "Others",
"items": [
{
"text": "Empty ASP.NET Core application",
"text": "Empty ASP.NET Core MVC / Razor Pages Application",
"path": "get-started/empty-aspnet-core-application.md"
},
{
"text": "MAUI application",
"text": "MAUI Application Startup Template",
"path": "get-started/maui.md"
},
{
"text": "WPF application",
"text": "WPF Application Startup Template",
"path": "get-started/wpf.md"
},
{
"text": "Console application",
"text": "Console Application Startup Template",
"path": "get-started/console.md"
}
]
@ -57,36 +57,36 @@
"path": "tutorials/todo"
},
{
"text": "Single-layer solution",
"text": "Single-Layer Solution",
"path": "tutorials/todo/single-layer"
},
{
"text": "Layered solution",
"text": "Layered Solution",
"path": "tutorials/todo/layered"
}
]
},
{
"text": "Book Store Application",
"text": "Web Application Development",
"items": [
{
"text": "Overview",
"path": "tutorials/book-store"
},
{
"text": "1: Creating the server side",
"text": "1: Creating the Server Side",
"path": "tutorials/book-store/part-01.md"
},
{
"text": "2: The Book List page",
"text": "2: The Book List Page",
"path": "tutorials/book-store/part-02.md"
},
{
"text": "3: Creating, updating and deleting books",
"text": "3: Creating, Updating and Deleting Books",
"path": "tutorials/book-store/part-03.md"
},
{
"text": "4: Integration tests",
"text": "4: Integration Tests",
"path": "tutorials/book-store/part-04.md"
},
{
@ -94,23 +94,23 @@
"path": "tutorials/book-store/part-05.md"
},
{
"text": "6: Authors: Domain layer",
"text": "6: Authors: Domain Layer",
"path": "tutorials/book-store/part-06.md"
},
{
"text": "7: Authors: Database integration",
"text": "7: Authors: Database Integration",
"path": "tutorials/book-store/part-07.md"
},
{
"text": "8: Authors: Application layer",
"text": "8: Authors: Application Layer",
"path": "tutorials/book-store/part-08.md"
},
{
"text": "9: Authors: User interface",
"text": "9: Authors: User Interface",
"path": "tutorials/book-store/part-09.md"
},
{
"text": "10: Book to author relation",
"text": "10: Book to Author Relation",
"path": "tutorials/book-store/part-10.md"
}
]
@ -123,35 +123,35 @@
"path": "tutorials/modular-crm/index.md"
},
{
"text": "1: Creating the initial solution",
"text": "1: Creating the Initial Solution",
"path": "tutorials/modular-crm/part-01.md"
},
{
"text": "2: Creating the initial Products module",
"text": "2: Creating the Initial Products Module",
"path": "tutorials/modular-crm/part-02.md"
},
{
"text": "3: Building the Products module",
"text": "3: Building the Products Module",
"path": "tutorials/modular-crm/part-03.md"
},
{
"text": "4: Creating the initial Ordering module",
"text": "4: Creating the Initial Ordering Module",
"path": "tutorials/modular-crm/part-04.md"
},
{
"text": "5: Building the Ordering module",
"text": "5: Building the Ordering Module",
"path": "tutorials/modular-crm/part-05.md"
},
{
"text": "6: Integrating the modules: Implementing Integration Services",
"text": "6: Integrating the Modules: Implementing Integration Services",
"path": "tutorials/modular-crm/part-06.md"
},
{
"text": "7: Integrating the modules: Communication via Messages (Events)",
"text": "7: Integrating the Modules: Communication via Messages (Events)",
"path": "tutorials/modular-crm/part-07.md"
},
{
"text": "8: Integrating the modules: Joining the Products and Orders Data",
"text": "8: Integrating the Modules: Joining the Products and Orders Data",
"path": "tutorials/modular-crm/part-08.md"
}
]
@ -177,7 +177,7 @@
"path": "cli"
},
{
"text": "Examples for the new command",
"text": "New Solution Sample Commands",
"path": "cli/new-command-samples.md"
}
]
@ -256,7 +256,7 @@
"path": "suite/add-solution.md"
},
{
"text": "Creating new ABP solution",
"text": "Creating New ABP Solution",
"path": "suite/create-solution.md"
},
{
@ -271,7 +271,7 @@
"path": "suite/creating-many-to-many-relationship.md"
},
{
"text": "Generating from an Existing Database",
"text": "Generating From an Existing Database",
"path": "suite/generating-entities-from-an-existing-database-table.md"
},
{
@ -301,7 +301,7 @@
"path": "suite/editing-templates.md"
},
{
"text": "How to uninstall",
"text": "How to Uninstall",
"path": "suite/how-to-uninstall.md"
}
]
@ -336,7 +336,7 @@
]
},
{
"text": "Caching",
"text": "Distributed Caching",
"items": [
{
"text": "Overview",
@ -653,7 +653,7 @@
"path": "framework/architecture"
},
{
"text": "Best Practices",
"text": "Module Development Best Practices & Conventions",
"items": [
{
"text": "Overview",
@ -1184,7 +1184,7 @@
"text": "Other Components",
"items": [
{
"text": "SubmitButton",
"text": "SubmitButton Component",
"path": "framework/ui/blazor/components/submit-button.md"
}
]
@ -1226,6 +1226,10 @@
{
"text": "Angular",
"items": [
{
"text": "Overview",
"path": "framework/ui/angular/overview.md"
},
{
"text": "Quick Start",
"path": "framework/ui/angular/quick-start.md"
@ -1278,7 +1282,7 @@
"path": "framework/ui/angular/http-requests.md"
},
{
"text": "Customize Error Handling",
"text": "Error Handling",
"path": "framework/ui/angular/http-error-handling.md"
}
]
@ -1438,6 +1442,10 @@
"text": "Modifying the Menu",
"path": "framework/ui/angular/modifying-the-menu.md"
},
{
"text": "Manage Profile Page Tabs",
"path": "framework/ui/angular/manage-profile-page-tabs.md"
},
{
"text": "Sorting Navigation Elements",
"path": "framework/ui/angular/sorting-navigation-elements.md"
@ -1491,6 +1499,18 @@
{
"text": "Card",
"path": "framework/ui/angular/card-component.md"
},
{
"text": "Password Complexity Indicator",
"path": "framework/ui/angular/password-complexity-indicator-component.md"
},
{
"text": "Lookup Components(Pro)",
"path": "framework/ui/angular/lookup-components.md"
},
{
"text": "Entity Filters(Pro)",
"path": "framework/ui/angular/entity-filters.md"
}
]
}
@ -1631,7 +1651,7 @@
"path": "solution-templates/microservice"
},
{
"text": "Application Module",
"text": "Module Solution",
"path": "solution-templates/application-module"
}
]
@ -1946,7 +1966,7 @@
"path": "others/why-abp-platform.md"
},
{
"text": "Free license vs Pro licenses?",
"text": "Free (Open Source) License vs Commercial (Pro) Licenses",
"path": "others/free-licenses-vs-pro-licenses.md"
},
{
@ -1954,7 +1974,7 @@
"path": "others/penetration-test-report.md"
},
{
"text": "ASP.NET Zero vs ABP",
"text": "ABP vs ASP.NET Zero",
"path": "others/aspnet-zero-vs-abp.md"
},
{

143
docs/en/framework/ui/angular/entity-filters.md

@ -0,0 +1,143 @@
# Entity Filters
Every CRUD page includes some sort of inputs to filter the listed data. Some of the inputs are common among all of the entities like the `Search` box. In addition, every entity has its own advanced filters depending on its fields. To reduce the amount of code written on every CRUD page, the Angular UI of ABP Commercial introduces a new type of component called `abp-advanced-entity-filters`
## Setup
The components are in the _@volo/abp.commercial.ng.ui_ package, which is included in the ABP templates. So, as long as your project is a product of these templates and unless you delete the package, you have access to the entity filter components.
You can either import the `CommercialUiModule` which contains other components as well as `AdvancedEntityFilters` or you can directly import the `AdvancedEntityFiltersModule` if you do not need other components. Here is how you import them in your Angular module:
```javascript
import {
CommercialUiModule,
AdvancedEntityFiltersModule,
} from "@volo/abp.commercial.ng.ui";
@NgModule({
imports: [
// other imports
CommercialUiModule,
// OR
AdvancedEntityFiltersModule,
],
// rest of the module metadata
})
export class YourModule {}
```
## Usage
Let's take a look at the `Users` page from the `Identity` module.
![ABP Angular UI Users Page with Advanced Entity Filters](./images/angular-advanced-entity-filters.png)
As shown in the screenshot, `abp-advanced-entity-filters` usually contain two parts, an entity filter (common among entities), i.e. `abp-entity-filter`, and entity-specific filters which are encapsulated within the `abp-advanced-entity-filters-form` component.
`users.component.html`
```html
<abp-advanced-entity-filters [list]="list" localizationSourceName="AbpIdentity">
<abp-advanced-entity-filters-form>
<form #filterForm (keyup.enter)="list.get()">
<div class="row">
<!-- Form elements are omitted -->
<div class="col-12 col-sm-auto align-self-end mb-3">
<div class="row">
<div class="col-6 col-sm-auto d-grid">
<button
type="button"
class="btn btn-outline-primary"
(click)="clearFilters()"
>
<span>{%{{{ 'AbpUi::Clear' | abpLocalization }}}%}</span>
</button>
</div>
<div class="col-6 col-sm-auto d-grid">
<button
type="button"
class="btn btn-primary"
(click)="list.get()"
>
<span>{%{{{ 'AbpUi::Refresh' | abpLocalization }}}%}</span>
</button>
</div>
</div>
</div>
</div>
</form>
</abp-advanced-entity-filters-form>
</abp-advanced-entity-filters>
```
The `abp-advanced-entity-filters` already contains the `abp-entity-filter` component so you do not need to pass it. However, the `abp-entity-filter` component needs an instance of `ListService` which is usually stored in the `list` field of the page. You can also change the placeholder of the component via `entityFilterPlaceholder` input which is passed into the `abpLocalization` pipe so that it uses the translated text. Default is `'AbpUi::PagerSearch'`
E.g
```html
<abp-advanced-entity-filters
[list]="list"
entityFilterPlaceholder="AbpUi::PagerSearch"
>
<!-- ... -->
</abp-advanced-entity-filters>
```
### Inputs
- `list`: an instance of `ListService`
- `entityFilterPlaceholder`: the placeholder of `abp-entity-filter` component. Default: `'AbpUi::PagerSearch'`
- `localizationSourceName`: the localization source of the current page. E.g: `AbpIdentity`
### Inner components
Some entities are simple and do not require any filter other than the `abp-entity-filter`. In this case, you can simply use the `abp-advanced-entity-filters` without anything in between.
E.g.
Let's remove `form` from the `Users` page
```html
<abp-advanced-entity-filters [list]="list" localizationSourceName="AbpIdentity">
</abp-advanced-entity-filters>
```
![ABP Angular UI Users Page with Advanced Entity Filters without form](./images/angular-advanced-entity-filters-without-form.png)
If your component needs other filters, you can pass your own `form` within the `abp-advanced-entity-filters-form` component. This will render your form as well as a toggle (`abp-advanced-entity-filters-toggle`) to show and hide the form
E.g.
```html
<abp-advanced-entity-filters [list]="list" localizationSourceName="AbpIdentity">
<abp-advanced-entity-filters-form>
<form>
<!-- Content is omitted for sake of simplicity -->
</form>
</abp-advanced-entity-filters-form>
</abp-advanced-entity-filters>
```
![ABP Angular UI Users Page with Advanced Entity Filters with form](./images/angular-advanced-entity-filters-with-form.png)
Last but not least, if you need to render some content above the `abp-entity-filter` component, you can use the `abp-advanced-entity-filters-above-search`.
E.g.
```html
<abp-advanced-entity-filters [list]="list" localizationSourceName="AbpIdentity">
<abp-advanced-entity-filters-above-search>
<h3>Custom Content above entity-filter</h3>
</abp-advanced-entity-filters-above-search>
<abp-advanced-entity-filters-form>
<form>
<!-- Content is omitted for sake of simplicity -->
</form>
</abp-advanced-entity-filters-form>
</abp-advanced-entity-filters>
```
![ABP Angular UI Users Page with Advanced Entity Filters with custom content above filter](./images/angular-advanced-entity-filters-with-custom-content-above-filter.png)

16
docs/en/framework/ui/angular/environment.md

@ -101,6 +101,22 @@ export interface RemoteEnv {
- `method`: HTTP method to be used when retrieving environment config. Default: `GET`
- `headers`: If extra headers are needed for the request, it can be set through this field.
## Provide Environment Variable to Core Module
`environment` variable comes from angular host application.
```js
import { environment } from '../environments/environment';
@NgModule({
imports: [
//...other imports
CoreModule.forRoot({
environment
}),
]
})
```
## EnvironmentService
` EnvironmentService` is a singleton service, i.e. provided in root level of your application, and keeps the environment in the internal store.

BIN
docs/en/framework/ui/angular/images/angular-advanced-entity-filters-with-custom-content-above-filter.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 42 KiB

BIN
docs/en/framework/ui/angular/images/angular-advanced-entity-filters-with-form.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 38 KiB

BIN
docs/en/framework/ui/angular/images/angular-advanced-entity-filters-without-form.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.7 KiB

After

Width:  |  Height:  |  Size: 9.7 KiB

BIN
docs/en/framework/ui/angular/images/angular-advanced-entity-filters.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 47 KiB

BIN
docs/en/framework/ui/angular/images/angular-lookup-select.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 224 KiB

BIN
docs/en/framework/ui/angular/images/angular-lookup-typeahead.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 228 KiB

BIN
docs/en/framework/ui/angular/images/grouped-menu-mobile.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

BIN
docs/en/framework/ui/angular/images/grouped-menu.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

BIN
docs/en/framework/ui/angular/images/manage-profile-page-new-tab.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 24 KiB

BIN
docs/en/framework/ui/angular/images/manage-profile-page.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 38 KiB

98
docs/en/framework/ui/angular/lookup-components.md

@ -0,0 +1,98 @@
# Lookup Components
The Angular UI of ABP Commercial introduces some components with `abp-lookup-...` selector prefix. These components are used for retrieving relational entity data.
## Setup
The components are in the _@volo/abp.commercial.ng.ui_ package, which is included in the ABP templates. So, as long as your project is a product of these templates and unless you delete the package, you have access to the lookup components. Here is how you import them in your Angular module:
```javascript
import { CommercialUiModule } from '@volo/abp.commercial.ng.ui';
@NgModule({
imports: [
// other imports
CommercialUiModule,
],
// rest of the module metadata
})
export class YourModule {}
```
Now you can use the lookup components in your components declared by this module.
## Lookup HTTP Requests
The lookup requests are used by all lookup components to get the related entity records. Because of lexical this, _they must be arrow functions_.
```javascript
@Injectable({
providedIn: 'root'
})
export class AuthorService {
getCountryLookup = (input: LookupRequestDto) =>
this.restService.request<any, PagedResultDto<LookupDto<string>>>({
method: 'GET',
url: '/api/app/authors/country-lookup',
params: { filter: input.filter, skipCount: input.skipCount, maxResultCount: input.maxResultCount },
},
{ apiName: this.apiName });
// rest of the service is removed for brevity
}
```
## Lookup Typeahead Component
Typeahead is a good choice when you have an unknown number of records for the related entity or you want to improve the UX with a search ability. Although not the best scenario, the country picker below shows how the lookup typeahead works:
![ABP Angular UI Typeahead Lookup](./images/angular-lookup-typeahead.gif)
Here is how it is used in the template.
```html
<abp-lookup-typeahead
cid="author-country-id"
formControlName="countryId"
displayNameProp="name"
[editingData]="selected?.country"
[getFn]="service.getCountryLookup"
></abp-lookup-typeahead>
```
The available properties are as follows:
- **cid:** The id of the form control (e.g. an input or a select element) inside the lookup component. Lets form controls respond to `<label>` events.
- **editingData:** The related entity data if a record is being updated.
- **displayNameProp:** The property of the updated record to use as a display name in the form control.
- **lookupNameProp:** The property of the entity to use as a display name in options. Should macth the lookup HTTP request interface. _(default: displayName)_
- **lookupIdProp:** The property of the entity to use as the unique key in options. Should macth the lookup HTTP request interface. _(default: id)_
- **maxResultCount:** The maximum number of options to display. _(default: 10)_
- **getFn:** A function to get the related entity records with HTTP requests. Because of lexical this, _it must be a an arrow function_.
- **disabled:** This property lets you disable/enable a lookup component. _(default: false)_.
## Lookup Select Component
Select is a good choice when you have a low (and usually fixed) number of records for the related entity and search is not necessary. The country picker below shows how the lookup select works:
![ABP Angular UI Select Lookup](./images/angular-lookup-select.gif)
Here is how it is used in the template.
```html
<abp-lookup-select
cid="author-country-id"
formControlName="countryId"
displayNameProp="name"
[getFn]="service.getCountryLookup"
></abp-lookup-select>
```
The available properties are as follows:
- **cid:** The id of the form control (e.g. an input or a select element) inside the lookup component. Lets form controls respond to `<label>` events.
- **displayNameProp:** The property of the updated record to use as a display name in the form control.
- **lookupNameProp:** The property of the entity to use as a display name in options. Should macth the lookup HTTP request interface. _(default: displayName)_
- **lookupIdProp:** The property of the entity to use as the unique key in options. Should macth the lookup HTTP request interface. _(default: id)_
- **getFn:** A function to get the related entity records with HTTP requests. Because of lexical this, _it must be a an arrow function_.
- **disabled:** This property lets you disable/enable a lookup component. _(default: false)_.

77
docs/en/framework/ui/angular/manage-profile-page-tabs.md

@ -0,0 +1,77 @@
# Manage Profile Page Tabs
![manage profile page](./images/manage-profile-page.png)
The tabs in the manage profile page can be managed via `ManageProfileTabsService` which is exposed by the `@volo/abp.ng.account/public/config` package. You can add, remove, or edit a tab with using this service.
See the example below, covers all features:
```ts
// manage-profile-tabs.provider.ts
import { APP_INITIALIZER, Component } from "@angular/core";
import { TwoFactorTabComponent } from "@volo/abp.ng.account/public";
import {
eAccountManageProfileTabNames,
ManageProfileTabsService,
} from "@volo/abp.ng.account/public/config";
import { MyAwesomeTabComponent } from "./my-awesome-tab/my-awesome-tab.component";
@Component({
standalone: true,
selector: "abp-my-awesome-tab",
template: `My Awesome Tab`,
})
class MyAwesomeTabComponent {}
export const MANAGE_PROFILE_TAB_PROVIDER = {
provide: APP_INITIALIZER,
useFactory: configureManageProfileTabs,
deps: [ManageProfileTabsService],
multi: true,
};
export function configureManageProfileTabs(tabs: ManageProfileTabsService) {
return () => {
tabs.add([
{
name: "::MyAwesomeTab", // supports localization keys
order: 5,
component: MyAwesomeTabComponent,
},
]);
tabs.patch(eAccountManageProfileTabNames.TwoFactor, {
name: "Two factor authentication",
component: TwoFactorTabComponent,
});
tabs.remove([eAccountManageProfileTabNames.ProfilePicture]);
};
}
```
```ts
//app.module.ts
import { MANAGE_PROFILE_TAB_PROVIDER } from "./manage-profile-tabs.provider";
@NgModule({
providers: [MANAGE_PROFILE_TAB_PROVIDER],
})
export class AppModule {}
```
What we have done above;
- Created the `manage-profile-page-tabs.provider.ts`.
- Determined the `configureManageProfileTabs` function to perform manage profile tabs actions.
- Added a new tab labeled "My awesome tab".
- Renamed the "Two factor" tab label.
- Removed the "Profile picture" tab.
- Determined the `MANAGE_PROFILE_TAB_PROVIDER` to be able to run the `configureManageProfileTabs` function on initialization.
- Registered the `MANAGE_PROFILE_TAB_PROVIDER` to the `AppModule` providers.
See the result:
![my awesome tab](./images/manage-profile-page-new-tab.png)

13
docs/en/framework/ui/angular/modifying-the-menu.md

@ -344,3 +344,16 @@ export class AppComponent {
* Patched the languages dropdown element with new `requiredPolicy` and new `order`.
* Removed the current user dropdown element.
## Grouped Menu (Pro)
**This feature is only applied for [LeptonX](https://abp.io/docs/latest/themes/lepton-x/angular) theme**
### Web
![groupped-menu](./images/grouped-menu.png)
### Mobile
![groupped-menu-mobile](./images/grouped-menu-mobile.png)

14
docs/en/framework/ui/angular/overview.md

@ -0,0 +1,14 @@
# Angular UI
[Angular](https://angular.dev/) is a framework for building interactive, client-side web UIs using [TypeScript](https://www.typescriptlang.org) and [NodeJS](https://nodejs.org).
ABP Angular provides the infrastructure to communicate with the ABP backend and offers utilities to simplify frontend development. We’ll explore and dive into the details under the following main topics:
- Development
- Core Functionality
- Utilities
- Customization
- Components
You can also make a [Quick Start](./quick-start.md)

2
docs/en/framework/ui/angular/quick-start.md

@ -1,5 +1,7 @@
# ABP Angular Quick Start
**In this version ABP uses Angular [17.3.x](https://github.com/angular/angular/tree/17.3.x) version. You don't have to install Angular CLI globally**
## How to Prepare Development Environment
Please follow the steps below to prepare your development environment for Angular.

2
docs/en/framework/ui/blazor/components/submit-button.md

@ -1,4 +1,4 @@
# Blazor UI: SubmitButton component
# Blazor UI: SubmitButton Component
`SubmitButton` is a simple wrapper around `Button` component. It is used to be placed inside of page Form or Modal dialogs where it can response to user actions and to be activated as a default button by pressing an ENTER key. Once clicked it will go into the `disabled` state and also it will show a small loading indicator until clicked event is finished.

BIN
docs/en/images/abp-overall-diagram-1600.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 407 KiB

After

Width:  |  Height:  |  Size: 547 KiB

10
docs/en/index.md

@ -29,10 +29,20 @@ ABP can work with any database provider, while the following providers are suppo
<img width="340" src="images/db-options.png" alt="ABP Database Providers" />
## The ABP Platform
ABP **bridges the gap** between ASP.NET Core and **real-world business application requirements**, allowing you to focus on your business code.
The following diagram contains the core components of the **ABP Platform** and shows how ABP sits between **ASP.NET Core** and **Your Application**:
![abp-overall-diagram-1600](images/abp-overall-diagram-1600.png)
## Exploring the Documentation
ABP has a **comprehensive documentation** that not only explains ABP, but also includes **guides** and **samples** to help you on creating a **maintainable solution** by introducing and discussing common **software development principle and best practices**.
The next sections highlight important ABP components and provides links to related documents.
### The Framework
#### Architecture

2
docs/en/modules/cms-kit-pro/index.md

@ -1,4 +1,4 @@
# CMS Kit Pro Module (Pro)
# CMS Kit Module (Pro)
> You must have an ABP Team or a higher license to use this module.

2
docs/en/solution-templates/application-module/index.md

@ -1,4 +1,4 @@
# Module Startup Template
# Module Solution Template
This template can be used to create a **reusable [application module](../../modules)** based on the [module development best practices & conventions](../../framework/architecture/best-practices). It is also suitable for creating **microservices** (with or without UI).

4
docs/en/solution-templates/layered-web-application/index.md

@ -1,4 +1,4 @@
# Application Startup Template
# Layered Application Solution Template
## Introduction
@ -6,7 +6,7 @@ This template provides a layered application structure based on the [Domain Driv
This document explains **the solution structure** and projects in details. If you want to start quickly, follow the guides below:
* [The getting started document](../../get-started/single-layer-web-application.md) explains how to create a new application in a few minutes.
* [The getting started document](../../get-started/layered-web-application.md) explains how to create a new application in a few minutes.
* [The application development tutorial](../../tutorials/book-store/part-01.md) explains step by step application development.
## How to Start With?

6
docs/en/solution-templates/single-layer-web-application/index.md

@ -1,12 +1,12 @@
# Application (Single Layer) Startup Template
# Single Layer Application Solution Template
## Introduction
This template provides a simple solution structure with a single project. This document explains that solution structure in details.
### The Difference Between the Application Startup Templates
### The Difference Between the Application Solution Templates
ABP's [Application Startup Template](../layered-web-application) provides a well-organized and layered solution to create maintainable business applications based on the [Domain Driven Design](../../framework/architecture/domain-driven-design) (DDD) practices. However, some developers find this template a little bit complex for simple and short-term applications. The single-layer application template has been created to provide a simpler development model for such applications. This template has the same functionality, features and modules on runtime with the [Application Startup Template](../layered-web-application) but the development model is minimal and everything is in a single project (`.csproj`).
ABP's [Layered Application Solution Template](../layered-web-application) provides a well-organized and layered solution to create maintainable business applications based on the [Domain Driven Design](../../framework/architecture/domain-driven-design) (DDD) practices. However, some developers find this template a little bit complex for simple and short-term applications. The single-layer application template has been created to provide a simpler development model for such applications. This template has the same functionality, features and modules on runtime with the [Layered Application Solution Template](../layered-web-application) but the development model is minimal and everything is in a single project (`.csproj`).
## How to Start with It?

Loading…
Cancel
Save