diff --git a/src/app/shared/components/addons/addon-setup-account-form/addon-setup-account-form.component.html b/src/app/shared/components/addons/addon-setup-account-form/addon-setup-account-form.component.html index 9f27832d6..a5b7955aa 100644 --- a/src/app/shared/components/addons/addon-setup-account-form/addon-setup-account-form.component.html +++ b/src/app/shared/components/addons/addon-setup-account-form/addon-setup-account-form.component.html @@ -1,5 +1,15 @@
+ @if (hasConfigurableApiRoot()) { +

+ {{ 'settings.addons.form.fields.hostUrl' | translate }} +

+

+ {{ 'settings.addons.form.fields.hostUrlDescription' | translate }} +

+ + } + @if (isAccessSecretKeysFormat()) {

{{ 'settings.addons.form.fields.accessKey' | translate }} @@ -23,13 +33,6 @@

} @if (isDataverseApiTokenFormat()) { -

- {{ 'settings.addons.form.fields.hostUrl' | translate }} -

-

- {{ 'settings.addons.form.fields.hostUrlDescription' | translate }} -

-

{{ 'settings.addons.form.fields.apiToken' | translate }}

@@ -43,13 +46,6 @@

} @if (isUsernamePasswordFormat()) { -

- {{ 'settings.addons.form.fields.hostUrl' | translate }} -

-

- {{ 'settings.addons.form.fields.hostUrlDescription' | translate }} -

-

{{ 'settings.addons.form.fields.username' | translate }}

@@ -71,13 +67,6 @@

} @if (isRepoTokenFormat()) { -

- {{ 'settings.addons.form.fields.hostUrl' | translate }} -

-

- {{ 'settings.addons.form.fields.hostUrlDescription' | translate }} -

-

{{ 'settings.addons.form.fields.personalAccessToken' | translate }}

diff --git a/src/app/shared/components/addons/addon-setup-account-form/addon-setup-account-form.component.ts b/src/app/shared/components/addons/addon-setup-account-form/addon-setup-account-form.component.ts index cbcb857eb..2a31ca311 100644 --- a/src/app/shared/components/addons/addon-setup-account-form/addon-setup-account-form.component.ts +++ b/src/app/shared/components/addons/addon-setup-account-form/addon-setup-account-form.component.ts @@ -62,6 +62,8 @@ export class AddonSetupAccountFormComponent { return format === CredentialsFormat.OAUTH2 || format === CredentialsFormat.OAUTH; }); + readonly hasConfigurableApiRoot = computed(() => !!this.addon().configurableApiRoot); + handleSubmit(): void { if (!this.isFormValid) return; diff --git a/src/app/shared/mappers/addon.mapper.ts b/src/app/shared/mappers/addon.mapper.ts index fa3c4d73d..333fede38 100644 --- a/src/app/shared/mappers/addon.mapper.ts +++ b/src/app/shared/mappers/addon.mapper.ts @@ -26,6 +26,7 @@ export class AddonMapper { credentialsFormat: response.attributes.credentials_format, providerName: response.attributes.display_name, iconUrl: response.attributes.icon_url, + configurableApiRoot: response.attributes.configurable_api_root, }; } diff --git a/src/app/shared/models/addons/addon-json-api.models.ts b/src/app/shared/models/addons/addon-json-api.models.ts index 68ed09b73..78c7a685f 100644 --- a/src/app/shared/models/addons/addon-json-api.models.ts +++ b/src/app/shared/models/addons/addon-json-api.models.ts @@ -10,6 +10,7 @@ export interface AddonGetResponseJsonApi { credentials_format: string; wb_key: string; icon_url: string; + configurable_api_root: boolean; [key: string]: unknown; }; relationships: { diff --git a/src/app/shared/models/addons/addon.model.ts b/src/app/shared/models/addons/addon.model.ts index 90d17e5df..4f6a7c458 100644 --- a/src/app/shared/models/addons/addon.model.ts +++ b/src/app/shared/models/addons/addon.model.ts @@ -7,6 +7,7 @@ export interface AddonModel { supportedFeatures?: string[]; providerName?: string; credentialsFormat?: string; + configurableApiRoot?: boolean; authUrl?: string | null; authorizedCapabilities?: string[]; authorizedOperationNames?: string[]; diff --git a/src/app/shared/services/addons/addon-form.service.ts b/src/app/shared/services/addons/addon-form.service.ts index 9f164b626..0284dfa4a 100644 --- a/src/app/shared/services/addons/addon-form.service.ts +++ b/src/app/shared/services/addons/addon-form.service.ts @@ -26,6 +26,9 @@ export class AddonFormService { const formControls: Partial = { [AddonFormControls.AccountName]: this.formBuilder.control(addon.displayName || '', Validators.required), }; + if (addon.configurableApiRoot) { + formControls[AddonFormControls.HostUrl] = this.formBuilder.control('', Validators.required); + } switch (addon.credentialsFormat) { case CredentialsFormat.ACCESS_SECRET_KEYS: @@ -33,16 +36,13 @@ export class AddonFormService { formControls[AddonFormControls.SecretKey] = this.formBuilder.control('', Validators.required); break; case CredentialsFormat.DATAVERSE_API_TOKEN: - formControls[AddonFormControls.HostUrl] = this.formBuilder.control('', Validators.required); formControls[AddonFormControls.ApiToken] = this.formBuilder.control('', Validators.required); break; case CredentialsFormat.USERNAME_PASSWORD: - formControls[AddonFormControls.HostUrl] = this.formBuilder.control('', Validators.required); formControls[AddonFormControls.Username] = this.formBuilder.control('', Validators.required); formControls[AddonFormControls.Password] = this.formBuilder.control('', Validators.required); break; case CredentialsFormat.REPO_TOKEN: - formControls[AddonFormControls.HostUrl] = this.formBuilder.control('', Validators.required); formControls[AddonFormControls.PersonalAccessToken] = this.formBuilder.control('', Validators.required); break; } diff --git a/src/app/shared/services/addons/addons.service.spec.ts b/src/app/shared/services/addons/addons.service.spec.ts index fc00d7d50..45355d7ba 100644 --- a/src/app/shared/services/addons/addons.service.spec.ts +++ b/src/app/shared/services/addons/addons.service.spec.ts @@ -42,6 +42,7 @@ describe('Service: Addons', () => { supportedFeatures: ['DOWNLOAD_AS_ZIP', 'FORKING', 'LOGS', 'PERMISSIONS', 'REGISTERING'], type: 'external-storage-services', wbKey: 'figshare', + configurableApiRoot: false, }) ); diff --git a/src/app/shared/stores/addons/addons.state.spec.ts b/src/app/shared/stores/addons/addons.state.spec.ts index b4bbf9b0c..ebfbf99a8 100644 --- a/src/app/shared/stores/addons/addons.state.spec.ts +++ b/src/app/shared/stores/addons/addons.state.spec.ts @@ -59,6 +59,7 @@ describe('State: Addons', () => { supportedFeatures: ['DOWNLOAD_AS_ZIP', 'FORKING', 'LOGS', 'PERMISSIONS', 'REGISTERING'], type: 'external-storage-services', wbKey: 'figshare', + configurableApiRoot: false, }) ); @@ -76,6 +77,7 @@ describe('State: Addons', () => { supportedFeatures: ['DOWNLOAD_AS_ZIP', 'FORKING', 'LOGS', 'PERMISSIONS', 'REGISTERING'], type: 'external-storage-services', wbKey: 'figshare', + configurableApiRoot: false, }) ); expect(loading()).toBeFalsy(); diff --git a/src/testing/mocks/addon.mock.ts b/src/testing/mocks/addon.mock.ts index 31ff950b4..fd59c6f2f 100644 --- a/src/testing/mocks/addon.mock.ts +++ b/src/testing/mocks/addon.mock.ts @@ -12,4 +12,5 @@ export const MOCK_ADDON: AddonModel = { providerName: 'Test Provider', wbKey: 'github', iconUrl: 'https://test.com/icon.png', + configurableApiRoot: false, };