Activities of "sumeyye.kurtulus"

Hello David,

Thank you for the detailed ticket and context around your use of custom templates with the extensible forms. Let me address your questions as well.

When using custom components inside extensible forms or tables, the injected EXTENSIONS_FORM_PROP_DATA only provides the plain record by default, not the full PropData with helpers like getInjected.

Although PropData defines getInjected(...), it's only populated in certain rendering contexts (e.g., the default ABP flow). When creating custom components, this context isn’t automatically passed.

If you're overriding rendering via custom components (like template: MyComponent inside prop config), you're responsible for providing the full context (record + helpers) if needed.

{
  provide: EXTENSIONS_FORM_PROP_DATA,
  deps: [Injector],
  useFactory: (injector: Injector) => ({
    record,
    getInjected: <T>(token: any) => injector.get<T>(token)
  })
}

As for future support, we’ll share feedback with the team — but for now, the pattern above is the recommended way to ensure full context is available in custom components.

I am also sharing a sample project showing how I replicated your structure based on these details: https://drive.google.com/file/d/1qLoFopObla_kGQ1k_a71KVvrlMZ_DPBc/view?usp=drive_link

If you think that this does not answer your question, I can assist you further. Thank you for your cooperation.

Hello, I recommend the following steps to achieve this:

First, create a new tab component

//new-feature-management-tab.component.ts
import { LocalizationModule, ReplaceableTemplateDirective } from '@abp/ng.core';
import { FeatureManagementTabComponent } from '@abp/ng.feature-management';
import { Component } from '@angular/core';
import { NewFeatureManagementComponent } from '../new-feature-management/new-feature-management.component';

@Component({
  selector: 'app-new-feature-management-tab',
  imports: [LocalizationModule, NewFeatureManagementComponent, ReplaceableTemplateDirective],
  template: `
    &lt;p class=&quot;pt-2 text-wrap&quot;&gt;
      {{ 'AbpFeatureManagement::ManageHostFeaturesText' | abpLocalization }}
    &lt;/p&gt;

    &lt;button class=&quot;btn btn-primary&quot; type=&quot;button&quot; (click)=&quot;openFeaturesModal()&quot;&gt;
      &lt;i class=&quot;me-1 fa fa-cog&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;
      {{ 'AbpFeatureManagement::ManageHostFeatures' | abpLocalization }}
    &lt;/button&gt;
    @if (visibleFeatures) {
    &lt;app-new-feature-management
      *abpReplaceableTemplate=&quot;{
        inputs: {
          providerName: { value: &#39;T&#39; },
          providerKey: { value: providerKey },
          visible: { value: visibleFeatures, twoWay: true }
        },
        outputs: { visibleChange: onVisibleFeaturesChange },
        componentKey: &#39;FeatureManagement.FeatureManagementComponent&#39;
      }&quot;
      [(visible)]=&quot;visibleFeatures&quot;
      providerName=&quot;T&quot;
      [providerKey]=&quot;providerKey&quot;
    &gt;
    &lt;/app-new-feature-management&gt;
    }
  `,
  styleUrl: './new-feature-management-tab.component.scss',
})
export class NewFeatureManagementTabComponent extends FeatureManagementTabComponent {}

Secondly, create a new management component

// new-feature-management.component.ts
@Component({
  selector: 'app-new-feature-management',
  imports: [
    CommonModule,
    ThemeSharedModule,
    LocalizationModule,
    FormsModule,
    NgbNavModule,
    FreeTextInputDirective,
    NgTemplateOutlet,
  ],
  template: `@if (visible) {
    &lt;abp-modal [(visible)]=&quot;visible&quot; [busy]=&quot;modalBusy&quot; [options]=&quot;{ size: &#39;lg&#39; }&quot;&gt;
      &lt;ng-template #abpHeader&gt;
        &lt;h3 class=&quot;test&quot;&gt;
          {{ 'AbpFeatureManagement::Features' | abpLocalization }}
          @if (providerTitle) { - {{ providerTitle }}
          }
        &lt;/h3&gt;
      &lt;/ng-template&gt;

      &lt;ng-template #abpBody&gt;
        &lt;div class=&quot;row&quot;&gt;
          @if (groups.length) {
          &lt;div class=&quot;col-md-4&quot;&gt;
            &lt;ul
              ngbNav
              #nav=&quot;ngbNav&quot;
              [(activeId)]=&quot;selectedGroupDisplayName&quot;
              class=&quot;nav-pills&quot;
              orientation=&quot;vertical&quot;
            &gt;
              @for (group of groups; track group.name) {
              &lt;li [ngbNavItem]=&quot;group.displayName&quot;&gt;
                &lt;a ngbNavLink&gt;{{ group.displayName }}&lt;/a&gt;
                &lt;ng-template ngbNavContent&gt;
                  &lt;h4&gt;{{ selectedGroupDisplayName }}&lt;/h4&gt;
                  &lt;hr class=&quot;mt-2 mb-3&quot; /&gt;

                  @for (feature of features[group.name]; track feature.id || i; let i = $index) {
                  &lt;div class=&quot;mt-2&quot; [ngStyle]=&quot;feature.style&quot; (keyup.enter)=&quot;save()&quot;&gt;
                    @switch (feature.valueType?.name) { @case (valueTypes.ToggleStringValueType) {
                    &lt;div class=&quot;form-check&quot; [class.px-4]=&quot;!!feature.parentName&quot;&gt;
                      &lt;input
                        class=&quot;form-check-input&quot;
                        type=&quot;checkbox&quot;
                        [id]=&quot;feature.name&quot;
                        [(ngModel)]=&quot;feature.value&quot;
                        (ngModelChange)=&quot;onCheckboxClick($event, feature)&quot;
                      /&gt;

                      &lt;label class=&quot;form-check-label&quot; [htmlFor]=&quot;feature.name&quot;&gt;{{
                        feature.displayName
                      }}&lt;/label&gt;
                      &lt;ng-container
                        *ngTemplateOutlet=&quot;descTmp; context: { $implicit: feature.description }&quot;
                      &gt;&lt;/ng-container&gt;
                    &lt;/div&gt;
                    } @case (valueTypes.FreeTextStringValueType) {
                    &lt;div class=&quot;mb-3 form-group&quot; [class.px-2]=&quot;!!feature.parentName&quot;&gt;
                      &lt;label [htmlFor]=&quot;feature.name&quot; class=&quot;form-label&quot;&gt;{{
                        feature.displayName
                      }}&lt;/label&gt;
                      &lt;input
                        class=&quot;form-control&quot;
                        type=&quot;text&quot;
                        [id]=&quot;feature.name&quot;
                        [(ngModel)]=&quot;feature.value&quot;
                        [abpFeatureManagementFreeText]=&quot;feature&quot;
                      /&gt;

                      &lt;ng-container
                        *ngTemplateOutlet=&quot;descTmp; context: { $implicit: feature.description }&quot;
                      &gt;&lt;/ng-container&gt;
                    &lt;/div&gt;
                    } @case (valueTypes.SelectionStringValueType) { @if
                    (feature.valueType.itemSource?.items?.length) {
                    &lt;div class=&quot;mb-3 form-group&quot; [class.px-2]=&quot;!!feature.parentName&quot;&gt;
                      &lt;label [htmlFor]=&quot;feature.name&quot; class=&quot;form-label&quot;&gt;{{
                        feature.displayName
                      }}&lt;/label&gt;
                      &lt;select class=&quot;form-select&quot; [id]=&quot;feature.name&quot; [(ngModel)]=&quot;feature.value&quot;&gt;
                        @for ( item of feature.valueType.itemSource?.items; track item.value ) {
                        &lt;option [ngValue]=&quot;item.value&quot;&gt;
                          {{
                            item.displayText?.resourceName + '::' + item.displayText?.name
                              | abpLocalization
                          }}
                        &lt;/option&gt;
                        }
                      &lt;/select&gt;
                      &lt;ng-container
                        *ngTemplateOutlet=&quot;descTmp; context: { $implicit: feature.description }&quot;
                      &gt;&lt;/ng-container&gt;
                    &lt;/div&gt;
                    } } @default {
                    {{ feature.displayName }}
                    } }
                  &lt;/div&gt;
                  }
                &lt;/ng-template&gt;
              &lt;/li&gt;
              }
            &lt;/ul&gt;
          &lt;/div&gt;

          &lt;ng-template #descTmp let-description&gt;
            @if (description) {
            &lt;small class=&quot;d-block form-text text-muted&quot;&gt;{{ description }}&lt;/small&gt;
            }
          &lt;/ng-template&gt;

          &lt;div class=&quot;col-md-8&quot;&gt;&lt;div class=&quot;py-0&quot; [ngbNavOutlet]=&quot;nav&quot;&gt;&lt;/div&gt;&lt;/div&gt;
          } @if (!groups.length) {
          &lt;div class=&quot;col&quot;&gt;
            {{ 'AbpFeatureManagement::NoFeatureFoundMessage' | abpLocalization }}
          &lt;/div&gt;
          }
        &lt;/div&gt;
      &lt;/ng-template&gt;

      &lt;ng-template #abpFooter&gt;
        &lt;button abpClose type=&quot;button&quot; class=&quot;btn btn-link&quot;&gt;
          {{ 'AbpFeatureManagement::Cancel' | abpLocalization }}
        &lt;/button&gt;

        @if (groups.length) {
        &lt;abp-button
          buttonClass=&quot;btn btn-outline-primary&quot;
          [disabled]=&quot;modalBusy&quot;
          (click)=&quot;resetToDefault()&quot;
          aria-hidden=&quot;true&quot;
        &gt;
          {{ 'AbpFeatureManagement::ResetToDefault' | abpLocalization }}
        &lt;/abp-button&gt;
        } @if (groups.length) {
        &lt;abp-button
          iconClass=&quot;fa fa-check&quot;
          [disabled]=&quot;modalBusy&quot;
          (click)=&quot;save()&quot;
          aria-hidden=&quot;true&quot;
        &gt;
          {{ 'AbpFeatureManagement::Save' | abpLocalization }}
        &lt;/abp-button&gt;
        }
      &lt;/ng-template&gt;
    &lt;/abp-modal&gt;
    } `,
  styleUrl: './new-feature-management.component.scss',
})
export class NewFeatureManagementComponent extends FeatureManagementComponent {}

Lastly, update the settings tabs to include your changes

//app.component.ts
import { SettingTabsService } from '@abp/ng.setting-management/config';
export class AppComponent {
  protected settingTabs = inject(SettingTabsService);

  constructor() {
    this.settingTabs.patch('AbpFeatureManagement::Permission:FeatureManagement', {
      name: 'New Feature Management',
      order: 100,
      requiredPolicy: 'FeatureManagement.ManageHostFeatures',
      component: NewFeatureManagementTabComponent,
    });
  }
}

Let me know if you need further assistance.

Hello,

To add a module to your solution, please refer to the following documentation:

👉 Modular Monolith Application Tutorial

Additionally, you can use the ABP CLI to create a new module. Detailed instructions are available here:

👉 Creating a New Module with ABP CLI

Let me know if you need further assistance, or your aim is to utilize the standalone structure for your modules!

Thank you for providing extra details on your environment file.

After checking the open-id configuration request, I see two main issues:

  1. HTTPS Requirement: Your configuration has requireHttps: true, but the discovery document returns HTTP endpoints (not HTTPS) for all endpoints except the issuer.

  2. Issuer URL Mismatch: The endpoints in the discovery document don't start with the issuer URL (they use http:// while the issuer uses https://).

      "issuer": "https://bluestar-authserver.lemonpond-86e62977.centralindia.azurecontainerapps.io/",
      "authorization_endpoint": "http://bluestar-authserver.lemonpond-86e62977.centralindia.azurecontainerapps.io/connect/authorize",
      "token_endpoint": "http://bluestar-authserver.lemonpond-86e62977.centralindia.azurecontainerapps.io/connect/token",
      "introspection_endpoint": "http://bluestar-authserver.lemonpond-86e62977.centralindia.azurecontainerapps.io/connect/introspect",
      "end_session_endpoint": "http://bluestar-authserver.lemonpond-86e62977.centralindia.azurecontainerapps.io/connect/logout",
      "revocation_endpoint": "http://bluestar-authserver.lemonpond-86e62977.centralindia.azurecontainerapps.io/connect/revocat",
      "userinfo_endpoint": "http://bluestar-authserver.lemonpond-86e62977.centralindia.azurecontainerapps.io/connect/userinfo",
      "device_authorization_endpoint": "http://bluestar-authserver.lemonpond-86e62977.centralindia.azurecontainerapps.io/device",
      "jwks_uri": "http://bluestar-authserver.lemonpond-86e62977.centralindia.azurecontainerapps.io/.well-known/jwks",
    

I can suggest you an optimum solution to configure your auth server to:

  1. Serve all endpoints via HTTPS
  2. Ensure all endpoints in the discovery document match the issuer URL scheme (HTTPS)

You can also manually configure the discovery document as follows: https://manfredsteyer.github.io/angular-oauth2-oidc/docs/additional-documentation/using-an-id-provider-that-fails-discovery-document-validation.html

const oAuthConfig = {
  issuer: 'https://bluestar-authserver.lemonpond-86e62977.centralindia.azurecontainerapps.io/',
  redirectUri: baseUrl,
  clientId: 'Bluestar_App',
  responseType: 'code',
  scope: 'offline_access Bluestar',
  requireHttps: true,
  strictDiscoveryDocumentValidation: false,
  skipIssuerCheck: true,
  // Manually specify endpoints with HTTPS
  loginUrl: 'https://bluestar-authserver.lemonpond-86e62977.centralindia.azurecontainerapps.io/connect/authorize',
  tokenEndpoint: 'https://bluestar-authserver.lemonpond-86e62977.centralindia.azurecontainerapps.io/connect/token',
  // Add other endpoints as needed
};

It is important to note that using HTTP endpoints or disabling security validations should only be done in development environments. For production, you should always use the https for all endpoints and keep strict validations enabled.

You can let me know if you need further assistance.

Hello,

It appears that the login process has not been configured to require HTTPS. Additionally, the issuer setting may not be correctly specified.

To address this, I recommend adding the following flags to your authConfig in the environment file:

  strictDiscoveryDocumentValidation: true,
  skipIssuerCheck: true,

If you require further assistance, please feel free to share the relevant details of your authConfig.

Answer

To further investigate the console error you're still seeing, could you please provide a minimal, reproducible example that triggers the issue? This will help us pinpoint the root cause much more effectively. You can send it directly to sumeyye.kurtulus@volosoft.com.

If possible, please include:

  • A simple sample project or code snippet where the issue occurs
  • The exact steps to reproduce the error
  • The full console output or stack trace

Appreciate your help — we’ll dive right in as soon as we receive it.

Answer

Hello again. Thank you for providing extra details about your problem.

However, I still cannot produce the same problem on our side. Could you please share a minimal, reproducible example via this email: sumeyye.kurtulus@volosoft.com, so that I could assist you further.

Thank you for your cooperation.

Answer

Hello, I cannot produce the same problem on my end. Could you please share your app.config.ts file? Could you also clarify the package manager and its version?

Hello, I cannot produce the problem on my end. Could you please share a minimal, reproducible example via this e-mail address: sumeyye.kurtulus@volosoft.com so that I can assist you further?

Hello, can you confirm that the related permission is configured with the same name on the backend side as BlueStar.AccessReviews.Create?

Showing 161 to 170 of 462 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