From 4f8816400bbc8a20536001547a37f207dc7da299 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81d=C3=A1m=20Kov=C3=A1cs?= Date: Wed, 5 Jul 2023 12:02:36 +0200 Subject: [PATCH] Group rename --- ...emManipulationUserCommandHandlerService.cs | 119 ++++++++++++------ 1 file changed, 84 insertions(+), 35 deletions(-) diff --git a/src/AppCommon/FileTime.App.Core/Services/UserCommandHandler/ItemManipulationUserCommandHandlerService.cs b/src/AppCommon/FileTime.App.Core/Services/UserCommandHandler/ItemManipulationUserCommandHandlerService.cs index 3713a7e..888fa13 100644 --- a/src/AppCommon/FileTime.App.Core/Services/UserCommandHandler/ItemManipulationUserCommandHandlerService.cs +++ b/src/AppCommon/FileTime.App.Core/Services/UserCommandHandler/ItemManipulationUserCommandHandlerService.cs @@ -180,12 +180,15 @@ public class ItemManipulationUserCommandHandlerService : UserCommandHandlerServi private async Task Rename(RenameCommand command) { + List itemsToMove = new(); if ((_markedItems?.Collection?.Count ?? 0) > 0) { BehaviorSubject templateRegexValue = new(string.Empty); BehaviorSubject newNameSchemaValue = new(string.Empty); - var itemPreviews = _markedItems!.Collection! + var itemsToRename = new List(_markedItems!.Collection!); + + var itemPreviews = itemsToRename .Select(item => { var originalName = item.GetName(); @@ -238,33 +241,7 @@ public class ItemManipulationUserCommandHandlerService : UserCommandHandlerServi || string.IsNullOrWhiteSpace(newNameSchema)) return new List {new(originalName)}; var regex = new Regex(templateRegex); - var match = regex.Match(originalName); - if (!match.Success) return new List {new(originalName)}; - - var matchGroups = match.Groups; - - var newNameParts = Enumerable.Range(1, matchGroups.Count).Aggregate( - (IEnumerable) new List {newNameSchema}, - (acc, i) => - acc.SelectMany(item2 => - item2 - .Split($"/{i}/") - .SelectMany(e => new[] {e, $"/{i}/"}) - .SkipLast(1) - ) - ); - - - var itemNameParts = newNameParts.Select(namePart => - namePart.StartsWith("/") - && namePart.EndsWith("/") - && namePart.Length > 2 - && int.TryParse(namePart.AsSpan(1, namePart.Length - 2), out var index) - && index > 0 - && index <= matchGroups.Count - ? new ItemNamePart(matchGroups[index].Value, true) - : new ItemNamePart(namePart, false) - ); + var itemNameParts = GetItemNameParts(regex, originalName, newNameSchema); return itemNameParts.ToList(); } @@ -291,14 +268,47 @@ public class ItemManipulationUserCommandHandlerService : UserCommandHandlerServi s => templateRegexValue.OnNext(s!)); var newNameSchema = new TextInputElement("New name schema", string.Empty, s => newNameSchemaValue.OnNext(s!)); - await _userCommunicationService.ReadInputs( + + var success = await _userCommunicationService.ReadInputs( new[] {templateRegex, newNameSchema}, new[] {doubleTextListPreview} ); + + if (success) + { + if (templateRegex.Value is null) + { + //TODO messagebox + } + else if (newNameSchema.Value is null) + { + //TODO messagebox + } + else + { + var regex = new Regex(templateRegex.Value); + var itemsToMoveWithPath = itemsToRename + .Select(item => + ( + OriginalFullName: item, + NewName: + item.GetParent()!.GetChild( + string.Join( + "", + GetItemNameParts(regex, item.GetName(), newNameSchema.Value) + .Select(i => i.Text) + ) + ) + ) + ) + .Select(i => new ItemToMove(i.OriginalFullName, i.NewName)); + + itemsToMove.AddRange(itemsToMoveWithPath); + } + } } else { - List itemsToMove = new(); if (_currentSelectedItem?.BaseItem?.FullName is null) return; var item = await _timelessContentProvider.GetItemByFullNameAsync(_currentSelectedItem.BaseItem.FullName, PointInTime.Present); @@ -307,16 +317,55 @@ public class ItemManipulationUserCommandHandlerService : UserCommandHandlerServi var renameInput = new TextInputElement("New name", item.Name); - await _userCommunicationService.ReadInputs(renameInput); - - //TODO: should check these... - var newPath = item.FullName!.GetParent()!.GetChild(renameInput.Value!); - itemsToMove.Add(new ItemToMove(item.FullName, newPath)); + if (await _userCommunicationService.ReadInputs(renameInput)) + { + //TODO: should check these null forgivings... + var newPath = item.FullName!.GetParent()!.GetChild(renameInput.Value!); + itemsToMove.Add(new ItemToMove(item.FullName, newPath)); + } + } + if (itemsToMove.Count > 0) + { + //TODO: name collision, probably on the input window at the new template name + //TODO: check if the name changed var moveCommandFactory = _serviceProvider.GetRequiredService(); var moveCommand = moveCommandFactory.GenerateCommand(itemsToMove); await AddCommand(moveCommand); } + + static IEnumerable GetItemNameParts(Regex templateRegex, string originalName, string newNameSchema) + { + var match = templateRegex.Match(originalName); + if (!match.Success) return new List {new(originalName)}; + + var matchGroups = match.Groups; + + var newNameParts = Enumerable.Range(1, matchGroups.Count).Aggregate( + (IEnumerable) new List {newNameSchema}, + (acc, i) => + acc.SelectMany(item2 => + item2 + .Split($"/{i}/") + .SelectMany(e => new[] {e, $"/{i}/"}) + .SkipLast(1) + ) + ); + + + var itemNameParts = newNameParts.Select(namePart => + namePart.StartsWith("/") + && namePart.EndsWith("/") + && namePart.Length > 2 + && int.TryParse(namePart.AsSpan(1, namePart.Length - 2), out var index) + && index > 0 + && index <= matchGroups.Count + ? new ItemNamePart(matchGroups[index].Value, true) + : new ItemNamePart(namePart, false) + ); + + return itemNameParts; + } } private async Task Delete(DeleteCommand command)