From a3c6d36a8be7de06a6aae171853bb0571c50e582 Mon Sep 17 00:00:00 2001 From: Exitare Date: Fri, 20 Dec 2024 12:17:02 -0800 Subject: [PATCH 1/6] Add working acore string editor --- apps/keira/src/app/routes.ts | 12 ++ apps/keira/src/assets/i18n/de.json | 4 +- apps/keira/src/assets/i18n/el.json | 4 +- apps/keira/src/assets/i18n/en.json | 4 +- apps/keira/src/assets/i18n/es.json | 4 +- apps/keira/src/assets/i18n/fr.json | 4 +- apps/keira/src/assets/i18n/it.json | 4 +- apps/keira/src/assets/i18n/ko.json | 4 +- apps/keira/src/assets/i18n/nl.json | 4 +- apps/keira/src/assets/i18n/pl.json | 4 +- apps/keira/src/assets/i18n/pt.json | 4 +- apps/keira/src/assets/i18n/ro.json | 4 +- apps/keira/src/assets/i18n/ru.json | 4 +- apps/keira/src/assets/i18n/sk.json | 4 +- apps/keira/src/assets/i18n/sv.json | 4 +- apps/keira/src/assets/i18n/zh.json | 4 +- .../acore-text-handler.service.spec.ts | 27 +++ .../acore-text/acore-text-handler.service.ts | 18 ++ .../src/acore-text/acore-text.component.html | 73 ++++++++ .../src/acore-text/acore-text.component.ts | 20 +++ .../acore-text/acore-text.integration.spec.ts | 158 ++++++++++++++++++ .../src/acore-text/acore-text.service.spec.ts | 17 ++ .../src/acore-text/acore-text.service.ts | 14 ++ .../select-acore-text.component.html | 62 +++++++ .../acore-text/select-acore-text.component.ts | 31 ++++ .../select-acore-text.integration.spec.ts | 140 ++++++++++++++++ .../select-acore-text.service.spec.ts | 22 +++ .../acore-text/select-acore-text.service.ts | 24 +++ .../src/sidebar/sidebar.component.html | 16 ++ .../src/entities/acore-text.type.ts | 22 +++ libs/shared/acore-world-model/src/index.ts | 1 + 31 files changed, 702 insertions(+), 15 deletions(-) create mode 100644 libs/features/texts/src/acore-text/acore-text-handler.service.spec.ts create mode 100644 libs/features/texts/src/acore-text/acore-text-handler.service.ts create mode 100644 libs/features/texts/src/acore-text/acore-text.component.html create mode 100644 libs/features/texts/src/acore-text/acore-text.component.ts create mode 100644 libs/features/texts/src/acore-text/acore-text.integration.spec.ts create mode 100644 libs/features/texts/src/acore-text/acore-text.service.spec.ts create mode 100644 libs/features/texts/src/acore-text/acore-text.service.ts create mode 100644 libs/features/texts/src/acore-text/select-acore-text.component.html create mode 100644 libs/features/texts/src/acore-text/select-acore-text.component.ts create mode 100644 libs/features/texts/src/acore-text/select-acore-text.integration.spec.ts create mode 100644 libs/features/texts/src/acore-text/select-acore-text.service.spec.ts create mode 100644 libs/features/texts/src/acore-text/select-acore-text.service.ts create mode 100644 libs/shared/acore-world-model/src/entities/acore-text.type.ts diff --git a/apps/keira/src/app/routes.ts b/apps/keira/src/app/routes.ts index 04e5ec9e3b..50919b8b5b 100644 --- a/apps/keira/src/app/routes.ts +++ b/apps/keira/src/app/routes.ts @@ -89,6 +89,9 @@ import { SelectNpcTextComponent, SelectPageTextComponent, } from 'texts'; +import { AcoreTextComponent } from '../../../../libs/features/texts/src/acore-text/acore-text.component'; +import { AcoreTextHandlerService } from '../../../../libs/features/texts/src/acore-text/acore-text-handler.service'; +import { SelectAcoreTextComponent } from '../../../../libs/features/texts/src/acore-text/select-acore-text.component'; export const KEIRA_ROUTES: Routes = [ { @@ -406,6 +409,15 @@ export const KEIRA_ROUTES: Routes = [ component: NpcTextComponent, canActivate: [NpcTextHandlerService], }, + { + path: 'acore-string', + component: AcoreTextComponent, + canActivate: [AcoreTextHandlerService], + }, + { + path: 'select-acore-string', + component: SelectAcoreTextComponent, + }, ], }, { diff --git a/apps/keira/src/assets/i18n/de.json b/apps/keira/src/assets/i18n/de.json index 5016593d57..8195cbadd6 100644 --- a/apps/keira/src/assets/i18n/de.json +++ b/apps/keira/src/assets/i18n/de.json @@ -147,7 +147,9 @@ "SELECT_NPC_TEXT": "NPC-Text auswählen", "NPC_TEXT": "NPC-Text", "SELECT_PAGE_TEXT": "Seiten-Text auswählen", - "PAGE_TEXT": "Seiten-Text" + "PAGE_TEXT": "Seiten-Text", + "ACORE_STRING_TEXT": "Acore-String Texts", + "SELECT_ACORE_STRING_TEXT": "Acore-String Texts auswählen" }, "GOSSIP": { "TITLE": "Klatsch", diff --git a/apps/keira/src/assets/i18n/el.json b/apps/keira/src/assets/i18n/el.json index 14487cafcb..c41afdd39f 100644 --- a/apps/keira/src/assets/i18n/el.json +++ b/apps/keira/src/assets/i18n/el.json @@ -148,7 +148,9 @@ "SELECT_NPC_TEXT": "Select NPC Text", "NPC_TEXT": "NPC Text", "SELECT_PAGE_TEXT": "Select Page Text", - "PAGE_TEXT": "Page Text" + "PAGE_TEXT": "Page Text", + "ACORE_STRING_TEXT": "Acore Strings", + "SELECT_ACORE_STRING_TEXT": "Select Acore Strings" }, "GOSSIP": { "TITLE": "Gossip", diff --git a/apps/keira/src/assets/i18n/en.json b/apps/keira/src/assets/i18n/en.json index a92b6cfb2a..ff56377d43 100644 --- a/apps/keira/src/assets/i18n/en.json +++ b/apps/keira/src/assets/i18n/en.json @@ -148,7 +148,9 @@ "SELECT_NPC_TEXT": "Select NPC Text", "NPC_TEXT": "NPC Text", "SELECT_PAGE_TEXT": "Select Page Text", - "PAGE_TEXT": "Page Text" + "PAGE_TEXT": "Page Text", + "ACORE_STRING_TEXT": "Acore Strings", + "SELECT_ACORE_STRING_TEXT": "Select Acore Strings" }, "GOSSIP": { "TITLE": "Gossip", diff --git a/apps/keira/src/assets/i18n/es.json b/apps/keira/src/assets/i18n/es.json index 4b3265248a..f7e726b039 100644 --- a/apps/keira/src/assets/i18n/es.json +++ b/apps/keira/src/assets/i18n/es.json @@ -149,7 +149,9 @@ "ID": "The ID of the text in the page. This number is unique to every text ID.", "NEXT_PAGE_ID": "The ID of the next page's text ID.", "TEXT": "The actual text. The message in this field will be shown as the text on a page." - } + }, + "ACORE_STRING_TEXT": "Acore Strings", + "SELECT_ACORE_STRING_TEXT": "Select Acore Strings" }, "GOSSIP": { "TITLE": "Ventana de Texto de Criatura", diff --git a/apps/keira/src/assets/i18n/fr.json b/apps/keira/src/assets/i18n/fr.json index 918e1af96f..43c7ecf843 100644 --- a/apps/keira/src/assets/i18n/fr.json +++ b/apps/keira/src/assets/i18n/fr.json @@ -144,7 +144,9 @@ "SELECT_NPC_TEXT": "Select NPC Text", "NPC_TEXT": "NPC Text", "SELECT_PAGE_TEXT": "Select Page Text", - "PAGE_TEXT": "Page Text" + "PAGE_TEXT": "Page Text", + "ACORE_STRING_TEXT": "Acore Strings", + "SELECT_ACORE_STRING_TEXT": "Select Acore Strings" }, "GOSSIP": { "TITLE": "Gossip", diff --git a/apps/keira/src/assets/i18n/it.json b/apps/keira/src/assets/i18n/it.json index 08eef2e48b..2e14240293 100644 --- a/apps/keira/src/assets/i18n/it.json +++ b/apps/keira/src/assets/i18n/it.json @@ -147,7 +147,9 @@ "SELECT_NPC_TEXT": "Select NPC Text", "NPC_TEXT": "NPC Text", "SELECT_PAGE_TEXT": "Select Page Text", - "PAGE_TEXT": "Page Text" + "PAGE_TEXT": "Page Text", + "ACORE_STRING_TEXT": "Acore Strings", + "SELECT_ACORE_STRING_TEXT": "Select Acore Strings" }, "GOSSIP": { "TITLE": "Gossip", diff --git a/apps/keira/src/assets/i18n/ko.json b/apps/keira/src/assets/i18n/ko.json index 14487cafcb..c41afdd39f 100644 --- a/apps/keira/src/assets/i18n/ko.json +++ b/apps/keira/src/assets/i18n/ko.json @@ -148,7 +148,9 @@ "SELECT_NPC_TEXT": "Select NPC Text", "NPC_TEXT": "NPC Text", "SELECT_PAGE_TEXT": "Select Page Text", - "PAGE_TEXT": "Page Text" + "PAGE_TEXT": "Page Text", + "ACORE_STRING_TEXT": "Acore Strings", + "SELECT_ACORE_STRING_TEXT": "Select Acore Strings" }, "GOSSIP": { "TITLE": "Gossip", diff --git a/apps/keira/src/assets/i18n/nl.json b/apps/keira/src/assets/i18n/nl.json index 14487cafcb..c41afdd39f 100644 --- a/apps/keira/src/assets/i18n/nl.json +++ b/apps/keira/src/assets/i18n/nl.json @@ -148,7 +148,9 @@ "SELECT_NPC_TEXT": "Select NPC Text", "NPC_TEXT": "NPC Text", "SELECT_PAGE_TEXT": "Select Page Text", - "PAGE_TEXT": "Page Text" + "PAGE_TEXT": "Page Text", + "ACORE_STRING_TEXT": "Acore Strings", + "SELECT_ACORE_STRING_TEXT": "Select Acore Strings" }, "GOSSIP": { "TITLE": "Gossip", diff --git a/apps/keira/src/assets/i18n/pl.json b/apps/keira/src/assets/i18n/pl.json index 14487cafcb..c41afdd39f 100644 --- a/apps/keira/src/assets/i18n/pl.json +++ b/apps/keira/src/assets/i18n/pl.json @@ -148,7 +148,9 @@ "SELECT_NPC_TEXT": "Select NPC Text", "NPC_TEXT": "NPC Text", "SELECT_PAGE_TEXT": "Select Page Text", - "PAGE_TEXT": "Page Text" + "PAGE_TEXT": "Page Text", + "ACORE_STRING_TEXT": "Acore Strings", + "SELECT_ACORE_STRING_TEXT": "Select Acore Strings" }, "GOSSIP": { "TITLE": "Gossip", diff --git a/apps/keira/src/assets/i18n/pt.json b/apps/keira/src/assets/i18n/pt.json index 4c63b31e22..b0bc7e616d 100644 --- a/apps/keira/src/assets/i18n/pt.json +++ b/apps/keira/src/assets/i18n/pt.json @@ -144,7 +144,9 @@ "SELECT_NPC_TEXT": "Select NPC Text", "NPC_TEXT": "NPC Text", "SELECT_PAGE_TEXT": "Select Page Text", - "PAGE_TEXT": "Page Text" + "PAGE_TEXT": "Page Text", + "ACORE_STRING_TEXT": "Acore Strings", + "SELECT_ACORE_STRING_TEXT": "Select Acore Strings" }, "GOSSIP": { "TITLE": "Gossip", diff --git a/apps/keira/src/assets/i18n/ro.json b/apps/keira/src/assets/i18n/ro.json index 14487cafcb..c41afdd39f 100644 --- a/apps/keira/src/assets/i18n/ro.json +++ b/apps/keira/src/assets/i18n/ro.json @@ -148,7 +148,9 @@ "SELECT_NPC_TEXT": "Select NPC Text", "NPC_TEXT": "NPC Text", "SELECT_PAGE_TEXT": "Select Page Text", - "PAGE_TEXT": "Page Text" + "PAGE_TEXT": "Page Text", + "ACORE_STRING_TEXT": "Acore Strings", + "SELECT_ACORE_STRING_TEXT": "Select Acore Strings" }, "GOSSIP": { "TITLE": "Gossip", diff --git a/apps/keira/src/assets/i18n/ru.json b/apps/keira/src/assets/i18n/ru.json index 673a8b08fe..eb74491740 100644 --- a/apps/keira/src/assets/i18n/ru.json +++ b/apps/keira/src/assets/i18n/ru.json @@ -144,7 +144,9 @@ "SELECT_NPC_TEXT": "Select NPC Text", "NPC_TEXT": "NPC Text", "SELECT_PAGE_TEXT": "Select Page Text", - "PAGE_TEXT": "Page Text" + "PAGE_TEXT": "Page Text", + "ACORE_STRING_TEXT": "Acore Strings", + "SELECT_ACORE_STRING_TEXT": "Select Acore Strings" }, "GOSSIP": { "TITLE": "Разговоры", diff --git a/apps/keira/src/assets/i18n/sk.json b/apps/keira/src/assets/i18n/sk.json index 14487cafcb..c41afdd39f 100644 --- a/apps/keira/src/assets/i18n/sk.json +++ b/apps/keira/src/assets/i18n/sk.json @@ -148,7 +148,9 @@ "SELECT_NPC_TEXT": "Select NPC Text", "NPC_TEXT": "NPC Text", "SELECT_PAGE_TEXT": "Select Page Text", - "PAGE_TEXT": "Page Text" + "PAGE_TEXT": "Page Text", + "ACORE_STRING_TEXT": "Acore Strings", + "SELECT_ACORE_STRING_TEXT": "Select Acore Strings" }, "GOSSIP": { "TITLE": "Gossip", diff --git a/apps/keira/src/assets/i18n/sv.json b/apps/keira/src/assets/i18n/sv.json index c29971099b..17544e8f84 100644 --- a/apps/keira/src/assets/i18n/sv.json +++ b/apps/keira/src/assets/i18n/sv.json @@ -144,7 +144,9 @@ "SELECT_NPC_TEXT": "Select NPC Text", "NPC_TEXT": "NPC Text", "SELECT_PAGE_TEXT": "Select Page Text", - "PAGE_TEXT": "Page Text" + "PAGE_TEXT": "Page Text", + "ACORE_STRING_TEXT": "Acore Strings", + "SELECT_ACORE_STRING_TEXT": "Select Acore Strings" }, "GOSSIP": { "TITLE": "Gossip", diff --git a/apps/keira/src/assets/i18n/zh.json b/apps/keira/src/assets/i18n/zh.json index bd3160e77e..d413c4c4da 100644 --- a/apps/keira/src/assets/i18n/zh.json +++ b/apps/keira/src/assets/i18n/zh.json @@ -144,7 +144,9 @@ "SELECT_NPC_TEXT": "Select NPC Text", "NPC_TEXT": "NPC Text", "SELECT_PAGE_TEXT": "Select Page Text", - "PAGE_TEXT": "Page Text" + "PAGE_TEXT": "Page Text", + "ACORE_STRING_TEXT": "Acore Strings", + "SELECT_ACORE_STRING_TEXT": "Select Acore Strings" }, "GOSSIP": { "TITLE": "闲聊对话", diff --git a/libs/features/texts/src/acore-text/acore-text-handler.service.spec.ts b/libs/features/texts/src/acore-text/acore-text-handler.service.spec.ts new file mode 100644 index 0000000000..ab577b6e9d --- /dev/null +++ b/libs/features/texts/src/acore-text/acore-text-handler.service.spec.ts @@ -0,0 +1,27 @@ +import { TestBed } from '@angular/core/testing'; +import { AcoreTextHandlerService } from './acore-text-handler.service'; +import { ACORE_STRING_TABLE } from '@keira/shared/acore-world-model'; + +describe(AcoreTextHandlerService.name, () => { + beforeEach(() => + TestBed.configureTestingModule({ + providers: [AcoreTextHandlerService], + }), + ); + + const setup = () => { + const service = TestBed.inject(AcoreTextHandlerService); + return { service }; + }; + + it('isUnsaved should return the value of the statusMap for the broadcast_text table', () => { + const { service } = setup(); + expect(service.isUnsaved).toBe(false); // defaults to false + + service.statusMap[ACORE_STRING_TABLE] = true; + expect(service.isUnsaved).toBe(true); + + service.statusMap[ACORE_STRING_TABLE] = false; + expect(service.isUnsaved).toBe(false); + }); +}); diff --git a/libs/features/texts/src/acore-text/acore-text-handler.service.ts b/libs/features/texts/src/acore-text/acore-text-handler.service.ts new file mode 100644 index 0000000000..6bcab2d6b7 --- /dev/null +++ b/libs/features/texts/src/acore-text/acore-text-handler.service.ts @@ -0,0 +1,18 @@ +import { Injectable } from '@angular/core'; +import { HandlerService } from '@keira/shared/base-abstract-classes'; +import { ACORE_STRING_TABLE, AcoreString } from '@keira/shared/acore-world-model'; + +@Injectable({ + providedIn: 'root', +}) +export class AcoreTextHandlerService extends HandlerService { + protected readonly mainEditorRoutePath = 'texts/acore-string'; + + get isUnsaved(): boolean { + return this.statusMap[ACORE_STRING_TABLE]; + } + + protected _statusMap = { + [ACORE_STRING_TABLE]: false, + }; +} diff --git a/libs/features/texts/src/acore-text/acore-text.component.html b/libs/features/texts/src/acore-text/acore-text.component.html new file mode 100644 index 0000000000..a6497231ef --- /dev/null +++ b/libs/features/texts/src/acore-text/acore-text.component.html @@ -0,0 +1,73 @@ + + +
+ @if (editorService.loading) { + + } + + @if (editorService.form && !!editorService.loadedEntityId && !editorService.loading) { +
+
+ +
+
+
+
+
+ + + +
+
+
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+ +
+
+ + +
+
+ + +
+
+
+
+
+ } +
diff --git a/libs/features/texts/src/acore-text/acore-text.component.ts b/libs/features/texts/src/acore-text/acore-text.component.ts new file mode 100644 index 0000000000..4e9ebba6ee --- /dev/null +++ b/libs/features/texts/src/acore-text/acore-text.component.ts @@ -0,0 +1,20 @@ +import { ChangeDetectionStrategy, Component, inject } from '@angular/core'; +import { ReactiveFormsModule } from '@angular/forms'; +import { AcoreString } from '@keira/shared/acore-world-model'; +import { SingleRowEditorComponent } from '@keira/shared/base-abstract-classes'; +import { QueryOutputComponent, TopBarComponent } from '@keira/shared/base-editor-components'; +import { TranslateModule } from '@ngx-translate/core'; +import { TooltipModule } from 'ngx-bootstrap/tooltip'; +import { AcoreTextHandlerService } from './acore-text-handler.service'; +import { AcoreTextService } from './acore-text.service'; + +@Component({ + changeDetection: ChangeDetectionStrategy.OnPush, + templateUrl: './acore-text.component.html', + standalone: true, + imports: [TopBarComponent, TranslateModule, QueryOutputComponent, ReactiveFormsModule, TooltipModule], +}) +export class AcoreTextComponent extends SingleRowEditorComponent { + override readonly editorService = inject(AcoreTextService); + protected override readonly handlerService = inject(AcoreTextHandlerService); +} diff --git a/libs/features/texts/src/acore-text/acore-text.integration.spec.ts b/libs/features/texts/src/acore-text/acore-text.integration.spec.ts new file mode 100644 index 0000000000..c4c957de93 --- /dev/null +++ b/libs/features/texts/src/acore-text/acore-text.integration.spec.ts @@ -0,0 +1,158 @@ +import { TestBed, waitForAsync } from '@angular/core/testing'; +import { MysqlQueryService } from '@keira/shared/db-layer'; +import { EditorPageObject, TranslateTestingModule } from '@keira/shared/test-utils'; +import { AcoreString } from '@keira/shared/acore-world-model'; +import { ModalModule } from 'ngx-bootstrap/modal'; +import { ToastrModule } from 'ngx-toastr'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; +import { of } from 'rxjs'; +import { KEIRA_APP_CONFIG_TOKEN, KEIRA_MOCK_CONFIG } from '@keira/shared/config'; +import { AcoreTextComponent } from './acore-text.component'; +import { AcoreTextHandlerService } from './acore-text-handler.service'; + +describe('Acore String integration tests', () => { + class Page extends EditorPageObject {} + + const entry = 1234; + const expectedFullCreateQuery = + 'DELETE FROM `acore_string` WHERE (`entry` = 1234);\n' + + 'INSERT INTO `acore_string` (`entry`, `content_default`, `locale_koKR`, `locale_frFR`, `locale_deDE`, ' + + '`locale_zhCN`, `locale_zhTW`, `locale_esES`, `locale_esMX`, `locale_ruRU`)' + + ' VALUES\n' + + "(1234, '', '', '', '', '', '', '', '', '');"; + + const originalEntity = new AcoreString(); + originalEntity.entry = entry; + originalEntity.content_default = 'Hi'; + originalEntity.locale_koKR = '1'; + originalEntity.locale_frFR = '2'; + originalEntity.locale_deDE = '3'; + originalEntity.locale_zhCN = '4'; + originalEntity.locale_zhTW = '5'; + originalEntity.locale_esES = '6'; + originalEntity.locale_esMX = '7'; + originalEntity.locale_ruRU = '8'; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + imports: [BrowserAnimationsModule, ToastrModule.forRoot(), ModalModule.forRoot(), AcoreTextComponent, TranslateTestingModule], + providers: [{ provide: KEIRA_APP_CONFIG_TOKEN, useValue: KEIRA_MOCK_CONFIG }], + }).compileComponents(); + })); + + function setup(creatingNew: boolean) { + const handlerService = TestBed.inject(AcoreTextHandlerService); + handlerService['_selected'] = `${entry}`; + handlerService.isNew = creatingNew; + + const queryService = TestBed.inject(MysqlQueryService); + const querySpy = spyOn(queryService, 'query').and.returnValue(of([])); + + spyOn(queryService, 'selectAll').and.returnValue(of(creatingNew ? [] : [originalEntity])); + + const fixture = TestBed.createComponent(AcoreTextComponent); + const component = fixture.componentInstance; + const page = new Page(fixture); + fixture.autoDetectChanges(true); + fixture.detectChanges(); + + return { originalEntity, handlerService, queryService, querySpy, fixture, component, page: page }; + } + + describe('Creating new', () => { + it('should correctly initialise', () => { + const { page } = setup(true); + page.expectQuerySwitchToBeHidden(); + page.expectFullQueryToBeShown(); + page.expectFullQueryToContain(expectedFullCreateQuery); + page.removeNativeElement(); + }); + + it('should correctly update the unsaved status', () => { + const { page, handlerService } = setup(true); + const field = 'content_default'; + expect(handlerService.isUnsaved).toBe(false); + page.setInputValueById(field, 'Hi, i am a quest'); + expect(handlerService.isUnsaved).toBe(true); + page.setInputValueById(field, ''); + expect(handlerService.isUnsaved).toBe(false); + page.removeNativeElement(); + }); + + it('changing a property and executing the query should correctly work', () => { + const { page, querySpy } = setup(true); + const expectedQuery = + 'DELETE FROM `acore_string` WHERE (`entry` = 1234);\n' + + 'INSERT INTO `acore_string` (`entry`, `content_default`, `locale_koKR`, `locale_frFR`, `locale_deDE`, ' + + '`locale_zhCN`, `locale_zhTW`, `locale_esES`, `locale_esMX`, `locale_ruRU`)' + + ' VALUES\n' + + "(1234, 'Hi', '', '', '', '', '', '', '', '');"; + querySpy.calls.reset(); + + page.setInputValueById('content_default', 'Hi'); + page.expectFullQueryToContain(expectedQuery); + + page.clickExecuteQuery(); + + expect(querySpy).toHaveBeenCalledTimes(1); + expect(querySpy.calls.mostRecent().args[0]).toContain(expectedQuery); + page.removeNativeElement(); + }); + }); + + describe('Editing existing', () => { + it('should correctly initialise', () => { + const { page } = setup(false); + page.expectDiffQueryToBeShown(); + page.expectDiffQueryToBeEmpty(); + page.expectFullQueryToContain( + 'DELETE FROM `acore_string` WHERE (`entry` = 1234);\n' + + 'INSERT INTO `acore_string` (`entry`, `content_default`, `locale_koKR`, `locale_frFR`, `locale_deDE`, ' + + '`locale_zhCN`, `locale_zhTW`, `locale_esES`, `locale_esMX`, `locale_ruRU`)' + + ' VALUES\n' + + "(1234, 'Hi', '1', '2', '3', '4', '5', '6', '7', '8');", + ); + page.removeNativeElement(); + }); + + it('changing all properties and executing the query should correctly work', () => { + const { page, querySpy } = setup(false); + const expectedQuery = "UPDATE `acore_string` SET `content_default` = '0' WHERE (`entry` = 1234);"; + querySpy.calls.reset(); + + page.changeAllFields(originalEntity, ['entry']); + page.expectDiffQueryToContain(expectedQuery); + + page.clickExecuteQuery(); + expect(querySpy).toHaveBeenCalledTimes(1); + expect(querySpy.calls.mostRecent().args[0]).toContain(expectedQuery); + page.removeNativeElement(); + }); + + it('changing values should correctly update the queries', () => { + const { page } = setup(false); + page.setInputValueById('content_default', 'Hello'); + page.expectDiffQueryToContain("UPDATE `acore_string` SET `content_default` = 'Hello' WHERE (`entry` = 1234);"); + page.expectFullQueryToContain( + 'DELETE FROM `acore_string` WHERE (`entry` = 1234);\n' + + 'INSERT INTO `acore_string` (`entry`, `content_default`, `locale_koKR`, `locale_frFR`, `locale_deDE`, ' + + '`locale_zhCN`, `locale_zhTW`, `locale_esES`, `locale_esMX`, `locale_ruRU`)' + + ' VALUES\n' + + "(1234, 'Hello', '1', '2', '3', '4', '5', '6', '7', '8');", + ); + + page.setInputValueById('locale_deDE', 'Hallo'); + page.expectDiffQueryToContain( + "UPDATE `acore_string` SET `content_default` = 'Hello', `locale_deDE` = 'Hallo' WHERE (`entry` = 1234);", + ); + page.expectFullQueryToContain( + 'DELETE FROM `acore_string` WHERE (`entry` = 1234);\n' + + 'INSERT INTO `acore_string` (`entry`, `content_default`, `locale_koKR`, `locale_frFR`, `locale_deDE`, ' + + '`locale_zhCN`, `locale_zhTW`, `locale_esES`, `locale_esMX`, `locale_ruRU`)' + + ' VALUES\n' + + "(1234, 'Hello', '1', '2', 'Hallo', '4', '5', '6', '7', '8');", + ); + page.removeNativeElement(); + }); + }); +}); diff --git a/libs/features/texts/src/acore-text/acore-text.service.spec.ts b/libs/features/texts/src/acore-text/acore-text.service.spec.ts new file mode 100644 index 0000000000..d9144800c3 --- /dev/null +++ b/libs/features/texts/src/acore-text/acore-text.service.spec.ts @@ -0,0 +1,17 @@ +import { TestBed } from '@angular/core/testing'; +import { AcoreTextService } from './acore-text.service'; +import { AcoreTextHandlerService } from './acore-text-handler.service'; +import { instance, mock } from 'ts-mockito'; +import { ToastrService } from 'ngx-toastr'; + +describe(AcoreTextService.name, () => { + beforeEach(() => + TestBed.configureTestingModule({ + providers: [AcoreTextHandlerService, { provide: ToastrService, useValue: instance(mock(ToastrService)) }], + }), + ); + + it('should be created', () => { + expect(TestBed.inject(AcoreTextService)).toBeTruthy(); + }); +}); diff --git a/libs/features/texts/src/acore-text/acore-text.service.ts b/libs/features/texts/src/acore-text/acore-text.service.ts new file mode 100644 index 0000000000..7cb110166f --- /dev/null +++ b/libs/features/texts/src/acore-text/acore-text.service.ts @@ -0,0 +1,14 @@ +import { Injectable } from '@angular/core'; +import { SingleRowEditorService } from '@keira/shared/base-abstract-classes'; +import { AcoreTextHandlerService } from './acore-text-handler.service'; +import { ACORE_STRING_DEFAULT, ACORE_STRING_ENTRY, ACORE_STRING_TABLE, AcoreString } from '@keira/shared/acore-world-model'; + +@Injectable({ + providedIn: 'root', +}) +export class AcoreTextService extends SingleRowEditorService { + /* istanbul ignore next */ // because of: https://github.com/gotwarlost/istanbul/issues/690 + constructor(protected override handlerService: AcoreTextHandlerService) { + super(AcoreString, ACORE_STRING_TABLE, ACORE_STRING_ENTRY, ACORE_STRING_DEFAULT, true, handlerService); + } +} diff --git a/libs/features/texts/src/acore-text/select-acore-text.component.html b/libs/features/texts/src/acore-text/select-acore-text.component.html new file mode 100644 index 0000000000..c9220daab2 --- /dev/null +++ b/libs/features/texts/src/acore-text/select-acore-text.component.html @@ -0,0 +1,62 @@ + + +
+
+ +
+ +
+

+
+
+ +
+ +
+
+ +
+
+
+ +
+
+ +
+
+ + + + @if (selectService.rows) { +
+ + + + +
+ } +
+
diff --git a/libs/features/texts/src/acore-text/select-acore-text.component.ts b/libs/features/texts/src/acore-text/select-acore-text.component.ts new file mode 100644 index 0000000000..c35124e3d1 --- /dev/null +++ b/libs/features/texts/src/acore-text/select-acore-text.component.ts @@ -0,0 +1,31 @@ +import { ChangeDetectionStrategy, Component, inject } from '@angular/core'; +import { SelectComponent } from '@keira/shared/base-abstract-classes'; +import { ACORE_STRING_CUSTOM_STARTING_ID, ACORE_STRING_ENTRY, ACORE_STRING_TABLE, AcoreString } from '@keira/shared/acore-world-model'; +import { NgxDatatableModule } from '@siemens/ngx-datatable'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { TranslateModule } from '@ngx-translate/core'; +import { CreateComponent, HighlightjsWrapperComponent, TopBarComponent } from '@keira/shared/base-editor-components'; +import { SelectAcoreTextService } from './select-acore-text.service'; +import { AcoreTextHandlerService } from './acore-text-handler.service'; + +@Component({ + changeDetection: ChangeDetectionStrategy.OnPush, + templateUrl: './select-acore-text.component.html', + standalone: true, + imports: [ + TopBarComponent, + CreateComponent, + TranslateModule, + FormsModule, + ReactiveFormsModule, + HighlightjsWrapperComponent, + NgxDatatableModule, + ], +}) +export class SelectAcoreTextComponent extends SelectComponent { + readonly entityTable = ACORE_STRING_TABLE; + readonly entityIdField = ACORE_STRING_ENTRY; + readonly customStartingId = ACORE_STRING_CUSTOM_STARTING_ID; + readonly selectService = inject(SelectAcoreTextService); + readonly handlerService = inject(AcoreTextHandlerService); +} diff --git a/libs/features/texts/src/acore-text/select-acore-text.integration.spec.ts b/libs/features/texts/src/acore-text/select-acore-text.integration.spec.ts new file mode 100644 index 0000000000..b47d536226 --- /dev/null +++ b/libs/features/texts/src/acore-text/select-acore-text.integration.spec.ts @@ -0,0 +1,140 @@ +import { TestBed, waitForAsync } from '@angular/core/testing'; +import { Router } from '@angular/router'; +import { MysqlQueryService } from '@keira/shared/db-layer'; +import { SelectPageObject, TranslateTestingModule } from '@keira/shared/test-utils'; +import { ACORE_STRING_ENTRY } from '@keira/shared/acore-world-model'; +import { ModalModule } from 'ngx-bootstrap/modal'; +import { ToastrModule } from 'ngx-toastr'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; +import { of } from 'rxjs'; +import { SelectAcoreTextComponent } from './select-acore-text.component'; +import { AcoreTextHandlerService } from './acore-text-handler.service'; +import { SelectAcoreTextService } from './select-acore-text.service'; + +describe(`${SelectAcoreTextComponent.name} integration tests`, () => { + class Page extends SelectPageObject { + override ID_FIELD = ACORE_STRING_ENTRY; + } + + const value = 1200; + const expectedRoute = 'texts/acore-string'; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + imports: [BrowserAnimationsModule, ToastrModule.forRoot(), ModalModule.forRoot(), SelectAcoreTextComponent, TranslateTestingModule], + providers: [AcoreTextHandlerService], + }).compileComponents(); + })); + + function setup() { + const navigateSpy = spyOn(TestBed.inject(Router), 'navigate'); + const queryService = TestBed.inject(MysqlQueryService); + const querySpy = spyOn(queryService, 'query').and.returnValue(of([{ max: 1 }])); + + const selectService = TestBed.inject(SelectAcoreTextService); + + const fixture = TestBed.createComponent(SelectAcoreTextComponent); + const page = new Page(fixture); + const component = fixture.componentInstance; + fixture.autoDetectChanges(true); + fixture.detectChanges(); + + return { component, fixture, selectService, broadcast: page, queryService, querySpy, navigateSpy }; + } + + it('should correctly initialise', waitForAsync(async () => { + const { fixture, broadcast, querySpy, component } = setup(); + + await fixture.whenStable(); + expect(broadcast.createInput.value).toEqual(`${component.customStartingId}`); + broadcast.expectNewEntityFree(); + expect(querySpy).toHaveBeenCalledWith('SELECT MAX(entry) AS max FROM acore_string;'); + expect(broadcast.queryWrapper.innerText).toContain('SELECT * FROM `acore_string` LIMIT 50'); + })); + + it('should correctly behave when inserting and selecting free entry', waitForAsync(async () => { + const { fixture, broadcast, querySpy, navigateSpy } = setup(); + + await fixture.whenStable(); + querySpy.calls.reset(); + querySpy.and.returnValue(of([])); + + broadcast.setInputValue(broadcast.createInput, value); + + expect(querySpy).toHaveBeenCalledTimes(1); + expect(querySpy).toHaveBeenCalledWith(`SELECT * FROM \`acore_string\` WHERE (entry = ${value})`); + broadcast.expectNewEntityFree(); + + broadcast.clickElement(broadcast.selectNewBtn); + + expect(navigateSpy).toHaveBeenCalledTimes(1); + expect(navigateSpy).toHaveBeenCalledWith([expectedRoute]); + broadcast.expectTopBarCreatingNew(value); + })); + + it('should correctly behave when inserting an existing entity', waitForAsync(async () => { + const { fixture, broadcast, querySpy } = setup(); + + await fixture.whenStable(); + querySpy.calls.reset(); + querySpy.and.returnValue(of([{}])); + + broadcast.setInputValue(broadcast.createInput, value); + + expect(querySpy).toHaveBeenCalledTimes(1); + expect(querySpy).toHaveBeenCalledWith(`SELECT * FROM \`acore_string\` WHERE (entry = ${value})`); + broadcast.expectEntityAlreadyInUse(); + })); + + for (const { id, entry, limit, expectedQuery } of [ + { + id: 1, + entry: 1200, + limit: '100', + expectedQuery: 'SELECT * FROM `acore_string` ' + "WHERE (`entry` LIKE '%1200%') LIMIT 100", + }, + ]) { + it(`searching an existing entity should correctly work [${id}]`, () => { + const { broadcast, querySpy } = setup(); + + querySpy.calls.reset(); + if (entry) { + broadcast.setInputValue(broadcast.searchIdInput, entry); + } + broadcast.setInputValue(broadcast.searchLimitInput, limit); + + expect(broadcast.queryWrapper.innerText).toContain(expectedQuery); + + broadcast.clickElement(broadcast.searchBtn); + + expect(querySpy).toHaveBeenCalledTimes(1); + expect(querySpy).toHaveBeenCalledWith(expectedQuery); + }); + } + + it('searching and selecting an existing entity from the datatable should correctly work', () => { + const { navigateSpy, broadcast, querySpy } = setup(); + + const results = [{ entry: 1 }, { entry: 2 }, { entry: 3 }]; + querySpy.calls.reset(); + querySpy.and.returnValue(of(results)); + + broadcast.clickElement(broadcast.searchBtn); + + const row0 = broadcast.getDatatableRow(0); + const row1 = broadcast.getDatatableRow(1); + const row2 = broadcast.getDatatableRow(2); + + expect(row0.innerText).toContain(String(results[0].entry)); + expect(row1.innerText).toContain(String(results[1].entry)); + expect(row2.innerText).toContain(String(results[2].entry)); + + broadcast.clickElement(broadcast.getDatatableCell(0, 0)); + + expect(navigateSpy).toHaveBeenCalledTimes(1); + expect(navigateSpy).toHaveBeenCalledWith([expectedRoute]); + // TODO: check this + // Note: this is different than in other editors + // expect(broadcast.topBar.innerText).toContain(`Editing: broadcast_text (${results[0].ID})`); + }); +}); diff --git a/libs/features/texts/src/acore-text/select-acore-text.service.spec.ts b/libs/features/texts/src/acore-text/select-acore-text.service.spec.ts new file mode 100644 index 0000000000..586ad42015 --- /dev/null +++ b/libs/features/texts/src/acore-text/select-acore-text.service.spec.ts @@ -0,0 +1,22 @@ +import { TestBed } from '@angular/core/testing'; +import { MysqlQueryService } from '@keira/shared/db-layer'; + +import { instance, mock } from 'ts-mockito'; +import { SelectAcoreTextService } from './select-acore-text.service'; +import { AcoreTextHandlerService } from './acore-text-handler.service'; + +describe(SelectAcoreTextService.name, () => { + beforeEach(() => + TestBed.configureTestingModule({ + providers: [ + { provide: MysqlQueryService, useValue: instance(mock(MysqlQueryService)) }, + SelectAcoreTextService, + AcoreTextHandlerService, + ], + }), + ); + + it('should be created', () => { + expect(TestBed.inject(SelectAcoreTextService)).toBeTruthy(); + }); +}); diff --git a/libs/features/texts/src/acore-text/select-acore-text.service.ts b/libs/features/texts/src/acore-text/select-acore-text.service.ts new file mode 100644 index 0000000000..bfcc4d5cea --- /dev/null +++ b/libs/features/texts/src/acore-text/select-acore-text.service.ts @@ -0,0 +1,24 @@ +import { Injectable } from '@angular/core'; +import { SelectService } from '@keira/shared/base-abstract-classes'; +import { MysqlQueryService } from '@keira/shared/db-layer'; +import { + ACORE_STRING_DEFAULT, + ACORE_STRING_ENTRY, + ACORE_STRING_SEARCH_FIELDS, + ACORE_STRING_TABLE, + AcoreString, +} from '@keira/shared/acore-world-model'; +import { AcoreTextHandlerService } from './acore-text-handler.service'; + +@Injectable({ + providedIn: 'root', +}) +export class SelectAcoreTextService extends SelectService { + /* istanbul ignore next */ // because of: https://github.com/gotwarlost/istanbul/issues/690 + constructor( + override readonly queryService: MysqlQueryService, + public override readonly handlerService: AcoreTextHandlerService, + ) { + super(queryService, handlerService, ACORE_STRING_TABLE, ACORE_STRING_ENTRY, ACORE_STRING_DEFAULT, ACORE_STRING_SEARCH_FIELDS); + } +} diff --git a/libs/main/main-window/src/sidebar/sidebar.component.html b/libs/main/main-window/src/sidebar/sidebar.component.html index 76a1267bd7..3ec9fcee66 100644 --- a/libs/main/main-window/src/sidebar/sidebar.component.html +++ b/libs/main/main-window/src/sidebar/sidebar.component.html @@ -539,6 +539,22 @@ } diff --git a/libs/features/texts/src/acore-text/select-acore-string.component.ts b/libs/features/texts/src/acore-string/select-acore-string.component.ts similarity index 100% rename from libs/features/texts/src/acore-text/select-acore-string.component.ts rename to libs/features/texts/src/acore-string/select-acore-string.component.ts diff --git a/libs/features/texts/src/acore-text/select-acore-string.integration.spec.ts b/libs/features/texts/src/acore-string/select-acore-string.integration.spec.ts similarity index 71% rename from libs/features/texts/src/acore-text/select-acore-string.integration.spec.ts rename to libs/features/texts/src/acore-string/select-acore-string.integration.spec.ts index 1b43380373..f1143b6d53 100644 --- a/libs/features/texts/src/acore-text/select-acore-string.integration.spec.ts +++ b/libs/features/texts/src/acore-string/select-acore-string.integration.spec.ts @@ -39,51 +39,51 @@ describe(`${SelectAcoreStringComponent.name} integration tests`, () => { fixture.autoDetectChanges(true); fixture.detectChanges(); - return { component, fixture, selectService, broadcast: page, queryService, querySpy, navigateSpy }; + return { component, fixture, selectService, acoreStrings: page, queryService, querySpy, navigateSpy }; } it('should correctly initialise', waitForAsync(async () => { - const { fixture, broadcast, querySpy, component } = setup(); + const { fixture, acoreStrings, querySpy, component } = setup(); await fixture.whenStable(); - expect(broadcast.createInput.value).toEqual(`${component.customStartingId}`); - broadcast.expectNewEntityFree(); + expect(acoreStrings.createInput.value).toEqual(`${component.customStartingId}`); + acoreStrings.expectNewEntityFree(); expect(querySpy).toHaveBeenCalledWith('SELECT MAX(entry) AS max FROM acore_string;'); - expect(broadcast.queryWrapper.innerText).toContain('SELECT * FROM `acore_string` LIMIT 50'); + expect(acoreStrings.queryWrapper.innerText).toContain('SELECT * FROM `acore_string` LIMIT 50'); })); it('should correctly behave when inserting and selecting free entry', waitForAsync(async () => { - const { fixture, broadcast, querySpy, navigateSpy } = setup(); + const { fixture, acoreStrings, querySpy, navigateSpy } = setup(); await fixture.whenStable(); querySpy.calls.reset(); querySpy.and.returnValue(of([])); - broadcast.setInputValue(broadcast.createInput, value); + acoreStrings.setInputValue(acoreStrings.createInput, value); expect(querySpy).toHaveBeenCalledTimes(1); expect(querySpy).toHaveBeenCalledWith(`SELECT * FROM \`acore_string\` WHERE (entry = ${value})`); - broadcast.expectNewEntityFree(); + acoreStrings.expectNewEntityFree(); - broadcast.clickElement(broadcast.selectNewBtn); + acoreStrings.clickElement(acoreStrings.selectNewBtn); expect(navigateSpy).toHaveBeenCalledTimes(1); expect(navigateSpy).toHaveBeenCalledWith([expectedRoute]); - broadcast.expectTopBarCreatingNew(value); + acoreStrings.expectTopBarCreatingNew(value); })); it('should correctly behave when inserting an existing entity', waitForAsync(async () => { - const { fixture, broadcast, querySpy } = setup(); + const { fixture, acoreStrings, querySpy } = setup(); await fixture.whenStable(); querySpy.calls.reset(); querySpy.and.returnValue(of([{}])); - broadcast.setInputValue(broadcast.createInput, value); + acoreStrings.setInputValue(acoreStrings.createInput, value); expect(querySpy).toHaveBeenCalledTimes(1); expect(querySpy).toHaveBeenCalledWith(`SELECT * FROM \`acore_string\` WHERE (entry = ${value})`); - broadcast.expectEntityAlreadyInUse(); + acoreStrings.expectEntityAlreadyInUse(); })); for (const { id, entry, limit, expectedQuery } of [ @@ -95,17 +95,17 @@ describe(`${SelectAcoreStringComponent.name} integration tests`, () => { }, ]) { it(`searching an existing entity should correctly work [${id}]`, () => { - const { broadcast, querySpy } = setup(); + const { acoreStrings, querySpy } = setup(); querySpy.calls.reset(); if (entry) { - broadcast.setInputValue(broadcast.searchIdInput, entry); + acoreStrings.setInputValue(acoreStrings.searchIdInput, entry); } - broadcast.setInputValue(broadcast.searchLimitInput, limit); + acoreStrings.setInputValue(acoreStrings.searchLimitInput, limit); - expect(broadcast.queryWrapper.innerText).toContain(expectedQuery); + expect(acoreStrings.queryWrapper.innerText).toContain(expectedQuery); - broadcast.clickElement(broadcast.searchBtn); + acoreStrings.clickElement(acoreStrings.searchBtn); expect(querySpy).toHaveBeenCalledTimes(1); expect(querySpy).toHaveBeenCalledWith(expectedQuery); @@ -113,28 +113,25 @@ describe(`${SelectAcoreStringComponent.name} integration tests`, () => { } it('searching and selecting an existing entity from the datatable should correctly work', () => { - const { navigateSpy, broadcast, querySpy } = setup(); + const { navigateSpy, acoreStrings, querySpy } = setup(); const results = [{ entry: 1 }, { entry: 2 }, { entry: 3 }]; querySpy.calls.reset(); querySpy.and.returnValue(of(results)); - broadcast.clickElement(broadcast.searchBtn); + acoreStrings.clickElement(acoreStrings.searchBtn); - const row0 = broadcast.getDatatableRow(0); - const row1 = broadcast.getDatatableRow(1); - const row2 = broadcast.getDatatableRow(2); + const row0 = acoreStrings.getDatatableRow(0); + const row1 = acoreStrings.getDatatableRow(1); + const row2 = acoreStrings.getDatatableRow(2); expect(row0.innerText).toContain(String(results[0].entry)); expect(row1.innerText).toContain(String(results[1].entry)); expect(row2.innerText).toContain(String(results[2].entry)); - broadcast.clickElement(broadcast.getDatatableCell(0, 0)); + acoreStrings.clickElement(acoreStrings.getDatatableCell(0, 0)); expect(navigateSpy).toHaveBeenCalledTimes(1); expect(navigateSpy).toHaveBeenCalledWith([expectedRoute]); - // TODO: check this - // Note: this is different than in other editors - // expect(broadcast.topBar.innerText).toContain(`Editing: broadcast_text (${results[0].ID})`); }); }); diff --git a/libs/features/texts/src/acore-text/select-acore-string.service.spec.ts b/libs/features/texts/src/acore-string/select-acore-string.service.spec.ts similarity index 100% rename from libs/features/texts/src/acore-text/select-acore-string.service.spec.ts rename to libs/features/texts/src/acore-string/select-acore-string.service.spec.ts diff --git a/libs/features/texts/src/acore-text/select-acore-string.service.ts b/libs/features/texts/src/acore-string/select-acore-string.service.ts similarity index 100% rename from libs/features/texts/src/acore-text/select-acore-string.service.ts rename to libs/features/texts/src/acore-string/select-acore-string.service.ts diff --git a/libs/features/texts/src/index.ts b/libs/features/texts/src/index.ts index 29ec1197c2..c4209b8c94 100644 --- a/libs/features/texts/src/index.ts +++ b/libs/features/texts/src/index.ts @@ -10,6 +10,6 @@ export { NpcTextHandlerService } from './npc-text/npc-text-handler.service'; export { SelectNpcTextComponent } from './npc-text/select-npc-text.component'; export { NpcTextComponent } from './npc-text/npc-text.component'; -export { AcoreStringHandlerService } from './acore-text/acore-string-handler.service'; -export { SelectAcoreStringComponent } from './acore-text/select-acore-string.component'; -export { AcoreStringComponent } from './acore-text/acore-string.component'; +export { AcoreStringHandlerService } from './acore-string/acore-string-handler.service'; +export { SelectAcoreStringComponent } from './acore-string/select-acore-string.component'; +export { AcoreStringComponent } from './acore-string/acore-string.component'; From 21cc6988f928b46472c4f9c96d8ae9640842d2c4 Mon Sep 17 00:00:00 2001 From: Exitare Date: Sat, 21 Dec 2024 09:59:58 -0800 Subject: [PATCH 5/6] Add missing acore string handler --- libs/main/main-window/src/sidebar/sidebar.component.html | 2 +- libs/main/main-window/src/sidebar/sidebar.component.ts | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/libs/main/main-window/src/sidebar/sidebar.component.html b/libs/main/main-window/src/sidebar/sidebar.component.html index 3ec9fcee66..fef4a8504e 100644 --- a/libs/main/main-window/src/sidebar/sidebar.component.html +++ b/libs/main/main-window/src/sidebar/sidebar.component.html @@ -544,7 +544,7 @@ {{ 'SIDEBAR.TEXTS.SELECT_ACORE_STRING_TEXT' | translate }} - @if (broadcastTextHandlerService.selected) { + @if (acoreStringHandlerService.selected) {
  • {{ 'SIDEBAR.TEXTS.ACORE_STRING_TEXT' | translate }} diff --git a/libs/main/main-window/src/sidebar/sidebar.component.ts b/libs/main/main-window/src/sidebar/sidebar.component.ts index edfda54e11..9e1487e720 100644 --- a/libs/main/main-window/src/sidebar/sidebar.component.ts +++ b/libs/main/main-window/src/sidebar/sidebar.component.ts @@ -16,7 +16,12 @@ import { } from '@keira/features/other-loots'; import { QuestHandlerService } from '@keira/features/quest'; import { SpellHandlerService } from '@keira/features/spell'; -import { BroadcastTextHandlerService, NpcTextHandlerService, PageTextHandlerService } from '@keira/features/texts'; +import { + BroadcastTextHandlerService, + NpcTextHandlerService, + PageTextHandlerService, + AcoreStringHandlerService, +} from '@keira/features/texts'; import { LocationService } from '@keira/shared/common-services'; import { MysqlService } from '@keira/shared/db-layer'; import { SaiHandlerService } from '@keira/shared/sai-editor'; @@ -101,6 +106,7 @@ export class SidebarComponent { protected readonly pageTextHandlerService = inject(PageTextHandlerService); protected readonly broadcastTextHandlerService = inject(BroadcastTextHandlerService); protected readonly npcTextHandlerService = inject(NpcTextHandlerService); + protected readonly acoreStringHandlerService = inject(AcoreStringHandlerService); private readonly locationService = inject(LocationService); getSideBarState(): boolean { From 0fb07ad29fa9a70c5334131c4808e4a1dfaef9c8 Mon Sep 17 00:00:00 2001 From: Exitare Date: Sat, 21 Dec 2024 10:01:22 -0800 Subject: [PATCH 6/6] Update service used for if clause --- libs/main/main-window/src/sidebar/sidebar.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/main/main-window/src/sidebar/sidebar.component.html b/libs/main/main-window/src/sidebar/sidebar.component.html index fef4a8504e..29b29618a0 100644 --- a/libs/main/main-window/src/sidebar/sidebar.component.html +++ b/libs/main/main-window/src/sidebar/sidebar.component.html @@ -548,7 +548,7 @@
  • {{ 'SIDEBAR.TEXTS.ACORE_STRING_TEXT' | translate }} - @if (broadcastTextHandlerService.isUnsaved) { + @if (acoreStringHandlerService.isUnsaved) { }