diff --git a/package-lock.json b/package-lock.json index 71fd20064..9699293ab 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "osf", - "version": "0.0.0", + "version": "25.2.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "osf", - "version": "0.0.0", + "version": "25.2.0", "dependencies": { "@angular/animations": "^19.2.0", "@angular/cdk": "^19.2.1", diff --git a/src/app/features/project/project-addons/components/configure-addon/configure-addon.component.ts b/src/app/features/project/project-addons/components/configure-addon/configure-addon.component.ts index 887c3c5ec..4b5621389 100644 --- a/src/app/features/project/project-addons/components/configure-addon/configure-addon.component.ts +++ b/src/app/features/project/project-addons/components/configure-addon/configure-addon.component.ts @@ -116,8 +116,9 @@ export class ConfigureAddonComponent implements OnInit { }); readonly supportedResourceTypes = computed(() => { - if (this.linkAddons().length && this.addonTypeString() === AddonType.LINK) { - const addon = this.linkAddons().find((a) => this.addon()?.externalServiceName === a.externalServiceName); + const linkAddons = this.linkAddons(); + if (linkAddons?.length && this.addonTypeString() === AddonType.LINK) { + const addon = linkAddons.find((a) => this.addon()?.externalServiceName === a.externalServiceName); return addon?.supportedResourceTypes || []; } return []; diff --git a/src/app/features/project/project-addons/project-addons.component.ts b/src/app/features/project/project-addons/project-addons.component.ts index 5ad91d482..c175b3a06 100644 --- a/src/app/features/project/project-addons/project-addons.component.ts +++ b/src/app/features/project/project-addons/project-addons.component.ts @@ -242,8 +242,9 @@ export class ProjectAddonsComponent implements OnInit { filteredAddonCards = computed((): AddonCardModel[] => { const searchValue = this.searchValue().toLowerCase(); const configuredAddons = this.allConfiguredAddonsForCheck(); + const addons = this.currentAddonsState() ?? []; - const addonCards = this.currentAddonsState() + const addonCards = addons .filter( (card) => card.externalServiceName.toLowerCase().includes(searchValue) || @@ -300,7 +301,7 @@ export class ProjectAddonsComponent implements OnInit { const addons = this.currentAddonsState(); const isLoading = this.currentAddonsLoading(); - if (!addons?.length && !isLoading) { + if (!addons && !isLoading) { action(); } } diff --git a/src/app/features/settings/settings-addons/settings-addons.component.ts b/src/app/features/settings/settings-addons/settings-addons.component.ts index 6b967c8a5..c040078a8 100644 --- a/src/app/features/settings/settings-addons/settings-addons.component.ts +++ b/src/app/features/settings/settings-addons/settings-addons.component.ts @@ -213,7 +213,8 @@ export class SettingsAddonsComponent implements OnInit { readonly filteredAddonCards = computed(() => { const searchValue = this.searchValue().toLowerCase(); - const filteredAddons = this.currentAddonsState().filter( + const addons = this.currentAddonsState() ?? []; + const filteredAddons = addons.filter( (card) => card.externalServiceName.toLowerCase().includes(searchValue) || card.displayName.toLowerCase().includes(searchValue) @@ -259,7 +260,7 @@ export class SettingsAddonsComponent implements OnInit { const action = this.currentAction(); const addons = this.currentAddonsState(); - if (!addons?.length) { + if (!addons) { action(); } } diff --git a/src/app/shared/components/files-tree/files-tree.component.html b/src/app/shared/components/files-tree/files-tree.component.html index 6c6444787..24856541c 100644 --- a/src/app/shared/components/files-tree/files-tree.component.html +++ b/src/app/shared/components/files-tree/files-tree.component.html @@ -25,8 +25,8 @@
; - citationAddons: AsyncStateModel; - linkAddons: AsyncStateModel; + storageAddons: AsyncStateModel; + citationAddons: AsyncStateModel; + linkAddons: AsyncStateModel; authorizedStorageAddons: AsyncStateModel; authorizedCitationAddons: AsyncStateModel; authorizedLinkAddons: AsyncStateModel; @@ -30,17 +30,17 @@ export interface AddonsStateModel { export const ADDONS_DEFAULTS: AddonsStateModel = { storageAddons: { - data: [], + data: null, isLoading: false, error: null, }, citationAddons: { - data: [], + data: null, isLoading: false, error: null, }, linkAddons: { - data: [], + data: null, isLoading: false, error: null, }, diff --git a/src/app/shared/stores/addons/addons.selectors.ts b/src/app/shared/stores/addons/addons.selectors.ts index bd8158094..c1893f729 100644 --- a/src/app/shared/stores/addons/addons.selectors.ts +++ b/src/app/shared/stores/addons/addons.selectors.ts @@ -16,13 +16,13 @@ import { AddonsState } from './addons.state'; export class AddonsSelectors { @Selector([AddonsState]) - static getStorageAddons(state: AddonsStateModel): AddonModel[] { + static getStorageAddons(state: AddonsStateModel): AddonModel[] | null { return state.storageAddons.data; } static getStorageAddon(id: string): (state: AddonsStateModel) => AddonModel | null { return createSelector([AddonsState], (state: AddonsStateModel): AddonModel | null => { - return state.storageAddons.data.find((addon: AddonModel) => addon.id === id) || null; + return state.storageAddons.data?.find((addon: AddonModel) => addon.id === id) || null; }); } @@ -32,7 +32,7 @@ export class AddonsSelectors { } @Selector([AddonsState]) - static getCitationAddons(state: AddonsStateModel): AddonModel[] { + static getCitationAddons(state: AddonsStateModel): AddonModel[] | null { return state.citationAddons.data; } @@ -42,7 +42,7 @@ export class AddonsSelectors { } @Selector([AddonsState]) - static getLinkAddons(state: AddonsStateModel): AddonModel[] { + static getLinkAddons(state: AddonsStateModel): AddonModel[] | null { return state.linkAddons.data; } diff --git a/src/app/shared/stores/addons/addons.state.spec.ts b/src/app/shared/stores/addons/addons.state.spec.ts index ebfbf99a8..f86ead712 100644 --- a/src/app/shared/stores/addons/addons.state.spec.ts +++ b/src/app/shared/stores/addons/addons.state.spec.ts @@ -35,7 +35,7 @@ describe('State: Addons', () => { it('should fetch storage addons and update state and selector output', inject( [HttpTestingController], (httpMock: HttpTestingController) => { - let result: any[] = []; + let result: any[] | null = []; store.dispatch(new GetStorageAddons()).subscribe(() => { result = store.selectSnapshot(AddonsSelectors.getStorageAddons); }); @@ -106,7 +106,7 @@ describe('State: Addons', () => { req.flush({ message: 'Internal Server Error' }, { status: 500, statusText: 'Server Error' }); expect(result).toEqual({ - data: [], + data: null, error: 'Http failure response for http://addons.localhost:8000/external-storage-services: 500 Server Error', isLoading: false, isSubmitting: false,