diff --git a/backend/FwLite/FwDataMiniLcmBridge/Api/FwDataMiniLcmApi.cs b/backend/FwLite/FwDataMiniLcmBridge/Api/FwDataMiniLcmApi.cs index 788bad33b..a701101bb 100644 --- a/backend/FwLite/FwDataMiniLcmBridge/Api/FwDataMiniLcmApi.cs +++ b/backend/FwLite/FwDataMiniLcmBridge/Api/FwDataMiniLcmApi.cs @@ -136,9 +136,15 @@ private WritingSystem FromLcmWritingSystem(CoreWritingSystemDefinition ws, int i }; } - public Task GetWritingSystem(WritingSystemId id, WritingSystemType type) + public async Task GetWritingSystem(WritingSystemId id, WritingSystemType type) { - throw new NotImplementedException(); + var writingSystems = await GetWritingSystems(); + return type switch + { + WritingSystemType.Vernacular => writingSystems.Vernacular.FirstOrDefault(ws => ws.WsId == id), + WritingSystemType.Analysis => writingSystems.Analysis.FirstOrDefault(ws => ws.WsId == id), + _ => throw new ArgumentOutOfRangeException(nameof(type), type, null) + } ?? throw new NullReferenceException($"unable to find writing system with id {id}"); } internal void CompleteExemplars(WritingSystems writingSystems) @@ -208,13 +214,12 @@ await Cache.DoUsingNewOrCurrentUOW("Update WritingSystem", "Revert WritingSystem", async () => { - var updateProxy = new UpdateWritingSystemProxy(lcmWritingSystem, this) + var updateProxy = new UpdateWritingSystemProxy(lcmWritingSystem) { Id = Guid.Empty, Type = type, }; update.Apply(updateProxy); - updateProxy.CommitUpdate(Cache); }); return await GetWritingSystem(id, type); } diff --git a/backend/FwLite/FwDataMiniLcmBridge/Api/UpdateProxy/UpdateWritingSystemProxy.cs b/backend/FwLite/FwDataMiniLcmBridge/Api/UpdateProxy/UpdateWritingSystemProxy.cs index eaf849fcb..3baf370de 100644 --- a/backend/FwLite/FwDataMiniLcmBridge/Api/UpdateProxy/UpdateWritingSystemProxy.cs +++ b/backend/FwLite/FwDataMiniLcmBridge/Api/UpdateProxy/UpdateWritingSystemProxy.cs @@ -9,60 +9,43 @@ namespace FwDataMiniLcmBridge.Api.UpdateProxy; public record UpdateWritingSystemProxy : WritingSystem { - private readonly CoreWritingSystemDefinition _origLcmWritingSystem; - private readonly CoreWritingSystemDefinition _workingLcmWritingSystem; - private readonly FwDataMiniLcmApi _lexboxLcmApi; + private readonly CoreWritingSystemDefinition _lcmWritingSystem; [SetsRequiredMembers] - public UpdateWritingSystemProxy(CoreWritingSystemDefinition lcmWritingSystem, FwDataMiniLcmApi lexboxLcmApi) + public UpdateWritingSystemProxy(CoreWritingSystemDefinition lcmWritingSystem) { - _origLcmWritingSystem = lcmWritingSystem; - _workingLcmWritingSystem = new CoreWritingSystemDefinition(lcmWritingSystem, cloneId: true); - base.Abbreviation = Abbreviation = _origLcmWritingSystem.Abbreviation ?? ""; - base.Name = Name = _origLcmWritingSystem.LanguageName ?? ""; - base.Font = Font = _origLcmWritingSystem.DefaultFontName ?? ""; - _lexboxLcmApi = lexboxLcmApi; - } - - public void CommitUpdate(LcmCache cache) - { - if (_workingLcmWritingSystem.Id == _origLcmWritingSystem.Id) - { - cache.ServiceLocator.WritingSystemManager.Set(_workingLcmWritingSystem); - } - else - { - // Changing the ID of a writing system requires LCM to do a lot of work, so only go through that process if absolutely required - WritingSystemServices.MergeWritingSystems(cache, _workingLcmWritingSystem, _origLcmWritingSystem); - } + _lcmWritingSystem = lcmWritingSystem; + base.Abbreviation = Abbreviation = _lcmWritingSystem.Abbreviation ?? ""; + base.Name = Name = _lcmWritingSystem.LanguageName ?? ""; + base.Font = Font = _lcmWritingSystem.DefaultFontName ?? ""; } public override required WritingSystemId WsId { - get => _workingLcmWritingSystem.Id; - set => _workingLcmWritingSystem.Id = value; + get => _lcmWritingSystem.Id; + set => throw new NotSupportedException("Changing the ID of a writing system is not supported"); } public override required string Name { - get => _workingLcmWritingSystem.LanguageName; + get => _lcmWritingSystem.LanguageName; set { } // Silently do nothing; name should be derived from WsId at all times, so if the name should change then so should the WsId } public override required string Abbreviation { - get => _workingLcmWritingSystem.Abbreviation; - set => _workingLcmWritingSystem.Abbreviation = value; + get => _lcmWritingSystem.Abbreviation; + set => _lcmWritingSystem.Abbreviation = value; } public override required string Font { - get => _workingLcmWritingSystem.DefaultFontName; + get => _lcmWritingSystem.DefaultFontName; set { - if (value != _workingLcmWritingSystem.DefaultFontName) + if (value != _lcmWritingSystem.DefaultFontName) { - _workingLcmWritingSystem.DefaultFont = new FontDefinition(value); + _lcmWritingSystem.DefaultFont = new FontDefinition(value); } } } diff --git a/backend/FwLite/MiniLcm.Tests/WritingSystemTestsBase.cs b/backend/FwLite/MiniLcm.Tests/WritingSystemTestsBase.cs index 3d740d65a..99534c47f 100644 --- a/backend/FwLite/MiniLcm.Tests/WritingSystemTestsBase.cs +++ b/backend/FwLite/MiniLcm.Tests/WritingSystemTestsBase.cs @@ -64,4 +64,15 @@ await Api.CreateWritingSystem(WritingSystemType.Vernacular, }); await action.Should().ThrowAsync(); } + + [Fact] + public async Task UpdateExistingWritingSystem_Works() + { + var writingSystems = await Api.GetWritingSystems(); + var writingSystem = writingSystems.Vernacular.First(); + var original = writingSystem.Copy(); + writingSystem.Abbreviation = "New Abbreviation"; + var updatedWritingSystem = await Api.UpdateWritingSystem(original, writingSystem); + updatedWritingSystem.Abbreviation.Should().Be("New Abbreviation"); + } } diff --git a/backend/FwLite/MiniLcm/Models/WritingSystem.cs b/backend/FwLite/MiniLcm/Models/WritingSystem.cs index 2684b1dc9..93224e74e 100644 --- a/backend/FwLite/MiniLcm/Models/WritingSystem.cs +++ b/backend/FwLite/MiniLcm/Models/WritingSystem.cs @@ -2,7 +2,7 @@ namespace MiniLcm.Models; -public record WritingSystem: IObjectWithId +public record WritingSystem: IObjectWithId { public required Guid Id { get; set; } public virtual required WritingSystemId WsId { get; set; } @@ -28,7 +28,7 @@ public void RemoveReference(Guid id, DateTimeOffset time) { } - public IObjectWithId Copy() + public WritingSystem Copy() { return new WritingSystem { diff --git a/frontend/viewer/src/lib/writing-system/WritingSystemEditor.svelte b/frontend/viewer/src/lib/writing-system/WritingSystemEditor.svelte index 32f2c0d1d..71fe031e6 100644 --- a/frontend/viewer/src/lib/writing-system/WritingSystemEditor.svelte +++ b/frontend/viewer/src/lib/writing-system/WritingSystemEditor.svelte @@ -31,7 +31,8 @@
onChange()} bind:value={writingSystem.wsId}/> - onChange()} bind:value={writingSystem.name}/> + + onChange()} bind:value={writingSystem.name}/> onChange()} bind:value={writingSystem.abbreviation}/> onChange()} bind:value={writingSystem.font}/> {#if newWs}