diff --git a/docs/zh-Hans/CLI.md b/docs/zh-Hans/CLI.md index 3b440ed722..658545c4fd 100644 --- a/docs/zh-Hans/CLI.md +++ b/docs/zh-Hans/CLI.md @@ -166,6 +166,10 @@ CLI的一些功能需要登录到abp.io平台. 使用你的用户名登录 abp login ``` +```bash +abp login -p +``` + 请注意,新的登录将终止先前的会话并创建一个新的会话. ### logout diff --git a/docs/zh-Hans/UI/Angular/Confirmation-Service.md b/docs/zh-Hans/UI/Angular/Confirmation-Service.md index d6ff4bc3c5..a1a181837c 100644 --- a/docs/zh-Hans/UI/Angular/Confirmation-Service.md +++ b/docs/zh-Hans/UI/Angular/Confirmation-Service.md @@ -86,10 +86,32 @@ this.confirmation.warn( - `messageLocalizationParams`是用于消息本地化的插值参数. - `titleLocalizationParams` 是标题本地化的插值参数. -With the options above, the confirmation popup looks like this: +使用以上选项确认弹层窗口如下所示: ![confirmation](./images/confirmation.png) +你可以传递HTML字符串作为标题,消息或按钮文本. 例如: + +```js +const options: Partial = { + yesText: 'Yes, delete it', +}; + +this.confirmation.warn( + ` + Role Demo will be deleted +
+ Do you confirm that? + `, + 'Are you sure?', + options, +); +``` + +由于这些值现在是HTML,因此应该手动处理本地化. 参阅[LocalizationService](./Localization#using-the-localization-service)了解如何实现. + +> 注意,Angular会清除所有字符串,并且并非每个HTML字符串都可以使用. 仅显示被Angular视为"安全"的值. + ### 如何删除一个确认弹层 打开的确认弹出窗口可以通过 `clear` 方法手动删除: diff --git a/docs/zh-Hans/UI/Common/Utils/Linked-List.md b/docs/zh-Hans/UI/Common/Utils/Linked-List.md index 871db960ab..53c356628f 100644 --- a/docs/zh-Hans/UI/Common/Utils/Linked-List.md +++ b/docs/zh-Hans/UI/Common/Utils/Linked-List.md @@ -1229,7 +1229,7 @@ find(predicate: ListIteratorFunction): ListNode | undefined 从链表中找到与给定谓词匹配的第一个节点: ```js -list.addTailMany(['a', 'b', 'b', 'c']); +list.addManyTail(['a', 'b', 'b', 'c']); // "a" <-> "b" <-> "b" <-> "c" @@ -1251,7 +1251,7 @@ findIndex(predicate: ListIteratorFunction): number 从链表中找到与给定谓词匹配的第一个节点的位置: ```js -list.addTailMany(['a', 'b', 'b', 'c']); +list.addManyTail(['a', 'b', 'b', 'c']); // "a" <-> "b" <-> "b" <-> "c" @@ -1279,7 +1279,7 @@ get(position: number): ListNode | undefined 查找并返回链表中特定位置的节点: ```js -list.addTailMany(['a', 'b', 'c']); +list.addManyTail(['a', 'b', 'c']); // "a" <-> "b" <-> "c" @@ -1303,7 +1303,7 @@ indexOf(value: T, compareFn?: ListComparisonFn): number 在链表中找到匹配给定值的第一个节点位置: ```js -list.addTailMany(['a', 'b', 'b', 'c']); +list.addManyTail(['a', 'b', 'b', 'c']); // "a" <-> "b" <-> "b" <-> "c" @@ -1325,7 +1325,7 @@ i3 === -1 你可以自定义比较器 ```js -list.addTailMany([{ x: 1 }, { x: 0 }, { x: 2 }, { x: 0 }, { x: 3 }]); +list.addManyTail([{ x: 1 }, { x: 0 }, { x: 2 }, { x: 0 }, { x: 3 }]); // {"x":1} <-> {"x":0} <-> {"x":2} <-> {"x":0} <-> {"x":3} @@ -1365,7 +1365,7 @@ forEach(iteratorFn: ListIteratorFn): void 从头到尾在链表中的所有节点上运行回调函数: ```js -list.addTailMany(['a', 'b', 'c']); +list.addManyTail(['a', 'b', 'c']); // "a" <-> "b" <-> "c" @@ -1381,7 +1381,7 @@ list.forEach((node, index) => console.log(node.value + index)); 链表是可迭代的. 换句话说你可以使用诸如`for ... of`之类的方法. ```js -list.addTailMany(['a', 'b', 'c']); +list.addManyTail(['a', 'b', 'c']); // "a" <-> "b" <-> "c" @@ -1405,7 +1405,7 @@ toArray(): T[] 转换链表值为数组: ```js -list.addTailMany(['a', 'b', 'c']); +list.addManyTail(['a', 'b', 'c']); // "a" <-> "b" <-> "c" @@ -1427,7 +1427,7 @@ toNodeArray(): T[] 转换链表节点为数组: ```js -list.addTailMany(['a', 'b', 'c']); +list.addManyTail(['a', 'b', 'c']); // "a" <-> "b" <-> "c" @@ -1449,7 +1449,7 @@ toString(mapperFn: ListMapperFn = JSON.stringify): string 将链表转换为节点及其关系的字符串表示形式: ```js -list.addTailMany(['a', 2, 'c', { k: 4, v: 'd' }]); +list.addManyTail(['a', 2, 'c', { k: 4, v: 'd' }]); // "a" <-> 2 <-> "c" <-> {"k":4,"v":"d"} @@ -1507,7 +1507,7 @@ export class ListNode { - `previous`引用列表中的上一个节点. ```js -list.addTailMany([ 0, 1, 2 ]); +list.addManyTail([ 0, 1, 2 ]); console.log( list.head.value, // 0 diff --git a/npm/ng-packs/packages/account-config/src/lib/services/account-config.service.ts b/npm/ng-packs/packages/account-config/src/lib/services/account-config.service.ts index 0add43bc33..d94935c071 100644 --- a/npm/ng-packs/packages/account-config/src/lib/services/account-config.service.ts +++ b/npm/ng-packs/packages/account-config/src/lib/services/account-config.service.ts @@ -1,5 +1,6 @@ import { addAbpRoutes, eLayoutType } from '@abp/ng.core'; import { Injectable } from '@angular/core'; +import { eAccountRouteNames } from '@abp/ng.account'; @Injectable({ providedIn: 'root', @@ -7,14 +8,14 @@ import { Injectable } from '@angular/core'; export class AccountConfigService { constructor() { addAbpRoutes({ - name: 'AbpAccount::Menu:Account', + name: eAccountRouteNames.Account, path: 'account', invisible: true, layout: eLayoutType.application, children: [ - { path: 'login', name: 'AbpAccount::Login', order: 1 }, - { path: 'register', name: 'AbpAccount::Register', order: 2 }, - { path: 'manage-profile', name: 'AbpAccount::ManageYourProfile', order: 3 }, + { path: 'login', name: eAccountRouteNames.Login, order: 1 }, + { path: 'register', name: eAccountRouteNames.Register, order: 2 }, + { path: 'manage-profile', name: eAccountRouteNames.ManageProfile, order: 3 }, ], }); } diff --git a/npm/ng-packs/packages/account/src/lib/enums/index.ts b/npm/ng-packs/packages/account/src/lib/enums/index.ts new file mode 100644 index 0000000000..5ac9b6e8fa --- /dev/null +++ b/npm/ng-packs/packages/account/src/lib/enums/index.ts @@ -0,0 +1,2 @@ +export * from './components'; +export * from './route-names'; diff --git a/npm/ng-packs/packages/account/src/lib/enums/route-names.ts b/npm/ng-packs/packages/account/src/lib/enums/route-names.ts new file mode 100644 index 0000000000..810985e027 --- /dev/null +++ b/npm/ng-packs/packages/account/src/lib/enums/route-names.ts @@ -0,0 +1,6 @@ +export const enum eAccountRouteNames { + Account = 'AbpAccount::Menu:Account', + Login = 'AbpAccount::Login', + Register = 'AbpAccount::Register', + ManageProfile = 'AbpAccount::ManageYourProfile', +} diff --git a/npm/ng-packs/packages/account/src/public-api.ts b/npm/ng-packs/packages/account/src/public-api.ts index 63cb476f9b..8d1ef3c43a 100644 --- a/npm/ng-packs/packages/account/src/public-api.ts +++ b/npm/ng-packs/packages/account/src/public-api.ts @@ -1,6 +1,6 @@ export * from './lib/account.module'; export * from './lib/components'; -export * from './lib/enums/components'; +export * from './lib/enums'; export * from './lib/tokens'; export * from './lib/models'; export * from './lib/services'; diff --git a/npm/ng-packs/packages/core/src/lib/plugins/config.plugin.ts b/npm/ng-packs/packages/core/src/lib/plugins/config.plugin.ts index f9c8f45423..b2afab6072 100644 --- a/npm/ng-packs/packages/core/src/lib/plugins/config.plugin.ts +++ b/npm/ng-packs/packages/core/src/lib/plugins/config.plugin.ts @@ -10,7 +10,7 @@ import { } from '@ngxs/store'; import clone from 'just-clone'; import snq from 'snq'; -import { ABP } from '../models'; +import { ABP } from '../models/common'; import { getAbpRoutes, organizeRoutes } from '../utils/route-utils'; export const NGXS_CONFIG_PLUGIN_OPTIONS = new InjectionToken('NGXS_CONFIG_PLUGIN_OPTIONS'); @@ -30,8 +30,8 @@ export class ConfigPlugin implements NgxsPlugin { if (isInitAction && !this.initialized) { const transformedRoutes = transformRoutes(this.router.config); - let { routes } = transformedRoutes; - const { wrappers } = transformedRoutes; + let { routes, wrappers } = transformedRoutes; + wrappers = reduceWrappers(wrappers); routes = organizeRoutes(routes, wrappers); const flattedRoutes = flatRoutes(clone(routes)); @@ -118,3 +118,14 @@ function flatRoutes(routes: ABP.FullRoute[]): ABP.FullRoute[] { return flat(routes); } + +function reduceWrappers(wrappers: ABP.FullRoute[] = []) { + const existingWrappers = new Set(); + + return wrappers.filter(wrapper => { + if (existingWrappers.has(wrapper.name)) return false; + + existingWrappers.add(wrapper.name); + return true; + }); +} diff --git a/npm/ng-packs/packages/identity-config/src/lib/services/identity-config.service.ts b/npm/ng-packs/packages/identity-config/src/lib/services/identity-config.service.ts index d1b52fed8b..c1fdbb102d 100644 --- a/npm/ng-packs/packages/identity-config/src/lib/services/identity-config.service.ts +++ b/npm/ng-packs/packages/identity-config/src/lib/services/identity-config.service.ts @@ -1,5 +1,6 @@ import { addAbpRoutes, eLayoutType } from '@abp/ng.core'; import { Injectable } from '@angular/core'; +import { eIdentityRouteNames } from '@abp/ng.identity'; @Injectable({ providedIn: 'root', @@ -8,29 +9,29 @@ export class IdentityConfigService { constructor() { addAbpRoutes([ { - name: 'AbpUiNavigation::Menu:Administration', + name: eIdentityRouteNames.Administration, path: '', order: 1, wrapper: true, iconClass: 'fa fa-wrench', }, { - name: 'AbpIdentity::Menu:IdentityManagement', + name: eIdentityRouteNames.IdentityManagement, path: 'identity', order: 1, - parentName: 'AbpUiNavigation::Menu:Administration', + parentName: eIdentityRouteNames.Administration, layout: eLayoutType.application, iconClass: 'fa fa-id-card-o', children: [ { path: 'roles', - name: 'AbpIdentity::Roles', + name: eIdentityRouteNames.Roles, order: 1, requiredPolicy: 'AbpIdentity.Roles', }, { path: 'users', - name: 'AbpIdentity::Users', + name: eIdentityRouteNames.Users, order: 2, requiredPolicy: 'AbpIdentity.Users', }, diff --git a/npm/ng-packs/packages/identity/src/lib/enums/index.ts b/npm/ng-packs/packages/identity/src/lib/enums/index.ts new file mode 100644 index 0000000000..5ac9b6e8fa --- /dev/null +++ b/npm/ng-packs/packages/identity/src/lib/enums/index.ts @@ -0,0 +1,2 @@ +export * from './components'; +export * from './route-names'; diff --git a/npm/ng-packs/packages/identity/src/lib/enums/route-names.ts b/npm/ng-packs/packages/identity/src/lib/enums/route-names.ts new file mode 100644 index 0000000000..15933a5b77 --- /dev/null +++ b/npm/ng-packs/packages/identity/src/lib/enums/route-names.ts @@ -0,0 +1,6 @@ +export const enum eIdentityRouteNames { + Administration = 'AbpUiNavigation::Menu:Administration', + IdentityManagement = 'AbpIdentity::Menu:IdentityManagement', + Roles = 'AbpIdentity::Roles', + Users = 'AbpIdentity::Users', +} diff --git a/npm/ng-packs/packages/identity/src/public-api.ts b/npm/ng-packs/packages/identity/src/public-api.ts index 1a2b217931..fd26c8a649 100644 --- a/npm/ng-packs/packages/identity/src/public-api.ts +++ b/npm/ng-packs/packages/identity/src/public-api.ts @@ -4,7 +4,7 @@ export * from './lib/identity.module'; export * from './lib/actions/identity.actions'; -export * from './lib/enums/components'; +export * from './lib/enums'; export * from './lib/components'; export * from './lib/models/identity'; export * from './lib/services'; diff --git a/npm/ng-packs/packages/setting-management-config/src/lib/services/setting-management-config.service.ts b/npm/ng-packs/packages/setting-management-config/src/lib/services/setting-management-config.service.ts index 721a5a5991..a5b319ccb1 100644 --- a/npm/ng-packs/packages/setting-management-config/src/lib/services/setting-management-config.service.ts +++ b/npm/ng-packs/packages/setting-management-config/src/lib/services/setting-management-config.service.ts @@ -2,6 +2,7 @@ import { Injectable, Injector } from '@angular/core'; import { addAbpRoutes, eLayoutType, PatchRouteByName, ABP } from '@abp/ng.core'; import { getSettingTabs } from '@abp/ng.theme.shared'; import { Store } from '@ngxs/store'; +import { eSettingManagementRouteNames } from '@abp/ng.setting-management'; @Injectable({ providedIn: 'root', @@ -13,7 +14,7 @@ export class SettingManagementConfigService { constructor(private injector: Injector) { const route = { - name: 'AbpSettingManagement::Settings', + name: eSettingManagementRouteNames.Settings, path: 'setting-management', parentName: 'AbpUiNavigation::Menu:Administration', requiredPolicy: 'AbpAccount.SettingManagement', diff --git a/npm/ng-packs/packages/setting-management/src/lib/enums/index.ts b/npm/ng-packs/packages/setting-management/src/lib/enums/index.ts new file mode 100644 index 0000000000..5ac9b6e8fa --- /dev/null +++ b/npm/ng-packs/packages/setting-management/src/lib/enums/index.ts @@ -0,0 +1,2 @@ +export * from './components'; +export * from './route-names'; diff --git a/npm/ng-packs/packages/setting-management/src/lib/enums/route-names.ts b/npm/ng-packs/packages/setting-management/src/lib/enums/route-names.ts new file mode 100644 index 0000000000..86ad145f5f --- /dev/null +++ b/npm/ng-packs/packages/setting-management/src/lib/enums/route-names.ts @@ -0,0 +1,3 @@ +export const enum eSettingManagementRouteNames { + Settings = 'AbpSettingManagement::Settings', +} diff --git a/npm/ng-packs/packages/setting-management/src/public-api.ts b/npm/ng-packs/packages/setting-management/src/public-api.ts index ac030c3ccf..24e62d4da1 100644 --- a/npm/ng-packs/packages/setting-management/src/public-api.ts +++ b/npm/ng-packs/packages/setting-management/src/public-api.ts @@ -1,3 +1,3 @@ export * from './lib/setting-management.module'; export * from './lib/components/setting-management.component'; -export * from './lib/enums/components'; +export * from './lib/enums'; diff --git a/npm/ng-packs/packages/tenant-management-config/src/lib/services/tenant-management-config.service.ts b/npm/ng-packs/packages/tenant-management-config/src/lib/services/tenant-management-config.service.ts index 48a6d31c84..ab5ca4a081 100644 --- a/npm/ng-packs/packages/tenant-management-config/src/lib/services/tenant-management-config.service.ts +++ b/npm/ng-packs/packages/tenant-management-config/src/lib/services/tenant-management-config.service.ts @@ -1,25 +1,34 @@ import { Injectable } from '@angular/core'; import { addAbpRoutes, eLayoutType } from '@abp/ng.core'; - +import { eTenantManagementRouteNames } from '@abp/ng.tenant-management'; @Injectable({ providedIn: 'root', }) export class TenantManagementConfigService { constructor() { - addAbpRoutes({ - name: 'AbpTenantManagement::Menu:TenantManagement', - path: 'tenant-management', - parentName: 'AbpUiNavigation::Menu:Administration', - layout: eLayoutType.application, - iconClass: 'fa fa-users', - children: [ - { - path: 'tenants', - name: 'AbpTenantManagement::Tenants', - order: 1, - requiredPolicy: 'AbpTenantManagement.Tenants', - }, - ], - }); + addAbpRoutes([ + { + name: eTenantManagementRouteNames.Administration, + path: '', + order: 1, + wrapper: true, + iconClass: 'fa fa-wrench', + }, + { + name: eTenantManagementRouteNames.TenantManagement, + path: 'tenant-management', + parentName: eTenantManagementRouteNames.Administration, + layout: eLayoutType.application, + iconClass: 'fa fa-users', + children: [ + { + path: 'tenants', + name: eTenantManagementRouteNames.Tenants, + order: 1, + requiredPolicy: 'AbpTenantManagement.Tenants', + }, + ], + }, + ]); } } diff --git a/npm/ng-packs/packages/tenant-management/src/lib/enums/index.ts b/npm/ng-packs/packages/tenant-management/src/lib/enums/index.ts new file mode 100644 index 0000000000..5ac9b6e8fa --- /dev/null +++ b/npm/ng-packs/packages/tenant-management/src/lib/enums/index.ts @@ -0,0 +1,2 @@ +export * from './components'; +export * from './route-names'; diff --git a/npm/ng-packs/packages/tenant-management/src/lib/enums/route-names.ts b/npm/ng-packs/packages/tenant-management/src/lib/enums/route-names.ts new file mode 100644 index 0000000000..8125e28a4f --- /dev/null +++ b/npm/ng-packs/packages/tenant-management/src/lib/enums/route-names.ts @@ -0,0 +1,5 @@ +export const enum eTenantManagementRouteNames { + Administration = 'AbpUiNavigation::Menu:Administration', + TenantManagement = 'AbpTenantManagement::Menu:TenantManagement', + Tenants = 'AbpTenantManagement::Tenants', +} diff --git a/npm/ng-packs/packages/tenant-management/src/public-api.ts b/npm/ng-packs/packages/tenant-management/src/public-api.ts index 003074b2c4..3fc7cf90d5 100644 --- a/npm/ng-packs/packages/tenant-management/src/public-api.ts +++ b/npm/ng-packs/packages/tenant-management/src/public-api.ts @@ -1,7 +1,7 @@ export * from './lib/tenant-management.module'; export * from './lib/actions'; export * from './lib/components'; -export * from './lib/enums/components'; +export * from './lib/enums'; export * from './lib/models'; export * from './lib/services'; export * from './lib/states'; diff --git a/npm/ng-packs/packages/theme-basic/src/lib/components/application-layout/application-layout.component.html b/npm/ng-packs/packages/theme-basic/src/lib/components/application-layout/application-layout.component.html index 2687c2cf81..438c315c16 100644 --- a/npm/ng-packs/packages/theme-basic/src/lib/components/application-layout/application-layout.component.html +++ b/npm/ng-packs/packages/theme-basic/src/lib/components/application-layout/application-layout.component.html @@ -5,7 +5,13 @@ >
- +