From 982a66bbc9d804dbf2a1261b80ddc7ebb71d40df Mon Sep 17 00:00:00 2001 From: Bohdan Odintsov Date: Mon, 3 Nov 2025 16:06:38 +0200 Subject: [PATCH 1/3] fix(wiki-list): Make rename wiki work --- .../features/project/wiki/wiki.component.html | 1 + .../features/project/wiki/wiki.component.ts | 4 ++ .../rename-wiki-dialog.component.html | 18 ++++++ .../rename-wiki-dialog.component.scss | 0 .../rename-wiki-dialog.component.ts | 56 +++++++++++++++++++ .../wiki/wiki-list/wiki-list.component.html | 15 ++++- .../wiki/wiki-list/wiki-list.component.scss | 5 -- .../wiki/wiki-list/wiki-list.component.ts | 14 +++++ src/app/shared/mappers/wiki/wiki.mapper.ts | 9 +++ src/app/shared/models/wiki/wiki.model.ts | 9 +++ src/app/shared/services/wiki.service.ts | 18 ++++++ src/app/shared/stores/wiki/wiki.actions.ts | 9 +++ src/app/shared/stores/wiki/wiki.state.ts | 28 ++++++++++ src/assets/i18n/en.json | 6 +- 14 files changed, 183 insertions(+), 9 deletions(-) create mode 100644 src/app/shared/components/wiki/rename-wiki-dialog/rename-wiki-dialog.component.html create mode 100644 src/app/shared/components/wiki/rename-wiki-dialog/rename-wiki-dialog.component.scss create mode 100644 src/app/shared/components/wiki/rename-wiki-dialog/rename-wiki-dialog.component.ts diff --git a/src/app/features/project/wiki/wiki.component.html b/src/app/features/project/wiki/wiki.component.html index d3b1d94eb..ff8a434b5 100644 --- a/src/app/features/project/wiki/wiki.component.html +++ b/src/app/features/project/wiki/wiki.component.html @@ -36,6 +36,7 @@ [canEdit]="hasWriteAccess()" (createWiki)="onCreateWiki()" (deleteWiki)="onDeleteWiki()" + (renameWiki)="onRenameWiki()" > @if (wikiModes().view) { this.navigateToWiki(this.currentWikiId()))); } diff --git a/src/app/shared/components/wiki/rename-wiki-dialog/rename-wiki-dialog.component.html b/src/app/shared/components/wiki/rename-wiki-dialog/rename-wiki-dialog.component.html new file mode 100644 index 000000000..47d0c2771 --- /dev/null +++ b/src/app/shared/components/wiki/rename-wiki-dialog/rename-wiki-dialog.component.html @@ -0,0 +1,18 @@ +
+ + + +
+ + +
+
diff --git a/src/app/shared/components/wiki/rename-wiki-dialog/rename-wiki-dialog.component.scss b/src/app/shared/components/wiki/rename-wiki-dialog/rename-wiki-dialog.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/src/app/shared/components/wiki/rename-wiki-dialog/rename-wiki-dialog.component.ts b/src/app/shared/components/wiki/rename-wiki-dialog/rename-wiki-dialog.component.ts new file mode 100644 index 000000000..98d0f8435 --- /dev/null +++ b/src/app/shared/components/wiki/rename-wiki-dialog/rename-wiki-dialog.component.ts @@ -0,0 +1,56 @@ +import { createDispatchMap, select } from '@ngxs/store'; + +import { TranslatePipe } from '@ngx-translate/core'; + +import { Button } from 'primeng/button'; +import { DynamicDialogConfig, DynamicDialogRef } from 'primeng/dynamicdialog'; + +import { ChangeDetectionStrategy, Component, inject } from '@angular/core'; +import { FormControl, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms'; + +import { InputLimits } from '@osf/shared/constants/input-limits.const'; +import { CustomValidators } from '@osf/shared/helpers/custom-form-validators.helper'; +import { ToastService } from '@osf/shared/services/toast.service'; +import { RenameWiki, WikiSelectors } from '@osf/shared/stores/wiki'; + +import { TextInputComponent } from '../../text-input/text-input.component'; + +@Component({ + selector: 'osf-rename-wiki-dialog-component', + imports: [Button, ReactiveFormsModule, TranslatePipe, TextInputComponent], + templateUrl: './rename-wiki-dialog.component.html', + styleUrl: './rename-wiki-dialog.component.scss', + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class RenameWikiDialogComponent { + readonly dialogRef = inject(DynamicDialogRef); + readonly config = inject(DynamicDialogConfig); + private toastService = inject(ToastService); + + actions = createDispatchMap({ renameWiki: RenameWiki }); + isSubmitting = select(WikiSelectors.getWikiSubmitting); + inputLimits = InputLimits; + + renameWikiForm = new FormGroup({ + name: new FormControl('', { + nonNullable: true, + validators: [CustomValidators.requiredTrimmed(), Validators.maxLength(InputLimits.fullName.maxLength)], + }), + }); + + submitForm(): void { + if (this.renameWikiForm.valid) { + this.actions.renameWiki(this.config.data.wikiId, this.renameWikiForm.value.name ?? '').subscribe({ + next: (res) => { + this.toastService.showSuccess('project.wiki.renameWikiSuccess'); + this.dialogRef.close(res); + }, + error: (err) => { + if (err?.status === 409) { + this.toastService.showError('project.wiki.renameWikiConflict'); + } + }, + }); + } + } +} diff --git a/src/app/shared/components/wiki/wiki-list/wiki-list.component.html b/src/app/shared/components/wiki/wiki-list/wiki-list.component.html index 22645ceb6..984959ab0 100644 --- a/src/app/shared/components/wiki/wiki-list/wiki-list.component.html +++ b/src/app/shared/components/wiki/wiki-list/wiki-list.component.html @@ -62,9 +62,18 @@

{{ item.label | translate }}

{{ item.label | translate }} } @default { -
- - {{ item.label }} +
+
+ + {{ item.label }} +
+ + +
} } diff --git a/src/app/shared/components/wiki/wiki-list/wiki-list.component.scss b/src/app/shared/components/wiki/wiki-list/wiki-list.component.scss index 49c80f9ae..74bdcf60c 100644 --- a/src/app/shared/components/wiki/wiki-list/wiki-list.component.scss +++ b/src/app/shared/components/wiki/wiki-list/wiki-list.component.scss @@ -7,9 +7,4 @@ min-width: 300px; width: 300px; } - - .active { - background-color: var(--pr-blue-1); - color: var(--white); - } } diff --git a/src/app/shared/components/wiki/wiki-list/wiki-list.component.ts b/src/app/shared/components/wiki/wiki-list/wiki-list.component.ts index 7c55dec8e..09293edbb 100644 --- a/src/app/shared/components/wiki/wiki-list/wiki-list.component.ts +++ b/src/app/shared/components/wiki/wiki-list/wiki-list.component.ts @@ -14,6 +14,7 @@ import { WikiItemType } from '@osf/shared/models/wiki/wiki-type.model'; import { CustomConfirmationService } from '@osf/shared/services/custom-confirmation.service'; import { CustomDialogService } from '@osf/shared/services/custom-dialog.service'; import { ComponentWiki } from '@osf/shared/stores/wiki'; +import { RenameWikiDialogComponent } from '@shared/components/wiki/rename-wiki-dialog/rename-wiki-dialog.component'; import { AddWikiDialogComponent } from '../add-wiki-dialog/add-wiki-dialog.component'; @@ -35,6 +36,7 @@ export class WikiListComponent { readonly deleteWiki = output(); readonly createWiki = output(); + readonly renameWiki = output(); private readonly customDialogService = inject(CustomDialogService); private readonly customConfirmationService = inject(CustomConfirmationService); @@ -97,6 +99,18 @@ export class WikiListComponent { .onClose.subscribe(() => this.createWiki.emit()); } + openRenameWikiDialog(wikiId: string) { + this.customDialogService + .open(RenameWikiDialogComponent, { + header: 'project.wiki.renameWiki', + width: '448px', + data: { + wikiId: wikiId, + }, + }) + .onClose.subscribe(() => this.renameWiki.emit()); + } + openDeleteWikiDialog(): void { this.customConfirmationService.confirmDelete({ headerKey: 'project.wiki.deleteWiki', diff --git a/src/app/shared/mappers/wiki/wiki.mapper.ts b/src/app/shared/mappers/wiki/wiki.mapper.ts index aa79c9911..6748308dd 100644 --- a/src/app/shared/mappers/wiki/wiki.mapper.ts +++ b/src/app/shared/mappers/wiki/wiki.mapper.ts @@ -4,6 +4,7 @@ import { HomeWikiGetResponse, WikiGetResponse, WikiModel, + WikiRenameResponse, WikiVersion, WikiVersionJsonApi, } from '@osf/shared/models/wiki/wiki.model'; @@ -18,6 +19,14 @@ export class WikiMapper { }; } + static fromRenameWikiResponse(data: WikiRenameResponse): WikiModel { + return { + id: data.id, + name: data.attributes.name, + kind: data.attributes.kind, + }; + } + static fromGetHomeWikiResponse(response: HomeWikiGetResponse): HomeWiki { return { id: response.id, diff --git a/src/app/shared/models/wiki/wiki.model.ts b/src/app/shared/models/wiki/wiki.model.ts index 6223fde49..bb2d5a8a2 100644 --- a/src/app/shared/models/wiki/wiki.model.ts +++ b/src/app/shared/models/wiki/wiki.model.ts @@ -58,6 +58,15 @@ export interface WikiGetResponse { }; } +export interface WikiRenameResponse { + id: string; + type: string; + attributes: { + name: string; + kind: string; + }; +} + export interface ComponentsWikiGetResponse { id: string; type: string; diff --git a/src/app/shared/services/wiki.service.ts b/src/app/shared/services/wiki.service.ts index f2d02a306..2cc62fb58 100644 --- a/src/app/shared/services/wiki.service.ts +++ b/src/app/shared/services/wiki.service.ts @@ -64,6 +64,24 @@ export class WikiService { .pipe(map((response) => WikiMapper.fromCreateWikiResponse(response.data))); } + RenameWiki(id: string, name: string): Observable { + const body = { + data: { + type: 'wikis', + attributes: { + name, + id, + }, + }, + }; + return this.jsonApiService.patch>(`${this.apiUrl}/wikis/${id}/`, body).pipe( + map((response) => { + const data = response?.data ?? response; + return WikiMapper.fromRenameWikiResponse(data); + }) + ); + } + deleteWiki(wikiId: string): Observable { return this.jsonApiService.delete(`${this.apiUrl}/wikis/${wikiId}/`); } diff --git a/src/app/shared/stores/wiki/wiki.actions.ts b/src/app/shared/stores/wiki/wiki.actions.ts index c143793fc..3d0ec159d 100644 --- a/src/app/shared/stores/wiki/wiki.actions.ts +++ b/src/app/shared/stores/wiki/wiki.actions.ts @@ -11,6 +11,15 @@ export class CreateWiki { ) {} } +export class RenameWiki { + static readonly type = '[Wiki] Rename Wiki'; + + constructor( + public wikiId: string, + public name: string + ) {} +} + export class DeleteWiki { static readonly type = '[Wiki] Delete Wiki'; constructor(public wikiId: string) {} diff --git a/src/app/shared/stores/wiki/wiki.state.ts b/src/app/shared/stores/wiki/wiki.state.ts index 86fbf7fd4..a1cb202ac 100644 --- a/src/app/shared/stores/wiki/wiki.state.ts +++ b/src/app/shared/stores/wiki/wiki.state.ts @@ -17,6 +17,7 @@ import { GetWikiList, GetWikiVersionContent, GetWikiVersions, + RenameWiki, SetCurrentWiki, ToggleMode, UpdateWikiPreviewContent, @@ -55,6 +56,33 @@ export class WikiState { ); } + @Action(RenameWiki) + renameWiki(ctx: StateContext, action: RenameWiki) { + const state = ctx.getState(); + ctx.patchState({ + wikiList: { + ...state.wikiList, + isSubmitting: true, + }, + }); + return this.wikiService.RenameWiki(action.wikiId, action.name).pipe( + tap((wiki) => { + const updatedWiki = wiki.id === action.wikiId ? { ...wiki, name: action.name } : wiki; + const updatedList = state.wikiList.data.map((w) => (w.id === updatedWiki.id ? updatedWiki : w)); + ctx.patchState({ + wikiList: { + ...state.wikiList, + data: [...updatedList], + isSubmitting: false, + }, + currentWikiId: updatedWiki.id, + }); + }), + map((wiki) => wiki || { id: action.wikiId, name: action.name }), + catchError((error) => this.handleError(ctx, error)) + ); + } + @Action(DeleteWiki) deleteWiki(ctx: StateContext, action: DeleteWiki) { const state = ctx.getState(); diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json index 11e832513..294dae5c6 100644 --- a/src/assets/i18n/en.json +++ b/src/assets/i18n/en.json @@ -899,10 +899,13 @@ }, "wiki": { "addNewWiki": "Add new wiki page", + "renameWiki": "Rename wiki page", "deleteWiki": "Delete wiki page", "deleteWikiMessage": "Are you sure you want to delete this wiki page?", "addNewWikiPlaceholder": "New wiki name", "addWikiSuccess": "Wiki page has been added successfully", + "renameWikiSuccess": "Wiki page has been renamed successfully", + "renameWikiConflict": "That wiki name already exists.", "view": "View", "edit": "Edit", "compare": "Compare", @@ -1907,7 +1910,8 @@ }, "buttons": { "cancel": "Cancel", - "add": "Add" + "add": "Add", + "rename": "Rename" }, "messages": { "success": "Alternative email added successfully", From 03fdecb9ec1bf8ec814ecea57a4c7aa024fec193 Mon Sep 17 00:00:00 2001 From: Bohdan Odintsov Date: Tue, 4 Nov 2025 15:06:41 +0200 Subject: [PATCH 2/3] fix(wiki-list): Add tests, fix issues --- .../rename-wiki-dialog.component.spec.ts | 128 ++++++++++++++++++ .../rename-wiki-dialog.component.ts | 6 +- .../wiki/wiki-list/wiki-list.component.html | 6 +- .../wiki/wiki-list/wiki-list.component.ts | 3 +- src/app/shared/mappers/wiki/wiki.mapper.ts | 9 -- src/app/shared/models/wiki/wiki.model.ts | 9 -- src/app/shared/services/wiki.service.ts | 13 +- src/app/shared/stores/wiki/wiki.state.ts | 3 +- src/assets/i18n/en.json | 4 +- 9 files changed, 144 insertions(+), 37 deletions(-) create mode 100644 src/app/shared/components/wiki/rename-wiki-dialog/rename-wiki-dialog.component.spec.ts diff --git a/src/app/shared/components/wiki/rename-wiki-dialog/rename-wiki-dialog.component.spec.ts b/src/app/shared/components/wiki/rename-wiki-dialog/rename-wiki-dialog.component.spec.ts new file mode 100644 index 000000000..4bc252f05 --- /dev/null +++ b/src/app/shared/components/wiki/rename-wiki-dialog/rename-wiki-dialog.component.spec.ts @@ -0,0 +1,128 @@ +import { Store } from '@ngxs/store'; + +import { MockComponent, MockProvider } from 'ng-mocks'; + +import { DynamicDialogConfig, DynamicDialogRef } from 'primeng/dynamicdialog'; + +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ToastService } from '@osf/shared/services/toast.service'; +import { WikiSelectors } from '@osf/shared/stores/wiki'; + +import { TextInputComponent } from '../../text-input/text-input.component'; + +import { RenameWikiDialogComponent } from './rename-wiki-dialog.component'; + +import { MOCK_STORE } from '@testing/mocks/mock-store.mock'; +import { TranslateServiceMock } from '@testing/mocks/translate.service.mock'; + +describe('RenameWikiDialogComponent', () => { + let component: RenameWikiDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + (MOCK_STORE.selectSignal as jest.Mock).mockImplementation((selector) => { + if (selector === WikiSelectors.getWikiSubmitting) { + return () => false; + } + return () => null; + }); + + await TestBed.configureTestingModule({ + imports: [RenameWikiDialogComponent, MockComponent(TextInputComponent)], + providers: [ + TranslateServiceMock, + MockProvider(DynamicDialogRef), + MockProvider(DynamicDialogConfig, { + data: { + resourceId: 'project-123', + wikiName: 'Wiki Name', + }, + }), + MockProvider(ToastService), + MockProvider(Store, MOCK_STORE), + ], + }).compileComponents(); + + fixture = TestBed.createComponent(RenameWikiDialogComponent); + component = fixture.componentInstance; + + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + it('should initialize form with current name', () => { + expect(component.renameWikiForm.get('name')?.value).toBe('Wiki Name'); + }); + + it('should have required validation on name field', () => { + const nameControl = component.renameWikiForm.get('name'); + nameControl?.setValue(''); + + expect(nameControl?.hasError('required')).toBe(true); + }); + + it('should validate name field with valid input', () => { + const nameControl = component.renameWikiForm.get('name'); + nameControl?.setValue('Test Wiki Name'); + + expect(nameControl?.valid).toBe(true); + }); + + it('should validate name field with whitespace only', () => { + const nameControl = component.renameWikiForm.get('name'); + nameControl?.setValue(' '); + + expect(nameControl?.hasError('required')).toBe(true); + }); + + it('should validate name field with max length', () => { + const nameControl = component.renameWikiForm.get('name'); + const longName = 'a'.repeat(256); + nameControl?.setValue(longName); + + expect(nameControl?.hasError('maxlength')).toBe(true); + }); + + it('should close dialog on cancel', () => { + const dialogRef = TestBed.inject(DynamicDialogRef); + const closeSpy = jest.spyOn(dialogRef, 'close'); + + dialogRef.close(); + + expect(closeSpy).toHaveBeenCalled(); + }); + + it('should not submit form when invalid', () => { + const dialogRef = TestBed.inject(DynamicDialogRef); + const toastService = TestBed.inject(ToastService); + + const closeSpy = jest.spyOn(dialogRef, 'close'); + const showSuccessSpy = jest.spyOn(toastService, 'showSuccess'); + + component.renameWikiForm.patchValue({ name: '' }); + + component.submitForm(); + + expect(showSuccessSpy).not.toHaveBeenCalled(); + expect(closeSpy).not.toHaveBeenCalled(); + }); + + it('should handle form submission with empty name', () => { + const dialogRef = TestBed.inject(DynamicDialogRef); + const toastService = TestBed.inject(ToastService); + + const closeSpy = jest.spyOn(dialogRef, 'close'); + const showSuccessSpy = jest.spyOn(toastService, 'showSuccess'); + + component.renameWikiForm.patchValue({ name: ' ' }); + + component.submitForm(); + + expect(showSuccessSpy).not.toHaveBeenCalled(); + expect(closeSpy).not.toHaveBeenCalled(); + }); +}); diff --git a/src/app/shared/components/wiki/rename-wiki-dialog/rename-wiki-dialog.component.ts b/src/app/shared/components/wiki/rename-wiki-dialog/rename-wiki-dialog.component.ts index 98d0f8435..11d905b65 100644 --- a/src/app/shared/components/wiki/rename-wiki-dialog/rename-wiki-dialog.component.ts +++ b/src/app/shared/components/wiki/rename-wiki-dialog/rename-wiki-dialog.component.ts @@ -32,7 +32,7 @@ export class RenameWikiDialogComponent { inputLimits = InputLimits; renameWikiForm = new FormGroup({ - name: new FormControl('', { + name: new FormControl(this.config.data.wikiName, { nonNullable: true, validators: [CustomValidators.requiredTrimmed(), Validators.maxLength(InputLimits.fullName.maxLength)], }), @@ -41,9 +41,9 @@ export class RenameWikiDialogComponent { submitForm(): void { if (this.renameWikiForm.valid) { this.actions.renameWiki(this.config.data.wikiId, this.renameWikiForm.value.name ?? '').subscribe({ - next: (res) => { + next: () => { this.toastService.showSuccess('project.wiki.renameWikiSuccess'); - this.dialogRef.close(res); + this.dialogRef.close(true); }, error: (err) => { if (err?.status === 409) { diff --git a/src/app/shared/components/wiki/wiki-list/wiki-list.component.html b/src/app/shared/components/wiki/wiki-list/wiki-list.component.html index 984959ab0..41f09c1c1 100644 --- a/src/app/shared/components/wiki/wiki-list/wiki-list.component.html +++ b/src/app/shared/components/wiki/wiki-list/wiki-list.component.html @@ -70,8 +70,10 @@

{{ item.label | translate }}

diff --git a/src/app/shared/components/wiki/wiki-list/wiki-list.component.ts b/src/app/shared/components/wiki/wiki-list/wiki-list.component.ts index 09293edbb..97f1b7baa 100644 --- a/src/app/shared/components/wiki/wiki-list/wiki-list.component.ts +++ b/src/app/shared/components/wiki/wiki-list/wiki-list.component.ts @@ -99,13 +99,14 @@ export class WikiListComponent { .onClose.subscribe(() => this.createWiki.emit()); } - openRenameWikiDialog(wikiId: string) { + openRenameWikiDialog(wikiId: string, wikiName: string) { this.customDialogService .open(RenameWikiDialogComponent, { header: 'project.wiki.renameWiki', width: '448px', data: { wikiId: wikiId, + wikiName: wikiName, }, }) .onClose.subscribe(() => this.renameWiki.emit()); diff --git a/src/app/shared/mappers/wiki/wiki.mapper.ts b/src/app/shared/mappers/wiki/wiki.mapper.ts index 6748308dd..aa79c9911 100644 --- a/src/app/shared/mappers/wiki/wiki.mapper.ts +++ b/src/app/shared/mappers/wiki/wiki.mapper.ts @@ -4,7 +4,6 @@ import { HomeWikiGetResponse, WikiGetResponse, WikiModel, - WikiRenameResponse, WikiVersion, WikiVersionJsonApi, } from '@osf/shared/models/wiki/wiki.model'; @@ -19,14 +18,6 @@ export class WikiMapper { }; } - static fromRenameWikiResponse(data: WikiRenameResponse): WikiModel { - return { - id: data.id, - name: data.attributes.name, - kind: data.attributes.kind, - }; - } - static fromGetHomeWikiResponse(response: HomeWikiGetResponse): HomeWiki { return { id: response.id, diff --git a/src/app/shared/models/wiki/wiki.model.ts b/src/app/shared/models/wiki/wiki.model.ts index bb2d5a8a2..6223fde49 100644 --- a/src/app/shared/models/wiki/wiki.model.ts +++ b/src/app/shared/models/wiki/wiki.model.ts @@ -58,15 +58,6 @@ export interface WikiGetResponse { }; } -export interface WikiRenameResponse { - id: string; - type: string; - attributes: { - name: string; - kind: string; - }; -} - export interface ComponentsWikiGetResponse { id: string; type: string; diff --git a/src/app/shared/services/wiki.service.ts b/src/app/shared/services/wiki.service.ts index 2cc62fb58..0909d7d96 100644 --- a/src/app/shared/services/wiki.service.ts +++ b/src/app/shared/services/wiki.service.ts @@ -64,22 +64,19 @@ export class WikiService { .pipe(map((response) => WikiMapper.fromCreateWikiResponse(response.data))); } - RenameWiki(id: string, name: string): Observable { + renameWiki(id: string, name: string): Observable { const body = { data: { type: 'wikis', attributes: { - name, id, + name, }, }, }; - return this.jsonApiService.patch>(`${this.apiUrl}/wikis/${id}/`, body).pipe( - map((response) => { - const data = response?.data ?? response; - return WikiMapper.fromRenameWikiResponse(data); - }) - ); + return this.jsonApiService + .patch(`${this.apiUrl}/wikis/${id}/`, body) + .pipe(map((response) => WikiMapper.fromCreateWikiResponse(response))); } deleteWiki(wikiId: string): Observable { diff --git a/src/app/shared/stores/wiki/wiki.state.ts b/src/app/shared/stores/wiki/wiki.state.ts index a1cb202ac..6c0b109ca 100644 --- a/src/app/shared/stores/wiki/wiki.state.ts +++ b/src/app/shared/stores/wiki/wiki.state.ts @@ -65,7 +65,7 @@ export class WikiState { isSubmitting: true, }, }); - return this.wikiService.RenameWiki(action.wikiId, action.name).pipe( + return this.wikiService.renameWiki(action.wikiId, action.name).pipe( tap((wiki) => { const updatedWiki = wiki.id === action.wikiId ? { ...wiki, name: action.name } : wiki; const updatedList = state.wikiList.data.map((w) => (w.id === updatedWiki.id ? updatedWiki : w)); @@ -78,7 +78,6 @@ export class WikiState { currentWikiId: updatedWiki.id, }); }), - map((wiki) => wiki || { id: action.wikiId, name: action.name }), catchError((error) => this.handleError(ctx, error)) ); } diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json index 294dae5c6..9e8797629 100644 --- a/src/assets/i18n/en.json +++ b/src/assets/i18n/en.json @@ -1909,9 +1909,7 @@ "emailPlaceholder": "email@example.com" }, "buttons": { - "cancel": "Cancel", - "add": "Add", - "rename": "Rename" + "cancel": "Cancel" }, "messages": { "success": "Alternative email added successfully", From 9a40af90ae3b8c2ec7ee797e6d523a42f93c97d0 Mon Sep 17 00:00:00 2001 From: Bohdan Odintsov Date: Tue, 4 Nov 2025 16:58:28 +0200 Subject: [PATCH 3/3] fix(wiki-list): Fix tests --- .../rename-wiki-dialog.component.spec.ts | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/src/app/shared/components/wiki/rename-wiki-dialog/rename-wiki-dialog.component.spec.ts b/src/app/shared/components/wiki/rename-wiki-dialog/rename-wiki-dialog.component.spec.ts index 4bc252f05..56399a64d 100644 --- a/src/app/shared/components/wiki/rename-wiki-dialog/rename-wiki-dialog.component.spec.ts +++ b/src/app/shared/components/wiki/rename-wiki-dialog/rename-wiki-dialog.component.spec.ts @@ -1,5 +1,3 @@ -import { Store } from '@ngxs/store'; - import { MockComponent, MockProvider } from 'ng-mocks'; import { DynamicDialogConfig, DynamicDialogRef } from 'primeng/dynamicdialog'; @@ -13,21 +11,14 @@ import { TextInputComponent } from '../../text-input/text-input.component'; import { RenameWikiDialogComponent } from './rename-wiki-dialog.component'; -import { MOCK_STORE } from '@testing/mocks/mock-store.mock'; import { TranslateServiceMock } from '@testing/mocks/translate.service.mock'; +import { provideMockStore } from '@testing/providers/store-provider.mock'; describe('RenameWikiDialogComponent', () => { let component: RenameWikiDialogComponent; let fixture: ComponentFixture; beforeEach(async () => { - (MOCK_STORE.selectSignal as jest.Mock).mockImplementation((selector) => { - if (selector === WikiSelectors.getWikiSubmitting) { - return () => false; - } - return () => null; - }); - await TestBed.configureTestingModule({ imports: [RenameWikiDialogComponent, MockComponent(TextInputComponent)], providers: [ @@ -40,7 +31,9 @@ describe('RenameWikiDialogComponent', () => { }, }), MockProvider(ToastService), - MockProvider(Store, MOCK_STORE), + provideMockStore({ + selectors: [{ selector: WikiSelectors.getWikiSubmitting, value: false }], + }), ], }).compileComponents();