Summary: After upgrading @abp/ng.core and @volo/abp.commercial.ng.ui from v10.1.1 to v10.6.1 (Angular v21 → v22), components that extend AbstractLookupSelectComponent (e.g. abp-lookup-select, likely also abp-lookup-typeahead, abp-lookup-typeahead-mtm, and the date/datetime pickers) no longer respect the disabled state set programmatically via Angular Reactive Forms (FormControl.disable() / FormGroup.disable()). Previously this worked correctly in 10.1.1.
Environment:
Angular: 22.1.7 @abp/ng.core: upgraded 10.1.1 → 10.6.1 @volo/abp.commercial.ng.ui: upgraded 10.1.1 → 10.6.1
Steps to reproduce:
Expected behavior: The component should become disabled, matching the behavior in 10.1.1, consistent with the standard Angular ControlValueAccessor contract.
Root cause (identified by comparing the published 10.1.1 vs 10.6.1 bundles):
this.disabledInput = input(false, { alias: 'disabled' });
this.disabled = false;
effect(() => { this.disabled = this.disabledInput(); });
This mirrors the new signal disabledInput into the plain disabled property used by the template ([abpDisabled]="disabled"). Because disabledInput only reflects the template-bound [disabled] input (not CVA state), and the component is OnPush, the plain property assignment made by setDisabledState() is no longer reliably reflected in the rendered template — it's effectively disconnected from/overwritten relative to the signal-driven effect().
This appears to be an unintended side effect of migrating these components to Angular signal inputs, rather than a documented/intentional breaking change — setDisabledState() itself was not modified, suggesting CVA-driven disabling was meant to keep working.
Current workaround: Explicitly bind [disabled]="expression" in the template to mirror the control's disabled condition, instead of relying solely on FormControl.disable().
Request: Please confirm whether this is a known issue, and whether a fix is planned to restore ControlValueAccessor.setDisabledState() support for lookup/picker components without requiring an explicit [disabled] template binding.
Thanks, S.
Hi,
Using APB.IO v9.1.2 and when navigating to the Identity Management and either Roles or Users page in Angular project, it gets the data from the backend as I can see it in the chrome dev tools but the data is not displayed in the data table. Only when I resize the chrome window. The same happens when I sort the data via clicking on one of the columns.
Is this a known issue with this version (v9.1.2)?
Thanks, S.
Hi,
Using the commercial license with Angular frontend.
For those dropdown lists where we get the list of items from the API we use the abp-lookup-select component.
Just wondering if there is a similar component for working with enum-s?
e.g. given below enum
import { mapEnumToOptions } from '@abp/ng.core';
export enum GeometryTypeEnum {
None = 1,
Point = 2,
Line = 3,
Polygon = 4,
All = 5,
}
export const geometryTypeEnumOptions = mapEnumToOptions(GeometryTypeEnum);
Thanks.
Hi,
We use the commercial license with version 10.1.1, and using Angular as the frontend. How can we customize the ResetPassword page for Angular, to keep the current functionality, but to add a link to the ForgotPassword page?
Thanks.
Hi,
After upgrading our project from ABP 9.3.7 to ABP 10.1.1, we regenerated the Angular proxies and encountered a TypeScript compilation error.
Environment
ABP Framework: 10.1.1
Angular: 21.2.3
ABP CLI: 2.2.1
Issue
After generating the proxy models, the Angular build fails with the following error:
TS2430: Interface 'GetIdentityUsersInput' incorrectly extends interface 'ExtensiblePagedAndSortedResultRequestDto'.
Types of property 'id' are incompatible.
Type 'string | null | undefined' is not assignable to type 'string | undefined'.
Type 'null' is not assignable to type 'string | undefined'. [plugin angular-compiler]
src/app/proxy/volo/abp/identity/models.ts:39:17
39 │ export interface GetIdentityUsersInput extends ExtensiblePagedAndSortedResultRequestDto
The generated proxy interface is:
export interface GetIdentityUsersInput extends ExtensiblePagedAndSortedResultRequestDto {
filter?: string;
roleId?: string | null;
organizationUnitId?: string | null;
id?: string | null;
userName?: string;
}
However, ExtensiblePagedAndSortedResultRequestDto defines the id property as:
id?: string;
Because of this, TypeScript reports that the child interface is widening the type (string | null), which is not compatible with the base interface (string).
Thanks.
Hi,
After upgrading our project from ABP Framework v9.3.7 to v10.1.1, we kept AutoMapper as our object mapping solution instead of the new default Mapperly.
We configured AutoMapper in our application module as follows:
public class MyApplicationModule : AbpModule
{
}
Inside ConfigureServices:
Configure<AbpAutoMapperOptions>(options =>
{
options.AddMaps<MyApplicationModule>();
});
Our AutoMapper profiles are discovered correctly, and mapping works as expected in our custom application services.
For example, mapping works without issues in:
public class MyCustomAppService : MyProjectAppService, IMyCustomAppService
However, when using the same mappings inside a service that derives from the ABP identity service:
public class MyProjectIdentityUserAppService : IdentityUserAppService
we receive an exception during execution. The exception indicates that the framework is attempting to resolve a mapping using Mapperly, even though AutoMapper is configured and working elsewhere in the application.
This suggests that the IdentityUserAppService (or the underlying object mapper context) is still trying to use Mapperly instead of AutoMapper after the upgrade.
Observed behavior:
Expected behavior: Since AutoMapper is configured in the application module and works in other services, we would expect the same AutoMapper configuration to be used when extending IdentityUserAppService.
Is there an additional configuration required in ABP v10.1.1 to ensure that IdentityUserAppService uses AutoMapper instead of Mapperly? Or is there a recommended approach for overriding the object mapper context in services derived from IdentityUserAppService?
Any guidance on the correct configuration for using AutoMapper in this scenario would be appreciated.
Thanks.
Hi,
I use the commercial license with version 9.3.7.
I wanted to add the Quartz integration following the documentation https://abp.io/docs/latest/framework/infrastructure/background-workers/quartz
I run below command to add the Quartz integration to the HttpApi.Host project
abp add-package Volo.Abp.BackgroundWorkers.Quartz
I also have added below as a dependency for HttpApiHostModule
typeof(AbpBackgroundWorkersQuartzModule)
After these when I run the project, I get below exception during application start:
Host terminated unexpectedly! Volo.Abp.AbpInitializationException: An error occurred during the initialize Volo.Abp.Modularity.OnApplicationInitializationModuleLifecycleContributor phase of the module Volo.Abp.AuditLogging.AbpAuditLoggingApplicationModule, Volo.Abp.AuditLogging.Application, Version=9.3.7.0, Culture=neutral, PublicKeyToken=null: Unexpected end of expression.. See the inner exception for details. ---> System.FormatException: Unexpected end of expression. at Quartz.CronExpression.BuildExpression(String expression) at Quartz.CronExpression..ctor(String cronExpression) at Quartz.CronExpression.ValidateExpression(String cronExpression) at Quartz.CronScheduleBuilder.CronSchedule(String cronExpression) at Quartz.CronScheduleTriggerBuilderExtensions.WithCronSchedule(TriggerBuilder triggerBuilder, String cronExpression) at Volo.Abp.BackgroundWorkers.Quartz.QuartzPeriodicBackgroundWorkerAdapter1.BuildWorker(IBackgroundWorker worker)
at Volo.Abp.BackgroundWorkers.Quartz.QuartzBackgroundWorkerManager.ReScheduleJobAsync(IBackgroundWorker worker, CancellationToken cancellationToken)
at Volo.Abp.BackgroundWorkers.Quartz.QuartzBackgroundWorkerManager.AddAsync(IBackgroundWorker worker, CancellationToken cancellationToken)
at Volo.Abp.AuditLogging.AbpAuditLoggingApplicationModule.OnApplicationInitializationAsync(ApplicationInitializationContext context)
at Volo.Abp.Modularity.OnApplicationInitializationModuleLifecycleContributor.InitializeAsync(ApplicationInitializationContext context, IAbpModule module)
at Volo.Abp.Modularity.ModuleManager.InitializeModulesAsync(ApplicationInitializationContext context)
--- End of inner exception stack trace ---
at Volo.Abp.Modularity.ModuleManager.InitializeModulesAsync(ApplicationInitializationContext context)
at Volo.Abp.AbpApplicationBase.InitializeModulesAsync()
at Volo.Abp.AbpApplicationWithExternalServiceProvider.InitializeAsync(IServiceProvider serviceProvider)
at Microsoft.AspNetCore.Builder.AbpApplicationBuilderExtensions.InitializeApplicationAsync(IApplicationBuilder app)`
As I understand, there is a cron expression somewhere in the AbpAuditLoggingApplicationModule, which is not valid for Quartz, but I do not have access to the pro version of the source code, therefore could not verify that.
Could you advise which configuration needs to be changed to get this running?
Thanks,.
Hi,
We are using the commercial license with version 9.3.2. I have noticed that the LastModificationTime is not updated when updating a one-to-many relationship in a full audited entity. I found below related thread https://abp.io/support/questions/10057/LastModification-fields-not-updated-when-changing-one-to-many-relationship
The last comment on above thread was 'We will improve it in the next 9.3.x patch version.'
Could you confirm the version which has the patch released with?
Thanks.
Hi,
We encountered a scenario where an entity (with its own entity type configuration) contains a nullable reference to IdentityUser.
In the entity configuration, we specified:
.OnDelete(DeleteBehavior.SetNull)
However, when the related IdentityUser is soft deleted, the reference is not updated to null. As a result, the entity continues to reference a soft-deleted IdentityUser, effectively creating a broken reference.
We are currently using ABP.IO version 9.3.2 (commercial license).
Our expectation was that ABP’s soft delete mechanism would also honor OnDelete(DeleteBehavior.SetNull) and automatically set the foreign key to null. However, this does not seem to be happening.
Could you please confirm whether ABP.IO handles soft delete scenarios together with OnDelete(DeleteBehavior.SetNull)? If it does, could you clarify how to achieve the expected behavior?
See below code as an example:
public class Employee : FullAuditedEntity<int>
{
public Guid? ManagerId { get; set; }
[ForeignKey(nameof(ManagerId))]
public IdentityUser? IdentityUser { get; set; }
public Employee()
{
}
}
public sealed class EmployeeConfig : IEntityTypeConfiguration<Employee>
{
public void Configure(EntityTypeBuilder<Employee> builder)
{
builder.ToTable(FfWConsts.DbTablePrefix + "Employees", FfWConsts.DbSchema);
builder.ConfigureByConvention();
builder.HasOne(p => p.IdentityUser).WithMany().HasForeignKey(x => x.ManagerId).OnDelete(DeleteBehavior.SetNull);
}
}