mirror of https://github.com/abpframework/abp.git
committed by
GitHub
164 changed files with 9662 additions and 6384 deletions
@ -1,64 +1,89 @@ |
|||
{ |
|||
"culture": "zh-Hans", |
|||
"texts": { |
|||
"Permission:CommunityArticle": "社区文章", |
|||
"Permission:Edit": "修改", |
|||
"Waiting": "等待中", |
|||
"Approved": "已批准", |
|||
"Rejected": "已拒绝", |
|||
"Wait": "等待", |
|||
"Approve": "批准", |
|||
"Reject": "拒绝", |
|||
"ReadArticle": "阅读文章", |
|||
"Status": "状态", |
|||
"ContentSource": "内容来源", |
|||
"Details": "详情", |
|||
"Url": "url", |
|||
"Title": "标题", |
|||
"CreationTime": "创建时间", |
|||
"Save": "保存", |
|||
"SameUrlAlreadyExist": "url已存在,如果你想要添加这篇文章,你需要更改url!", |
|||
"UrlIsNotValid": "Url无效.", |
|||
"UrlNotFound" : "Url未找到.", |
|||
"UrlContentNotFound": "Url内容未找到.", |
|||
"Summary": "摘要", |
|||
"MostRead": "阅读最多", |
|||
"Latest": "最新", |
|||
"ContributeAbpCommunity": "为ABP社区做贡献", |
|||
"SubmitYourArticle": "提交你的文章", |
|||
"ContributionGuide": "贡献指南", |
|||
"BugReport": "Bug报告", |
|||
"SeeAllArticles": "查看所有的文章", |
|||
"WelcomeToABPCommunity!": "欢迎来到ABP社区!", |
|||
"MyProfile": "我的资料", |
|||
"MyOrganizations": "我的组织", |
|||
"EmailNotValid": "请输入有效的电子邮箱地址.", |
|||
"FeatureRequest": "功能请求", |
|||
"CreateArticleTitleInfo": "文章标题显示在文章列表中.", |
|||
"CreateArticleUrlInfo": "文章的原始GitHub/外部URL.", |
|||
"CreateArticleSummaryInfo": "文章的简短摘要将显示在文章列表中.", |
|||
"CreateArticleCoverInfo": "为了创建有效的文章,请添加封面图. 仅支持16:9的图片!", |
|||
"ThisExtensionIsNotAllowed": "不允许此扩展名.", |
|||
"TheFileIsTooLarge": "文件过大.", |
|||
"GoToTheArticle": "转到文章", |
|||
"Contribute": "贡献", |
|||
"OverallProgress": "总体流程", |
|||
"Done": "完成", |
|||
"Open": "打开", |
|||
"Closed": "关闭", |
|||
"LatestQuestionOnThe": "有关的最新问题", |
|||
"Stackoverflow": "Stackoverflow", |
|||
"Votes": "票数", |
|||
"Answer": "回答", |
|||
"Views": "观看次数", |
|||
"Answered": "已回答", |
|||
"WaitingForYourAnswer": "等待你的回答", |
|||
"Asked": "提问", |
|||
"AllQuestions": "所有的问题", |
|||
"NextVersion": "下一个版本", |
|||
"MilestoneErrorMessage": "无法从Github获取当前的里程碑详细信息.", |
|||
"QuestionItemErrorMessage": "无法从Stackoverflow获取最新的问题详细信息.", |
|||
"Oops": "哎呀!" |
|||
} |
|||
"culture": "zh-Hans", |
|||
"texts": { |
|||
"Permission:CommunityArticle": "社区文章", |
|||
"Permission:Edit": "修改", |
|||
"Waiting": "等待中", |
|||
"Approved": "已批准", |
|||
"Rejected": "已拒绝", |
|||
"Wait": "等待", |
|||
"Approve": "批准", |
|||
"Reject": "拒绝", |
|||
"ReadArticle": "阅读文章", |
|||
"Status": "状态", |
|||
"ContentSource": "内容来源", |
|||
"Details": "详情", |
|||
"Url": "url", |
|||
"Title": "标题", |
|||
"CreationTime": "创建时间", |
|||
"Save": "保存", |
|||
"SameUrlAlreadyExist": "url已存在,如果你想要添加这篇文章,你需要更改url!", |
|||
"UrlIsNotValid": "Url无效.", |
|||
"UrlNotFound": "Url未找到.", |
|||
"UrlContentNotFound": "Url内容未找到.", |
|||
"Summary": "摘要", |
|||
"MostRead": "阅读最多", |
|||
"Latest": "最新", |
|||
"ContributeAbpCommunity": "为ABP社区做贡献", |
|||
"SubmitYourArticle": "提交你的文章", |
|||
"ContributionGuide": "贡献指南", |
|||
"BugReport": "Bug报告", |
|||
"SeeAllArticles": "查看所有的文章", |
|||
"WelcomeToABPCommunity!": "欢迎来到ABP社区!", |
|||
"MyProfile": "我的资料", |
|||
"MyOrganizations": "我的组织", |
|||
"EmailNotValid": "请输入有效的电子邮箱地址.", |
|||
"FeatureRequest": "功能请求", |
|||
"CreateArticleTitleInfo": "文章标题显示在文章列表中.", |
|||
"CreateArticleUrlInfo": "文章的原始GitHub/外部URL.", |
|||
"CreateArticleSummaryInfo": "文章的简短摘要将显示在文章列表中.", |
|||
"CreateArticleCoverInfo": "为了创建有效的文章,请添加封面图. 仅支持16:9的图片!", |
|||
"ThisExtensionIsNotAllowed": "不允许此扩展名.", |
|||
"TheFileIsTooLarge": "文件过大.", |
|||
"GoToTheArticle": "转到文章", |
|||
"Contribute": "贡献", |
|||
"OverallProgress": "总体流程", |
|||
"Done": "完成", |
|||
"Open": "打开", |
|||
"Closed": "关闭", |
|||
"LatestQuestionOnThe": "有关的最新问题", |
|||
"Stackoverflow": "Stackoverflow", |
|||
"Votes": "票数", |
|||
"Answer": "回答", |
|||
"Views": "观看次数", |
|||
"Answered": "已回答", |
|||
"WaitingForYourAnswer": "等待你的回答", |
|||
"Asked": "提问", |
|||
"AllQuestions": "所有的问题", |
|||
"NextVersion": "下一个版本", |
|||
"MilestoneErrorMessage": "无法从Github获取当前的里程碑详细信息.", |
|||
"QuestionItemErrorMessage": "无法从Stackoverflow获取最新的问题详细信息.", |
|||
"Oops": "哎呀!", |
|||
"CreateArticleSuccessMessage": "文章提交成功. 网站管理员审核通过后将被发布.", |
|||
"ChooseCoverImage": "选项一张封面图片", |
|||
"CoverImage": "封面图片", |
|||
"ShareYourExperiencesWithTheABPFramework": "分享你的ABP Framework经验!", |
|||
"Optional": "可选的", |
|||
"UpdateUserWebSiteInfo": "示例: https://johndoe.com", |
|||
"UpdateUserTwitterInfo": "示例: johndoe", |
|||
"UpdateUserGithubInfo": "示例: johndoe", |
|||
"UpdateUserLinkedinInfo": "示例: https://www.linkedin.com/...", |
|||
"UpdateUserCompanyInfo": "示例v: Volosoft", |
|||
"UpdateUserJobTitleInfo": "示例: Software Developer", |
|||
"UserName": "用户名", |
|||
"Company": "公司", |
|||
"PersonalWebsite": "个人网站", |
|||
"RegistrationDate": "注册时间", |
|||
"Social": "社交", |
|||
"Biography": "传记", |
|||
"HasNoPublishedArticlesYet": "尚未发表文章", |
|||
"Author": "作者", |
|||
"LatestGithubAnnouncements": "最新的Github公告", |
|||
"SeeAllAnnouncements": "查看所有公告", |
|||
"LatestBlogPost": "最新博客文章", |
|||
"Edit": "修改", |
|||
"ProfileImageChange": "更改资料图片", |
|||
"BlogItemErrorMessage": "无法从ABP获取最新的博客文章详细信息.", |
|||
"PlannedReleaseDate": "计划发布日期" |
|||
} |
|||
|
|||
} |
|||
@ -0,0 +1,54 @@ |
|||
# ABP Framework 3.3 to 4.0 Migration Guide |
|||
|
|||
## Identity Server Changes |
|||
|
|||
ABP Framework upgrades the [IdentityServer4](https://www.nuget.org/packages/IdentityServer4) library from 3.x to 4.x with the ABP Framework version 4.0. IdentityServer 4.x has a lot of changes, some of them are **breaking changes in the data structure**. |
|||
|
|||
### Database Changes |
|||
|
|||
**So, if you are upgrading from 3.x, then there are some change should be done in your database.** |
|||
|
|||
#### ApiScope |
|||
|
|||
As the **most important breaking change**, Identity Server 4.x places the `ApiScope` as an independent aggregate root. Previously it was a part of the to `ApiResource` aggregate. This requires manual operation. See the *Database Migration* section. |
|||
|
|||
Also, added `Enabled(string)` and `Description(bool,true)` properties. |
|||
|
|||
#### Client |
|||
|
|||
* Added `RequireRequestObject (bool)` and `AllowedIdentityTokenSigningAlgorithms (string)` properties. |
|||
* Changed default value of `RequireConsent` from `true` to `false`. |
|||
* Changed default value of `RequirePkce` from `false` to `true`. |
|||
|
|||
#### DeviceFlowCodes |
|||
|
|||
* Added `SessionId (string)` and `Description (string)` properties. |
|||
|
|||
#### PersistedGrant |
|||
|
|||
* Added `SessionId (string)` and `ShowInDiscoveryDocument (bool, default: true)` properties |
|||
|
|||
#### ApiResource |
|||
|
|||
* Added `AllowedAccessTokenSigningAlgorithms (string)` and `Description (string)` and `ConsumedTime (DateTime?)` properties |
|||
|
|||
#### ApiScope |
|||
|
|||
* Before it was a property of `ApiResource`, now it becomes an independent aggregate root. |
|||
|
|||
## Migrating the Database |
|||
|
|||
> Attention: **Please backup your database** before the migration! |
|||
|
|||
If you are using **Entity Framework Core**, you need to add a new database migration, using the `Add-Migration` command, and apply changes to the database. Please **review the migration** script to understand if it effects your existing data. Otherwise, you may **loose some of your configuration**. |
|||
|
|||
If you haven't customize the `IdentityServerDataSeedContributor` and haven't customized the initial data inside the `IdentityServer*` tables; |
|||
|
|||
1. Update `IdentityServerDataSeedContributor` class by comparing to [the latest code](https://github.com/abpframework/abp/blob/dev/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/IdentityServer/IdentityServerDataSeedContributor.cs). You probably only need to add the `CreateApiScopesAsync` method and the code related to it. |
|||
2. Then you can simply clear all the **table data** in these tables then execute the `DbMigrator` application again to fill it with the new configuration. |
|||
|
|||
If you've customize your IdentityServer configuration in the database or in the seed data, you should understand the changes and upgrade your code/data accordingly. |
|||
|
|||
### Related Resources |
|||
* https://leastprivilege.com/2020/06/19/announcing-identityserver4-v4-0/ |
|||
* https://github.com/IdentityServer/IdentityServer4/issues/4592 |
|||
|
After Width: | Height: | Size: 51 KiB |
@ -0,0 +1,24 @@ |
|||
# ASP.NET Core MVC / Razor Pages UI: JavaScript Auth API |
|||
|
|||
Auth API allows you to check permissions (policies) for the current user in the client side. In this way, you can conditionally show/hide UI parts or perform your client side logic based on the current permissions. |
|||
|
|||
> This document only explains the JavaScript API. See the [authorization document](../../../Authorization.md) to understand the ABP authorization & permission system. |
|||
|
|||
## Basic Usage |
|||
|
|||
`abp.auth.isGranted(...)` function is used to check if a permission/policy has granted or not: |
|||
|
|||
````js |
|||
if (abp.auth.isGranted('DeleteUsers')) { |
|||
//TODO: Delete the user |
|||
} else { |
|||
alert("You don't have permission to delete a user!"); |
|||
} |
|||
```` |
|||
|
|||
## Other Fields & Functions |
|||
|
|||
* ` abp.auth.isAnyGranted(...)`: Gets one or more permission/policy names and returns `true` if at least one of them has granted. |
|||
* `abp.auth.areAllGranted(...)`: Gets one or more permission/policy names and returns `true` if all of them of them have granted. |
|||
* `abp.auth.policies`: This is an object where its keys are the permission/policy names. You can find all permission/policy names here. |
|||
* `abp.auth.grantedPolicies`: This is an object where its keys are the permission/policy names. You can find the granted permission/policy names here. |
|||
@ -0,0 +1,56 @@ |
|||
# ASP.NET Core MVC / Razor Pages UI: JavaScript UI Block/Busy API |
|||
|
|||
UI Block API disables (blocks) the page or a part of the page. |
|||
|
|||
## Basic Usage |
|||
|
|||
**Example: Block (disable) the complete page** |
|||
|
|||
````js |
|||
abp.ui.block(); |
|||
```` |
|||
|
|||
**Example: Block (disable) an HTML element** |
|||
|
|||
````js |
|||
abp.ui.block('#MyContainer'); |
|||
```` |
|||
|
|||
**Example: Enables the previously blocked element or page:** |
|||
|
|||
````js |
|||
abp.ui.unblock(); |
|||
```` |
|||
|
|||
## Options |
|||
|
|||
`abp.ui.block()` method can get an options object which may contain the following fields: |
|||
|
|||
* `elm`: An optional selector to find the element to be blocked (e.g. `#MyContainerId`). If not provided, the entire page is blocked. The selector can also be directly passed to the `block()` method as shown above. |
|||
* `busy`: Set to `true` to show a progress indicator on the blocked area. |
|||
* `promise`: A promise object with `always` or `finally` callbacks. This can be helpful if you want to automatically unblock the blocked area when a deferred operation completes. |
|||
|
|||
**Example: Block an element with busy indicator** |
|||
|
|||
````js |
|||
abp.ui.block({ |
|||
elm: '#MySection', |
|||
busy: true |
|||
}); |
|||
```` |
|||
|
|||
The resulting UI will look like below: |
|||
|
|||
 |
|||
|
|||
## setBusy |
|||
|
|||
`abp.ui.setBusy(...)` and `abp.ui.clearBusy()` are shortcut functions if you want to use the block with `busy` option. |
|||
|
|||
**Example: Block with busy** |
|||
|
|||
````js |
|||
abp.ui.setBusy('#MySection'); |
|||
```` |
|||
|
|||
Then you can use `abp.ui.clearBusy();` to re-enable the busy area/page. |
|||
@ -0,0 +1,49 @@ |
|||
# ASP.NET Core MVC / Razor Pages UI: JavaScript CurrentUser API |
|||
|
|||
`abp.currentUser` is an object that contains information about the current user of the application. |
|||
|
|||
> This document only explains the JavaScript API. See the [CurrentUser document](../../../CurrentUser.md) to get information about the current user in the server side. |
|||
|
|||
## Authenticated User |
|||
|
|||
If the user was authenticated, this object will be something like below: |
|||
|
|||
````js |
|||
{ |
|||
isAuthenticated: true, |
|||
id: "34f1f4a7-13cc-4b91-84d1-b91c87afa95f", |
|||
tenantId: null, |
|||
userName: "john", |
|||
name: "John", |
|||
surName: "Nash", |
|||
email: "john.nash@abp.io", |
|||
emailVerified: true, |
|||
phoneNumber: null, |
|||
phoneNumberVerified: false, |
|||
roles: ["moderator","supporter"] |
|||
} |
|||
```` |
|||
|
|||
So, `abp.currentUser.userName` returns `john` in this case. |
|||
|
|||
## Anonymous User |
|||
|
|||
If the user was not authenticated, this object will be something like below: |
|||
|
|||
````js |
|||
{ |
|||
isAuthenticated: false, |
|||
id: null, |
|||
tenantId: null, |
|||
userName: null, |
|||
name: null, |
|||
surName: null, |
|||
email: null, |
|||
emailVerified: false, |
|||
phoneNumber: null, |
|||
phoneNumberVerified: false, |
|||
roles: [] |
|||
} |
|||
```` |
|||
|
|||
You can check `abp.currentUser.isAuthenticated` to understand if the use was authenticated or not. |
|||
@ -0,0 +1,117 @@ |
|||
# ASP.NET Core MVC / Razor Pages UI: JavaScript DOM API |
|||
|
|||
`abp.dom` (Document Object Model) provides events that you can subscribe to get notified when elements dynamically added to and removed from the page (DOM). |
|||
|
|||
It is especially helpful if you want to initialize the new loaded elements. This is generally needed when you dynamically add elements to DOM (for example, get some HTML elements via AJAX) after page initialization. |
|||
|
|||
> ABP uses the [MutationObserver](https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver) to observe the changes made on the DOM. |
|||
|
|||
## Node Events |
|||
|
|||
### onNodeAdded |
|||
|
|||
This event is triggered when an element is added to the DOM. Example: |
|||
|
|||
````js |
|||
abp.dom.onNodeAdded(function(args){ |
|||
console.log(args.$el); |
|||
}); |
|||
```` |
|||
|
|||
`args` object has the following fields; |
|||
|
|||
* `$el`: The JQuery selection to get the new element inserted to the DOM. |
|||
|
|||
### onNodeRemoved |
|||
|
|||
This event is triggered when an element is removed from the DOM. Example: |
|||
|
|||
````js |
|||
abp.dom.onNodeRemoved(function(args){ |
|||
console.log(args.$el); |
|||
}); |
|||
```` |
|||
|
|||
`args` object has the following fields; |
|||
|
|||
* `$el`: The JQuery selection to get the element removed from the DOM. |
|||
|
|||
## Pre-Build Initializers |
|||
|
|||
ABP Framework is using the DOM events to initialize some kind of HTML elements when they are added to the DOM after than the page was already initialized. |
|||
|
|||
> Note that the same initializers also work if these elements were already included in the initial DOM. So, whether they are initially or lazy loaded, they work as expected. |
|||
|
|||
### Form Initializer |
|||
|
|||
The Form initializer (defined as `abp.dom.initializers.initializeForms`) initializes the lazy loaded forms; |
|||
|
|||
* Automatically enabled the `unobtrusive` validation on the form. |
|||
* Can automatically show a confirmation message when you submit the form. To enable this feature, just add `data-confirm` attribute with a message (like `data-confirm="Are you sure?"`) to the `form` element. |
|||
* If the `form` element has `data-ajaxForm="true"` attribute, then automatically calls the `.abpAjaxForm()` on the `form` element, to make the form posted via AJAX. |
|||
|
|||
See the [Forms & Validation](../Forms-Validation.md) document for more. |
|||
|
|||
### Script Initializer |
|||
|
|||
Script initializer (`abp.dom.initializers.initializeScript`) can execute a JavaScript code for a DOM element. |
|||
|
|||
**Example: Lazy load a component and execute some code when the element has loaded** |
|||
|
|||
Assume that you've a container to load the element inside: |
|||
|
|||
````html |
|||
<div id="LazyComponent"></div> |
|||
```` |
|||
|
|||
And this is the component that will be loaded via AJAX from the server and inserted into the container: |
|||
|
|||
````html |
|||
<div data-script-class="MyCustomClass"> |
|||
<p>Sample message</p> |
|||
</div> |
|||
```` |
|||
|
|||
`data-script-class="MyCustomClass"` indicates the JavaScript class that will be used to perform some logic on this element: |
|||
|
|||
`MyCustomClass` is a global object defined as shown below: |
|||
|
|||
````js |
|||
MyCustomClass = function(){ |
|||
|
|||
function initDom($el){ |
|||
$el.css('color', 'red'); |
|||
} |
|||
|
|||
return { |
|||
initDom: initDom |
|||
} |
|||
}; |
|||
```` |
|||
|
|||
`initDom` is the function that is called by the ABP Framework. The `$el` argument is the loaded HTML element as a JQuery selection. |
|||
|
|||
Finally, you can load the component inside the container after an AJAX call: |
|||
|
|||
````js |
|||
$(function () { |
|||
setTimeout(function(){ |
|||
$.get('/get-my-element').then(function(response){ |
|||
$('#LazyComponent').html(response); |
|||
}); |
|||
}, 2000); |
|||
}); |
|||
```` |
|||
|
|||
Script Initialization system is especially helpful if you don't know how and when the component will be loaded into the DOM. This can be possible if you've developed a reusable UI component in a library and you want the application developer shouldn't care how to initialize the component in different use cases. |
|||
|
|||
> Script initialization doesn't work if the component was loaded in the initial DOM. In this case, you are responsible to initialize it. |
|||
|
|||
### Other Initializers |
|||
|
|||
The following Bootstrap components and libraries are automatically initialized when they are added to the DOM: |
|||
|
|||
* Tooltip |
|||
* Popover |
|||
* Timeage |
|||
|
|||
@ -0,0 +1,15 @@ |
|||
# ASP.NET Core MVC / Razor Pages UI: JavaScript Features API |
|||
|
|||
`abp.features` API allows you to check features or get the values of the features on the client side. You can read the current value of a feature in the client side only if it is allowed by the feature definition (on the server side). |
|||
|
|||
> This document only explains the JavaScript API. See the [Features](../../../Features.md) document to understand the ABP Features system. |
|||
|
|||
## Basic Usage |
|||
|
|||
`abp.features.values` can be used to access to the all feature values. |
|||
|
|||
````js |
|||
var excelExportFeatureValue = abp.features.values["ExportingToExcel"]; |
|||
```` |
|||
|
|||
Then you can check the value of the feature to perform your logic. |
|||
@ -1,3 +1,50 @@ |
|||
# ASP.NET Core MVC / Razor Pages UI: JavaScript Logging API |
|||
|
|||
TODO |
|||
`abp.log` API is used to write simple logs in the client side. |
|||
|
|||
> The logs are written to console, using the `console.log`, by default. |
|||
|
|||
> This document is for simple client side logging. See the [Logging](../../../Logging.md) document for server side logging system. |
|||
|
|||
## Basic Usage |
|||
|
|||
Use one of the `abp.log.xxx(...)` methods based on the severity of your log message. |
|||
|
|||
````js |
|||
abp.log.debug("Some debug log here..."); //Logging a simple debug message |
|||
abp.log.info({ name: "john", age: 42 }); //Logging an object as an information log |
|||
abp.log.warn("A warning message"); //Logging a warning message |
|||
abp.log.error('An error happens...'); //Error message |
|||
abp.log.fatal('Network connection has gone away!'); //Fatal error |
|||
```` |
|||
|
|||
## Log Levels |
|||
|
|||
There are 5 levels for a log message: |
|||
|
|||
* DEBUG = 1 |
|||
* INFO = 2 |
|||
* WARN = 3 |
|||
* ERROR = 4 |
|||
* FATAL = 5 |
|||
|
|||
These are defined in the `abp.log.levels` object (like `abp.log.levels.WARN`). |
|||
|
|||
### Changing the Current Log Level |
|||
|
|||
You can control the log level as shown below: |
|||
|
|||
````js |
|||
abp.log.level = abp.log.levels.WARN; |
|||
```` |
|||
|
|||
Default log level is `DEBUG`. |
|||
|
|||
### Logging with Specifying the Level |
|||
|
|||
Instead of calling `abp.log.info(...)` function, you can use the `abp.log.log` by specifying the log level as a parameter: |
|||
|
|||
````js |
|||
abp.log.log("log message...", abp.log.levels.INFO); |
|||
```` |
|||
|
|||
|
|||
@ -0,0 +1,40 @@ |
|||
# ASP.NET Core MVC / Razor Pages UI: JavaScript Resource Loader API |
|||
|
|||
`abp.ResourceLoader` is a service that can load a JavaScript or CSS file on demand. It guarantees to load the file only once even if you request multiple times. |
|||
|
|||
## Loading Script Files |
|||
|
|||
`abp.ResourceLoader.loadScript(...)` function **loads** a JavaScript file from the server and **executes** it. |
|||
|
|||
**Example: Load a JavaScript file** |
|||
|
|||
````js |
|||
abp.ResourceLoader.loadScript('/Pages/my-script.js'); |
|||
```` |
|||
|
|||
### Parameters |
|||
|
|||
`loadScript` function can get three parameters; |
|||
|
|||
* `url` (required, `string`): The URL of the script file to be loaded. |
|||
* `loadCallback` (optional, `function`): A callback function that is called once the script is loaded & executed. In this callback you can safely use the code in the script file. This callback is called even if the file was loaded before. |
|||
* `failCallback` (optional, `function`): A callback function that is called if loading the script fails. |
|||
|
|||
**Example: Provide the `loadCallback` argument** |
|||
|
|||
````js |
|||
abp.ResourceLoader.loadScript('/Pages/my-script.js', function() { |
|||
console.log('successfully loaded :)'); |
|||
}); |
|||
```` |
|||
|
|||
## Loading Style Files |
|||
|
|||
`abp.ResourceLoader.loadStyle(...)` function adds a `link` element to the `head` of the document for the given URL, so the CSS file is automatically loaded by the browser. |
|||
|
|||
**Example: Load a CSS file** |
|||
|
|||
````js |
|||
abp.ResourceLoader.loadStyle('/Pages/my-styles.css'); |
|||
```` |
|||
|
|||
|
After Width: | Height: | Size: 135 KiB |
@ -1,16 +0,0 @@ |
|||
$(function () { |
|||
$('.dropdown-menu a.dropdown-toggle').on('click', function (e) { |
|||
if (!$(this).next().hasClass('show')) { |
|||
$(this).parents('.dropdown-menu').first().find('.show').removeClass("show"); |
|||
} |
|||
|
|||
var $subMenu = $(this).next(".dropdown-menu"); |
|||
$subMenu.toggleClass('show'); |
|||
|
|||
$(this).parents('li.nav-item.dropdown.show').on('hidden.bs.dropdown', function (e) { |
|||
$('.dropdown-submenu .show').removeClass("show"); |
|||
}); |
|||
|
|||
return false; |
|||
}); |
|||
}); |
|||
@ -0,0 +1,20 @@ |
|||
using Blazorise; |
|||
|
|||
namespace Volo.Abp.BlazoriseUI |
|||
{ |
|||
public class BreadcrumbItem |
|||
{ |
|||
public string Text { get; set; } |
|||
|
|||
public object Icon { get; set; } |
|||
|
|||
public string Url { get; set; } |
|||
|
|||
public BreadcrumbItem(string text, string url = null, object icon = null) |
|||
{ |
|||
Text = text; |
|||
Url = url; |
|||
Icon = icon; |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,37 @@ |
|||
<Row Class="entry-row"> |
|||
<Column ColumnSize="ColumnSize.IsAuto"> |
|||
<h1 class="content-header-title">@Title</h1> |
|||
</Column> |
|||
@if (BreadcrumbItems.Any()) |
|||
{ |
|||
<Column ColumnSize="ColumnSize.IsAuto.OnWidescreen" Padding="Padding.Is0.FromLeft.OnWidescreen"> |
|||
<Breadcrumb Mode="@(BreadcrumbShowCurrent ? BreadcrumbMode.Auto : BreadcrumbMode.None)"> |
|||
@if (BreadcrumbShowHome) |
|||
{ |
|||
<BreadcrumbItem> |
|||
<BreadcrumbLink To="/"> |
|||
<Icon Name="IconName.Home" /> |
|||
</BreadcrumbLink> |
|||
</BreadcrumbItem> |
|||
} |
|||
@foreach (var item in BreadcrumbItems) |
|||
{ |
|||
<BreadcrumbItem> |
|||
<BreadcrumbLink To="@item.Url"> |
|||
@if (item.Icon != null) |
|||
{ |
|||
<Icon Name="@item.Icon" /> |
|||
} |
|||
@item.Text |
|||
</BreadcrumbLink> |
|||
</BreadcrumbItem> |
|||
} |
|||
</Breadcrumb> |
|||
</Column> |
|||
} |
|||
<Column> |
|||
<Row Class="justify-content-end mx-n1"> |
|||
@ChildContent |
|||
</Row> |
|||
</Column> |
|||
</Row> |
|||
@ -0,0 +1,29 @@ |
|||
using System.Collections.Generic; |
|||
using Blazorise; |
|||
using Microsoft.AspNetCore.Components; |
|||
|
|||
namespace Volo.Abp.BlazoriseUI.Components |
|||
{ |
|||
public partial class PageHeader : ComponentBase |
|||
{ |
|||
[Parameter] |
|||
public string Title { get; set; } |
|||
|
|||
[Parameter] |
|||
public bool BreadcrumbShowHome { get; set; } = true; |
|||
|
|||
[Parameter] |
|||
public bool BreadcrumbShowCurrent { get; set; } = true; |
|||
|
|||
[Parameter] |
|||
public RenderFragment ChildContent { get; set; } |
|||
|
|||
[Parameter] |
|||
public List<BreadcrumbItem> BreadcrumbItems { get; set; } |
|||
|
|||
public PageHeader() |
|||
{ |
|||
BreadcrumbItems = new List<BreadcrumbItem>(); |
|||
} |
|||
} |
|||
} |
|||
@ -1,9 +1,13 @@ |
|||
namespace Volo.Abp.Settings |
|||
using System.Collections.Generic; |
|||
|
|||
namespace Volo.Abp.Settings |
|||
{ |
|||
public interface ISettingDefinitionContext |
|||
{ |
|||
SettingDefinition GetOrNull(string name); |
|||
|
|||
IReadOnlyList<SettingDefinition> GetAll(); |
|||
|
|||
void Add(params SettingDefinition[] definitions); |
|||
} |
|||
} |
|||
} |
|||
|
|||
@ -0,0 +1,6 @@ |
|||
{ |
|||
"culture": "zh-Hans", |
|||
"texts": { |
|||
"hello": "你好" |
|||
} |
|||
} |
|||
@ -0,0 +1,6 @@ |
|||
{ |
|||
"culture": "zh-Hans", |
|||
"texts": { |
|||
"Volo.Abp.Http.DynamicProxying:10001": "业务异常: {0}" |
|||
} |
|||
} |
|||
@ -0,0 +1,6 @@ |
|||
{ |
|||
"culture": "zh-Hans", |
|||
"texts": { |
|||
"SeeYou": "再见" |
|||
} |
|||
} |
|||
@ -0,0 +1,7 @@ |
|||
{ |
|||
"culture": "zh-Hans", |
|||
"texts": { |
|||
"HelloText": "你好 {0}", |
|||
"HowAreYou": "你好吗?" |
|||
} |
|||
} |
|||
@ -1,56 +1,58 @@ |
|||
{ |
|||
"culture": "zh-Hans", |
|||
"texts": { |
|||
"Menu:Blogs": "博客", |
|||
"Menu:BlogManagement": "博客管理", |
|||
"Permission:Management": "管理", |
|||
"Permission:Edit": "编辑", |
|||
"Permission:Create": "创建", |
|||
"Permission:Delete": "删除", |
|||
"Permission:Blogging": "博客", |
|||
"Permission:Blogs": "博客", |
|||
"Permission:Posts": "帖子", |
|||
"Permission:Tags": "标签", |
|||
"Permission:Comments": "评论", |
|||
"Title": "标题", |
|||
"Delete": "删除", |
|||
"Reply": "回复", |
|||
"ReplyTo": "回复 {0}", |
|||
"ContinueReading": "继续阅读", |
|||
"DaysAgo": "{0}天前", |
|||
"YearsAgo": "{0}年前", |
|||
"MonthsAgo": "{0}月前", |
|||
"WeeksAgo": "{0}周前", |
|||
"MinutesAgo": "{0}分前", |
|||
"SecondsAgo": "{0}秒前", |
|||
"HoursAgo": "{0}小时前", |
|||
"Now": "刚刚", |
|||
"Content": "内容", |
|||
"SeeAll": "查看所有", |
|||
"PopularTags": "热门标签", |
|||
"WiewsWithCount": "{0}人查看", |
|||
"LastPosts": "最后的帖子", |
|||
"LeaveComment": "发布评论", |
|||
"TagsInThisArticle": "文章中的标签", |
|||
"Posts": "帖子", |
|||
"Edit": "编辑", |
|||
"BLOG": "博客", |
|||
"CommentDeletionWarningMessage": "评论将被删除.", |
|||
"PostDeletionWarningMessage": "帖子将被删除", |
|||
"BlogDeletionWarningMessage": "博客将被删除.", |
|||
"AreYouSure": "你确定吗?", |
|||
"CommentWithCount": "{0}个评论", |
|||
"Comment": "评论", |
|||
"ShareOnTwitter": "分享到Twitter", |
|||
"CoverImage": "封面图", |
|||
"CreateANewPost": "创建一个新帖子", |
|||
"CreateANewBlog": "创建一个新博客", |
|||
"WhatIsNew": "最新消息", |
|||
"Name": "名称", |
|||
"ShortName": "简称", |
|||
"CreationTime": "创建时间", |
|||
"Description": "描述", |
|||
"Blogs": "博客", |
|||
"Tags": "标签" |
|||
"culture": "zh-Hans", |
|||
"texts": { |
|||
"Menu:Blogs": "博客", |
|||
"Menu:BlogManagement": "博客管理", |
|||
"Permission:Management": "管理", |
|||
"Permission:Edit": "编辑", |
|||
"Permission:Create": "创建", |
|||
"Permission:Delete": "删除", |
|||
"Permission:Blogging": "博客", |
|||
"Permission:Blogs": "博客", |
|||
"Permission:Posts": "帖子", |
|||
"Permission:Tags": "标签", |
|||
"Permission:Comments": "评论", |
|||
"Title": "标题", |
|||
"Delete": "删除", |
|||
"Reply": "回复", |
|||
"ReplyTo": "回复 {0}", |
|||
"ContinueReading": "继续阅读", |
|||
"DaysAgo": "{0}天前", |
|||
"YearsAgo": "{0}年前", |
|||
"MonthsAgo": "{0}月前", |
|||
"WeeksAgo": "{0}周前", |
|||
"MinutesAgo": "{0}分前", |
|||
"SecondsAgo": "{0}秒前", |
|||
"HoursAgo": "{0}小时前", |
|||
"Now": "刚刚", |
|||
"Content": "内容", |
|||
"SeeAll": "查看所有", |
|||
"PopularTags": "热门标签", |
|||
"WiewsWithCount": "{0}人查看", |
|||
"LastPosts": "最后的帖子", |
|||
"LeaveComment": "发布评论", |
|||
"TagsInThisArticle": "文章中的标签", |
|||
"Posts": "帖子", |
|||
"Edit": "编辑", |
|||
"BLOG": "博客", |
|||
"CommentDeletionWarningMessage": "评论将被删除.", |
|||
"PostDeletionWarningMessage": "帖子将被删除", |
|||
"BlogDeletionWarningMessage": "博客将被删除.", |
|||
"AreYouSure": "你确定吗?", |
|||
"CommentWithCount": "{0}个评论", |
|||
"Comment": "评论", |
|||
"ShareOnTwitter": "分享到Twitter", |
|||
"CoverImage": "封面图", |
|||
"CreateANewPost": "创建一个新帖子", |
|||
"CreateANewBlog": "创建一个新博客", |
|||
"WhatIsNew": "最新消息", |
|||
"Name": "名称", |
|||
"ShortName": "简称", |
|||
"CreationTime": "创建时间", |
|||
"Description": "描述", |
|||
"Blogs": "博客", |
|||
"Tags": "标签", |
|||
"ShareOn": "分享", |
|||
"TitleLengthWarning": "保持标题大小不超过60个字符,实现SEO友好!" |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,22 @@ |
|||
{ |
|||
"culture": "zh-Hans", |
|||
"texts": { |
|||
"PickYourReaction": "选择你的回应", |
|||
"YourComment": "你的评论", |
|||
"YourReply": "你的回复", |
|||
"Comments": "评论", |
|||
"Send": "发送", |
|||
"Delete": "删除", |
|||
"Reply": "回复", |
|||
"Update": "更新", |
|||
"Edit": "修改", |
|||
"LoginToAddComment": "登录添加评论", |
|||
"LoginToReply": "登录进行回复", |
|||
"MessageDeletionConfirmationMessage": "这条评论将被完全删除", |
|||
"CommentAuthorizationExceptionMessage": "这些评论不允许公开显示", |
|||
"Undo": "撤消", |
|||
"RatingUndoMessage": "您的评分将被撤消", |
|||
"LoginToRate": "登录进行评分", |
|||
"Star": "星" |
|||
} |
|||
} |
|||
@ -0,0 +1,9 @@ |
|||
namespace Volo.Abp.IdentityServer.ApiResources |
|||
{ |
|||
public class ApiResourcePropertyConsts |
|||
{ |
|||
public static int KeyMaxLength { get; set; } = 250; |
|||
|
|||
public static int ValueMaxLength { get; set; } = 2000; |
|||
} |
|||
} |
|||
@ -0,0 +1,7 @@ |
|||
namespace Volo.Abp.IdentityServer.ApiResources |
|||
{ |
|||
public class ApiResourceScopeConsts |
|||
{ |
|||
public static int ScopeMaxLength { get; set; } = 200; |
|||
} |
|||
} |
|||
@ -0,0 +1,20 @@ |
|||
namespace Volo.Abp.IdentityServer.ApiResources |
|||
{ |
|||
public class ApiResourceSecretConsts |
|||
{ |
|||
/// <summary>
|
|||
/// Default value: 250
|
|||
/// </summary>
|
|||
public static int TypeMaxLength { get; set; } = 250; |
|||
|
|||
/// <summary>
|
|||
/// Default value: 4000
|
|||
/// </summary>
|
|||
public static int ValueMaxLength { get; set; } = 4000; |
|||
|
|||
/// <summary>
|
|||
/// Default value: 1000
|
|||
/// </summary>
|
|||
public static int DescriptionMaxLength { get; set; } = 1000; |
|||
} |
|||
} |
|||
@ -1,9 +0,0 @@ |
|||
namespace Volo.Abp.IdentityServer.ApiResources |
|||
{ |
|||
public class ApiScopeConsts |
|||
{ |
|||
public const int NameMaxLength = 200; |
|||
public const int DisplayNameMaxLength = 200; |
|||
public const int DescriptionMaxLength = 1000; |
|||
} |
|||
} |
|||
@ -0,0 +1,11 @@ |
|||
namespace Volo.Abp.IdentityServer.ApiScopes |
|||
{ |
|||
public class ApiScopeConsts |
|||
{ |
|||
public static int NameMaxLength { get; set; } = 200; |
|||
|
|||
public static int DisplayNameMaxLength { get; set; } = 200; |
|||
|
|||
public static int DescriptionMaxLength { get; set; } = 1000; |
|||
} |
|||
} |
|||
@ -0,0 +1,9 @@ |
|||
namespace Volo.Abp.IdentityServer.ApiScopes |
|||
{ |
|||
public class ApiScopePropertyConsts |
|||
{ |
|||
public static int KeyMaxLength { get; set; } = 250; |
|||
|
|||
public static int ValueMaxLength { get; set; } = 2000; |
|||
} |
|||
} |
|||
@ -1,22 +1,20 @@ |
|||
namespace Volo.Abp.IdentityServer |
|||
namespace Volo.Abp.IdentityServer.Clients |
|||
{ |
|||
public class SecretConsts |
|||
public class ClientSecretConsts |
|||
{ |
|||
/// <summary>
|
|||
/// Default value: 250
|
|||
/// </summary>
|
|||
public static int TypeMaxLength { get; set; } = 250; |
|||
|
|||
|
|||
/// <summary>
|
|||
/// Default value: 4000
|
|||
/// </summary>
|
|||
public static int ValueMaxLength { get; set; } = 4000; |
|||
|
|||
public static int ValueMaxLengthValue { get; set; } = ValueMaxLength; |
|||
|
|||
|
|||
/// <summary>
|
|||
/// Default value: 2000
|
|||
/// </summary>
|
|||
public static int DescriptionMaxLength { get; set; } = 2000; |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,19 @@ |
|||
namespace Volo.Abp.IdentityServer.Devices |
|||
{ |
|||
public class DeviceFlowCodesConsts |
|||
{ |
|||
public static int DeviceCodeMaxLength { get; set; } = 200; |
|||
|
|||
public static int UserCodeMaxLength { get; set; } = 200; |
|||
|
|||
public static int SubjectIdMaxLength { get; set; } = 200; |
|||
|
|||
public static int SessionIdMaxLength { get; set; } = 100; |
|||
|
|||
public static int DescriptionMaxLength { get; set; } = 200; |
|||
|
|||
public static int ClientIdMaxLength { get; set; } = 200; |
|||
|
|||
public static int DataMaxLength { get; set; } = 50000; |
|||
} |
|||
} |
|||
@ -0,0 +1,9 @@ |
|||
namespace Volo.Abp.IdentityServer.IdentityResources |
|||
{ |
|||
public class IdentityResourcePropertyConsts |
|||
{ |
|||
public static int KeyMaxLength { get; set; } = 250; |
|||
|
|||
public static int ValueMaxLength { get; set; } = 2000; |
|||
} |
|||
} |
|||
@ -0,0 +1,37 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Linq; |
|||
using AutoMapper; |
|||
|
|||
namespace Volo.Abp.IdentityServer |
|||
{ |
|||
public class AllowedSigningAlgorithmsConverter : |
|||
IValueConverter<ICollection<string>, string>, |
|||
IValueConverter<string, ICollection<string>> |
|||
{ |
|||
public static AllowedSigningAlgorithmsConverter Converter = new AllowedSigningAlgorithmsConverter(); |
|||
|
|||
public string Convert(ICollection<string> sourceMember, ResolutionContext context) |
|||
{ |
|||
if (sourceMember == null || !sourceMember.Any()) |
|||
{ |
|||
return null; |
|||
} |
|||
return sourceMember.Aggregate((x, y) => $"{x},{y}"); |
|||
} |
|||
|
|||
public ICollection<string> Convert(string sourceMember, ResolutionContext context) |
|||
{ |
|||
var list = new HashSet<string>(); |
|||
if (!String.IsNullOrWhiteSpace(sourceMember)) |
|||
{ |
|||
sourceMember = sourceMember.Trim(); |
|||
foreach (var item in sourceMember.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries).Distinct()) |
|||
{ |
|||
list.Add(item); |
|||
} |
|||
} |
|||
return list; |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,39 @@ |
|||
using System; |
|||
using JetBrains.Annotations; |
|||
using Volo.Abp.Domain.Entities; |
|||
|
|||
namespace Volo.Abp.IdentityServer.ApiResources |
|||
{ |
|||
public class ApiResourceProperty : Entity |
|||
{ |
|||
public virtual Guid ApiResourceId { get; protected set; } |
|||
|
|||
public virtual string Key { get; set; } |
|||
|
|||
public virtual string Value { get; set; } |
|||
|
|||
protected ApiResourceProperty() |
|||
{ |
|||
|
|||
} |
|||
|
|||
public virtual bool Equals(Guid aiResourceId, [NotNull] string key, string value) |
|||
{ |
|||
return ApiResourceId == aiResourceId && Key == key && Value == value; |
|||
} |
|||
|
|||
protected internal ApiResourceProperty(Guid aiResourceId, [NotNull] string key, [NotNull] string value) |
|||
{ |
|||
Check.NotNull(key, nameof(key)); |
|||
|
|||
ApiResourceId = aiResourceId; |
|||
Key = key; |
|||
Value = value; |
|||
} |
|||
|
|||
public override object[] GetKeys() |
|||
{ |
|||
return new object[] { ApiResourceId, Key }; |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,38 @@ |
|||
using System; |
|||
using JetBrains.Annotations; |
|||
using Volo.Abp.Domain.Entities; |
|||
|
|||
namespace Volo.Abp.IdentityServer.ApiResources |
|||
{ |
|||
public class ApiResourceScope : Entity |
|||
{ |
|||
public virtual Guid ApiResourceId { get; protected set; } |
|||
|
|||
public virtual string Scope { get; set; } |
|||
|
|||
protected ApiResourceScope() |
|||
{ |
|||
|
|||
} |
|||
|
|||
public virtual bool Equals(Guid apiResourceId, [NotNull] string scope) |
|||
{ |
|||
return ApiResourceId == apiResourceId && Scope == scope; |
|||
} |
|||
|
|||
protected internal ApiResourceScope( |
|||
Guid apiResourceId, |
|||
[NotNull] string scope) |
|||
{ |
|||
Check.NotNull(scope, nameof(scope)); |
|||
|
|||
ApiResourceId = apiResourceId; |
|||
Scope = scope; |
|||
} |
|||
|
|||
public override object[] GetKeys() |
|||
{ |
|||
return new object[] { ApiResourceId, Scope }; |
|||
} |
|||
} |
|||
} |
|||
@ -1,37 +0,0 @@ |
|||
using System; |
|||
using JetBrains.Annotations; |
|||
|
|||
namespace Volo.Abp.IdentityServer.ApiResources |
|||
{ |
|||
public class ApiScopeClaim : UserClaim |
|||
{ |
|||
public Guid ApiResourceId { get; protected set; } |
|||
|
|||
[NotNull] |
|||
public string Name { get; protected set; } |
|||
|
|||
protected ApiScopeClaim() |
|||
{ |
|||
|
|||
} |
|||
|
|||
public virtual bool Equals(Guid apiResourceId, [NotNull] string name, [NotNull] string type) |
|||
{ |
|||
return ApiResourceId == apiResourceId && Name == name && Type == type; |
|||
} |
|||
|
|||
protected internal ApiScopeClaim(Guid apiResourceId, [NotNull] string name, [NotNull] string type) |
|||
: base(type) |
|||
{ |
|||
Check.NotNull(name, nameof(name)); |
|||
|
|||
ApiResourceId = apiResourceId; |
|||
Name = name; |
|||
} |
|||
|
|||
public override object[] GetKeys() |
|||
{ |
|||
return new object[] { ApiResourceId, Name, Type }; |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,31 @@ |
|||
using System; |
|||
using JetBrains.Annotations; |
|||
|
|||
namespace Volo.Abp.IdentityServer.ApiScopes |
|||
{ |
|||
public class ApiScopeClaim : UserClaim |
|||
{ |
|||
public Guid ApiScopeId { get; protected set; } |
|||
|
|||
protected ApiScopeClaim() |
|||
{ |
|||
|
|||
} |
|||
|
|||
public virtual bool Equals(Guid apiScopeId, [NotNull] string type) |
|||
{ |
|||
return ApiScopeId == apiScopeId && Type == type; |
|||
} |
|||
|
|||
protected internal ApiScopeClaim(Guid apiScopeId, [NotNull] string type) |
|||
: base(type) |
|||
{ |
|||
ApiScopeId = apiScopeId; |
|||
} |
|||
|
|||
public override object[] GetKeys() |
|||
{ |
|||
return new object[] { ApiScopeId, Type }; |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,39 @@ |
|||
using System; |
|||
using JetBrains.Annotations; |
|||
using Volo.Abp.Domain.Entities; |
|||
|
|||
namespace Volo.Abp.IdentityServer.ApiScopes |
|||
{ |
|||
public class ApiScopeProperty : Entity |
|||
{ |
|||
public virtual Guid ApiScopeId { get; set; } |
|||
|
|||
public virtual string Key { get; set; } |
|||
|
|||
public virtual string Value { get; set; } |
|||
|
|||
protected ApiScopeProperty() |
|||
{ |
|||
|
|||
} |
|||
|
|||
public virtual bool Equals(Guid apiScopeId, [NotNull] string key, string value) |
|||
{ |
|||
return ApiScopeId == apiScopeId && Key == key && Value == value; |
|||
} |
|||
|
|||
protected internal ApiScopeProperty(Guid apiScopeId, [NotNull] string key, [NotNull] string value) |
|||
{ |
|||
Check.NotNull(key, nameof(key)); |
|||
|
|||
ApiScopeId = apiScopeId; |
|||
Key = key; |
|||
Value = value; |
|||
} |
|||
|
|||
public override object[] GetKeys() |
|||
{ |
|||
return new object[] { ApiScopeId, Key }; |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,38 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Threading; |
|||
using System.Threading.Tasks; |
|||
using Volo.Abp.Domain.Repositories; |
|||
|
|||
namespace Volo.Abp.IdentityServer.ApiScopes |
|||
{ |
|||
public interface IApiScopeRepository : IBasicRepository<ApiScope, Guid> |
|||
{ |
|||
Task<ApiScope> GetByNameAsync( |
|||
string scopeName, |
|||
bool includeDetails = true, |
|||
CancellationToken cancellationToken = default |
|||
); |
|||
|
|||
Task<List<ApiScope>> GetListByNameAsync( |
|||
string[] scopeNames, |
|||
bool includeDetails = false, |
|||
CancellationToken cancellationToken = default |
|||
); |
|||
|
|||
Task<List<ApiScope>> GetListAsync( |
|||
string sorting, |
|||
int skipCount, |
|||
int maxResultCount, |
|||
string filter = null, |
|||
bool includeDetails = false, |
|||
CancellationToken cancellationToken = default |
|||
); |
|||
|
|||
Task<bool> CheckNameExistAsync( |
|||
string name, |
|||
Guid? expectedId = null, |
|||
CancellationToken cancellationToken = default |
|||
); |
|||
} |
|||
} |
|||
Some files were not shown because too many files changed in this diff
Loading…
Reference in new issue