"CreateArticleTitleInfo":"Title of the article to be shown on the article list.",
"CreateArticleTitleInfo":"Title of the article to be shown on the article list.",
"CreateArticleUrlInfo":"Original GitHub/External URL of the article.",
"CreateArticleUrlInfo":"Original GitHub/External URL of the article.",
"CreateArticleSummaryInfo":"A short summary of the article to be shown on the article list.",
"CreateArticleSummaryInfo":"A short summary of the article to be shown on the article list.",
"CreateArticleCoverInfo":"For creating an effective article, add a cover photo. Upload 16:9 aspect ratio pictures for the best view.",
"CreateArticleCoverInfo":"For creating an effective article, add a cover photo. Upload 16:9 aspect ratio pictures for the best view. Maximum file size: 1MB.",
"ThisExtensionIsNotAllowed":"This extension is not allowed.",
"ThisExtensionIsNotAllowed":"This extension is not allowed.",
In this example, `OtherMongoDbContext` implements `IBookStoreMongoDbContext`. This feature allows you to have multiple MongoDbContext (one per module) on development, but single MongoDbContext (implements all interfaces of all MongoDbContexts) on runtime.
In this example, `OtherMongoDbContext` implements `IBookStoreMongoDbContext`. This feature allows you to have multiple MongoDbContext (one per module) on development, but single MongoDbContext (implements all interfaces of all MongoDbContexts) on runtime.
### Customize Bulk Operations
If you have better logic or using an external library for bulk operations, you can override the logic via implementing `IMongoDbBulkOperationProvider`.
- You may use example template below:
```csharp
public class MyCustomMongoDbBulkOperationProvider : IMongoDbBulkOperationProvider, ITransientDependency
{
public async Task DeleteManyAsync<TEntity>(IMongoDbRepository<TEntity> repository,
IEnumerable<TEntity> entities,
IClientSessionHandle sessionHandle,
bool autoSave,
CancellationToken cancellationToken)
where TEntity : class, IEntity
{
// Your logic here.
}
public async Task InsertManyAsync<TEntity>(IMongoDbRepository<TEntity> repository,
IEnumerable<TEntity> entities,
IClientSessionHandle sessionHandle,
bool autoSave,
CancellationToken cancellationToken)
where TEntity : class, IEntity
{
// Your logic here.
}
public async Task UpdateManyAsync<TEntity>(IMongoDbRepository<TEntity> repository,
`ListService` is a utility service to provide an easy pagination, sorting, and search implementation.
`ListService` is a utility service to provide easy pagination, sorting, and search implementation.
@ -35,7 +35,10 @@ class BookComponent {
constructor(
constructor(
public readonly list: ListService,
public readonly list: ListService,
private bookService: BookService,
private bookService: BookService,
) {}
) {
// change ListService defaults here
this.list.maxResultCount = 20;
}
ngOnInit() {
ngOnInit() {
// A function that gets query and returns an observable
// A function that gets query and returns an observable
@ -164,7 +167,7 @@ You may use observables in combination with [AsyncPipe](https://angular.io/guide
</ngx-datatable>
</ngx-datatable>
```
```
> We do not recommend using NGXS store for CRUD pages, unless your application needs to share list information between components or use it later on in another page.
> We do not recommend using the NGXS store for CRUD pages unless your application needs to share list information between components or use it later on in another page.
## How to Refresh Table on Create/Update/Delete
## How to Refresh Table on Create/Update/Delete
@ -186,7 +189,7 @@ You may use observables in combination with [AsyncPipe](https://angular.io/guide
> We donot recommend using NGXS store for CRUD pages, unless your application needs to share list information between components or use it later on in another page.
> We donot recommend using the NGXS store for CRUD pages unless your application needs to share list information between components or use it later on in another page.
## How to Implement Server-Side Search in a Table
## How to Implement Server-Side Search in a Table
@ -210,7 +213,7 @@ We had to modify the `ListService` to make it work with `ngx-datatable`. Previou
></abp-table>
></abp-table>
```
```
As of v3.0, with ngx-datatable, the `page` property has to be set as `0` for inital page. Therefore, if you used `ListService` on your tables before and are going to keep `abp-table`, you need to make the following change:
As of v3.0, with ngx-datatable, the `page` property has to be set as `0` for the initial page. Therefore, if you used `ListService` on your tables before and are going to keep `abp-table`, you need to make the following change:
```html
```html
<!-- other bindings are hidden in favor of brevity -->
<!-- other bindings are hidden in favor of brevity -->
/// Set true to automatically save changes to database.
/// This is useful for ORMs / database APIs those only save changes with an explicit method call, but you need to immediately save changes to the database.
/// </param>
/// <param name="cancellationToken">A <see cref="T:System.Threading.CancellationToken" /> to observe while waiting for the task to complete.</param>
/// <param name="entities">Entities to be inserted.</param>
/// <param name="entities">Entities to be updated.</param>
/// <param name="autoSave">
/// Set true to automatically save changes to database.
/// This is useful for ORMs / database APIs those only save changes with an explicit method call, but you need to immediately save changes to the database.</param>
/// <param name="cancellationToken">A <see cref="T:System.Threading.CancellationToken" /> to observe while waiting for the task to complete.</param>
/// <param name="entities">Entities to be deleted.</param>
/// <param name="autoSave">
/// Set true to automatically save changes to database.
/// This is useful for ORMs / database APIs those only save changes with an explicit method call, but you need to immediately save changes to the database.
/// </param>
/// <param name="cancellationToken">A <see cref="T:System.Threading.CancellationToken" /> to observe while waiting for the task to complete.</param>
/// <param name="cancellationToken">A <see cref="T:System.Threading.CancellationToken" /> to observe while waiting for the task to complete.</param>
/// <param name="cancellationToken">A <see cref="T:System.Threading.CancellationToken" /> to observe while waiting for the task to complete.</param>
TaskDeleteAsync(TKeyid,boolautoSave=false,CancellationTokencancellationToken=default);//TODO: Return true if deleted
TaskDeleteAsync(TKeyid,boolautoSave=false,CancellationTokencancellationToken=default);//TODO: Return true if deleted
/// <summary>
/// Deletes multiple entities by primary keys.
/// </summary>
/// <param name="ids">Primary keys of the each entity.</param>
/// <param name="autoSave">
/// Set true to automatically save changes to database.
/// This is useful for ORMs / database APIs those only save changes with an explicit method call, but you need to immediately save changes to the database.
/// </param>
/// <param name="cancellationToken">A <see cref="T:System.Threading.CancellationToken" /> to observe while waiting for the task to complete.</param>
<input asp-for="@Model.ConsentInput.IdentityScopes[i].Name" type="hidden" /> @* TODO: Use attributes on the view model instead of using hidden here *@
<input abp-id-name="@Model.ConsentInput.IdentityScopes[i].Name" asp-for="@identityScope.Name" type="hidden" /> @* TODO: Use attributes on the view model instead of using hidden here *@
<input asp-for="@Model.ConsentInput.ApiScopes[i].Name" type="hidden" /> @* TODO: Use attributes on the view model instead of using hidden here *@
<input abp-id-name="@Model.ConsentInput.ApiScopes[i].Name" asp-for="@apiScope.Name" type="hidden" /> @* TODO: Use attributes on the view model instead of using hidden here *@