Activities of "enisn"

Hi,

Thanks for the reply, i understand now what the issue is. I have a few questions reguarding this approach. Why would leptonX render both toolbars regardless of if im viewing the page from mobile or desktop? Wouldn't it be better perfomance wise if they only rendered when necessary? Is there an option to achieve this rather then having them both render always?

Unfortunately it's not a programming decision. The HTML structure of the LeptonX theme requires 2 different usage since desktop toolbar and mobile toolbar has completely different html tree. It cannot change menu & toolbars only visually by using CSS. The html structure also is different and both should be added separately. That's why we have 2 different component to match leptonx html structure in blazor.

https://x.leptontheme.com/side-menu/index.html

Hi,

I assume you're using LeptonX Theme right?

In the leptonx, Desktop Toolbar and Mobile Toolbar are separated and this component is rendered twice, one for desktop toolbar and one for mobile toolbar. That's why you see 2 different logs in your console.

If you wish to use it in the only for desktop view, I suggest you to use LeptonXToolbars.Main or LeptonXToolbars.MainMobile instead directly using StandardToolbars.Main from the framework:

if (context.Toolbar.Name == LeptonXToolbars.Main)
{
    context.Toolbar.Items.Insert(0, new ToolbarItem(typeof(Notification)));
}

If you want to share a state between those 2 component instances, you can use a Singleton or Scoped service to get data from a service and keep the data in that service and render directly from that service. In that case, you'll make a single request and share data that obtained once.

Hi,

Can you share your ABP Studio logs to determine the problem?

You'll see the logs tab at the bottom panel of the studio:

After closing the error modal, can you go to that tab and send us the problem that is related to ABP Suite?

Hi,

It's a business decision by ABP team.

After version v8.3, new project creation is moved to the new ABP Studio CLI and ABP Studio UI. Now, ABP provides new templates with much more options. The new way provides a lot more features, old templates won't be supported anymore.

https://abp.io/get-started

If you interested in with old templates, it's still possible with abp-old CLI command but it's not accessible from the ABP Suite UI. You can continue creating project from legacy templates like abp-old new MyProjectName -u angular -d mongodb -csf

Hi,

Can you provide your steps to reproduce the problem?

Did you create a subscription link by using ISubscriptionAppService and redirected to that link in your code? https://abp.io/docs/latest/modules/saas#usage

Hi,

The time required depends on your project structure and how much you've customized ABP's features and services. While we generally try to avoid breaking changes, they can sometimes occur.

I suggest following the migration guides step by step, incrementally updating versions instead of jumping directly to v9.0: ABP Migration Guides

Since you use modules from source codes, you won't be able to update modules with the NuGet package version. Instead, you'll need to re-download the latest versions of these modules, compare the changes made by the ABP team, and apply those changes to your local ones. If there aren't many changes in your modules, you can move your customizations to the newly downloaded source code, which might save you time.

I can't provide an exact estimate without knowing your overrides, but here's a general idea for a standard usage scenario:

  • Each version upgrade should be done manually and tested separately.
  • You have 10 iterations to reach the latest v9.0 version (v5.3 -> v6.0 -> v7.0 -> v7.1 -> ... -> v9.0).

Each version switch may take 2-4 hours, including building, running, and testing, assuming there are no issues.

Total time estimate: (2-4 hours) * 10 iterations = 20-40 hours

⚠️ This is just an assumption. I am a software developer, not a project manager, so the actual time might be more or less depending on your team's experience.

Answer

Hi @nabass

It seems the CSS variable is loaded much more earlier than your custom logo variable. The only way to prevent this problem permanently is replacing this physical files in your application:

/images/logo/leptonx/icon-logo.svg
/images/logo/leptonx/icon.svg

Overriding BrandingProvider also works but still there is a timing problem. When the theme's CSS file is loaded to the browser it automatcally starts download the given file from variable. Even you override, it was started download already. So replacing the original file prevents it.

Another approach is customizing the SCSS files and build your css on your own if you have access to source code of leptonx. But replacing the source file is much more easier solution for now

Upon testing, I see that the SaaS module UI only includes what is defined in the microservice SaaSService module.

Yes this is right. There is no synchronization between services for this configuration. This is a simple Options Pattern from the built-in .NET Dependency Injection. Configuring it Saas make sense, but still you'll need to apply this configuration where the connection string is resolved. You may create a simple class library or module (easy to create with ABP Studio with right clicking the soluion) and configure it in there an share this configuration across all the services. Some of them maybe not required for some services but managing it one by one is harder than sharing all the configuration from single point

If i want to implement Inbox / Outbox pattern to my internal modules (with local events) i believe that is not possible with abp out of the box. Am i right about it?

Yes, you are correct LocalEventBus do not support the Inbox/Outbox pattern for local events by default. This pattern is indeed designed for distributed event scenarios.

If you want to implement the Inbox/Outbox pattern for internal modules using LocalEventBus, you will need to create a custom implementation. You may inherit and override LocalEventBus according your needs or you may create a new provider by implementing DistributedEventBusBase in a new class.

By the way, if you don't configure any distributed event bus provider, IDistributedEventBus works in memory like local event bus. So you can use this interface without configuring any provider such as rabbitmq or kafka.

But still it does not use outbox pattren by default, you see below it doesn't do anything with useOutbox parameter https://github.com/abpframework/abp/blob/69fde715c730b5796d32f7622ac7dc7782b6d320/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/LocalDistributedEventBus.cs#L138-L148

You can manually override one of them if you really need to use outbox/inbox with local events.

But as a recommendation;

  • I can suggest using RabbitMQ with ABP's default inbox/outbox implementation -- or --
  • I can suggest going with LocalEventBus and investigate performance, if a bottleneck detected, than you can take an action to switch other solutions

Just one more question. Does it have any performance problem since it is dealing with multiple db contexts with separate connection strings in one request? Cause i have seen in so many examples, they do not deal with unitofwork in multiple databases instead they have implemented inbox/outbox pattern and closing the transactions for each modules. So you can think they use separate unit of work for each module and use inbox/outbox pattern.

Short answer is yes.

This unit of work and rollback logic requires execution of all the db context operations in the same transaction and to end the request all the db context operations should be completed. HTTP Request lasts until all the operations are completed. It brings some drawbacks like performance issues. Also, it depends on the database operations and your deployment environment. But still it costs some performance instead of using single db context.

Even if you use LocalEventBus, still all the operations will be executed in the same transaction. So it won't make any difference.

But using Inbox/Outbox pattern will make some performance difference. Cause it will not require execution of all the operations in the same transaction. It will just send the messages to the outbox table and that's it. So it will not wait for the operation to complete.

But this case brings some other drawbacks like complexity and handling errors and retry mechanisms. ABP implements retry logic with Inbox/Outbox pattern, but still, you'll need to maintain and check the fails regularly. Some problems can't be eventually consistent. (Like you said, when database is not reachable, retry logic doesn't help until it is reachable again.)

Showing 251 to 260 of 780 entries
Boost Your Development
ABP Live Training
Packages
See Trainings
Mastering ABP Framework Book
The Official Guide
Mastering
ABP Framework
Learn More
Mastering ABP Framework Book
Made with ❤️ on ABP v10.1.0-preview. Updated on November 04, 2025, 06:41