Browse Source

use new control flow in `identity`, `permission-management`, `tenant-management`,`setting-management`, `theme-basic`, `theme-shared` packages

pull/19469/head
Sinan997 3 years ago
parent
commit
295c07c095
  1. 77
      npm/ng-packs/packages/identity/src/lib/components/users/users.component.html
  2. 95
      npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.html
  3. 10
      npm/ng-packs/packages/setting-management/src/lib/components/setting-management.component.html
  4. 24
      npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.html
  5. 13
      npm/ng-packs/packages/theme-basic/src/lib/components/account-layout/account-layout.component.html
  6. 29
      npm/ng-packs/packages/theme-basic/src/lib/components/account-layout/auth-wrapper/auth-wrapper.component.html
  7. 4
      npm/ng-packs/packages/theme-basic/src/lib/components/account-layout/tenant-box/tenant-box.component.html
  8. 14
      npm/ng-packs/packages/theme-basic/src/lib/components/application-layout/application-layout.component.html
  9. 22
      npm/ng-packs/packages/theme-basic/src/lib/components/logo/logo.component.ts
  10. 124
      npm/ng-packs/packages/theme-basic/src/lib/components/nav-items/current-user.component.html
  11. 60
      npm/ng-packs/packages/theme-basic/src/lib/components/nav-items/languages.component.ts
  12. 24
      npm/ng-packs/packages/theme-basic/src/lib/components/nav-items/nav-items.component.html
  13. 32
      npm/ng-packs/packages/theme-basic/src/lib/components/page-alert-container/page-alert-container.component.html
  14. 47
      npm/ng-packs/packages/theme-basic/src/lib/components/routes/routes.component.html
  15. 8
      npm/ng-packs/packages/theme-basic/src/lib/components/validation-error/validation-error.component.ts
  16. 29
      npm/ng-packs/packages/theme-shared/src/lib/components/breadcrumb-items/breadcrumb-items.component.html
  17. 8
      npm/ng-packs/packages/theme-shared/src/lib/components/checkbox/checkbox.component.ts
  18. 89
      npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.html
  19. 8
      npm/ng-packs/packages/theme-shared/src/lib/components/form-input/form-input.component.ts
  20. 47
      npm/ng-packs/packages/theme-shared/src/lib/components/http-error-wrapper/http-error-wrapper.component.html
  21. 40
      npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal.component.html
  22. 11
      npm/ng-packs/packages/theme-shared/src/lib/components/toast-container/toast-container.component.html
  23. 8
      npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.html

77
npm/ng-packs/packages/identity/src/lib/components/users/users.component.html

@ -26,46 +26,45 @@
</ng-template> </ng-template>
<ng-template #abpBody> <ng-template #abpBody>
<ng-template #loaderRef> @if (form) {
<div class="text-center"><i class="fa fa-pulse fa-spinner" aria-hidden="true"></i></div> <form [formGroup]="form" (ngSubmit)="save()">
</ng-template> <ul ngbNav #nav="ngbNav" class="nav-tabs">
<li ngbNavItem>
<form *ngIf="form; else loaderRef" [formGroup]="form" (ngSubmit)="save()"> <a ngbNavLink>{{ 'AbpIdentity::UserInformations' | abpLocalization }}</a>
<ul ngbNav #nav="ngbNav" class="nav-tabs"> <ng-template ngbNavContent>
<li ngbNavItem> <abp-extensible-form [selectedRecord]="selected"></abp-extensible-form>
<a ngbNavLink>{{ 'AbpIdentity::UserInformations' | abpLocalization }}</a> </ng-template>
<ng-template ngbNavContent> </li>
<abp-extensible-form [selectedRecord]="selected"></abp-extensible-form>
</ng-template>
</li>
<li ngbNavItem> <li ngbNavItem>
<a ngbNavLink>{{ 'AbpIdentity::Roles' | abpLocalization }}</a> <a ngbNavLink>{{ 'AbpIdentity::Roles' | abpLocalization }}</a>
<ng-template ngbNavContent> <ng-template ngbNavContent>
<div @for (roleGroup of roleGroups; track $index; let i = $index) {
*ngFor="let roleGroup of roleGroups; let i = index; trackBy: trackByFn" <div class="form-check mb-2">
class="form-check mb-2" <abp-checkbox
> *abpReplaceableTemplate="{
<abp-checkbox inputs: {
*abpReplaceableTemplate="{ checkboxId: 'roles-' + i,
inputs: { label: roles[i].name,
checkboxId: 'roles-' + i, formControl: roleGroup.controls[roles[i].name]
label: roles[i].name, },
formControl: roleGroup.controls[roles[i].name] componentKey: inputKey
}, }"
componentKey: inputKey [checkboxId]="'roles-' + i"
}" [formControl]="roleGroup.controls[roles[i].name]"
[checkboxId]="'roles-' + i" [label]="roles[i].name"
[formControl]="roleGroup.controls[roles[i].name]" >
[label]="roles[i].name" </abp-checkbox>
> </div>
</abp-checkbox> }
</div> </ng-template>
</ng-template> </li>
</li> </ul>
</ul> <div class="mt-2 fade-in-top" [ngbNavOutlet]="nav"></div>
<div class="mt-2 fade-in-top" [ngbNavOutlet]="nav"></div> </form>
</form> } @else {
<div class="text-center"><i class="fa fa-pulse fa-spinner" aria-hidden="true"></i></div>
}
</ng-template> </ng-template>
<ng-template #abpFooter> <ng-template #abpFooter>

95
npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.html

@ -1,5 +1,5 @@
<abp-modal [(visible)]="visible" [busy]="modalBusy" [options]="{ size: 'lg' ,scrollable:false }"> <abp-modal [(visible)]="visible" [busy]="modalBusy" [options]="{ size: 'lg', scrollable: false }">
<ng-container *ngIf="data.entityDisplayName || entityDisplayName"> @if (data.entityDisplayName || entityDisplayName) {
<ng-template #abpHeader> <ng-template #abpHeader>
<h4> <h4>
{{ 'AbpPermissionManagement::Permissions' | abpLocalization }} - {{ 'AbpPermissionManagement::Permissions' | abpLocalization }} -
@ -28,23 +28,28 @@
<hr class="mt-2 mb-2" /> <hr class="mt-2 mb-2" />
<div class="overflow-auto"> <div class="overflow-auto">
<ul class="nav nav-pills flex-column"> <ul class="nav nav-pills flex-column">
<li *ngFor="let group of data.groups; trackBy: trackByFn" class="nav-item"> @for (group of data.groups; track $index) {
<a <li class="nav-item">
*ngIf="{ assignedCount: getAssignedCount(group.name) } as count" @if ({ assignedCount: getAssignedCount(group.name) }; as count) {
class="nav-link pointer" <a
[class.active]="selectedGroup?.name === group?.name" class="nav-link pointer"
(click)="onChangeGroup(group)" [class.active]="selectedGroup?.name === group?.name"
(select)="setDisabled(group.permissions)" (click)="onChangeGroup(group)"
> (select)="setDisabled(group.permissions)"
<div [class.font-weight-bold]="count.assignedCount"> >
{{ group?.displayName }} <div [class.font-weight-bold]="count.assignedCount">
<span *ngIf="count.assignedCount > 0">({{ count.assignedCount }})</span> {{ group?.displayName }}
</div> @if (count.assignedCount > 0) {
</a> <span>({{ count.assignedCount }})</span>
</li> }
</div>
</a>
}
</li>
}
</ul> </ul>
</div> </div>
</div> </div>
<div class="col-md-8 scroll-in-modal"> <div class="col-md-8 scroll-in-modal">
<div class="ps-1"> <div class="ps-1">
@ -64,32 +69,34 @@
}}</label> }}</label>
</div> </div>
<hr class="my-2" /> <hr class="my-2" />
<div @for (permission of selectedGroupPermissions; track $index; let i = $index) {
*ngFor="let permission of selectedGroupPermissions; let i = index; trackBy: trackByFn" <div
[ngStyle]="permission.style" [ngStyle]="permission.style"
class="form-check mb-2" class="form-check mb-2"
> >
<input <input
#permissionCheckbox #permissionCheckbox
type="checkbox" type="checkbox"
[checked]="getChecked(permission.name)" [checked]="getChecked(permission.name)"
[value]="getChecked(permission.name)" [value]="getChecked(permission.name)"
[attr.id]="permission.name" [attr.id]="permission.name"
class="form-check-input" class="form-check-input"
[disabled]="isGrantedByOtherProviderName(permission.grantedProviders)" [disabled]="isGrantedByOtherProviderName(permission.grantedProviders)"
(click)="onClickCheckbox(permission, permissionCheckbox.value)" (click)="onClickCheckbox(permission, permissionCheckbox.value)"
/> />
<label class="form-check-label" [attr.for]="permission.name" <label class="form-check-label" [attr.for]="permission.name"
>{{ permission.displayName }} >{{ permission.displayName }}
<ng-container *ngIf="!hideBadges"> @if (!hideBadges) {
<span @for (provider of permission.grantedProviders; track $index) {
*ngFor="let provider of permission.grantedProviders" <span
class="badge bg-light text-dark" class="badge bg-light text-dark"
>{{ provider.providerName }}: {{ provider.providerKey }}</span >{{ provider.providerName }}: {{ provider.providerKey }}</span
> >
</ng-container> }
</label> }
</div> </label>
</div>
}
</div> </div>
</div> </div>
</div> </div>
@ -102,5 +109,5 @@
'AbpIdentity::Save' | abpLocalization 'AbpIdentity::Save' | abpLocalization
}}</abp-button> }}</abp-button>
</ng-template> </ng-template>
</ng-container> }
</abp-modal> </abp-modal>

10
npm/ng-packs/packages/setting-management/src/lib/components/setting-management.component.html

@ -23,11 +23,13 @@
</ul> </ul>
</div> </div>
<div class="col-12 col-md-9"> <div class="col-12 col-md-9">
<div *ngIf="settings.length" class="tab-content"> @if (settings.length) {
<div class="tab-pane fade show active" [id]="selected.name + '-tab'" role="tabpanel"> <div class="tab-content">
<ng-container *ngComponentOutlet="selected.component"></ng-container> <div class="tab-pane fade show active" [id]="selected.name + '-tab'" role="tabpanel">
<ng-container *ngComponentOutlet="selected.component"></ng-container>
</div>
</div> </div>
</div> }
</div> </div>
</div> </div>
</div> </div>

24
npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.html

@ -1,6 +1,4 @@
<abp-page [title]="'AbpTenantManagement::Tenants' | abpLocalization" [toolbar]="data.items"> <abp-page [title]="'AbpTenantManagement::Tenants' | abpLocalization" [toolbar]="data.items">
<div id="wrapper" class="card"> <div id="wrapper" class="card">
<div class="card-body"> <div class="card-body">
<div id="data-tables-table-filter" class="data-tables-filter mb-3"> <div id="data-tables-table-filter" class="data-tables-filter mb-3">
@ -26,8 +24,8 @@
<ng-template #abpHeader> <ng-template #abpHeader>
<h3> <h3>
{{ {{
(selected?.id ? 'AbpTenantManagement::Edit' : 'AbpTenantManagement::NewTenant') (selected?.id ? 'AbpTenantManagement::Edit' : 'AbpTenantManagement::NewTenant')
| abpLocalization | abpLocalization
}} }}
</h3> </h3>
</ng-template> </ng-template>
@ -44,20 +42,20 @@
</button> </button>
<abp-button iconClass="fa fa-check" (click)="save()" [disabled]="tenantForm?.invalid">{{ <abp-button iconClass="fa fa-check" (click)="save()" [disabled]="tenantForm?.invalid">{{
'AbpTenantManagement::Save' | abpLocalization 'AbpTenantManagement::Save' | abpLocalization
}}</abp-button> }}</abp-button>
</ng-template> </ng-template>
</abp-modal> </abp-modal>
<abp-feature-management <abp-feature-management
*abpReplaceableTemplate="{ *abpReplaceableTemplate="{
inputs: { inputs: {
providerName: { value: 'T' }, providerName: { value: 'T' },
providerKey: { value: providerKey }, providerKey: { value: providerKey },
visible: { value: visibleFeatures, twoWay: true } visible: { value: visibleFeatures, twoWay: true }
}, },
outputs: { visibleChange: $any(onVisibleFeaturesChange) }, outputs: { visibleChange: $any(onVisibleFeaturesChange) },
componentKey: featureManagementKey componentKey: featureManagementKey
}" }"
[(visible)]="visibleFeatures" [(visible)]="visibleFeatures"
providerName="T" providerName="T"
[providerKey]="providerKey" [providerKey]="providerKey"

13
npm/ng-packs/packages/theme-basic/src/lib/components/account-layout/account-layout.component.html

@ -20,12 +20,13 @@
> >
<ng-container *ngTemplateOutlet="!service.smallScreen ? navigations : null"></ng-container> <ng-container *ngTemplateOutlet="!service.smallScreen ? navigations : null"></ng-container>
<div @if (service.smallScreen) {
*ngIf="service.smallScreen" <div
[@collapseWithMargin]="service.isCollapsed ? 'collapsed' : 'expanded'" [@collapseWithMargin]="service.isCollapsed ? 'collapsed' : 'expanded'"
> >
<ng-container *ngTemplateOutlet="navigations"></ng-container> <ng-container *ngTemplateOutlet="navigations"></ng-container>
</div> </div>
}
<ng-template #navigations> <ng-template #navigations>
<abp-routes <abp-routes

29
npm/ng-packs/packages/theme-basic/src/lib/components/account-layout/auth-wrapper/auth-wrapper.component.html

@ -1,27 +1,24 @@
<div class="row"> <div class="row">
<div class="mx-auto col col-md-5"> <div class="mx-auto col col-md-5">
<ng-container *ngIf="(service.isMultiTenancyEnabled$ | async) && service.isTenantBoxVisible"> @if ((service.isMultiTenancyEnabled$ | async) && service.isTenantBoxVisible) {
<abp-tenant-box <abp-tenant-box
*abpReplaceableTemplate="{ componentKey: service.tenantBoxKey }" *abpReplaceableTemplate="{ componentKey: service.tenantBoxKey }"
></abp-tenant-box> ></abp-tenant-box>
</ng-container> }
<div class="abp-account-container"> <div class="abp-account-container">
<div @if (service.enableLocalLogin$ | async) {
*ngIf="service.enableLocalLogin$ | async; else disableLocalLoginTemplate" <div class="card mt-3 shadow-sm rounded">
class="card mt-3 shadow-sm rounded" <div class="card-body p-5">
> <ng-content></ng-content>
<div class="card-body p-5"> </div>
<ng-content></ng-content>
</div> </div>
</div> } @else {
<div class="alert alert-warning">
<strong>{{ 'AbpAccount::InvalidLoginRequest' | abpLocalization }}</strong>
{{ 'AbpAccount::ThereAreNoLoginSchemesConfiguredForThisClient' | abpLocalization }}
</div>
}
</div> </div>
</div> </div>
</div> </div>
<ng-template #disableLocalLoginTemplate>
<div class="alert alert-warning">
<strong>{{ 'AbpAccount::InvalidLoginRequest' | abpLocalization }}</strong>
{{ 'AbpAccount::ThereAreNoLoginSchemesConfiguredForThisClient' | abpLocalization }}
</div>
</ng-template>

4
npm/ng-packs/packages/theme-basic/src/lib/components/account-layout/tenant-box/tenant-box.component.html

@ -1,4 +1,4 @@
<ng-container *ngIf="(service.currentTenant$ | async) || { name: '' } as currentTenant"> @if ((service.currentTenant$ | async) || { name: '' }; as currentTenant) {
<div class="card shadow-sm rounded mb-3"> <div class="card shadow-sm rounded mb-3">
<div class="card-body px-5"> <div class="card-body px-5">
<div class="row"> <div class="row">
@ -62,4 +62,4 @@
</abp-button> </abp-button>
</ng-template> </ng-template>
</abp-modal> </abp-modal>
</ng-container> }

14
npm/ng-packs/packages/theme-basic/src/lib/components/application-layout/application-layout.component.html

@ -13,12 +13,18 @@
> >
<span class="navbar-toggler-icon"></span> <span class="navbar-toggler-icon"></span>
</button> </button>
<div class="navbar-collapse" [class.overflow-hidden]="service.smallScreen" id="main-navbar-collapse"> <div
class="navbar-collapse"
[class.overflow-hidden]="service.smallScreen"
id="main-navbar-collapse"
>
<ng-container *ngTemplateOutlet="!service.smallScreen ? navigations : null"></ng-container> <ng-container *ngTemplateOutlet="!service.smallScreen ? navigations : null"></ng-container>
<div *ngIf="service.smallScreen" [@collapseWithMargin]="service.isCollapsed ? 'collapsed' : 'expanded'"> @if (service.smallScreen) {
<ng-container *ngTemplateOutlet="navigations"></ng-container> <div [@collapseWithMargin]="service.isCollapsed ? 'collapsed' : 'expanded'">
</div> <ng-container *ngTemplateOutlet="navigations"></ng-container>
</div>
}
<ng-template #navigations> <ng-template #navigations>
<abp-routes <abp-routes

22
npm/ng-packs/packages/theme-basic/src/lib/components/logo/logo.component.ts

@ -5,18 +5,18 @@ import { Component } from '@angular/core';
selector: 'abp-logo', selector: 'abp-logo',
template: ` template: `
<a class="navbar-brand" routerLink="/"> <a class="navbar-brand" routerLink="/">
<img @if (appInfo.logoUrl) {
*ngIf="appInfo.logoUrl; else appName" <img
[src]="appInfo.logoUrl" *ngIf="appInfo.logoUrl"
[alt]="appInfo.name" [src]="appInfo.logoUrl"
width="100%" [alt]="appInfo.name"
height="auto" width="100%"
/> height="auto"
/>
} @else {
{{ appInfo.name }}
}
</a> </a>
<ng-template #appName>
{{ appInfo.name }}
</ng-template>
`, `,
}) })
export class LogoComponent { export class LogoComponent {

124
npm/ng-packs/packages/theme-basic/src/lib/components/nav-items/current-user.component.html

@ -1,65 +1,65 @@
<ng-template #loginBtn> @if ((currentUser$ | async)?.isAuthenticated) {
<a role="button" class="nav-link pointer" (click)="navigateToLogin()">{{
'AbpAccount::Login' | abpLocalization
}}</a>
</ng-template>
<div
*ngIf="(currentUser$ | async)?.isAuthenticated; else loginBtn"
ngbDropdown
class="dropdown"
#currentUserDropdown="ngbDropdown"
display="static"
>
<a
ngbDropdownToggle
class="nav-link"
href="javascript:void(0)"
role="button"
id="dropdownMenuLink"
data-toggle="dropdown"
aria-haspopup="true"
aria-expanded="false"
>
<small *ngIf="(selectedTenant$ | async)?.name as tenantName"
><i>{{ tenantName }}</i
>\</small
>
<strong>{{ (currentUser$ | async)?.userName }}</strong>
</a>
<div <div
class="dropdown-menu dropdown-menu-end border-0 shadow-sm" *ngIf="(currentUser$ | async)?.isAuthenticated"
aria-labelledby="dropdownMenuLink" ngbDropdown
[class.d-block]="smallScreen && currentUserDropdown.isOpen()" class="dropdown"
#currentUserDropdown="ngbDropdown"
display="static"
> >
<ng-container *ngFor="let item of userMenu.items$ | async; trackBy: trackByFn"> <a
<ng-container *abpVisible="!item.visible || item.visible(item)"> ngbDropdownToggle
<li class="nav-item d-flex align-items-center" *abpPermission="item.requiredPolicy"> class="nav-link"
<ng-container href="javascript:void(0)"
*ngIf="item.component; else htmlTemplate" role="button"
[ngComponentOutlet]="item.component" id="dropdownMenuLink"
[ngComponentOutletInjector]="item | toInjector" data-toggle="dropdown"
></ng-container> aria-haspopup="true"
aria-expanded="false"
<ng-template #htmlTemplate> >
<div @if ((selectedTenant$ | async)?.name; as tenantName) {
*ngIf="item.html; else textTemplate" <small
[innerHTML]="item.html" ><i>{{ tenantName }}</i
(click)="item.action ? item.action() : null" >\</small
></div> >
</ng-template> }
<strong>{{ (currentUser$ | async)?.userName }}</strong>
<ng-template #textTemplate> </a>
<a <div
*ngIf="item.textTemplate" class="dropdown-menu dropdown-menu-end border-0 shadow-sm"
(click)="item.action ? item.action() : null" aria-labelledby="dropdownMenuLink"
class="dropdown-item pointer" [class.d-block]="smallScreen && currentUserDropdown.isOpen()"
> >
<i *ngIf="item.textTemplate.icon" class="me-1 {{ item.textTemplate.icon }}"></i> @for (item of userMenu.items$ | async; track $index) {
{{ item.textTemplate.text | abpLocalization }}</a <ng-container *abpVisible="!item.visible || item.visible(item)">
> <li class="nav-item d-flex align-items-center" *abpPermission="item.requiredPolicy">
</ng-template> @if (item.component) {
</li> <ng-container
</ng-container> [ngComponentOutlet]="item.component"
</ng-container> [ngComponentOutletInjector]="item | toInjector"
></ng-container>
} @else {
@if (item.html) {
<div [innerHTML]="item.html" (click)="item.action ? item.action() : null"></div>
} @else {
@if (item.textTemplate) {
<a (click)="item.action ? item.action() : null" class="dropdown-item pointer">
@if (item.textTemplate.icon) {
<i class="me-1 {{ item.textTemplate.icon }}"></i>
}
{{ item.textTemplate.text | abpLocalization }}</a
>
}
}
}
</li>
</ng-container>
}
</div>
</div> </div>
</div> } @else {
<ng-template #loginBtn>
<a role="button" class="nav-link pointer" (click)="navigateToLogin()">{{
'AbpAccount::Login' | abpLocalization
}}</a>
</ng-template>
}

60
npm/ng-packs/packages/theme-basic/src/lib/components/nav-items/languages.component.ts

@ -6,39 +6,36 @@ import { map } from 'rxjs/operators';
@Component({ @Component({
selector: 'abp-languages', selector: 'abp-languages',
template: ` template: `
<div @if (((dropdownLanguages$ | async)?.length || 0) > 0) {
*ngIf="((dropdownLanguages$ | async)?.length || 0) > 0" <div class="dropdown" ngbDropdown #languageDropdown="ngbDropdown" display="static">
class="dropdown"
ngbDropdown
#languageDropdown="ngbDropdown"
display="static"
>
<a
ngbDropdownToggle
class="nav-link"
href="javascript:void(0)"
role="button"
id="dropdownMenuLink"
data-toggle="dropdown"
aria-haspopup="true"
aria-expanded="false"
>
{{ defaultLanguage$ | async }}
</a>
<div
class="dropdown-menu dropdown-menu-end border-0 shadow-sm"
aria-labelledby="dropdownMenuLink"
[class.d-block]="smallScreen && languageDropdown.isOpen()"
>
<a <a
*ngFor="let lang of dropdownLanguages$ | async" ngbDropdownToggle
class="nav-link"
href="javascript:void(0)" href="javascript:void(0)"
class="dropdown-item" role="button"
(click)="onChangeLang(lang.cultureName || '')" id="dropdownMenuLink"
>{{ lang?.displayName }}</a data-toggle="dropdown"
aria-haspopup="true"
aria-expanded="false"
> >
{{ defaultLanguage$ | async }}
</a>
<div
class="dropdown-menu dropdown-menu-end border-0 shadow-sm"
aria-labelledby="dropdownMenuLink"
[class.d-block]="smallScreen && languageDropdown.isOpen()"
>
@for (lang of dropdownLanguages$ | async; track $index) {
<a
href="javascript:void(0)"
class="dropdown-item"
(click)="onChangeLang(lang.cultureName || '')"
>{{ lang?.displayName }}</a
>
}
</div>
</div> </div>
</div> }
`, `,
}) })
export class LanguagesComponent { export class LanguagesComponent {
@ -69,7 +66,10 @@ export class LanguagesComponent {
return this.sessionState.getLanguage(); return this.sessionState.getLanguage();
} }
constructor(private sessionState: SessionStateService, private configState: ConfigStateService) {} constructor(
private sessionState: SessionStateService,
private configState: ConfigStateService,
) {}
onChangeLang(cultureName: string) { onChangeLang(cultureName: string) {
this.sessionState.setLanguage(cultureName); this.sessionState.setLanguage(cultureName);

24
npm/ng-packs/packages/theme-basic/src/lib/components/nav-items/nav-items.component.html

@ -1,18 +1,16 @@
<ul class="navbar-nav"> <ul class="navbar-nav">
<ng-container *ngFor="let item of navItems.items$ | async; trackBy: trackByFn"> @for (item of navItems.items$ | async; track $index) {
<ng-container *abpVisible="!item.visible || item.visible(item)"> <ng-container *abpVisible="!item.visible || item.visible(item)">
<li class="nav-item d-flex align-items-center" *abpPermission="item.requiredPolicy"> <li class="nav-item d-flex align-items-center" *abpPermission="item.requiredPolicy">
<ng-container @if (item.component) {
<ng-container
*ngIf="item.component; else htmlTemplate" [ngComponentOutlet]="item.component"
[ngComponentOutlet]="item.component" [ngComponentOutletInjector]="item | toInjector"
[ngComponentOutletInjector]="item | toInjector" ></ng-container>
></ng-container> } @else {
<ng-template #htmlTemplate>
<div [innerHTML]="item.html" (click)="item.action ? item.action() : null"></div> <div [innerHTML]="item.html" (click)="item.action ? item.action() : null"></div>
</ng-template> }
</li> </li>
</ng-container> </ng-container>
</ng-container> }
</ul> </ul>

32
npm/ng-packs/packages/theme-basic/src/lib/components/page-alert-container/page-alert-container.component.html

@ -1,24 +1,26 @@
<ng-container *ngFor="let alert of service.alerts$ | async; let i = index"> @for (alert of service.alerts$ | async; track i; let i = $index) {
<div <div
class="alert alert-{{ alert.type }} fade show" class="alert alert-{{ alert.type }} fade show"
[ngClass]="{ 'alert-dismissible fade show': alert.dismissible }" [ngClass]="{ 'alert-dismissible fade show': alert.dismissible }"
role="alert" role="alert"
> >
<h4 @if (alert.title) {
class="alert-heading" <h4
*ngIf="alert.title" class="alert-heading"
[innerHTML]="alert.title | abpSafeHtml | abpLocalization: alert.titleLocalizationParams" [innerHTML]="alert.title | abpSafeHtml | abpLocalization: alert.titleLocalizationParams"
></h4> ></h4>
}
<span <span
[innerHTML]="alert.message | abpSafeHtml | abpLocalization: alert.messageLocalizationParams" [innerHTML]="alert.message | abpSafeHtml | abpLocalization: alert.messageLocalizationParams"
></span> ></span>
<button @if (alert.dismissible) {
*ngIf="alert.dismissible" <button
type="button" type="button"
class="btn-close" class="btn-close"
data-dismiss="alert" data-dismiss="alert"
aria-label="Close" aria-label="Close"
(click)="service.remove(i)" (click)="service.remove(i)"
></button> ></button>
}
</div> </div>
</ng-container> }

47
npm/ng-packs/packages/theme-basic/src/lib/components/routes/routes.component.html

@ -1,22 +1,25 @@
<ul class="navbar-nav"> <ul class="navbar-nav">
<ng-container @for (route of routesService.visible$ | async; track $index) {
*ngFor="let route of routesService.visible$ | async; trackBy: trackByFn" <ng-container
[ngTemplateOutlet]="isDropdown(route) ? dropdownLink : defaultLink" [ngTemplateOutlet]="isDropdown(route) ? dropdownLink : defaultLink"
[ngTemplateOutletContext]="{ $implicit: route }" [ngTemplateOutletContext]="{ $implicit: route }"
> >
</ng-container> </ng-container>
}
<ng-template #defaultLink let-route> <ng-template #defaultLink let-route>
<li class="nav-item" *abpPermission="route.requiredPolicy"> <li class="nav-item" *abpPermission="route.requiredPolicy">
<a class="nav-link" [routerLink]="[route.path]" <a class="nav-link" [routerLink]="[route.path]">
><i *ngIf="route.iconClass" [ngClass]="route.iconClass"></i> @if (route.iconClass) {
{{ route.name | abpLocalization }}</a <i [ngClass]="route.iconClass"></i>
> }
{{ route.name | abpLocalization }}
</a>
</li> </li>
</ng-template> </ng-template>
<ng-template #dropdownLink let-route> <ng-template #dropdownLink let-route>
<ng-container *ngIf="route.children?.length"> @if (route.children?.length) {
<li <li
class="nav-item dropdown" class="nav-item dropdown"
display="static" display="static"
@ -34,7 +37,9 @@
aria-expanded="false" aria-expanded="false"
href="javascript:void(0)" href="javascript:void(0)"
> >
<i *ngIf="route.iconClass" [ngClass]="route.iconClass"></i> @if (route.iconClass) {
<i [ngClass]="route.iconClass"></i>
}
{{ route.name | abpLocalization }} {{ route.name | abpLocalization }}
</a> </a>
<div <div
@ -48,27 +53,29 @@
></ng-container> ></ng-container>
</div> </div>
</li> </li>
</ng-container> }
</ng-template> </ng-template>
<ng-template #forTemplate let-route> <ng-template #forTemplate let-route>
<ng-container *ngFor="let child of route.children"> @for (child of route.children; track $index) {
<ng-template <ng-template
[ngTemplateOutlet]="child.children?.length ? dropdownChild : defaultChild" [ngTemplateOutlet]="child.children?.length ? dropdownChild : defaultChild"
[ngTemplateOutletContext]="{ $implicit: child }" [ngTemplateOutletContext]="{ $implicit: child }"
></ng-template> ></ng-template>
</ng-container> }
</ng-template> </ng-template>
<ng-template #defaultChild let-child> <ng-template #defaultChild let-child>
<ng-container *ngIf="child.path"> @if (child.path) {
<div class="dropdown-submenu" *abpPermission="child.requiredPolicy"> <div class="dropdown-submenu" *abpPermission="child.requiredPolicy">
<a class="dropdown-item" [routerLink]="[child.path]" (click)="closeDropdown()"> <a class="dropdown-item" [routerLink]="[child.path]" (click)="closeDropdown()">
<i *ngIf="child.iconClass" [ngClass]="child.iconClass"></i> @if (child.iconClass) {
<i [ngClass]="child.iconClass"></i>
}
{{ child.name | abpLocalization }}</a {{ child.name | abpLocalization }}</a
> >
</div> </div>
</ng-container> }
</ng-template> </ng-template>
<ng-template #dropdownChild let-child> <ng-template #dropdownChild let-child>
@ -87,7 +94,9 @@
role="button" role="button"
class="btn d-block text-start dropdown-toggle" class="btn d-block text-start dropdown-toggle"
> >
<i *ngIf="child.iconClass" [ngClass]="child.iconClass"></i> @if (child.iconClass) {
<i [ngClass]="child.iconClass"></i>
}
{{ child.name | abpLocalization }} {{ child.name | abpLocalization }}
</a> </a>
</div> </div>

8
npm/ng-packs/packages/theme-basic/src/lib/components/validation-error/validation-error.component.ts

@ -4,9 +4,11 @@ import { Validation, ValidationErrorComponent as ErrorComponent } from '@ngx-val
@Component({ @Component({
selector: 'abp-validation-error', selector: 'abp-validation-error',
template: ` template: `
<div class="invalid-feedback" *ngFor="let error of abpErrors; trackBy: trackByFn"> @for (error of abpErrors; track $index) {
{{ error.message | abpLocalization: error.interpoliteParams }} <div class="invalid-feedback" >
</div> {{ error.message | abpLocalization: error.interpoliteParams }}
</div>
}
`, `,
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
encapsulation: ViewEncapsulation.None, encapsulation: ViewEncapsulation.None,

29
npm/ng-packs/packages/theme-shared/src/lib/components/breadcrumb-items/breadcrumb-items.component.html

@ -1,18 +1,17 @@
<ol class="breadcrumb" *ngIf="items.length"> @if (items.length) {
<li class="breadcrumb-item"> <ol class="breadcrumb">
<a routerLink="/"><i class="fa fa-home" aria-hidden="true"></i> </a> <li class="breadcrumb-item">
</li> <a routerLink="/"><i class="fa fa-home" aria-hidden="true"></i> </a>
<li </li>
*ngFor="let item of items; let last = last" @for (item of items; track $index; let last = $last) {
class="breadcrumb-item" <li class="breadcrumb-item" [class.active]="last" aria-current="page">
[class.active]="last" <ng-container
aria-current="page" *ngTemplateOutlet="item.path ? linkTemplate : textTemplate; context: { $implicit: item }"
> ></ng-container>
<ng-container </li>
*ngTemplateOutlet="item.path ? linkTemplate : textTemplate; context: { $implicit: item }" }
></ng-container> </ol>
</li> }
</ol>
<ng-template #linkTemplate let-item> <ng-template #linkTemplate let-item>
<a [routerLink]="item.path"> {{ item.name | abpLocalization }}</a> <a [routerLink]="item.path"> {{ item.name | abpLocalization }}</a>

8
npm/ng-packs/packages/theme-shared/src/lib/components/checkbox/checkbox.component.ts

@ -16,9 +16,11 @@ import { NG_VALUE_ACCESSOR } from '@angular/forms';
(blur)="checkboxBlur.next()" (blur)="checkboxBlur.next()"
(focus)="checkboxFocus.next()" (focus)="checkboxFocus.next()"
/> />
<label *ngIf="label" [ngClass]="labelClass" [for]="checkboxId"> @if (label) {
{{ label | abpLocalization }} <label [ngClass]="labelClass" [for]="checkboxId">
</label> {{ label | abpLocalization }}
</label>
}
</div> </div>
`, `,
providers: [ providers: [

89
npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.html

@ -1,42 +1,51 @@
<div class="confirmation" *ngIf="confirmation$ | async as data"> @if (confirmation$ | async; as data) {
<div <div class="confirmation">
class="confirmation-backdrop" <div
(click)="data.options?.dismissible ? close(dismiss) : null" class="confirmation-backdrop"
></div> (click)="data.options?.dismissible ? close(dismiss) : null"
<div class="confirmation-dialog"> ></div>
<div class="icon-container" [ngClass]="data.severity" *ngIf="data.severity || isCustomIconExists(data)"> <div class="confirmation-dialog">
<div [outerHTML]="data.options.iconTemplate" *ngIf="isIconTemplateExits(data); else iconHolder" ></div> @if (data.severity || isCustomIconExists(data)) {
<ng-template #iconHolder> <div class="icon-container" [ngClass]="data.severity">
<i class="icon" [ngClass]="getIconClass(data)"></i> @if (isIconTemplateExits(data)) {
</ng-template> <div [outerHTML]="data.options.iconTemplate"></div>
</div> } @else {
<div class="content"> <i class="icon" [ngClass]="getIconClass(data)"></i>
<h1 }
class="title" </div>
*ngIf="data.title" }
[innerHTML]="data.title | abpLocalization: data.options?.titleLocalizationParams" <div class="content">
></h1> @if (data.title) {
<p <h1
class="message" class="title"
*ngIf="data.message" [innerHTML]="data.title | abpLocalization: data.options?.titleLocalizationParams"
[innerHTML]="data.message | abpLocalization: data.options?.messageLocalizationParams" ></h1>
></p> }
</div> @if (data.message) {
<div class="footer"> <p
<button class="message"
id="cancel" [innerHTML]="data.message | abpLocalization: data.options?.messageLocalizationParams"
class="btn btn-outline-primary me-2" ></p>
[innerHTML]="data.options?.cancelText || 'AbpUi::Cancel' | abpLocalization" }
*ngIf="!data?.options?.hideCancelBtn" </div>
(click)="close(reject)" <div class="footer">
></button> @if (!data?.options?.hideCancelBtn) {
<button <button
id="confirm" id="cancel"
class="btn btn-primary" class="btn btn-outline-primary me-2"
[innerHTML]="data.options?.yesText || 'AbpUi::Yes' | abpLocalization" [innerHTML]="data.options?.cancelText || 'AbpUi::Cancel' | abpLocalization"
*ngIf="!data?.options?.hideYesBtn" (click)="close(reject)"
(click)="close(confirm)" ></button>
></button> }
@if (!data?.options?.hideYesBtn) {
<button
id="confirm"
class="btn btn-primary"
[innerHTML]="data.options?.yesText || 'AbpUi::Yes' | abpLocalization"
(click)="close(confirm)"
></button>
}
</div>
</div> </div>
</div> </div>
</div> }

8
npm/ng-packs/packages/theme-shared/src/lib/components/form-input/form-input.component.ts

@ -6,9 +6,11 @@ import { NG_VALUE_ACCESSOR } from '@angular/forms';
selector: 'abp-form-input', selector: 'abp-form-input',
template: ` template: `
<div class="mb-3"> <div class="mb-3">
<label *ngIf="label" [ngClass]="labelClass" [for]="inputId"> @if (label) {
{{ label | abpLocalization }} <label [ngClass]="labelClass" [for]="inputId">
</label> {{ label | abpLocalization }}
</label>
}
<input <input
type="text" type="text"
[id]="inputId" [id]="inputId"

47
npm/ng-packs/packages/theme-shared/src/lib/components/http-error-wrapper/http-error-wrapper.component.html

@ -4,32 +4,31 @@
class="error" class="error"
[style.backgroundColor]="backgroundColor" [style.backgroundColor]="backgroundColor"
> >
<button @if (!hideCloseIcon) {
*ngIf="!hideCloseIcon" <button id="abp-close-button" type="button" class="btn-close me-2" (click)="destroy()"></button>
id="abp-close-button" }
type="button"
class="btn-close me-2"
(click)="destroy()"
></button>
<div *ngIf="!customComponent" class="row centered"> @if (!customComponent) {
<div class="col-md-12"> <div class="row centered">
<div class="error-template"> <div class="col-md-12">
<h1>{{ statusText }} {{ title | abpLocalization }}</h1> <div class="error-template">
<div class="error-details"> <h1>{{ statusText }} {{ title | abpLocalization }}</h1>
{{ details | abpLocalization }} <div class="error-details">
</div> {{ details | abpLocalization }}
<div class="error-actions"> </div>
<a <div class="error-actions">
*ngIf="isHomeShow" @if (isHomeShow) {
(click)="destroy()" <a
routerLink="/" (click)="destroy()"
class="btn btn-primary btn-md mt-2" routerLink="/"
><span class="glyphicon glyphicon-home"></span> class="btn btn-primary btn-md mt-2"
{{ { key: '::Menu:Home', defaultValue: 'Home' } | abpLocalization }} ><span class="glyphicon glyphicon-home"></span>
</a> {{ { key: '::Menu:Home', defaultValue: 'Home' } | abpLocalization }}
</a>
}
</div>
</div> </div>
</div> </div>
</div> </div>
</div> }
</div> </div>

40
npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal.component.html

@ -1,21 +1,27 @@
<ng-content></ng-content> <ng-content></ng-content>
<ng-template #modalContent let-modal> <ng-template #modalContent let-modal>
<div *ngIf="abpHeader" id="abp-modal-header" class="modal-header abp-modal-header"> @if (abpHeader) {
<ng-container *ngTemplateOutlet="abpHeader"></ng-container> <div id="abp-modal-header" class="modal-header abp-modal-header">
​ <ng-container *ngTemplateOutlet="abpHeader"></ng-container>
<button ​
id="abp-modal-close-button" <button
type="button" id="abp-modal-close-button"
class="btn-sm btn-close" type="button"
aria-label="Close" class="btn-sm btn-close"
(click)="modal.dismiss()" aria-label="Close"
></button> (click)="modal.dismiss()"
</div> ></button>
<div *ngIf="abpBody" id="abp-modal-body" class="modal-body"> </div>
<ng-container *ngTemplateOutlet="abpBody"></ng-container> }
</div> @if (abpBody) {
<div *ngIf="abpFooter" id="abp-modal-footer" class="modal-footer"> <div id="abp-modal-body" class="modal-body">
<ng-container *ngTemplateOutlet="abpFooter"></ng-container> <ng-container *ngTemplateOutlet="abpBody"></ng-container>
</div> </div>
}
@if (abpFooter) {
<div id="abp-modal-footer" class="modal-footer">
<ng-container *ngTemplateOutlet="abpFooter"></ng-container>
</div>
}
</ng-template> </ng-template>

11
npm/ng-packs/packages/theme-shared/src/lib/components/toast-container/toast-container.component.html

@ -7,9 +7,10 @@
[style.display]="toasts.length ? 'flex' : 'none'" [style.display]="toasts.length ? 'flex' : 'none'"
[@toastInOut]="toasts.length" [@toastInOut]="toasts.length"
> >
<abp-toast @for (toast of toasts; track toast.options?.id) {
[toast]="toast" <abp-toast
*ngFor="let toast of toasts; trackBy: trackByFunc" [toast]="toast"
(remove)="remove($event)" (remove)="remove($event)"
></abp-toast> ></abp-toast>
}
</div> </div>

8
npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.html

@ -3,9 +3,11 @@
<i class="fa icon" [ngClass]="iconClass" aria-hidden="true"></i> <i class="fa icon" [ngClass]="iconClass" aria-hidden="true"></i>
</div> </div>
<div class="abp-toast-content"> <div class="abp-toast-content">
<button class="abp-toast-close-button" (click)="close()" *ngIf="toast.options?.closable"> @if (toast.options?.closable) {
<i class="fa fa-times" aria-hidden="true"></i> <button class="abp-toast-close-button" (click)="close()">
</button> <i class="fa fa-times" aria-hidden="true"></i>
</button>
}
<div class="abp-toast-title"> <div class="abp-toast-title">
{{ toast.title | abpLocalization: toast.options?.titleLocalizationParams }} {{ toast.title | abpLocalization: toast.options?.titleLocalizationParams }}
</div> </div>

Loading…
Cancel
Save