diff --git a/docs/en/Tutorials/Todo/Single-Layer/Index.md b/docs/en/Tutorials/Todo/Single-Layer/Index.md index 744aff88ad..ac6a89faea 100644 --- a/docs/en/Tutorials/Todo/Single-Layer/Index.md +++ b/docs/en/Tutorials/Todo/Single-Layer/Index.md @@ -255,7 +255,7 @@ Before starting to implement these use cases, first we need to create a DTO clas [Application services](../../../Application-Services.md) typically get and return DTOs ([Data Transfer Objects](../../../Data-Transfer-Objects.md)) instead of entities. So, create a new `TodoItemDto` class under the `Services/Dtos` folder{{if UI=="Blazor"}} of your `TodoApp.Contracts` project{{end}}: ```csharp -namespace TodoApp{{if UI=="Blazor"}}.Contracts{{end}}.Services.Dtos; +namespace TodoApp.Services.Dtos; public class TodoItemDto { @@ -273,10 +273,10 @@ This is a very simple DTO class that has the same properties as the `TodoItem` e Create a `ITodoAppService` interface under the `Services` folder of the `TodoApp.Contracts` project, as shown below: ```csharp -using TodoApp.Contracts.Services.Dtos; +using TodoApp.Services.Dtos; using Volo.Abp.Application.Services; -namespace TodoApp.Contracts.Services; +namespace TodoApp.Services; public interface ITodoAppService : IApplicationService { @@ -296,17 +296,18 @@ Create a `TodoAppService` class under the `Services` folder of {{if UI=="Blazor" ```csharp {{if UI=="Blazor"}} -using TodoApp.Contracts.Services; -using TodoApp.Contracts.Services.Dtos; -using TodoApp.Host.Entities; +using TodoApp.Services; +using TodoApp.Services.Dtos; +using TodoApp.Entities; using Volo.Abp.Application.Services; +using Volo.Abp.Domain.Repositories; {{else}} using TodoApp.Entities; using Volo.Abp.Application.Services; using Volo.Abp.Domain.Repositories; -{{end}} -namespace TodoApp{{if UI=="Blazor"}}.Host{{end}}.Services; + +namespace TodoApp.Services; public class TodoAppService : ApplicationService{{if UI=="Blazor"}}, ITodoAppService{{end}} { @@ -562,8 +563,8 @@ Open the `Index.razor.cs` file in the `Pages` folder{{if UI=="Blazor"}} in your ```csharp {{if UI=="Blazor"}} using Microsoft.AspNetCore.Components; -using TodoApp.Contracts.Services; -using TodoApp.Contracts.Services.Dtos; +using TodoApp.Services; +using TodoApp.Services.Dtos; {{else}} using Microsoft.AspNetCore.Components; using TodoApp.Services; diff --git a/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureDefinition.cs b/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureDefinition.cs index 14cd0d405b..1a1e2ece3b 100644 --- a/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureDefinition.cs +++ b/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureDefinition.cs @@ -124,7 +124,7 @@ public class FeatureDefinition : ICanCreateChildFeature } /// - /// Sets a property in the dictionary. + /// Adds one or more providers to the list. /// This is a shortcut for nested calls on this object. /// public virtual FeatureDefinition WithProviders(params string[] providers) diff --git a/npm/ng-packs/angular.json b/npm/ng-packs/angular.json index 01e482cd85..7138cb5a38 100644 --- a/npm/ng-packs/angular.json +++ b/npm/ng-packs/angular.json @@ -195,15 +195,55 @@ "assets": ["apps/dev-app/src/favicon.ico", "apps/dev-app/src/assets"], "styles": [ { - "input": "node_modules/bootstrap/dist/css/bootstrap.rtl.min.css", + "input": "node_modules/@volo/ngx-lepton-x.lite/assets/css/bootstrap-dim.css", "inject": false, - "bundleName": "bootstrap-rtl.min" + "bundleName": "bootstrap-dim" }, { - "input": "node_modules/bootstrap/dist/css/bootstrap.min.css", - "inject": true, - "bundleName": "bootstrap-ltr.min" + "input": "node_modules/@volo/ngx-lepton-x.lite/assets/css/ng-bundle.css", + "inject": false, + "bundleName": "ng-bundle" + }, + { + "input": "node_modules/@volo/ngx-lepton-x.lite/assets/css/side-menu/layout-bundle.css", + "inject": false, + "bundleName": "layout-bundle" + }, + { + "input": "node_modules/@abp/ng.theme.lepton-x/assets/css/abp-bundle.css", + "inject": false, + "bundleName": "abp-bundle" + }, + { + "input": "node_modules/@volo/ngx-lepton-x.lite/assets/css/bootstrap-dim.rtl.css", + "inject": false, + "bundleName": "bootstrap-dim.rtl" + }, + { + "input": "node_modules/@volo/ngx-lepton-x.lite/assets/css/ng-bundle.rtl.css", + "inject": false, + "bundleName": "ng-bundle.rtl" + }, + { + "input": "node_modules/@volo/ngx-lepton-x.lite/assets/css/side-menu/layout-bundle.rtl.css", + "inject": false, + "bundleName": "layout-bundle.rtl" + }, + { + "input": "node_modules/@abp/ng.theme.lepton-x/assets/css/abp-bundle.rtl.css", + "inject": false, + "bundleName": "abp-bundle.rtl" + }, + { + "input":"node_modules/@volo/ngx-lepton-x.lite/assets/css/font-bundle.rtl.css", + "inject":false, + "bundleName":"font-bundle.rtl" }, + { + "input":"node_modules/@volo/ngx-lepton-x.lite/assets/css/font-bundle.css", + "inject":false, + "bundleName":"font-bundle" + }, { "input": "node_modules/@fortawesome/fontawesome-free/css/all.min.css", "inject": true, @@ -234,6 +274,7 @@ "inject": false, "bundleName": "ng-zorro-antd-tree" }, + "node_modules/bootstrap-icons/font/bootstrap-icons.css", "apps/dev-app/src/styles.scss" ], "scripts": [] diff --git a/npm/ng-packs/apps/dev-app/src/app/app.module.ts b/npm/ng-packs/apps/dev-app/src/app/app.module.ts index 52ebd38362..86e29cf0d1 100644 --- a/npm/ng-packs/apps/dev-app/src/app/app.module.ts +++ b/npm/ng-packs/apps/dev-app/src/app/app.module.ts @@ -4,7 +4,8 @@ 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 { ThemeLeptonXModule } from "@abp/ng.theme.lepton-x"; +import { SideMenuLayoutModule } from "@abp/ng.theme.lepton-x/layouts"; import { ThemeSharedModule } from '@abp/ng.theme.shared'; import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; @@ -34,7 +35,8 @@ import { AbpOAuthModule } from '@abp/ng.oauth'; TenantManagementConfigModule.forRoot(), FeatureManagementModule.forRoot(), SettingManagementConfigModule.forRoot(), - ThemeBasicModule.forRoot(), + ThemeLeptonXModule.forRoot(), + SideMenuLayoutModule.forRoot() ], providers: [APP_ROUTE_PROVIDER], declarations: [AppComponent], diff --git a/npm/ng-packs/package.json b/npm/ng-packs/package.json index 7e302ee20d..600c047ff4 100644 --- a/npm/ng-packs/package.json +++ b/npm/ng-packs/package.json @@ -42,6 +42,18 @@ }, "private": true, "devDependencies": { + "@abp/ng.account": "~7.1.0-rc.1", + "@abp/ng.account.core": "~7.1.0-rc.1", + "@abp/ng.core": "~7.1.0-rc.1", + "@abp/ng.feature-management": "~7.1.0-rc.1", + "@abp/ng.identity": "~7.1.0-rc.1", + "@abp/ng.oauth": "~7.1.0-rc.1", + "@abp/ng.permission-management": "~7.1.0-rc.1", + "@abp/ng.schematics": "~7.1.0-rc.1", + "@abp/ng.setting-management": "~7.1.0-rc.1", + "@abp/ng.tenant-management": "~7.1.0-rc.1", + "@abp/ng.theme.basic": "~7.1.0-rc.1", + "@abp/ng.theme.shared": "~7.1.0-rc.1", "@abp/utils": "~7.1.0-rc.1", "@angular-devkit/build-angular": "~15.0.1", "@angular-devkit/build-ng-packagr": "^0.1002.0", @@ -61,18 +73,6 @@ "@angular/platform-browser": "~15.0.1", "@angular/platform-browser-dynamic": "~15.0.1", "@angular/router": "~15.0.1", - "@abp/ng.account": "~7.1.0-rc.1", - "@abp/ng.account.core": "~7.1.0-rc.1", - "@abp/ng.core": "~7.1.0-rc.1", - "@abp/ng.oauth": "~7.1.0-rc.1", - "@abp/ng.feature-management": "~7.1.0-rc.1", - "@abp/ng.identity": "~7.1.0-rc.1", - "@abp/ng.permission-management": "~7.1.0-rc.1", - "@abp/ng.schematics": "~7.1.0-rc.1", - "@abp/ng.setting-management": "~7.1.0-rc.1", - "@abp/ng.tenant-management": "~7.1.0-rc.1", - "@abp/ng.theme.basic": "~7.1.0-rc.1", - "@abp/ng.theme.shared": "~7.1.0-rc.1", "@fortawesome/fontawesome-free": "^5.15.4", "@ng-bootstrap/ng-bootstrap": "^14.0.0", "@ngneat/spectator": "^10.0.0", @@ -129,7 +129,10 @@ "typescript": "4.8.4", "zone.js": "0.11.4" }, - "dependencies": {}, + "dependencies": { + "@abp/ng.theme.lepton-x": "^2.1.0-rc.1", + "bootstrap-icons": "^1.10.3" + }, "lint-staged": { "**/*.{js,jsx,ts,tsx}": [ "npx prettier --write --config .prettierrc " diff --git a/npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.ts b/npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.ts index 44cc372f32..3d52624990 100644 --- a/npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.ts +++ b/npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.ts @@ -81,7 +81,7 @@ export class PermissionManagementComponent }); }); } else { - this.selectedGroup = null; + this.setSelectedGroup(null); this._visible = false; this.visibleChange.emit(false); } @@ -110,10 +110,22 @@ export class PermissionManagementComponent modalBusy = false; + selectedGroupPermissions: PermissionWithStyle[] = []; + trackByFn: TrackByFunction = (_, item) => item.name; - get selectedGroupPermissions(): PermissionWithStyle[] { - if (!this.selectedGroup) return []; + constructor(protected service: PermissionsService, protected configState: ConfigStateService) {} + + getChecked(name: string) { + return (this.permissions.find(per => per.name === name) || { isGranted: false }).isGranted; + } + + setSelectedGroup(group: PermissionGroupDto) { + this.selectedGroup = group; + if (!this.selectedGroup) { + this.selectedGroupPermissions = []; + return; + } const margin = `margin-${ (document.body.dir as LocaleDirection) === 'rtl' ? 'right' : 'left' @@ -123,7 +135,7 @@ export class PermissionManagementComponent group => group.name === this.selectedGroup.name, ).permissions; - return permissions.map( + this.selectedGroupPermissions = permissions.map( permission => ({ ...permission, @@ -133,12 +145,6 @@ export class PermissionManagementComponent ); } - constructor(protected service: PermissionsService, protected configState: ConfigStateService) {} - - getChecked(name: string) { - return (this.permissions.find(per => per.name === name) || { isGranted: false }).isGranted; - } - setDisabled(permissions: PermissionGrantInfoDto[]) { if (permissions.length) { this.disableSelectAllTab = permissions.every( @@ -248,7 +254,7 @@ export class PermissionManagementComponent onChangeGroup(group: PermissionGroupDto) { this.setDisabled(group.permissions); - this.selectedGroup = group; + this.setSelectedGroup(group); this.setTabCheckboxState(); } @@ -291,8 +297,8 @@ export class PermissionManagementComponent return this.service.get(this.providerName, this.providerKey).pipe( tap((permissionRes: GetPermissionListResultDto) => { this.data = permissionRes; - this.selectedGroup = permissionRes.groups[0]; this.permissions = getPermissions(permissionRes.groups); + this.setSelectedGroup(permissionRes.groups[0]); this.disabledSelectAllInAllTabs = this.permissions.every( per => per.isGranted &&