|
|
@@ -72,20 +72,20 @@ namespace InABox.Avalonia
|
|
|
|
|
|
public override string ToString() => Name ?? "";
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
public abstract class CoreRepository<TParent, TItem, TEntity> : CoreRepository, ICoreRepository, IEnumerable<TItem>
|
|
|
where TParent : CoreRepository<TParent, TItem, TEntity>
|
|
|
- where TEntity : Entity, IRemotable, IPersistent, new()
|
|
|
- where TItem : Shell<TParent,TEntity>, new()
|
|
|
+ where TEntity : Entity, IRemotable, IPersistent, new()
|
|
|
+ where TItem : Shell<TParent, TEntity>, new()
|
|
|
{
|
|
|
readonly MultiQuery _query = new();
|
|
|
-
|
|
|
+
|
|
|
public Func<Filter<TEntity>> Filter { get; set; }
|
|
|
|
|
|
protected virtual Filter<TEntity>? BaseFilter() => null;
|
|
|
-
|
|
|
+
|
|
|
public IModelHost Host { get; set; }
|
|
|
-
|
|
|
+
|
|
|
private DateTime _lastUpdated = DateTime.MinValue;
|
|
|
public DateTime LastUpdated
|
|
|
{
|
|
|
@@ -96,27 +96,27 @@ namespace InABox.Avalonia
|
|
|
OnPropertyChanged();
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
public Func<string>? FileName { get; }
|
|
|
|
|
|
-
|
|
|
+
|
|
|
private string DataFileName() => FileName != null
|
|
|
? $"{FileName.Invoke()}.data"
|
|
|
: string.Empty;
|
|
|
-
|
|
|
+
|
|
|
private string FilterFileName() => !string.IsNullOrWhiteSpace(FilterTag) && FileName != null
|
|
|
? $"{FileName.Invoke()}.filter"
|
|
|
: string.Empty;
|
|
|
-
|
|
|
+
|
|
|
protected CoreRepository(IModelHost host, Func<Filter<TEntity>> filter, Func<string>? filename = null)
|
|
|
{
|
|
|
AllItems = new CoreObservableCollection<TItem>();
|
|
|
AllItems.CollectionChanged += (sender, args) => ItemsChanged(AllItems);
|
|
|
// EnableSynchronization(AllItems);
|
|
|
-
|
|
|
+
|
|
|
//Items = new CoreObservableCollection<TItem>();
|
|
|
// EnableSynchronization(Items);
|
|
|
-
|
|
|
+
|
|
|
Reset();
|
|
|
Host = host;
|
|
|
Filter = filter;
|
|
|
@@ -142,17 +142,17 @@ namespace InABox.Avalonia
|
|
|
// }
|
|
|
|
|
|
#region INotifyPropertyChanged
|
|
|
-
|
|
|
+
|
|
|
public event PropertyChangedEventHandler? PropertyChanged;
|
|
|
|
|
|
protected void DoPropertyChanged(object sender, PropertyChangedEventArgs args)
|
|
|
{
|
|
|
PropertyChanged?.Invoke(sender, args);
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
protected bool SetProperty<T>(ref T field, T value, [CallerMemberName] string propertyName = "")
|
|
|
{
|
|
|
- if (EqualityComparer<T>.Default.Equals(field, value))
|
|
|
+ if (EqualityComparer<T>.Default.Equals(field, value))
|
|
|
return false;
|
|
|
field = value;
|
|
|
OnPropertyChanged(propertyName);
|
|
|
@@ -161,43 +161,43 @@ namespace InABox.Avalonia
|
|
|
|
|
|
protected void OnPropertyChanged([CallerMemberName] string propertyName = "")
|
|
|
=> DoPropertyChanged(this, new PropertyChangedEventArgs(propertyName));
|
|
|
-
|
|
|
+
|
|
|
#endregion
|
|
|
-
|
|
|
+
|
|
|
#region Image Lookups
|
|
|
-
|
|
|
+
|
|
|
public Dictionary<Guid, byte[]> Images { get; private set; } = new Dictionary<Guid, byte[]>();
|
|
|
|
|
|
public byte[]? GetImageSource(Guid id)
|
|
|
{
|
|
|
return Images.GetValueOrDefault(id);
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
public byte[]? GetImage(Guid id) => Images.GetValueOrDefault(id);
|
|
|
-
|
|
|
+
|
|
|
public bool HasImages() => Images.Any();
|
|
|
|
|
|
#endregion
|
|
|
-
|
|
|
+
|
|
|
protected virtual string FilterTag => typeof(TEntity).EntityName().Split('.').Last();
|
|
|
-
|
|
|
+
|
|
|
public CoreObservableCollection<CoreRepositoryFilter> AvailableFilters { get; } = new();
|
|
|
IEnumerable ICoreRepository.AvailableFilters => AvailableFilters;
|
|
|
-
|
|
|
+
|
|
|
protected Filter<TEntity>? SelectedFilter =>
|
|
|
Serialization.Deserialize<Filter<TEntity>>(AvailableFilters.FirstOrDefault(x => x.Selected)?.Filter);
|
|
|
-
|
|
|
+
|
|
|
public bool FiltersVisible => AvailableFilters.Any();
|
|
|
|
|
|
private bool FilterChanged = false;
|
|
|
|
|
|
public string? SelectedFilterName => AvailableFilters.FirstOrDefault(x => x.Selected)?.Name;
|
|
|
-
|
|
|
+
|
|
|
public void SelectFilter(String? name)
|
|
|
{
|
|
|
var currentSelected = AvailableFilters.FirstOrDefault(x => x.Selected);
|
|
|
var definition = AvailableFilters.FirstOrDefault(x => String.Equals(x.Name, name));
|
|
|
- if(definition is null && name is null)
|
|
|
+ if (definition is null && name is null)
|
|
|
{
|
|
|
definition = AvailableFilters.FirstOrDefault(x => x.Name == "All");
|
|
|
}
|
|
|
@@ -206,7 +206,7 @@ namespace InABox.Avalonia
|
|
|
availableFilter.Selected = definition == availableFilter;
|
|
|
OnPropertyChanged(nameof(AvailableFilters));
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
protected Filter<TEntity>? EffectiveFilter()
|
|
|
{
|
|
|
var filters = new Filters<TEntity>();
|
|
|
@@ -216,7 +216,7 @@ namespace InABox.Avalonia
|
|
|
var result = filters.Combine();
|
|
|
return result;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
protected Columns<TOtherEntity> GetColumns<TOtherItem, TOtherEntity>()
|
|
|
where TOtherItem : Shell<TParent, TOtherEntity>, new()
|
|
|
where TOtherEntity : Entity, IRemotable, IPersistent, new()
|
|
|
@@ -231,11 +231,11 @@ namespace InABox.Avalonia
|
|
|
//Items.Clear();
|
|
|
Images.Clear();
|
|
|
}
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
public bool Loaded { get; protected set; }
|
|
|
-
|
|
|
+
|
|
|
private void DoRefresh(bool force)
|
|
|
{
|
|
|
force = force || FilterChanged;
|
|
|
@@ -245,7 +245,7 @@ namespace InABox.Avalonia
|
|
|
//Items.Clear();
|
|
|
|
|
|
var dataFileName = DataFileName();
|
|
|
- if (!force && !Loaded && CoreRepository.IsCached(dataFileName))
|
|
|
+ if ((!force || Host.Status != ConnectionStatus.Connected) && !Loaded && CoreRepository.IsCached(dataFileName))
|
|
|
{
|
|
|
DoBeforeLoad();
|
|
|
if (LoadFromStorage())
|