From 6519689bc30b9325880c41a8d737ddbe8e83526e Mon Sep 17 00:00:00 2001 From: futa-ikeda Date: Mon, 3 Nov 2025 15:23:15 -0500 Subject: [PATCH 1/4] chore(addons): Serialize configurableApiRoot property --- src/app/shared/mappers/addon.mapper.ts | 1 + src/app/shared/models/addons/addon-json-api.models.ts | 1 + src/app/shared/models/addons/addon.model.ts | 1 + 3 files changed, 3 insertions(+) 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[]; From ba073d9d7c87d0dc92421321b8a6179af31566f0 Mon Sep 17 00:00:00 2001 From: futa-ikeda Date: Mon, 3 Nov 2025 15:24:40 -0500 Subject: [PATCH 2/4] refactor(addons): Use configurableApiRoot property to show form inputs --- .../addon-setup-account-form.component.html | 31 ++++++------------- .../addon-setup-account-form.component.ts | 4 +++ .../services/addons/addon-form.service.ts | 6 ++-- 3 files changed, 17 insertions(+), 24 deletions(-) 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..5c3601d81 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,10 @@ export class AddonSetupAccountFormComponent { return format === CredentialsFormat.OAUTH2 || format === CredentialsFormat.OAUTH; }); + readonly hasConfigurableApiRoot = computed(() => { + return this.addon().configurableApiRoot === true; + }); + handleSubmit(): void { if (!this.isFormValid) return; 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; } From ae067adfec41568861a3e94846ba3d35ed48c0c9 Mon Sep 17 00:00:00 2001 From: futa-ikeda Date: Mon, 3 Nov 2025 16:22:04 -0500 Subject: [PATCH 3/4] test(addons): update tests --- src/app/shared/services/addons/addons.service.spec.ts | 1 + src/app/shared/stores/addons/addons.state.spec.ts | 2 ++ src/testing/mocks/addon.mock.ts | 1 + 3 files changed, 4 insertions(+) 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, }; From 2fbcf46e2663c64f39a12573ff4076a0833de4d9 Mon Sep 17 00:00:00 2001 From: futa-ikeda Date: Tue, 4 Nov 2025 09:44:03 -0500 Subject: [PATCH 4/4] chore(addons): Simplify computed property --- .../addon-setup-account-form.component.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) 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 5c3601d81..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,9 +62,7 @@ export class AddonSetupAccountFormComponent { return format === CredentialsFormat.OAUTH2 || format === CredentialsFormat.OAUTH; }); - readonly hasConfigurableApiRoot = computed(() => { - return this.addon().configurableApiRoot === true; - }); + readonly hasConfigurableApiRoot = computed(() => !!this.addon().configurableApiRoot); handleSubmit(): void { if (!this.isFormValid) return;