mirror of
https://github.com/wismna/ModernKeePass.git
synced 2025-10-03 15:40:18 -04:00
Updated deleted text information
Improved dirty status detection (restored removed variable...) This corrected history creation on navigation when entry deleted
This commit is contained in:
@@ -147,35 +147,17 @@
|
||||
<data name="EntityRestoredTitle" xml:space="preserve">
|
||||
<value>Restored</value>
|
||||
</data>
|
||||
<data name="EntryDeleted" xml:space="preserve">
|
||||
<value>Entry permanently removed</value>
|
||||
</data>
|
||||
<data name="EntryDeletingConfirmation" xml:space="preserve">
|
||||
<value>Are you sure you want to delete this entry?</value>
|
||||
<value>Are you sure you want to delete {0} ?</value>
|
||||
</data>
|
||||
<data name="EntryRecycled" xml:space="preserve">
|
||||
<value>Entry moved to the Recycle bin</value>
|
||||
</data>
|
||||
<data name="EntryRecyclingConfirmation" xml:space="preserve">
|
||||
<value>Are you sure you want to send this entry to the recycle bin?</value>
|
||||
<value>{0} moved to the Recycle bin</value>
|
||||
</data>
|
||||
<data name="EntryRestored" xml:space="preserve">
|
||||
<value>Entry returned to its original group</value>
|
||||
</data>
|
||||
<data name="GroupDeleted" xml:space="preserve">
|
||||
<value>Group permanently removed</value>
|
||||
</data>
|
||||
<data name="GroupDeletingConfirmation" xml:space="preserve">
|
||||
<value>Are you sure you want to delete the whole group and all its entries?</value>
|
||||
</data>
|
||||
<data name="GroupRecycled" xml:space="preserve">
|
||||
<value>Group moved to the Recycle bin</value>
|
||||
</data>
|
||||
<data name="GroupRecyclingConfirmation" xml:space="preserve">
|
||||
<value>Are you sure you want to send the whole group and all its entries to the recycle bin?</value>
|
||||
</data>
|
||||
<data name="GroupRestored" xml:space="preserve">
|
||||
<value>Group returned to its original group</value>
|
||||
<value>{0} moved to the Recycle bin</value>
|
||||
</data>
|
||||
<data name="MainMenuItemAbout" xml:space="preserve">
|
||||
<value>About</value>
|
||||
@@ -288,4 +270,7 @@
|
||||
<data name="SettingsMenuItemRecycleBin" xml:space="preserve">
|
||||
<value>Recycle Bin</value>
|
||||
</data>
|
||||
<data name="GroupDeletingConfirmation" xml:space="preserve">
|
||||
<value>Are you sure you want to delete the {0} and all its entries?</value>
|
||||
</data>
|
||||
</root>
|
@@ -121,7 +121,7 @@
|
||||
<value>Dominik Reichl for the KeePass application and file format</value>
|
||||
</data>
|
||||
<data name="AboutCredits2.Text" xml:space="preserve">
|
||||
<value>David Lechner for his PCL adapatation of the KeePass Library and his correlated tests</value>
|
||||
<value>David Lechner for his PCL adapatation of the KeePass Library and his related tests</value>
|
||||
</data>
|
||||
<data name="AboutCreditsLabel.Text" xml:space="preserve">
|
||||
<value>Credits</value>
|
||||
|
@@ -147,35 +147,17 @@
|
||||
<data name="EntityRestoredTitle" xml:space="preserve">
|
||||
<value>Restauré</value>
|
||||
</data>
|
||||
<data name="EntryDeleted" xml:space="preserve">
|
||||
<value>Entrée supprimée définitivement</value>
|
||||
</data>
|
||||
<data name="EntryDeletingConfirmation" xml:space="preserve">
|
||||
<value>Êtes-vous sûr de vouloir supprimer cette entrée ?</value>
|
||||
<value>Êtes-vous sûr de vouloir supprimer {0} ?</value>
|
||||
</data>
|
||||
<data name="EntryRecycled" xml:space="preserve">
|
||||
<value>Entrée placée dans la Corbeille</value>
|
||||
</data>
|
||||
<data name="EntryRecyclingConfirmation" xml:space="preserve">
|
||||
<value>Êtes-vous sûr de vouloir placer cette entrée dans la Corbeille ?</value>
|
||||
</data>
|
||||
<data name="EntryRestored" xml:space="preserve">
|
||||
<value>Entrée replacée dans son groupe d'origine</value>
|
||||
</data>
|
||||
<data name="GroupDeleted" xml:space="preserve">
|
||||
<value>Groupe supprimé définitivement</value>
|
||||
<value>{0} placé dans la Corbeille</value>
|
||||
</data>
|
||||
<data name="GroupDeletingConfirmation" xml:space="preserve">
|
||||
<value>Êtes-vous sûr de vouloir supprimer ce groupe et toutes ses entrées ?</value>
|
||||
<value>Êtes-vous sûr de vouloir supprimer {0} et toutes ses entrées ?</value>
|
||||
</data>
|
||||
<data name="GroupRecycled" xml:space="preserve">
|
||||
<value>Groupe placé dans la Corbeille</value>
|
||||
</data>
|
||||
<data name="GroupRecyclingConfirmation" xml:space="preserve">
|
||||
<value>Êtes-vous sûr de vouloir envoyer ce groupe et toutes ses entrées vers la Corbeille ?</value>
|
||||
</data>
|
||||
<data name="GroupRestored" xml:space="preserve">
|
||||
<value>Groupe replacé à sa place originelle</value>
|
||||
<value>{0} placé dans la Corbeille</value>
|
||||
</data>
|
||||
<data name="MainMenuItemAbout" xml:space="preserve">
|
||||
<value>A propos</value>
|
||||
|
@@ -41,9 +41,17 @@ namespace ModernKeePass.ViewModels
|
||||
{
|
||||
public class EntryDetailVm : ViewModelBase
|
||||
{
|
||||
public bool IsRevealPasswordEnabled => !string.IsNullOrEmpty(Password);
|
||||
public bool HasExpired => HasExpirationDate && ExpiryDate < DateTime.Now;
|
||||
public double PasswordComplexityIndicator => _mediator.Send(new EstimatePasswordComplexityQuery {Password = Password}).GetAwaiter().GetResult();
|
||||
public double PasswordLength
|
||||
{
|
||||
get { return _settings.GetSetting(Constants.Settings.PasswordGenerationOptions.PasswordLength, 25); }
|
||||
set
|
||||
{
|
||||
_settings.PutSetting(Constants.Settings.PasswordGenerationOptions.PasswordLength, value);
|
||||
RaisePropertyChanged(nameof(PasswordLength));
|
||||
}
|
||||
}
|
||||
public bool UpperCasePatternSelected
|
||||
{
|
||||
get { return _settings.GetSetting(Constants.Settings.PasswordGenerationOptions.UpperCasePattern, true); }
|
||||
@@ -126,7 +134,7 @@ namespace ModernKeePass.ViewModels
|
||||
}));
|
||||
Attachments.CollectionChanged += (sender, args) =>
|
||||
{
|
||||
SaveCommand.RaiseCanExecuteChanged();
|
||||
UpdateDirtyStatus(true);
|
||||
};
|
||||
RaisePropertyChanged(string.Empty);
|
||||
}
|
||||
@@ -154,11 +162,6 @@ namespace ModernKeePass.ViewModels
|
||||
}
|
||||
}
|
||||
|
||||
public double PasswordLength
|
||||
{
|
||||
get { return _passwordLength; }
|
||||
set { Set(() => PasswordLength, ref _passwordLength, value); }
|
||||
}
|
||||
|
||||
public string Title
|
||||
{
|
||||
@@ -279,7 +282,6 @@ namespace ModernKeePass.ViewModels
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public bool IsEditMode
|
||||
{
|
||||
get { return IsCurrentEntry && _isEditMode; }
|
||||
@@ -320,7 +322,7 @@ namespace ModernKeePass.ViewModels
|
||||
private int _additionalFieldSelectedIndex = -1;
|
||||
private bool _isEditMode;
|
||||
private bool _isRevealPassword;
|
||||
private double _passwordLength = 25;
|
||||
private bool _isDirty;
|
||||
|
||||
public EntryDetailVm(IMediator mediator, INavigationService navigation, IResourceProxy resource, IDialogService dialog, INotificationService notification, IFileProxy file, ISettingsProxy settings)
|
||||
{
|
||||
@@ -360,7 +362,11 @@ namespace ModernKeePass.ViewModels
|
||||
{
|
||||
History.Add(entry);
|
||||
}
|
||||
History.CollectionChanged += (sender, args) => SaveCommand.RaiseCanExecuteChanged();
|
||||
History.CollectionChanged += (sender, args) =>
|
||||
{
|
||||
SelectedIndex = 0;
|
||||
SaveCommand.RaiseCanExecuteChanged();
|
||||
};
|
||||
}
|
||||
|
||||
public async Task GeneratePassword()
|
||||
@@ -378,12 +384,11 @@ namespace ModernKeePass.ViewModels
|
||||
UnderscorePatternSelected = UnderscorePatternSelected,
|
||||
UpperCasePatternSelected = UpperCasePatternSelected
|
||||
});
|
||||
RaisePropertyChanged(nameof(IsRevealPasswordEnabled));
|
||||
}
|
||||
|
||||
public async Task AddHistory()
|
||||
{
|
||||
if (Database.IsDirty) await _mediator.Send(new AddHistoryCommand { Entry = History[0] });
|
||||
if (_isDirty) await _mediator.Send(new AddHistoryCommand { Entry = History[0] });
|
||||
}
|
||||
|
||||
public void GoToGroup(string groupId)
|
||||
@@ -401,7 +406,7 @@ namespace ModernKeePass.ViewModels
|
||||
private async Task SetFieldValue(string fieldName, object value, bool isProtected)
|
||||
{
|
||||
await _mediator.Send(new UpsertFieldCommand { EntryId = Id, FieldName = fieldName, FieldValue = value, IsProtected = isProtected});
|
||||
SaveCommand.RaiseCanExecuteChanged();
|
||||
UpdateDirtyStatus(true);
|
||||
}
|
||||
|
||||
private async Task UpdateFieldName(string oldName, string newName, string value, bool isProtected)
|
||||
@@ -422,7 +427,7 @@ namespace ModernKeePass.ViewModels
|
||||
if (!string.IsNullOrEmpty(field.Name))
|
||||
{
|
||||
await _mediator.Send(new DeleteFieldCommand {EntryId = Id, FieldName = field.Name});
|
||||
SaveCommand.RaiseCanExecuteChanged();
|
||||
UpdateDirtyStatus(true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -433,12 +438,13 @@ namespace ModernKeePass.ViewModels
|
||||
if (IsRecycleOnDelete)
|
||||
{
|
||||
await Delete();
|
||||
_notification.Show(_resource.GetResourceValue("EntryRecyclingConfirmation"), _resource.GetResourceValue("EntryRecycled"));
|
||||
_notification.Show(_resource.GetResourceValue("EntityDeleting"), string.Format(_resource.GetResourceValue("EntryRecycled"), Title));
|
||||
}
|
||||
else
|
||||
{
|
||||
await _dialog.ShowMessage(_resource.GetResourceValue("EntryDeletingConfirmation"),
|
||||
_resource.GetResourceValue("EntityDeleteTitle"),
|
||||
await _dialog.ShowMessage(
|
||||
string.Format(_resource.GetResourceValue("EntryDeletingConfirmation"), Title),
|
||||
_resource.GetResourceValue("EntityDeleting"),
|
||||
_resource.GetResourceValue("EntityDeleteActionButton"),
|
||||
_resource.GetResourceValue("EntityDeleteCancelButton"),
|
||||
async isOk =>
|
||||
@@ -449,14 +455,14 @@ namespace ModernKeePass.ViewModels
|
||||
}
|
||||
else
|
||||
{
|
||||
await _dialog.ShowMessage(_resource.GetResourceValue("HistoryDeleteDescription"), _resource.GetResourceValue("HistoryDeleteTitle"),
|
||||
await _dialog.ShowMessage(_resource.GetResourceValue("HistoryDeleteDescription"),
|
||||
_resource.GetResourceValue("HistoryDeleteTitle"),
|
||||
_resource.GetResourceValue("EntityDeleteActionButton"),
|
||||
_resource.GetResourceValue("EntityDeleteCancelButton"), async isOk =>
|
||||
{
|
||||
if (!isOk) return;
|
||||
await _mediator.Send(new DeleteHistoryCommand { Entry = History[0], HistoryIndex = History.Count - SelectedIndex - 1 });
|
||||
History.RemoveAt(SelectedIndex);
|
||||
SelectedIndex = 0;
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -465,7 +471,6 @@ namespace ModernKeePass.ViewModels
|
||||
{
|
||||
await _mediator.Send(new RestoreHistoryCommand { Entry = History[0], HistoryIndex = History.Count - SelectedIndex - 1 });
|
||||
History.Insert(0, SelectedItem);
|
||||
SelectedIndex = 0;
|
||||
}
|
||||
|
||||
private async Task SaveChanges()
|
||||
@@ -479,7 +484,7 @@ namespace ModernKeePass.ViewModels
|
||||
{
|
||||
MessengerInstance.Send(new SaveErrorMessage { Message = e.Message });
|
||||
}
|
||||
SaveCommand.RaiseCanExecuteChanged();
|
||||
UpdateDirtyStatus(false);
|
||||
}
|
||||
|
||||
private async Task Delete()
|
||||
@@ -490,6 +495,7 @@ namespace ModernKeePass.ViewModels
|
||||
ParentGroupId = SelectedItem.ParentGroupId,
|
||||
RecycleBinName = _resource.GetResourceValue("RecycleBinTitle")
|
||||
});
|
||||
_isDirty = false;
|
||||
_navigation.GoBack();
|
||||
}
|
||||
|
||||
@@ -511,15 +517,18 @@ namespace ModernKeePass.ViewModels
|
||||
var contents = await _file.ReadBinaryFile(fileInfo.Id);
|
||||
await _mediator.Send(new AddAttachmentCommand { Entry = SelectedItem, AttachmentName = fileInfo.Name, AttachmentContent = contents });
|
||||
Attachments.Add(new Attachment { Name = fileInfo.Name, Content = contents });
|
||||
SaveCommand.RaiseCanExecuteChanged();
|
||||
}
|
||||
|
||||
private async Task DeleteAttachment(Attachment attachment)
|
||||
{
|
||||
await _mediator.Send(new DeleteAttachmentCommand { Entry = SelectedItem, AttachmentName = attachment.Name });
|
||||
Attachments.Remove(attachment);
|
||||
SaveCommand.RaiseCanExecuteChanged();
|
||||
}
|
||||
|
||||
private void UpdateDirtyStatus(bool isDirty)
|
||||
{
|
||||
SaveCommand.RaiseCanExecuteChanged();
|
||||
_isDirty = isDirty;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -261,11 +261,13 @@ namespace ModernKeePass.ViewModels
|
||||
if (IsRecycleOnDelete)
|
||||
{
|
||||
await Delete();
|
||||
_notification.Show(_resource.GetResourceValue("GroupRecyclingConfirmation"), _resource.GetResourceValue("GroupRecycled"));
|
||||
_notification.Show(_resource.GetResourceValue("EntityDeleting"), string.Format(_resource.GetResourceValue("GroupRecycled"), Title));
|
||||
}
|
||||
else
|
||||
{
|
||||
await _dialog.ShowMessage(_resource.GetResourceValue("GroupDeletingConfirmation"), _resource.GetResourceValue("EntityDeleteTitle"),
|
||||
await _dialog.ShowMessage(
|
||||
string.Format(_resource.GetResourceValue("GroupDeletingConfirmation"), Title),
|
||||
_resource.GetResourceValue("EntityDeleting"),
|
||||
_resource.GetResourceValue("EntityDeleteActionButton"),
|
||||
_resource.GetResourceValue("EntityDeleteCancelButton"),
|
||||
async isOk =>
|
||||
|
@@ -418,7 +418,7 @@
|
||||
</interactivity:Interaction.Behaviors>
|
||||
</local:TextBoxWithButton>
|
||||
<ProgressBar Value="{Binding PasswordComplexityIndicator, ConverterParameter=0\,128, Converter={StaticResource ProgressBarLegalValuesConverter}}" Maximum="128" Width="350" HorizontalAlignment="Left" Foreground="{Binding PasswordComplexityIndicator, ConverterParameter=128, Converter={StaticResource DoubleToForegroundBrushComplexityConverter}}" />
|
||||
<CheckBox x:Uid="EntryShowPassword" HorizontalAlignment="Left" Margin="-3,0,0,0" IsChecked="{Binding IsRevealPassword, Mode=TwoWay}" IsEnabled="{Binding IsRevealPasswordEnabled}" />
|
||||
<CheckBox x:Uid="EntryShowPassword" HorizontalAlignment="Left" Margin="-3,0,0,0" IsChecked="{Binding IsRevealPassword, Mode=TwoWay}" />
|
||||
<TextBlock Text="URL" Style="{StaticResource EntryTextBlockStyle}"/>
|
||||
<local:TextBoxWithButton x:Uid="UrlTextBox" Text="{Binding Url, Mode=TwoWay}" Style="{StaticResource TextBoxWithButtonStyle}" ButtonSymbol="" IsEnabled="{Binding IsCurrentEntry}">
|
||||
<interactivity:Interaction.Behaviors>
|
||||
|
@@ -5,3 +5,4 @@ Ability to manually reorder groups
|
||||
Ability to set max history count and size
|
||||
Design changes
|
||||
Update to KeePassLib version 2.45
|
||||
Bug corrections
|
@@ -5,3 +5,4 @@ Possibilite de reorganiser les groupes manuellement
|
||||
Possibilite de parametrer le nombre max et la taille de l'historique
|
||||
Quelques changements de design
|
||||
Mise a jour de la KeePassLib version 2.45
|
||||
Correction de bugs
|
@@ -32,6 +32,7 @@
|
||||
public static string SpacePattern => nameof(SpacePattern);
|
||||
public static string SpecialPattern => nameof(SpecialPattern);
|
||||
public static string BracketsPattern => nameof(BracketsPattern);
|
||||
public static string PasswordLength => nameof(PasswordLength);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user