From 9960b93f5815d0f5c0a1cc79f87ab5fb409eb1e3 Mon Sep 17 00:00:00 2001 From: Yury Bondarenko Date: Mon, 22 Jan 2024 14:56:00 +0100 Subject: [PATCH 1/3] Fix cache invalidation for versioning --- .../base/identifiable-data.service.spec.ts | 22 +++++++++------ .../data/base/identifiable-data.service.ts | 17 ++++++++++- .../data/version-history-data.service.spec.ts | 13 +++++---- .../core/data/version-history-data.service.ts | 28 +++++++++++++++---- .../submission/workflowitem-data.service.ts | 8 ++---- ...med-task-actions-approve.component.spec.ts | 11 ++++++-- .../claimed-task-actions-approve.component.ts | 25 +++++++++++++---- .../submission-objects.effects.spec.ts | 7 +++++ .../objects/submission-objects.effects.ts | 9 ++++-- 9 files changed, 103 insertions(+), 37 deletions(-) diff --git a/src/app/core/data/base/identifiable-data.service.spec.ts b/src/app/core/data/base/identifiable-data.service.spec.ts index 11af83ff9f6..817779fae7a 100644 --- a/src/app/core/data/base/identifiable-data.service.spec.ts +++ b/src/app/core/data/base/identifiable-data.service.spec.ts @@ -5,7 +5,6 @@ * * http://www.dspace.org/license/ */ -import { FindListOptions } from '../find-list-options.model'; import { getMockRequestService } from '../../../shared/mocks/request.service.mock'; import { HALEndpointServiceStub } from '../../../shared/testing/hal-endpoint-service.stub'; import { getMockRemoteDataBuildService } from '../../../shared/mocks/remote-data-build.service.mock'; @@ -13,7 +12,7 @@ import { followLink } from '../../../shared/utils/follow-link-config.model'; import { TestScheduler } from 'rxjs/testing'; import { RemoteData } from '../remote-data'; import { RequestEntryState } from '../request-entry-state.model'; -import { Observable, of as observableOf } from 'rxjs'; +import { of as observableOf } from 'rxjs'; import { RequestService } from '../request.service'; import { RemoteDataBuildService } from '../../cache/builders/remote-data-build.service'; import { HALEndpointService } from '../../shared/hal-endpoint.service'; @@ -21,7 +20,8 @@ import { ObjectCacheService } from '../../cache/object-cache.service'; import { IdentifiableDataService } from './identifiable-data.service'; import { EMBED_SEPARATOR } from './base-data.service'; -const endpoint = 'https://rest.api/core'; +const base = 'https://rest.api/core'; +const endpoint = 'test'; class TestService extends IdentifiableDataService { constructor( @@ -30,11 +30,7 @@ class TestService extends IdentifiableDataService { protected objectCache: ObjectCacheService, protected halService: HALEndpointService, ) { - super(undefined, requestService, rdbService, objectCache, halService); - } - - public getBrowseEndpoint(options: FindListOptions = {}, linkPath: string = this.linkPath): Observable { - return observableOf(endpoint); + super(endpoint, requestService, rdbService, objectCache, halService); } } @@ -51,7 +47,7 @@ describe('IdentifiableDataService', () => { function initTestService(): TestService { requestService = getMockRequestService(); - halService = new HALEndpointServiceStub('url') as any; + halService = new HALEndpointServiceStub(base) as any; rdbService = getMockRemoteDataBuildService(); objectCache = { @@ -143,4 +139,12 @@ describe('IdentifiableDataService', () => { expect(result).toEqual(expected); }); }); + + describe('invalidateById', () => { + it('should invalidate the correct resource by href', () => { + spyOn(service, 'invalidateByHref').and.returnValue(observableOf(true)); + service.invalidateById('123'); + expect(service.invalidateByHref).toHaveBeenCalledWith(`${base}/${endpoint}/123`); + }); + }); }); diff --git a/src/app/core/data/base/identifiable-data.service.ts b/src/app/core/data/base/identifiable-data.service.ts index 904f925765c..fae6fd88c19 100644 --- a/src/app/core/data/base/identifiable-data.service.ts +++ b/src/app/core/data/base/identifiable-data.service.ts @@ -8,7 +8,7 @@ import { CacheableObject } from '../../cache/cacheable-object.model'; import { FollowLinkConfig } from '../../../shared/utils/follow-link-config.model'; import { Observable } from 'rxjs'; -import { map } from 'rxjs/operators'; +import { map, switchMap, take } from 'rxjs/operators'; import { RemoteData } from '../remote-data'; import { BaseDataService } from './base-data.service'; import { RequestService } from '../request.service'; @@ -80,4 +80,19 @@ export class IdentifiableDataService extends BaseData return this.getEndpoint().pipe( map((endpoint: string) => this.getIDHref(endpoint, resourceID, ...linksToFollow))); } + + /** + * Invalidate a cached resource by its identifier + * @param resourceID the identifier of the resource to invalidate + */ + invalidateById(resourceID: string): Observable { + const ok$ = this.getIDHrefObs(resourceID).pipe( + take(1), + switchMap((href) => this.invalidateByHref(href)) + ); + + ok$.subscribe(); + + return ok$; + } } diff --git a/src/app/core/data/version-history-data.service.spec.ts b/src/app/core/data/version-history-data.service.spec.ts index 03bf6c8bcb7..1d55b4b2f19 100644 --- a/src/app/core/data/version-history-data.service.spec.ts +++ b/src/app/core/data/version-history-data.service.spec.ts @@ -65,6 +65,10 @@ describe('VersionHistoryDataService', () => { }, }, }); + const version1WithDraft = Object.assign(new Version(), { + ...version1, + versionhistory: createSuccessfulRemoteDataObject$(versionHistoryDraft), + }); const versions = [version1, version2]; versionHistory.versions = createSuccessfulRemoteDataObject$(createPaginatedList(versions)); const item1 = Object.assign(new Item(), { @@ -186,21 +190,18 @@ describe('VersionHistoryDataService', () => { }); describe('hasDraftVersion$', () => { - beforeEach(waitForAsync(() => { - versionService.findByHref.and.returnValue(createSuccessfulRemoteDataObject$(version1)); - })); it('should return false if draftVersion is false', fakeAsync(() => { - versionService.getHistoryFromVersion.and.returnValue(of(versionHistory)); + versionService.findByHref.and.returnValue(createSuccessfulRemoteDataObject$(version1)); service.hasDraftVersion$('href').subscribe((res) => { expect(res).toBeFalse(); }); })); + it('should return true if draftVersion is true', fakeAsync(() => { - versionService.getHistoryFromVersion.and.returnValue(of(versionHistoryDraft)); + versionService.findByHref.and.returnValue(createSuccessfulRemoteDataObject$(version1WithDraft)); service.hasDraftVersion$('href').subscribe((res) => { expect(res).toBeTrue(); }); })); }); - }); diff --git a/src/app/core/data/version-history-data.service.ts b/src/app/core/data/version-history-data.service.ts index b331c4f2e40..ee49c82e266 100644 --- a/src/app/core/data/version-history-data.service.ts +++ b/src/app/core/data/version-history-data.service.ts @@ -91,7 +91,7 @@ export class VersionHistoryDataService extends IdentifiableDataService (summary?.length > 0) ? `${endpointUrl}?summary=${summary}` : `${endpointUrl}`), map((endpointURL: string) => new PostRequest(this.requestService.generateRequestId(), endpointURL, itemHref, requestOptions)), @@ -99,6 +99,16 @@ export class VersionHistoryDataService extends IdentifiableDataService this.rdbService.buildFromRequestUUID(restRequest.uuid)), getFirstCompletedRemoteData() ) as Observable>; + + response$.subscribe((versionRD: RemoteData) => { + // invalidate version history + // note: we should do this regardless of whether the request succeeds, + // because it may have failed due to cached data that is out of date + this.requestService.setStaleByHrefSubstring(versionRD.payload._links.self.href); + this.requestService.setStaleByHrefSubstring(versionRD.payload._links.versionhistory.href); + }); + + return response$; } /** @@ -158,14 +168,20 @@ export class VersionHistoryDataService extends IdentifiableDataService { - return this.versionDataService.findByHref(versionHref, true, true, followLink('versionhistory')).pipe( + return this.versionDataService.findByHref(versionHref, false, true, followLink('versionhistory')).pipe( getFirstCompletedRemoteData(), switchMap((res) => { if (res.hasSucceeded && !res.hasNoContent) { - return of(res).pipe( - getFirstSucceededRemoteDataPayload(), - switchMap((version) => this.versionDataService.getHistoryFromVersion(version)), - map((versionHistory) => versionHistory ? versionHistory.draftVersion : false), + return res.payload.versionhistory.pipe( + getFirstCompletedRemoteData(), + map((versionHistoryRD) => { + if (res.hasSucceeded) { + const versionHistory = versionHistoryRD.payload; + return versionHistory ? versionHistory.draftVersion : false; + } else { + return false; + } + }), ); } else { return of(false); diff --git a/src/app/core/submission/workflowitem-data.service.ts b/src/app/core/submission/workflowitem-data.service.ts index 47d18470d39..25e3aa6aae7 100644 --- a/src/app/core/submission/workflowitem-data.service.ts +++ b/src/app/core/submission/workflowitem-data.service.ts @@ -13,7 +13,6 @@ import { RemoteData } from '../data/remote-data'; import { NoContent } from '../shared/NoContent.model'; import { getFirstCompletedRemoteData } from '../shared/operators'; import { FollowLinkConfig } from '../../shared/utils/follow-link-config.model'; -import { WorkspaceItem } from './models/workspaceitem.model'; import { RequestParam } from '../cache/models/request-param.model'; import { FindListOptions } from '../data/find-list-options.model'; import { IdentifiableDataService } from '../data/base/identifiable-data.service'; @@ -28,7 +27,6 @@ import { dataService } from '../data/base/data-service.decorator'; @Injectable() @dataService(WorkflowItem.type) export class WorkflowItemDataService extends IdentifiableDataService implements SearchData, DeleteData { - protected linkPath = 'workflowitems'; protected searchByItemLinkPath = 'item'; protected responseMsToLive = 10 * 1000; @@ -42,7 +40,7 @@ export class WorkflowItemDataService extends IdentifiableDataService[]): Observable> { + public findByItem(uuid: string, useCachedVersionIfAvailable = false, reRequestOnStale = true, options: FindListOptions = {}, ...linksToFollow: FollowLinkConfig[]): Observable> { const findListOptions = new FindListOptions(); findListOptions.searchParams = [new RequestParam('uuid', encodeURIComponent(uuid))]; const href$ = this.searchData.getSearchByHref(this.searchByItemLinkPath, findListOptions, ...linksToFollow); @@ -126,7 +124,7 @@ export class WorkflowItemDataService extends IdentifiableDataService>} * Return an observable that emits response from the server */ - public searchBy(searchMethod: string, options?: FindListOptions, useCachedVersionIfAvailable?: boolean, reRequestOnStale?: boolean, ...linksToFollow: FollowLinkConfig[]): Observable>> { + public searchBy(searchMethod: string, options?: FindListOptions, useCachedVersionIfAvailable?: boolean, reRequestOnStale?: boolean, ...linksToFollow: FollowLinkConfig[]): Observable>> { return this.searchData.searchBy(searchMethod, options, useCachedVersionIfAvailable, reRequestOnStale, ...linksToFollow); } diff --git a/src/app/shared/mydspace-actions/claimed-task/approve/claimed-task-actions-approve.component.spec.ts b/src/app/shared/mydspace-actions/claimed-task/approve/claimed-task-actions-approve.component.spec.ts index b79040fb125..617fd95b045 100644 --- a/src/app/shared/mydspace-actions/claimed-task/approve/claimed-task-actions-approve.component.spec.ts +++ b/src/app/shared/mydspace-actions/claimed-task/approve/claimed-task-actions-approve.component.spec.ts @@ -2,7 +2,7 @@ import { ChangeDetectionStrategy, Injector, NO_ERRORS_SCHEMA } from '@angular/co import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; -import { of, of as observableOf } from 'rxjs'; +import { of as observableOf } from 'rxjs'; import { ClaimedTaskActionsApproveComponent } from './claimed-task-actions-approve.component'; import { TranslateLoaderMock } from '../../../mocks/translate-loader.mock'; @@ -18,6 +18,7 @@ import { Router } from '@angular/router'; import { RouterStub } from '../../../testing/router.stub'; import { SearchService } from '../../../../core/shared/search/search.service'; import { RequestService } from '../../../../core/data/request.service'; +import { WorkflowItemDataService } from '../../../../core/submission/workflowitem-data.service'; let component: ClaimedTaskActionsApproveComponent; let fixture: ComponentFixture; @@ -27,6 +28,7 @@ const searchService = getMockSearchService(); const requestService = getMockRequestService(); let mockPoolTaskDataService: PoolTaskDataService; +let mockWorkflowItemDataService: WorkflowItemDataService; describe('ClaimedTaskActionsApproveComponent', () => { const object = Object.assign(new ClaimedTask(), { id: 'claimed-task-1' }); @@ -36,6 +38,10 @@ describe('ClaimedTaskActionsApproveComponent', () => { beforeEach(waitForAsync(() => { mockPoolTaskDataService = new PoolTaskDataService(null, null, null, null); + mockWorkflowItemDataService = jasmine.createSpyObj('WorkflowItemDataService', { + 'invalidateByHref': observableOf(false), + }); + TestBed.configureTestingModule({ imports: [ TranslateModule.forRoot({ @@ -53,6 +59,7 @@ describe('ClaimedTaskActionsApproveComponent', () => { { provide: SearchService, useValue: searchService }, { provide: RequestService, useValue: requestService }, { provide: PoolTaskDataService, useValue: mockPoolTaskDataService }, + { provide: WorkflowItemDataService, useValue: mockWorkflowItemDataService }, ], declarations: [ClaimedTaskActionsApproveComponent], schemas: [NO_ERRORS_SCHEMA] @@ -89,7 +96,7 @@ describe('ClaimedTaskActionsApproveComponent', () => { beforeEach(() => { spyOn(component.processCompleted, 'emit'); - spyOn(component, 'startActionExecution').and.returnValue(of(null)); + spyOn(component, 'startActionExecution').and.returnValue(observableOf(null)); expectedBody = { [component.option]: 'true' diff --git a/src/app/shared/mydspace-actions/claimed-task/approve/claimed-task-actions-approve.component.ts b/src/app/shared/mydspace-actions/claimed-task/approve/claimed-task-actions-approve.component.ts index 467d1514c90..ebee0f01080 100644 --- a/src/app/shared/mydspace-actions/claimed-task/approve/claimed-task-actions-approve.component.ts +++ b/src/app/shared/mydspace-actions/claimed-task/approve/claimed-task-actions-approve.component.ts @@ -10,6 +10,7 @@ import { TranslateService } from '@ngx-translate/core'; import { SearchService } from '../../../../core/shared/search/search.service'; import { RequestService } from '../../../../core/data/request.service'; import { ClaimedApprovedTaskSearchResult } from '../../../object-collection/shared/claimed-approved-task-search-result.model'; +import { WorkflowItemDataService } from '../../../../core/submission/workflowitem-data.service'; export const WORKFLOW_TASK_OPTION_APPROVE = 'submit_approve'; @@ -28,12 +29,15 @@ export class ClaimedTaskActionsApproveComponent extends ClaimedTaskActionsAbstra */ option = WORKFLOW_TASK_OPTION_APPROVE; - constructor(protected injector: Injector, - protected router: Router, - protected notificationsService: NotificationsService, - protected translate: TranslateService, - protected searchService: SearchService, - protected requestService: RequestService) { + constructor( + protected injector: Injector, + protected router: Router, + protected notificationsService: NotificationsService, + protected translate: TranslateService, + protected searchService: SearchService, + protected requestService: RequestService, + protected workflowItemDataService: WorkflowItemDataService, + ) { super(injector, router, notificationsService, translate, searchService, requestService); } @@ -48,4 +52,13 @@ export class ClaimedTaskActionsApproveComponent extends ClaimedTaskActionsAbstra return reloadedObject; } + public handleReloadableActionResponse(result: boolean, dso: DSpaceObject): void { + super.handleReloadableActionResponse(result, dso); + + // Item page version table includes labels for workflow Items, determined + // based on the result of /workflowitems/search/item?uuid=... + // In order for this label to be in sync with the workflow state, we should + // invalidate WFIs as they are approved. + this.workflowItemDataService.invalidateByHref(this.object?._links.workflowitem?.href); + } } diff --git a/src/app/submission/objects/submission-objects.effects.spec.ts b/src/app/submission/objects/submission-objects.effects.spec.ts index a1bb878aa59..11eb375cc63 100644 --- a/src/app/submission/objects/submission-objects.effects.spec.ts +++ b/src/app/submission/objects/submission-objects.effects.spec.ts @@ -66,6 +66,8 @@ describe('SubmissionObjectEffects test suite', () => { let submissionServiceStub; let submissionJsonPatchOperationsServiceStub; let submissionObjectDataServiceStub; + let workspaceItemDataService; + const collectionId: string = mockSubmissionCollectionId; const submissionId: string = mockSubmissionId; const submissionDefinitionResponse: any = mockSubmissionDefinitionResponse; @@ -82,6 +84,10 @@ describe('SubmissionObjectEffects test suite', () => { submissionServiceStub.hasUnsavedModification.and.returnValue(observableOf(true)); + workspaceItemDataService = jasmine.createSpyObj('WorkspaceItemDataService', { + invalidateById: observableOf(true), + }); + TestBed.configureTestingModule({ imports: [ StoreModule.forRoot({}, storeModuleConfig), @@ -106,6 +112,7 @@ describe('SubmissionObjectEffects test suite', () => { { provide: WorkflowItemDataService, useValue: {} }, { provide: HALEndpointService, useValue: {} }, { provide: SubmissionObjectDataService, useValue: submissionObjectDataServiceStub }, + { provide: WorkspaceitemDataService, useValue: workspaceItemDataService }, ], }); diff --git a/src/app/submission/objects/submission-objects.effects.ts b/src/app/submission/objects/submission-objects.effects.ts index 98646009d5b..eab5b4d7726 100644 --- a/src/app/submission/objects/submission-objects.effects.ts +++ b/src/app/submission/objects/submission-objects.effects.ts @@ -55,6 +55,7 @@ import parseSectionErrorPaths, { SectionErrorPath } from '../utils/parseSectionE import { FormState } from '../../shared/form/form.reducer'; import { SubmissionSectionObject } from './submission-section-object.model'; import { SubmissionSectionError } from './submission-section-error.model'; +import { WorkspaceitemDataService } from '../../core/submission/workspaceitem-data.service'; @Injectable() export class SubmissionObjectEffects { @@ -258,6 +259,7 @@ export class SubmissionObjectEffects { depositSubmissionSuccess$ = createEffect(() => this.actions$.pipe( ofType(SubmissionObjectActionTypes.DEPOSIT_SUBMISSION_SUCCESS), tap(() => this.notificationsService.success(null, this.translate.get('submission.sections.general.deposit_success_notice'))), + tap((action: DepositSubmissionSuccessAction) => this.workspaceItemDataService.invalidateById(action.payload.submissionId)), tap(() => this.submissionService.redirectToMyDSpace())), { dispatch: false }); /** @@ -326,14 +328,17 @@ export class SubmissionObjectEffects { ofType(SubmissionObjectActionTypes.DISCARD_SUBMISSION_ERROR), tap(() => this.notificationsService.error(null, this.translate.get('submission.sections.general.discard_error_notice')))), { dispatch: false }); - constructor(private actions$: Actions, + constructor( + private actions$: Actions, private notificationsService: NotificationsService, private operationsService: SubmissionJsonPatchOperationsService, private sectionService: SectionsService, private store$: Store, private submissionService: SubmissionService, private submissionObjectService: SubmissionObjectDataService, - private translate: TranslateService) { + private translate: TranslateService, + private workspaceItemDataService: WorkspaceitemDataService, + ) { } /** From 9f39358efbfadb8b89e5220b1d705b76d120667e Mon Sep 17 00:00:00 2001 From: Yury Bondarenko Date: Wed, 7 Feb 2024 10:01:39 +0100 Subject: [PATCH 2/3] Clean up VersionHistoryDataService changes --- .../core/data/version-history-data.service.ts | 59 +++++++++---------- 1 file changed, 29 insertions(+), 30 deletions(-) diff --git a/src/app/core/data/version-history-data.service.ts b/src/app/core/data/version-history-data.service.ts index ee49c82e266..82290835355 100644 --- a/src/app/core/data/version-history-data.service.ts +++ b/src/app/core/data/version-history-data.service.ts @@ -6,23 +6,21 @@ import { ObjectCacheService } from '../cache/object-cache.service'; import { HALEndpointService } from '../shared/hal-endpoint.service'; import { HttpHeaders } from '@angular/common/http'; import { PostRequest } from './request.models'; -import { Observable, of } from 'rxjs'; +import { combineLatest, Observable, of as observableOf } from 'rxjs'; import { PaginatedSearchOptions } from '../../shared/search/models/paginated-search-options.model'; import { RemoteData } from './remote-data'; import { PaginatedList } from './paginated-list.model'; import { Version } from '../shared/version.model'; -import { filter, map, switchMap, take } from 'rxjs/operators'; +import { filter, find, map, switchMap, take } from 'rxjs/operators'; import { VERSION_HISTORY } from '../shared/version-history.resource-type'; import { followLink, FollowLinkConfig } from '../../shared/utils/follow-link-config.model'; import { VersionDataService } from './version-data.service'; import { HttpOptions } from '../dspace-rest/dspace-rest.service'; import { getAllSucceededRemoteData, getFirstCompletedRemoteData, getFirstSucceededRemoteDataPayload, getRemoteDataPayload } from '../shared/operators'; import { PaginationComponentOptions } from '../../shared/pagination/pagination-component-options.model'; -import { hasValueOperator } from '../../shared/empty.util'; +import { hasValue, hasValueOperator } from '../../shared/empty.util'; import { Item } from '../shared/item.model'; import { FindListOptions } from './find-list-options.model'; -import { sendRequest } from '../shared/request.operators'; -import { RestRequest } from './rest-request.model'; import { IdentifiableDataService } from './base/identifiable-data.service'; import { dataService } from './base/data-service.decorator'; @@ -86,29 +84,31 @@ export class VersionHistoryDataService extends IdentifiableDataService> { + const requestId = this.requestService.generateRequestId(); const requestOptions: HttpOptions = Object.create({}); let requestHeaders = new HttpHeaders(); requestHeaders = requestHeaders.append('Content-Type', 'text/uri-list'); requestOptions.headers = requestHeaders; - const response$ = this.halService.getEndpoint(this.versionsEndpoint).pipe( + this.halService.getEndpoint(this.versionsEndpoint).pipe( take(1), map((endpointUrl: string) => (summary?.length > 0) ? `${endpointUrl}?summary=${summary}` : `${endpointUrl}`), - map((endpointURL: string) => new PostRequest(this.requestService.generateRequestId(), endpointURL, itemHref, requestOptions)), - sendRequest(this.requestService), - switchMap((restRequest: RestRequest) => this.rdbService.buildFromRequestUUID(restRequest.uuid)), - getFirstCompletedRemoteData() - ) as Observable>; - - response$.subscribe((versionRD: RemoteData) => { - // invalidate version history - // note: we should do this regardless of whether the request succeeds, - // because it may have failed due to cached data that is out of date - this.requestService.setStaleByHrefSubstring(versionRD.payload._links.self.href); - this.requestService.setStaleByHrefSubstring(versionRD.payload._links.versionhistory.href); + find((href: string) => hasValue(href)), + ).subscribe((href) => { + const request = new PostRequest(requestId, href, itemHref, requestOptions); + if (hasValue(this.responseMsToLive)) { + request.responseMsToLive = this.responseMsToLive; + } + + this.requestService.send(request); }); - return response$; + return this.rdbService.buildFromRequestUUIDAndAwait(requestId, (versionRD) => combineLatest([ + this.requestService.setStaleByHrefSubstring(versionRD.payload._links.self.href), + this.requestService.setStaleByHrefSubstring(versionRD.payload._links.versionhistory.href), + ])).pipe( + getFirstCompletedRemoteData(), + ); } /** @@ -147,7 +147,7 @@ export class VersionHistoryDataService extends IdentifiableDataService res.versionhistory), getFirstSucceededRemoteDataPayload(), switchMap((versionHistoryRD) => this.getLatestVersionFromHistory$(versionHistoryRD)), - ) : of(null); + ) : observableOf(null); } /** @@ -158,8 +158,8 @@ export class VersionHistoryDataService extends IdentifiableDataService { return version ? this.getLatestVersion$(version).pipe( take(1), - switchMap((latestVersion) => of(version.version === latestVersion.version)) - ) : of(null); + switchMap((latestVersion) => observableOf(version.version === latestVersion.version)) + ) : observableOf(null); } /** @@ -170,21 +170,20 @@ export class VersionHistoryDataService extends IdentifiableDataService { return this.versionDataService.findByHref(versionHref, false, true, followLink('versionhistory')).pipe( getFirstCompletedRemoteData(), - switchMap((res) => { - if (res.hasSucceeded && !res.hasNoContent) { - return res.payload.versionhistory.pipe( + switchMap((versionRD: RemoteData) => { + if (versionRD.hasSucceeded && !versionRD.hasNoContent) { + return versionRD.payload.versionhistory.pipe( getFirstCompletedRemoteData(), - map((versionHistoryRD) => { - if (res.hasSucceeded) { - const versionHistory = versionHistoryRD.payload; - return versionHistory ? versionHistory.draftVersion : false; + map((versionHistoryRD: RemoteData) => { + if (versionHistoryRD.hasSucceeded && !versionHistoryRD.hasNoContent) { + return versionHistoryRD.payload.draftVersion; } else { return false; } }), ); } else { - return of(false); + return observableOf(false); } }), ); From adb2e31026797eec7161b90eaff15dfe3ea6bfa6 Mon Sep 17 00:00:00 2001 From: Yury Bondarenko Date: Wed, 7 Feb 2024 11:13:53 +0100 Subject: [PATCH 3/3] Always wait for correct draft status, fix spelling --- .../dso-versioning-modal.service.ts | 7 ++----- src/assets/i18n/bn.json5 | 6 +++--- src/assets/i18n/ca.json5 | 6 +++--- src/assets/i18n/en.json5 | 6 +++--- src/assets/i18n/es.json5 | 6 +++--- src/assets/i18n/fr.json5 | 6 +++--- src/assets/i18n/gd.json5 | 6 +++--- src/assets/i18n/hu.json5 | 12 ++++++------ src/assets/i18n/it.json5 | 6 +++--- src/assets/i18n/kk.json5 | 6 +++--- src/assets/i18n/pt-BR.json5 | 6 +++--- src/assets/i18n/pt-PT.json5 | 6 +++--- src/assets/i18n/sv.json5 | 10 +++++----- 13 files changed, 43 insertions(+), 46 deletions(-) diff --git a/src/app/shared/dso-page/dso-versioning-modal-service/dso-versioning-modal.service.ts b/src/app/shared/dso-page/dso-versioning-modal-service/dso-versioning-modal.service.ts index 46792294dd8..b9c77dc56b6 100644 --- a/src/app/shared/dso-page/dso-versioning-modal-service/dso-versioning-modal.service.ts +++ b/src/app/shared/dso-page/dso-versioning-modal-service/dso-versioning-modal.service.ts @@ -1,7 +1,7 @@ import { getFirstCompletedRemoteData, getFirstSucceededRemoteDataPayload } from '../../../core/shared/operators'; import { RemoteData } from '../../../core/data/remote-data'; import { Version } from '../../../core/shared/version.model'; -import { map, startWith, switchMap, tap } from 'rxjs/operators'; +import { map, switchMap, tap } from 'rxjs/operators'; import { Item } from '../../../core/shared/item.model'; import { WorkspaceItem } from '../../../core/submission/models/workspaceitem.model'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; @@ -13,9 +13,7 @@ import { ItemDataService } from '../../../core/data/item-data.service'; import { Injectable } from '@angular/core'; import { Observable, of } from 'rxjs'; import { ItemVersionsSharedService } from '../../../item-page/versions/item-versions-shared.service'; -import { - ItemVersionsSummaryModalComponent -} from '../../../item-page/versions/item-versions-summary-modal/item-versions-summary-modal.component'; +import { ItemVersionsSummaryModalComponent } from '../../../item-page/versions/item-versions-summary-modal/item-versions-summary-modal.component'; /** * Service to take care of all the functionality related to the version creation modal @@ -86,7 +84,6 @@ export class DsoVersioningModalService { // button is disabled if hasDraftVersion = true, and enabled if hasDraftVersion = false or null // (hasDraftVersion is null when a version history does not exist) map((res) => Boolean(res)), - startWith(true), ); } diff --git a/src/assets/i18n/bn.json5 b/src/assets/i18n/bn.json5 index cc05d128287..be084985d66 100644 --- a/src/assets/i18n/bn.json5 +++ b/src/assets/i18n/bn.json5 @@ -3121,7 +3121,7 @@ // "item.page.version.create": "Create new version", "item.page.version.create": "নতুন সংস্করণ তৈরি করুন", - // "item.page.version.hasDraft": "A new version cannot be created because there is an inprogress submission in the version history", + // "item.page.version.hasDraft": "A new version cannot be created because there is an in-progress submission in the version history", "item.page.version.hasDraft": "একটি নতুন সংস্করণ তৈরি করা যাচ্ছে না কারণ ভার্সন হিস্ট্রিতে একটি জমা ইনপ্রগ্রেসস অবস্থাই রয়েছে", // "item.preview.dc.identifier.uri": "Identifier:", @@ -3250,7 +3250,7 @@ // "item.version.history.table.action.deleteVersion": "Delete version", "item.version.history.table.action.deleteVersion": "মুছে ফেলুন সংস্করণ", - // "item.version.history.table.action.hasDraft": "A new version cannot be created because there is an inprogress submission in the version history", + // "item.version.history.table.action.hasDraft": "A new version cannot be created because there is an in-progress submission in the version history", "item.version.history.table.action.hasDraft": "একটি নতুন সংস্করণ তৈরি করা যাচ্ছে না কারণ ভার্সন হিস্ট্রিতে একটি জমা ইনপ্রগ্রেসস অবস্থাই রয়েছে", @@ -3291,7 +3291,7 @@ // "item.version.create.notification.failure" : "New version has not been created", "item.version.create.notification.failure": "নতুন সংস্করণ তৈরি করা হয়নি", - // "item.version.create.notification.inProgress" : "A new version cannot be created because there is an inprogress submission in the version history", + // "item.version.create.notification.inProgress" : "A new version cannot be created because there is an in-progress submission in the version history", "item.version.create.notification.inProgress": "একটি নতুন সংস্করণ তৈরি করা যাবে না কারণ ভার্সন হিস্ট্রিতে একটি জমা ইনপ্রগ্রেসস অবস্থাই রয়েছে", diff --git a/src/assets/i18n/ca.json5 b/src/assets/i18n/ca.json5 index 34279548bb2..5bdd2be94bc 100644 --- a/src/assets/i18n/ca.json5 +++ b/src/assets/i18n/ca.json5 @@ -3376,7 +3376,7 @@ // "item.page.version.create": "Create new version", "item.page.version.create": "Crear una nova versió", - // "item.page.version.hasDraft": "A new version cannot be created because there is an inprogress submission in the version history", + // "item.page.version.hasDraft": "A new version cannot be created because there is an in-progress submission in the version history", "item.page.version.hasDraft": "No es pot crear una nova versió perquè a l'historial de versions hi ha un enviament en curs", // "item.page.claim.button": "Claim", @@ -3535,7 +3535,7 @@ // "item.version.history.table.action.deleteVersion": "Delete version", "item.version.history.table.action.deleteVersion": "Esborrar versió", - // "item.version.history.table.action.hasDraft": "A new version cannot be created because there is an inprogress submission in the version history", + // "item.version.history.table.action.hasDraft": "A new version cannot be created because there is an in-progress submission in the version history", "item.version.history.table.action.hasDraft": "No és possible crear una nova versió ja que existeix a l'historial de versions un enviament pendent", @@ -3582,7 +3582,7 @@ // "item.version.create.notification.failure" : "New version has not been created", "item.version.create.notification.failure": "No s'ha creat una nova versió", - // "item.version.create.notification.inProgress" : "A new version cannot be created because there is an inprogress submission in the version history", + // "item.version.create.notification.inProgress" : "A new version cannot be created because there is an in-progress submission in the version history", "item.version.create.notification.inProgress": "No és possible crear una nova versió ja que existeix a l'historial de versions un enviament pendent", diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index 6c91bae4c16..f62405481e7 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -2440,7 +2440,7 @@ "item.page.version.create": "Create new version", - "item.page.version.hasDraft": "A new version cannot be created because there is an inprogress submission in the version history", + "item.page.version.hasDraft": "A new version cannot be created because there is an in-progress submission in the version history", "item.page.claim.button": "Claim", @@ -2546,7 +2546,7 @@ "item.version.history.table.action.deleteVersion": "Delete version", - "item.version.history.table.action.hasDraft": "A new version cannot be created because there is an inprogress submission in the version history", + "item.version.history.table.action.hasDraft": "A new version cannot be created because there is an in-progress submission in the version history", "item.version.notice": "This is not the latest version of this item. The latest version can be found here.", @@ -2576,7 +2576,7 @@ "item.version.create.notification.failure": "New version has not been created", - "item.version.create.notification.inProgress": "A new version cannot be created because there is an inprogress submission in the version history", + "item.version.create.notification.inProgress": "A new version cannot be created because there is an in-progress submission in the version history", "item.version.delete.modal.header": "Delete version", diff --git a/src/assets/i18n/es.json5 b/src/assets/i18n/es.json5 index 7a2f2fa3db9..5d77de839ef 100644 --- a/src/assets/i18n/es.json5 +++ b/src/assets/i18n/es.json5 @@ -3660,7 +3660,7 @@ // "item.page.version.create": "Create new version", "item.page.version.create": "Crear una nueva version", - // "item.page.version.hasDraft": "A new version cannot be created because there is an inprogress submission in the version history", + // "item.page.version.hasDraft": "A new version cannot be created because there is an in-progress submission in the version history", "item.page.version.hasDraft": "No se puede crear una nueva versión porque en el historial de versiones hay un envío en curso", // "item.page.claim.button": "Claim", @@ -3819,7 +3819,7 @@ // "item.version.history.table.action.deleteVersion": "Delete version", "item.version.history.table.action.deleteVersion": "Borrar versión", - // "item.version.history.table.action.hasDraft": "A new version cannot be created because there is an inprogress submission in the version history", + // "item.version.history.table.action.hasDraft": "A new version cannot be created because there is an in-progress submission in the version history", "item.version.history.table.action.hasDraft": "No es posible crear una nueva versión puesto que existe en el historial de versiones un envío pendiente", @@ -3866,7 +3866,7 @@ // "item.version.create.notification.failure" : "New version has not been created", "item.version.create.notification.failure": "No se ha creado una nueva versión", - // "item.version.create.notification.inProgress" : "A new version cannot be created because there is an inprogress submission in the version history", + // "item.version.create.notification.inProgress" : "A new version cannot be created because there is an in-progress submission in the version history", "item.version.create.notification.inProgress": "No es posible crear una nueva versión puesto que existe en el historial de versiones un envío pendiente", diff --git a/src/assets/i18n/fr.json5 b/src/assets/i18n/fr.json5 index 8ee4dc7d224..36f750492ab 100644 --- a/src/assets/i18n/fr.json5 +++ b/src/assets/i18n/fr.json5 @@ -3108,7 +3108,7 @@ // "item.page.version.create": "Create new version", "item.page.version.create": "Créer une nouvelle version", - // "item.page.version.hasDraft": "A new version cannot be created because there is an inprogress submission in the version history", + // "item.page.version.hasDraft": "A new version cannot be created because there is an in-progress submission in the version history", "item.page.version.hasDraft": "Une nouvelle version ne peut être créée car il y a une soumission en cours dans l'historique des versions", // "item.preview.dc.identifier.uri": "Identifier:", @@ -3234,7 +3234,7 @@ // "item.version.history.table.action.deleteVersion": "Delete version", "item.version.history.table.action.deleteVersion": "Supprimer la version", - // "item.version.history.table.action.hasDraft": "A new version cannot be created because there is an inprogress submission in the version history", + // "item.version.history.table.action.hasDraft": "A new version cannot be created because there is an in-progress submission in the version history", "item.version.history.table.action.hasDraft": "Une nouvelle version ne peut pas être créée parce qu'il y a une soumission en cours dans l'historique des versions.", // "item.version.notice": "This is not the latest version of this item. The latest version can be found here.", @@ -3273,7 +3273,7 @@ // "item.version.create.notification.failure": "New version has not been created", "item.version.create.notification.failure": "La nouvelle version n'a pas été créée", - // "item.version.create.notification.inProgress": "A new version cannot be created because there is an inprogress submission in the version history", + // "item.version.create.notification.inProgress": "A new version cannot be created because there is an in-progress submission in the version history", "item.version.create.notification.inProgress": "Une nouvelle version ne peut pas être créée parce qu'il y a une soumission en cours dans l'historique des versions.", // "item.version.delete.modal.header": "Delete version", diff --git a/src/assets/i18n/gd.json5 b/src/assets/i18n/gd.json5 index 6096073d56e..be7bcb615d8 100644 --- a/src/assets/i18n/gd.json5 +++ b/src/assets/i18n/gd.json5 @@ -3106,7 +3106,7 @@ // "item.page.version.create": "Create new version", "item.page.version.create": "Cruthaich dreach ùr", - // "item.page.version.hasDraft": "A new version cannot be created because there is an inprogress submission in the version history", + // "item.page.version.hasDraft": "A new version cannot be created because there is an in-progress submission in the version history", "item.page.version.hasDraft": "Cha ghabh dreach ùr a chruthachadh oir tha cur-a-steach a' tachairt ann an eachdraidh nan dreachan", // "item.preview.dc.identifier.uri": "Identifier:", @@ -3235,7 +3235,7 @@ // "item.version.history.table.action.deleteVersion": "Delete version", "item.version.history.table.action.deleteVersion": "Dubh às dreach", - // "item.version.history.table.action.hasDraft": "A new version cannot be created because there is an inprogress submission in the version history", + // "item.version.history.table.action.hasDraft": "A new version cannot be created because there is an in-progress submission in the version history", "item.version.history.table.action.hasDraft": "Cha ghabh dreach ùr a chruthachadh oir tha cur-a-steach a' tachairt ann an eachdraidh nan dreachan", @@ -3276,7 +3276,7 @@ // "item.version.create.notification.failure" : "New version has not been created", "item.version.create.notification.failure": "Cha deach dreach ùr a chruthachadh", - // "item.version.create.notification.inProgress" : "A new version cannot be created because there is an inprogress submission in the version history", + // "item.version.create.notification.inProgress" : "A new version cannot be created because there is an in-progress submission in the version history", "item.version.create.notification.inProgress": "Cha ghabh dreach ùr a chruthachadh oir tha cur-a-steach a' tachairt ann an eachdraidh nan dreachan", diff --git a/src/assets/i18n/hu.json5 b/src/assets/i18n/hu.json5 index 373d73aec53..909d7b81cbe 100644 --- a/src/assets/i18n/hu.json5 +++ b/src/assets/i18n/hu.json5 @@ -3975,9 +3975,9 @@ // TODO New key - Add a translation "item.page.version.create": "Create new version", - // "item.page.version.hasDraft": "A new version cannot be created because there is an inprogress submission in the version history", + // "item.page.version.hasDraft": "A new version cannot be created because there is an in-progress submission in the version history", // TODO New key - Add a translation - "item.page.version.hasDraft": "A new version cannot be created because there is an inprogress submission in the version history", + "item.page.version.hasDraft": "A new version cannot be created because there is an in-progress submission in the version history", // "item.page.claim.button": "Claim", // TODO New key - Add a translation @@ -4162,9 +4162,9 @@ // TODO New key - Add a translation "item.version.history.table.action.deleteVersion": "Delete version", - // "item.version.history.table.action.hasDraft": "A new version cannot be created because there is an inprogress submission in the version history", + // "item.version.history.table.action.hasDraft": "A new version cannot be created because there is an in-progress submission in the version history", // TODO New key - Add a translation - "item.version.history.table.action.hasDraft": "A new version cannot be created because there is an inprogress submission in the version history", + "item.version.history.table.action.hasDraft": "A new version cannot be created because there is an in-progress submission in the version history", // "item.version.notice": "This is not the latest version of this item. The latest version can be found here.", @@ -4223,9 +4223,9 @@ // TODO New key - Add a translation "item.version.create.notification.failure": "New version has not been created", - // "item.version.create.notification.inProgress" : "A new version cannot be created because there is an inprogress submission in the version history", + // "item.version.create.notification.inProgress" : "A new version cannot be created because there is an in-progress submission in the version history", // TODO New key - Add a translation - "item.version.create.notification.inProgress": "A new version cannot be created because there is an inprogress submission in the version history", + "item.version.create.notification.inProgress": "A new version cannot be created because there is an in-progress submission in the version history", // "item.version.delete.modal.header": "Delete version", diff --git a/src/assets/i18n/it.json5 b/src/assets/i18n/it.json5 index 4131d0bee66..7c6e5828fec 100644 --- a/src/assets/i18n/it.json5 +++ b/src/assets/i18n/it.json5 @@ -3861,7 +3861,7 @@ // "item.page.version.create": "Create new version", "item.page.version.create": "Crea una nuova versione", - // "item.page.version.hasDraft": "A new version cannot be created because there is an inprogress submission in the version history", + // "item.page.version.hasDraft": "A new version cannot be created because there is an in-progress submission in the version history", "item.page.version.hasDraft": "Impossibile creare una nuova versione perché è presente un'submission in corso nella cronologia delle versioni", // "item.page.claim.button": "Claim", @@ -4028,7 +4028,7 @@ // "item.version.history.table.action.deleteVersion": "Delete version", "item.version.history.table.action.deleteVersion": "Elimina versione", - // "item.version.history.table.action.hasDraft": "A new version cannot be created because there is an inprogress submission in the version history", + // "item.version.history.table.action.hasDraft": "A new version cannot be created because there is an in-progress submission in the version history", "item.version.history.table.action.hasDraft": "Non è possibile creare una nuova versione perchè c'è già una submission in progress nella cronologia delle versioni", @@ -4077,7 +4077,7 @@ // TODO Source message changed - Revise the translation "item.version.create.notification.failure": "Non è stata creata una nuova versione", - // "item.version.create.notification.inProgress": "A new version cannot be created because there is an inprogress submission in the version history", + // "item.version.create.notification.inProgress": "A new version cannot be created because there is an in-progress submission in the version history", // TODO Source message changed - Revise the translation "item.version.create.notification.inProgress": "Non è possibile creare una nuova versione perchè c'è già una submission in progress nella cronologia delle versioni", diff --git a/src/assets/i18n/kk.json5 b/src/assets/i18n/kk.json5 index 354eb1104a1..8c01b6ed396 100644 --- a/src/assets/i18n/kk.json5 +++ b/src/assets/i18n/kk.json5 @@ -3321,7 +3321,7 @@ // "item.page.version.create": "Create new version", "item.page.version.create": "Жаңа нұсқасын жасау", - // "item.page.version.hasDraft": "A new version cannot be created because there is an inprogress submission in the version history", + // "item.page.version.hasDraft": "A new version cannot be created because there is an in-progress submission in the version history", "item.page.version.hasDraft": "Жаңа нұсқаны жасау мүмкін емес, өйткені нұсқа тарихында аяқталмаған жіберу бар", // "item.page.claim.button": "Claim", @@ -3481,7 +3481,7 @@ // "item.version.history.table.action.deleteVersion": "Delete version", "item.version.history.table.action.deleteVersion": "Нұсқаны өшіру", - // "item.version.history.table.action.hasDraft": "A new version cannot be created because there is an inprogress submission in the version history", + // "item.version.history.table.action.hasDraft": "A new version cannot be created because there is an in-progress submission in the version history", "item.version.history.table.action.hasDraft": "Жаңа нұсқаны жасау мүмкін емес, өйткені нұсқа тарихында аяқталмаған бағынымдар бар", @@ -3528,7 +3528,7 @@ // "item.version.create.notification.failure" : "New version has not been created", "item.version.create.notification.failure": "Жаңа нұсқа жасалмады", - // "item.version.create.notification.inProgress" : "A new version cannot be created because there is an inprogress submission in the version history", + // "item.version.create.notification.inProgress" : "A new version cannot be created because there is an in-progress submission in the version history", "item.version.create.notification.inProgress": "Жаңа нұсқаны жасау мүмкін емес, өйткені нұсқа тарихында аяқталмаған жіберу бар", diff --git a/src/assets/i18n/pt-BR.json5 b/src/assets/i18n/pt-BR.json5 index 25f1e0fb7c9..2e205337b09 100644 --- a/src/assets/i18n/pt-BR.json5 +++ b/src/assets/i18n/pt-BR.json5 @@ -3204,7 +3204,7 @@ // "item.page.version.create": "Create new version", "item.page.version.create": "Criar nova versão", - // "item.page.version.hasDraft": "A new version cannot be created because there is an inprogress submission in the version history", + // "item.page.version.hasDraft": "A new version cannot be created because there is an in-progress submission in the version history", "item.page.version.hasDraft": "Não é possível criar uma nova versão porque há uma submissão em andamento no histórico de versões", // "item.page.claim.button": "Claim", @@ -3360,7 +3360,7 @@ // "item.version.history.table.action.deleteVersion": "Delete version", "item.version.history.table.action.deleteVersion": "Apagar versão", - // "item.version.history.table.action.hasDraft": "A new version cannot be created because there is an inprogress submission in the version history", + // "item.version.history.table.action.hasDraft": "A new version cannot be created because there is an in-progress submission in the version history", "item.version.history.table.action.hasDraft": "Não é possível criar uma nova versão porque há uma submissão em andamento no histórico de versões", // "item.version.notice": "This is not the latest version of this item. The latest version can be found here.", @@ -3405,7 +3405,7 @@ // "item.version.create.notification.failure" : "New version has not been created", "item.version.create.notification.failure": "A nova versão não foi criada", - // "item.version.create.notification.inProgress" : "A new version cannot be created because there is an inprogress submission in the version history", + // "item.version.create.notification.inProgress" : "A new version cannot be created because there is an in-progress submission in the version history", "item.version.create.notification.inProgress": "Não é possível criar uma nova versão porque há uma submissão em andamento no histórico de versões", // "item.version.delete.modal.header": "Delete version", diff --git a/src/assets/i18n/pt-PT.json5 b/src/assets/i18n/pt-PT.json5 index a187ff927c0..ca12433419e 100644 --- a/src/assets/i18n/pt-PT.json5 +++ b/src/assets/i18n/pt-PT.json5 @@ -3619,7 +3619,7 @@ // "item.page.version.create": "Create new version", "item.page.version.create": "Criar nova versão", - // "item.page.version.hasDraft": "A new version cannot be created because there is an inprogress submission in the version history", + // "item.page.version.hasDraft": "A new version cannot be created because there is an in-progress submission in the version history", "item.page.version.hasDraft": "Um nova versão não pode ser criada porque já se encontra uma submisão em curso no histórico de versões.", // "item.page.claim.button": "Claim", @@ -3776,7 +3776,7 @@ // "item.version.history.table.action.deleteVersion": "Delete version", "item.version.history.table.action.deleteVersion": "Remover versão", - // "item.version.history.table.action.hasDraft": "A new version cannot be created because there is an inprogress submission in the version history", + // "item.version.history.table.action.hasDraft": "A new version cannot be created because there is an in-progress submission in the version history", "item.version.history.table.action.hasDraft": "Uma nova versão não pode ser criada porque se encontra um depósito em curso no histórico de versões", // "item.version.notice": "This is not the latest version of this item. The latest version can be found here.", @@ -3821,7 +3821,7 @@ // "item.version.create.notification.failure": "New version has not been created", "item.version.create.notification.failure": "Nova versão não foi criada", - // "item.version.create.notification.inProgress": "A new version cannot be created because there is an inprogress submission in the version history", + // "item.version.create.notification.inProgress": "A new version cannot be created because there is an in-progress submission in the version history", "item.version.create.notification.inProgress": "Uma nova versão não pode ser criada porque se encontra um depósito em curso no histórico de versões", // "item.version.delete.modal.header": "Delete version", diff --git a/src/assets/i18n/sv.json5 b/src/assets/i18n/sv.json5 index c988577c920..be75a0e803c 100644 --- a/src/assets/i18n/sv.json5 +++ b/src/assets/i18n/sv.json5 @@ -3151,7 +3151,7 @@ // "item.page.version.create": "Create new version", "item.page.version.create": "Skapa ny version", - // "item.page.version.hasDraft": "A new version cannot be created because there is an inprogress submission in the version history", + // "item.page.version.hasDraft": "A new version cannot be created because there is an in-progress submission in the version history", "item.page.version.hasDraft": "Ny version kan inte skapas pga pågående uppladdning i versionshistoriken", // "item.preview.dc.identifier.uri": "Identifier:", @@ -3281,9 +3281,9 @@ // "item.version.history.table.action.deleteVersion": "Delete version", "item.version.history.table.action.deleteVersion": "Radera version", - // "item.version.history.table.action.hasDraft": "A new version cannot be created because there is an inprogress submission in the version history", + // "item.version.history.table.action.hasDraft": "A new version cannot be created because there is an in-progress submission in the version history", // TODO New key - Add a translation - "item.version.history.table.action.hasDraft": "A new version cannot be created because there is an inprogress submission in the version history", + "item.version.history.table.action.hasDraft": "A new version cannot be created because there is an in-progress submission in the version history", // "item.version.notice": "This is not the latest version of this item. The latest version can be found here.", @@ -3323,9 +3323,9 @@ // "item.version.create.notification.failure" : "New version has not been created", "item.version.create.notification.failure": "Ny version har inte skapats", - // "item.version.create.notification.inProgress" : "A new version cannot be created because there is an inprogress submission in the version history", + // "item.version.create.notification.inProgress" : "A new version cannot be created because there is an in-progress submission in the version history", // TODO New key - Add a translation - "item.version.create.notification.inProgress": "A new version cannot be created because there is an inprogress submission in the version history", + "item.version.create.notification.inProgress": "A new version cannot be created because there is an in-progress submission in the version history", // "item.version.delete.modal.header": "Delete version",