Got a model to populate a grouping creator

This commit is contained in:
Vincent Allen
2025-09-02 15:00:23 -04:00
parent ff34eb87b9
commit e136fa8b3d
42 changed files with 238 additions and 56 deletions

View File

@@ -38,10 +38,10 @@
</MudPaper> </MudPaper>
</ActivatorContent> </ActivatorContent>
</MudFileUpload> </MudFileUpload>
@if (_files.Any()) @if (Files.Any())
{ {
<MudPaper Style="max-height: 150px; overflow-y: auto;" Outlined="true" Class="pa-4"> <MudPaper Style="max-height: 150px; overflow-y: auto;" Outlined="true" Class="pa-4">
@foreach (var file in _files) @foreach (var file in Files)
{ {
var color = _fileToDiskFileName.Keys.Contains(file) ? Color.Success : Color.Warning; var color = _fileToDiskFileName.Keys.Contains(file) ? Color.Success : Color.Warning;
<MudChip T="string" <MudChip T="string"
@@ -60,20 +60,20 @@
Open file picker Open file picker
</MudButton> </MudButton>
<MudButton Color="Color.Primary" <MudButton Color="Color.Primary"
Disabled="@(!_files.Any())" Disabled="@(!Files.Any())"
OnClick="@Upload" OnClick="@Upload"
Variant="Variant.Filled"> Variant="Variant.Filled">
Upload Upload
</MudButton> </MudButton>
<MudButton Color="Color.Error" <MudButton Color="Color.Error"
Disabled="@(!_files.Any())" Disabled="@(!Files.Any())"
OnClick="@ClearAsync" OnClick="@ClearAsync"
Variant="Variant.Filled"> Variant="Variant.Filled">
Clear Clear
</MudButton> </MudButton>
</MudToolBar> </MudToolBar>
@if (_files.Count != _fileToDiskFileName.Count) @if (Files.Count != _fileToDiskFileName.Count)
{ {
<MudText Color="Color.Error" Align="Align.Right">*Files must be uploaded</MudText> <MudText Color="Color.Error" Align="Align.Right">*Files must be uploaded</MudText>
} }
@@ -89,13 +89,13 @@
private string _dragClass = DefaultDragClass; private string _dragClass = DefaultDragClass;
private readonly List<IBrowserFile> _files = new(); public readonly List<IBrowserFile> Files = new();
private readonly Dictionary<IBrowserFile, string> _fileToDiskFileName = new(); private readonly Dictionary<IBrowserFile, string> _fileToDiskFileName = new();
private MudFileUpload<IReadOnlyList<IBrowserFile>>? _fileUpload; private MudFileUpload<IReadOnlyList<IBrowserFile>>? _fileUpload;
public int SelectedFileCount { get => _files.Count; } public int SelectedFileCount { get => Files.Count; }
public bool UploadsComplete { get; set; } = true; public bool UploadsComplete { get; set; } = true;
@@ -126,7 +126,7 @@
} }
_fileToDiskFileName.Clear(); _fileToDiskFileName.Clear();
_files.Clear(); Files.Clear();
await (_fileUpload?.ClearAsync() ?? Task.CompletedTask); await (_fileUpload?.ClearAsync() ?? Task.CompletedTask);
ClearDragClass(); ClearDragClass();
@@ -141,7 +141,7 @@
{ {
ClearDragClass(); ClearDragClass();
var files = e.GetMultipleFiles(maximumFileCount: _options.Value.MaxFileCount); var files = e.GetMultipleFiles(maximumFileCount: _options.Value.MaxFileCount);
_files.AddRange(files); Files.AddRange(files);
UploadsComplete = false; UploadsComplete = false;
StateHasChanged(); StateHasChanged();
@@ -149,7 +149,7 @@
private async Task Upload() private async Task Upload()
{ {
if (!_files.Any()) if (!Files.Any())
{ {
Snackbar.Add("No files to upload.", Severity.Warning); Snackbar.Add("No files to upload.", Severity.Warning);
return; return;
@@ -158,7 +158,7 @@
Snackbar.Configuration.PositionClass = Defaults.Classes.Position.TopCenter; Snackbar.Configuration.PositionClass = Defaults.Classes.Position.TopCenter;
List<FilePathListing> fileListings = []; List<FilePathListing> fileListings = [];
foreach (var file in _files) foreach (var file in Files)
{ {
if (_fileToDiskFileName.ContainsKey(file)) continue; if (_fileToDiskFileName.ContainsKey(file)) continue;
try try

View File

@@ -83,17 +83,20 @@
FilesUploaded="OnFilesUploaded" FilesUploaded="OnFilesUploaded"
ClearClicked="OnClearFilesClicked"></UploadDropBox> ClearClicked="OnClearFilesClicked"></UploadDropBox>
</MudPaper> </MudPaper>
@for (int index = 0; index < Model.ArtifactEntries.Count; ++index) @if (Model is not null)
{ {
// Capture the current item in a local variable for the lambda @for (int index = 0; index < Model.ArtifactEntries.Count; ++index)
var currentEntry = Model.ArtifactEntries[index]; {
// Capture the current item in a local variable for the lambda
var currentEntry = Model.ArtifactEntries[index];
<ArchiveEntryCreatorCard Model="currentEntry" <ArchiveEntryCreatorCard Model="currentEntry"
ModelChanged="(updatedEntry) => HandleEntryUpdate(currentEntry, updatedEntry)" ModelChanged="(updatedEntry) => HandleEntryUpdate(currentEntry, updatedEntry)"
InputsChanged="OnChanged" InputsChanged="OnChanged"
@key="currentEntry" @key="currentEntry"
ArtifactEntryIndex="index" ArtifactEntryIndex="index"
OnEntryDeletedClicked="() => OnDeleteEntryClicked(index)"/> OnEntryDeletedClicked="OnDeleteEntryClicked"/>
}
} }
</div> </div>
@@ -163,6 +166,18 @@
public List<ValidationResult> ValidationResults { get; private set; } = []; public List<ValidationResult> ValidationResults { get; private set; } = [];
protected override async Task OnParametersSetAsync()
{
// Ensure to reload the component if a model has been supplied so that the full
// component will render
if (Model?.Category is not null)
{
await OnCategoryChanged();
}
_isFormDivVisible = true;
StateHasChanged();
}
private async Task PublishClicked(MouseEventArgs args) private async Task PublishClicked(MouseEventArgs args)
{ {
var validationContext = new ValidationContext(Model); var validationContext = new ValidationContext(Model);
@@ -199,7 +214,7 @@
} }
} }
private void HandleEntryUpdate(ArtifactEntryValidationModel originalEntry, ArtifactEntryValidationModel updatedEntry) private async Task HandleEntryUpdate(ArtifactEntryValidationModel originalEntry, ArtifactEntryValidationModel updatedEntry)
{ {
// Find the index of the original object in our list // Find the index of the original object in our list
var index = Model.ArtifactEntries.IndexOf(originalEntry); var index = Model.ArtifactEntries.IndexOf(originalEntry);
@@ -211,7 +226,7 @@
} }
// Now, run the validation logic // Now, run the validation logic
OnChanged(); await OnChanged();
} }
// You can now simplify your OnFilesUploaded method slightly // You can now simplify your OnFilesUploaded method slightly
@@ -256,7 +271,7 @@
async Task OnCategoryChanged() async Task OnCategoryChanged()
{ {
if (Model.Category is not null) if (Model.Category is not null && _identifierTextBox is not null)
{ {
_identifierTextBox.VerifyFormatCategory = Model.Category; _identifierTextBox.VerifyFormatCategory = Model.Category;
_isFormDivVisible = true; _isFormDivVisible = true;
@@ -303,6 +318,7 @@
private async void OnDeleteEntryClicked(int index) private async void OnDeleteEntryClicked(int index)
{ {
Model.ArtifactEntries.RemoveAt(index); Model.ArtifactEntries.RemoveAt(index);
_uploadComponent.Files.RemoveAt(index);
StateHasChanged(); StateHasChanged();
} }
} }

View File

@@ -1,6 +1,6 @@
<MudDialog> <MudDialog>
<TitleContent> <TitleContent>
<MudText Typo="Typo.h6">Create a Category</MudText> <MudText Typo="Typo.h6">Edit a Category</MudText>
</TitleContent> </TitleContent>
<DialogContent> <DialogContent>
@@ -17,16 +17,19 @@
[Parameter] [Parameter]
public required ArtifactGroupingValidationModel Model { get; set; } public required ArtifactGroupingValidationModel Model { get; set; }
[CascadingParameter]
IMudDialogInstance MudDialog { get; set; }
[Parameter] [Parameter]
public bool IsUpdate { get; set; } = false; public bool IsUpdate { get; set; } = false;
private void OnCancel(MouseEventArgs args) private void OnCancel(MouseEventArgs args)
{ {
throw new NotImplementedException(); MudDialog.Cancel();
} }
private void OnSubmit(MouseEventArgs args) private void OnSubmit(MouseEventArgs args)
{ {
throw new NotImplementedException(); MudDialog.Close(DialogResult.Ok(Model));
} }
} }

View File

@@ -1,9 +1,9 @@
<MudDataGrid <MudDataGrid
T="ArtifactGroupingRowElement" T="ArtifactGroupingRowElement"
MultiSelection=true MultiSelection=true
Items="ArtifactGroupingRows"
Filterable=false Filterable=false
SelectOnRowClick=true SelectOnRowClick=true
ServerData="new Func<GridState<ArtifactGroupingRowElement>, Task<GridData<ArtifactGroupingRowElement>>>(ServerReload)"
@ref=@DataGrid> @ref=@DataGrid>
<ToolBarContent> <ToolBarContent>
@@ -94,9 +94,28 @@
} }
} }
private void OnRowEditClick(ArtifactGroupingRowElement row) private async Task OnRowEditClick(ArtifactGroupingRowElement row)
{ {
throw new NotImplementedException(); var parameters = new DialogParameters();
var model = await GroupingProvider.GetGroupingAsync(row.Id);
parameters.Add("Model", ArtifactGroupingValidationModel.ToValidationModel(model));
var options = new DialogOptions()
{
MaxWidth = MaxWidth.ExtraExtraLarge,
FullWidth = true
};
var dialog = await DialogService.ShowAsync<AddGroupingDialog>("Edit Grouping", parameters, options);
var result = await dialog.Result;
if (!result.Canceled)
{
await DataGrid.ReloadServerData();
}
} }
private async Task OnDeleteClicked(MouseEventArgs args) private async Task OnDeleteClicked(MouseEventArgs args)
@@ -120,6 +139,27 @@
StateHasChanged(); StateHasChanged();
} }
} }
}
private async Task<GridData<ArtifactGroupingRowElement>> ServerReload(GridState<ArtifactGroupingRowElement> state)
{
int totalItems = await GroupingProvider.GetTotalCount();
IEnumerable<ArtifactGrouping> groupings = await GroupingProvider.GetGroupingsPaged(state.Page + 1, state.PageSize);
var pagedItems = groupings.Select(grouping => new ArtifactGroupingRowElement()
{
Id = grouping.Id,
Title = grouping.Title,
ArtifactGroupingIdentifier = grouping.ArtifactGroupingIdentifier ?? throw new ArgumentNullException(nameof(grouping), "Got a null ArtifactGroupingIdentifier"),
CategoryName = grouping.Category.Name,
IsPublicallyVisible = grouping.IsPublicallyVisible,
});
return new GridData<ArtifactGroupingRowElement>()
{
TotalItems = totalItems,
Items = pagedItems
};
} }
} }

View File

@@ -40,6 +40,7 @@
public required string FieldSeparator { get; set; } = "-"; public required string FieldSeparator { get; set; } = "-";
private List<IdentifierFieldValidationModel> _identifierFields = new(); private List<IdentifierFieldValidationModel> _identifierFields = new();
[Parameter] [Parameter]
public required List<IdentifierFieldValidationModel> IdentifierFields public required List<IdentifierFieldValidationModel> IdentifierFields
{ {

View File

@@ -1,6 +1,7 @@
using Microsoft.IdentityModel.Tokens; using Microsoft.IdentityModel.Tokens;
using OpenArchival.DataAccess; using OpenArchival.DataAccess;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.Linq;
namespace OpenArchival.Blazor; namespace OpenArchival.Blazor;
@@ -54,6 +55,62 @@ public class ArtifactGroupingValidationModel : IValidatableObject
return grouping; return grouping;
} }
public static ArtifactGroupingValidationModel ToValidationModel(ArtifactGrouping grouping)
{
var entries = new List<ArtifactEntryValidationModel>();
foreach (var entry in grouping.ChildArtifactEntries)
{
var defects = new List<string>();
if (entry.Defects is not null)
{
defects.AddRange(entry.Defects.Select(defect => defect.Description));
}
var validationModel = new ArtifactEntryValidationModel()
{
Title = entry.Title,
StorageLocation = entry.StorageLocation.Location,
ArtifactNumber = entry.ArtifactNumber,
AssociatedDates = entry.AssociatedDates,
Defects = entry?.Defects?.Select(defect => defect.Description).ToList(),
Description = entry?.Description,
Files = entry?.Files,
FileTextContent = entry?.FileTextContent,
IsPublicallyVisible = entry.IsPubliclyVisible,
Links = entry.Links,
ListedNames = entry?.ListedNames?.Select(name => name.Value).ToList(),
RelatedArtifacts = entry.RelatedTo,
Tags = entry?.Tags?.Select(tag => tag.Name).ToList(),
Type = entry?.Type.Name,
};
entries.Add(validationModel);
}
var identifierFieldsStrings = grouping.IdentifierFields.Values;
List<IdentifierFieldValidationModel> identifierFields = new();
for (int index = 0; index < identifierFieldsStrings.Count; ++index)
{
identifierFields.Add(new IdentifierFieldValidationModel()
{
Value = identifierFieldsStrings[index],
Name = grouping.Category.FieldNames[index]
});
}
return new ArtifactGroupingValidationModel()
{
Title = grouping.Title,
ArtifactEntries = entries,
Category = grouping.Category,
Description = grouping.Description,
IdentifierFieldValues = identifierFields,
IsPublicallyVisible = grouping.IsPublicallyVisible,
Type = grouping.Type,
};
}
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{ {
foreach (var entry in ArtifactEntries) foreach (var entry in ArtifactEntries)

View File

@@ -15,7 +15,7 @@ using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("OpenArchival.Blazor")] [assembly: System.Reflection.AssemblyCompanyAttribute("OpenArchival.Blazor")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+dd3968f6effa8f45f27a3ec91c34762c88380f06")] [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+ff34eb87b9d0eec9553fb4767daadfcc0d97fb44")]
[assembly: System.Reflection.AssemblyProductAttribute("OpenArchival.Blazor")] [assembly: System.Reflection.AssemblyProductAttribute("OpenArchival.Blazor")]
[assembly: System.Reflection.AssemblyTitleAttribute("OpenArchival.Blazor")] [assembly: System.Reflection.AssemblyTitleAttribute("OpenArchival.Blazor")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]

View File

@@ -1 +1 @@
4cb1f71ab75baefd50d4cf23fe890ca9a8c7d28dbae39628ffdc79e6bcb2fe49 038afca63e0897bdd4751b98f3930ef5e6de7eabd431984af04ddfc4648f989b

View File

@@ -1 +1 @@
{"documents":{"D:\\Nextcloud\\Documents\\Open-Archival\\*":"https://raw.githubusercontent.com/vtallen/Open-Archival/dd3968f6effa8f45f27a3ec91c34762c88380f06/*"}} {"documents":{"D:\\Nextcloud\\Documents\\Open-Archival\\*":"https://raw.githubusercontent.com/vtallen/Open-Archival/ff34eb87b9d0eec9553fb4767daadfcc0d97fb44/*"}}

View File

@@ -1 +1 @@
{"GlobalPropertiesHash":"w2zJjDlrZF5/5p80zNaW9/DaLrmtiqb1ym05zjQa8AU=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["Ql2PiheSms1jp3ze9191\u002BLNizQeYVsVG\u002B7N0KZ1uG20=","J7kZmrOHXGR7mhUJ1qRNPdV4NRND\u002BvY/dHsYc/Fs5FA=","zoyQzHz20Gq24s2eR\u002BQU8CSBO06r9oxWByDVQGHt4qE=","m0ZalmIclG1CWERwq7TJzaS3UTwdWU7vJTH5wtXTRu0=","kYIUaswTSm/vuWdrFVk9i7vGl7gi4QutG\u002BtCBbnKC6I=","I92NrQVtDRIlAXcy/VupzptYIRXUmfdARzJEd\u002BMwPPI=","vwFknGJfBqZvyW3NEetGDZikd1HNT74cx2PojJjY\u002BPY=","3KENyb8mlCPncPOO5PbFfE0ubEK97voAevXn\u002BluJF7w=","NwDfbvguyiABZkN\u002B7yp6ClTOKkIFe/x4/v8tW4SUWHs=","Hourq1FvI\u002BJdRWbGSIe8r7GJGmkjFaIIQ8xB71hUBj4=","5n3ZEfHdKhL/ejFZA6mAyU6RVQAOd2wCgH3KjVv4d0U=","76\u002Bi/9Jz2zUyw2kfeC1dt0\u002B2uS7aFC2hMxE6ERdLn6s=","nvIt8ExR97wRoREETNPoXJ8D7Pb3KMAHZcwls7Q6c5E=","VfYWVT8Cth4Ztc4/xdY/qocO1V5snDiDHqbnmGMbvSw=","JxOQqF9Br69IsgvR\u002BTp8Vp93AFvsAKAiWtrgUjK7uKE=","5fR1TRHdDoMpaYhFN4ET8XHmhPG8hvpyxjiTF2qwx3M=","lxWH\u002B23ZAM/D8nGa5K0aryPD\u002BJPkC8vLJw2cEPhz8BA=","V8fXm0xeM7wossowKO5U7zhqV0P4uUGyIdkFdI9/LmY=","DGTAL07rwTwMmN0h4z8RtKm1\u002BbRR4K\u002B39bnl/wF43ZM=","rph0gnGKJ2XM54sr0iGk\u002BWTEktu647aepqf4FJUOLY8=","nklMuuwtwGoNNErDuvc4h4TaCmj4xyGZdjpGKgNvLGE=","Onb4gjU\u002B/9a/TKG0C3dG2hXdTEVs7OCECl6pWNTR6pQ=","WY7f0A5zLk9CD0lYECdLRR2b9b8GL2skPQO91AQ5wOM=","Ac8RYrUWtH4wwvUsQ9V6ndbtfhGuDzP1S9Hkh0JQLPg=","ixUpDxEYNKdhPZM9//dDIaFJGC9LvGDbh6rENZRYjWc=","SaPHXK2AwnFe3srooGZwMezdZmaxj0st4ZuBcZ0nfqE=","T5f5jCFFR0KCQwbQwHvZbWrVp7NucmIDfBynM8At\u002BFg=","DMXcRradogfvYUFJEJJT\u002B\u002B5RQjl\u002BI7kUSkHrHCl8oOk=","OLr6tSbzkGk2i5G0fVdSkw7v0IzsX6NL86pLF9m6eX0=","es5rRr8vQCVUTmRO5bFYu0yMvzBffvEDZTKp5IpEEvA=","//xOpsw6IkdGK7auzNWaN3ipl2miVcBMSjnir/YlMBM=","LxLYDw\u002BNEQs1/4eWj5xZUyDYpsFLgH0ApDhFJ57Tdxw=","MFYQHMUPDwTl5G2r85YGLzdn1v369NvEoKIV/yqP9D0=","suYCRRYSyx84XfGpJ642kjRBvpsYCZrXHIQdrDjHhM8=","FWll23MBvwnmTx45GuMEkpaohrEGlqtK5xFGH7EFhFQ=","xVQXdj83lrOmePZ2H/X8gQKeb0ZsdJwmwGlVhgn1iKk=","JBM4mmoRLcKW020j1M5/od\u002BktwV30JiF0IURK3neeVA=","LhQEEPfBv1x4zkjLkNo5UOqbP6vpsuxmDZfWrrYUOuQ=","6Ej25\u002BdEOADcqNkFwaGEjzHy7JwZjxZHE484x/wngas=","eFGzh1RmS7P9u2g03QpW6hWZdSUmi7k6aTjXbhIxvBw=","8EP2SMLjn\u002Ba9MBRxAWB0Chr/dyRQru36g4tGLaVvC5U=","1cSaY4ZOdlRQ4J8JEJcTCTaxFW6wCIkDNaHt4gOO6O0=","lOJzvq/mt94Oz7XdoNgAi5xhxeLtmYb8fQBwlPPQZZE=","OcnWLAVaHOsYs4bxnEnZqIWag3elwA7S4wtI2W/UU/w=","itNr5KUbu31/YaznAa3H9HU94pR2G5E\u002By41ZOAziBso=","9L2A6DEc9nUgGsAfznPoDJDiHK9N5yUnvVAZ55HFU5o=","jrhMriKpKb8MMoF/fFjCvVghgR1nPdlicua/iXMULrs=","CdwSbAeG72nDXEn8OBaMcL1/VmjlgS7xHzBX6FqCAhM=","ZKiapX8zYGlD2F5aGELVEVwu/xqbGH52dLsAPCg\u002BK1c=","MFwB9\u002Bmf\u002BLmDERjgvazd6oBnknubBcqxnX25YF5O\u002BR4=","ychUFdjaQZpbiFmAejbm6r2LE3ryZr0QzpQWAf8pYAU=","HHMN9Vvcgvov4W7M1YjdvfTZsFWuzyUh9TPfALHD8ys=","Rg0Zc7\u002B6aN84D0yIgRswn0g5Z\u002BCedtn8RjWnxPXD6Bc=","nJEkwqZ2WHoYX/lkd1ag99OObwa\u002BUacCxi8cPwQyYZQ=","haqWbxLhmiGrPyfId7Eidma9bDdT\u002BLmPiYFcTJeIvwM=","6Rdh8TmSgxQlWiZ1JiwrbUrqh6GigCZcyq3Y/p/GyEg=","3nVS5wBdgLMIZvvaoi8wriTzs3BDkKg37FtwHfDMhjQ=","PTCwsDOSptetl4jJHyelugE6oXbRSgUnDGBZeR5DJAw=","zzh3FW9R/C\u002BpOP8SPV2JXRRAhd1LLuYlGOyyOnZ9Gnk=","kEChOeuFq85XCariss4dIamJogzRzhHv3I\u002Bwz\u002BTM3qg=","ILgZb/GGIWdwm7iauiYzhswQLxIwoFQmo7WuMsDLZI8=","hPcbJaDUq2Gr6BBrUFWuGPpXtI2\u002Bzf\u002BB131nyeR/VhM=","6VyD1SdAUVe84G4oPqyBEYJ2vsYxzN6p\u002BE2JPzfsaHs=","g3sYtiwGKZqWqJmIFnpgMlXuzekOZOJp7bP\u002BeCGlEJg=","5kGuu3Hg/IoCEyBXsQ7ggsNkiuRTW4VUgJHrzZ6A32A=","V6Cuay3Fa0FmnT45Y/Je3\u002BP\u002BmRZG1Vn7QzNexS/U9QM=","x61JOwZ6Rincvaxrd7L/sxlpqJIbZhN8ugbqRa58Bh0=","2aJE9mIzYveQB88MIjZDblZknjB6XucYyey1JlyCSHw=","om8bC4Me/ps3m/rDiQ48q6XITG3NcGTkzfULk51DvlQ="],"CachedAssets":{},"CachedCopyCandidates":{}} {"GlobalPropertiesHash":"w2zJjDlrZF5/5p80zNaW9/DaLrmtiqb1ym05zjQa8AU=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["Ql2PiheSms1jp3ze9191\u002BLNizQeYVsVG\u002B7N0KZ1uG20=","J7kZmrOHXGR7mhUJ1qRNPdV4NRND\u002BvY/dHsYc/Fs5FA=","zoyQzHz20Gq24s2eR\u002BQU8CSBO06r9oxWByDVQGHt4qE=","m0ZalmIclG1CWERwq7TJzaS3UTwdWU7vJTH5wtXTRu0=","kYIUaswTSm/vuWdrFVk9i7vGl7gi4QutG\u002BtCBbnKC6I=","I92NrQVtDRIlAXcy/VupzptYIRXUmfdARzJEd\u002BMwPPI=","vwFknGJfBqZvyW3NEetGDZikd1HNT74cx2PojJjY\u002BPY=","3KENyb8mlCPncPOO5PbFfE0ubEK97voAevXn\u002BluJF7w=","NwDfbvguyiABZkN\u002B7yp6ClTOKkIFe/x4/v8tW4SUWHs=","Hourq1FvI\u002BJdRWbGSIe8r7GJGmkjFaIIQ8xB71hUBj4=","5n3ZEfHdKhL/ejFZA6mAyU6RVQAOd2wCgH3KjVv4d0U=","76\u002Bi/9Jz2zUyw2kfeC1dt0\u002B2uS7aFC2hMxE6ERdLn6s=","nvIt8ExR97wRoREETNPoXJ8D7Pb3KMAHZcwls7Q6c5E=","VfYWVT8Cth4Ztc4/xdY/qocO1V5snDiDHqbnmGMbvSw=","JxOQqF9Br69IsgvR\u002BTp8Vp93AFvsAKAiWtrgUjK7uKE=","5fR1TRHdDoMpaYhFN4ET8XHmhPG8hvpyxjiTF2qwx3M=","lxWH\u002B23ZAM/D8nGa5K0aryPD\u002BJPkC8vLJw2cEPhz8BA=","V8fXm0xeM7wossowKO5U7zhqV0P4uUGyIdkFdI9/LmY=","DGTAL07rwTwMmN0h4z8RtKm1\u002BbRR4K\u002B39bnl/wF43ZM=","rph0gnGKJ2XM54sr0iGk\u002BWTEktu647aepqf4FJUOLY8=","nklMuuwtwGoNNErDuvc4h4TaCmj4xyGZdjpGKgNvLGE=","Onb4gjU\u002B/9a/TKG0C3dG2hXdTEVs7OCECl6pWNTR6pQ=","WY7f0A5zLk9CD0lYECdLRR2b9b8GL2skPQO91AQ5wOM=","Ac8RYrUWtH4wwvUsQ9V6ndbtfhGuDzP1S9Hkh0JQLPg=","ixUpDxEYNKdhPZM9//dDIaFJGC9LvGDbh6rENZRYjWc=","SaPHXK2AwnFe3srooGZwMezdZmaxj0st4ZuBcZ0nfqE=","T5f5jCFFR0KCQwbQwHvZbWrVp7NucmIDfBynM8At\u002BFg=","DMXcRradogfvYUFJEJJT\u002B\u002B5RQjl\u002BI7kUSkHrHCl8oOk=","OLr6tSbzkGk2i5G0fVdSkw7v0IzsX6NL86pLF9m6eX0=","es5rRr8vQCVUTmRO5bFYu0yMvzBffvEDZTKp5IpEEvA=","//xOpsw6IkdGK7auzNWaN3ipl2miVcBMSjnir/YlMBM=","LxLYDw\u002BNEQs1/4eWj5xZUyDYpsFLgH0ApDhFJ57Tdxw=","MFYQHMUPDwTl5G2r85YGLzdn1v369NvEoKIV/yqP9D0=","suYCRRYSyx84XfGpJ642kjRBvpsYCZrXHIQdrDjHhM8=","FWll23MBvwnmTx45GuMEkpaohrEGlqtK5xFGH7EFhFQ=","xVQXdj83lrOmePZ2H/X8gQKeb0ZsdJwmwGlVhgn1iKk=","JBM4mmoRLcKW020j1M5/od\u002BktwV30JiF0IURK3neeVA=","LhQEEPfBv1x4zkjLkNo5UOqbP6vpsuxmDZfWrrYUOuQ=","6Ej25\u002BdEOADcqNkFwaGEjzHy7JwZjxZHE484x/wngas=","eFGzh1RmS7P9u2g03QpW6hWZdSUmi7k6aTjXbhIxvBw=","8EP2SMLjn\u002Ba9MBRxAWB0Chr/dyRQru36g4tGLaVvC5U=","1cSaY4ZOdlRQ4J8JEJcTCTaxFW6wCIkDNaHt4gOO6O0=","lOJzvq/mt94Oz7XdoNgAi5xhxeLtmYb8fQBwlPPQZZE=","OcnWLAVaHOsYs4bxnEnZqIWag3elwA7S4wtI2W/UU/w=","H8aFhn2drJzt36/L24d0engnsOFCb0JKnLejDgKTLi4=","9L2A6DEc9nUgGsAfznPoDJDiHK9N5yUnvVAZ55HFU5o=","jrhMriKpKb8MMoF/fFjCvVghgR1nPdlicua/iXMULrs=","CdwSbAeG72nDXEn8OBaMcL1/VmjlgS7xHzBX6FqCAhM=","rRfEoGduwRYI4dLUcvO1K5zL1Uf4y/R3qc5y1tZ6bbM=","j/BlMWNIm8dU8cN80vx7pKvotDlEPvK3Aw0x0gRwsGw=","unYa1AQD93GWZQpvokZZaLPzmQsIKVtMCYJWev1NKdA=","hTdJsAcxKOAgmREDxM0Q7F0XFAPcSi9LbkooIvw4pDo=","Rg0Zc7\u002B6aN84D0yIgRswn0g5Z\u002BCedtn8RjWnxPXD6Bc=","7i19fmcUtxUfpJGLk9ori6H9NTqI2TYMBHblGvKBU5w=","haqWbxLhmiGrPyfId7Eidma9bDdT\u002BLmPiYFcTJeIvwM=","6Rdh8TmSgxQlWiZ1JiwrbUrqh6GigCZcyq3Y/p/GyEg=","3nVS5wBdgLMIZvvaoi8wriTzs3BDkKg37FtwHfDMhjQ=","PTCwsDOSptetl4jJHyelugE6oXbRSgUnDGBZeR5DJAw=","zzh3FW9R/C\u002BpOP8SPV2JXRRAhd1LLuYlGOyyOnZ9Gnk=","kEChOeuFq85XCariss4dIamJogzRzhHv3I\u002Bwz\u002BTM3qg=","ILgZb/GGIWdwm7iauiYzhswQLxIwoFQmo7WuMsDLZI8=","hPcbJaDUq2Gr6BBrUFWuGPpXtI2\u002Bzf\u002BB131nyeR/VhM=","6VyD1SdAUVe84G4oPqyBEYJ2vsYxzN6p\u002BE2JPzfsaHs=","g3sYtiwGKZqWqJmIFnpgMlXuzekOZOJp7bP\u002BeCGlEJg=","5kGuu3Hg/IoCEyBXsQ7ggsNkiuRTW4VUgJHrzZ6A32A=","V6Cuay3Fa0FmnT45Y/Je3\u002BP\u002BmRZG1Vn7QzNexS/U9QM=","x61JOwZ6Rincvaxrd7L/sxlpqJIbZhN8ugbqRa58Bh0=","2aJE9mIzYveQB88MIjZDblZknjB6XucYyey1JlyCSHw=","G1Q8UgbSRswYv\u002BdHjSZGTEhWf8RSQOrZKntY9Seu1Zw="],"CachedAssets":{},"CachedCopyCandidates":{}}

View File

@@ -1 +1 @@
{"GlobalPropertiesHash":"uX1JeFdFTytYlQPawspOQefa+m0agbesQLMiaeAPgD0=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["Ql2PiheSms1jp3ze9191\u002BLNizQeYVsVG\u002B7N0KZ1uG20=","J7kZmrOHXGR7mhUJ1qRNPdV4NRND\u002BvY/dHsYc/Fs5FA=","zoyQzHz20Gq24s2eR\u002BQU8CSBO06r9oxWByDVQGHt4qE=","m0ZalmIclG1CWERwq7TJzaS3UTwdWU7vJTH5wtXTRu0=","kYIUaswTSm/vuWdrFVk9i7vGl7gi4QutG\u002BtCBbnKC6I=","I92NrQVtDRIlAXcy/VupzptYIRXUmfdARzJEd\u002BMwPPI=","vwFknGJfBqZvyW3NEetGDZikd1HNT74cx2PojJjY\u002BPY=","3KENyb8mlCPncPOO5PbFfE0ubEK97voAevXn\u002BluJF7w=","NwDfbvguyiABZkN\u002B7yp6ClTOKkIFe/x4/v8tW4SUWHs=","Hourq1FvI\u002BJdRWbGSIe8r7GJGmkjFaIIQ8xB71hUBj4=","5n3ZEfHdKhL/ejFZA6mAyU6RVQAOd2wCgH3KjVv4d0U=","76\u002Bi/9Jz2zUyw2kfeC1dt0\u002B2uS7aFC2hMxE6ERdLn6s=","nvIt8ExR97wRoREETNPoXJ8D7Pb3KMAHZcwls7Q6c5E=","VfYWVT8Cth4Ztc4/xdY/qocO1V5snDiDHqbnmGMbvSw=","JxOQqF9Br69IsgvR\u002BTp8Vp93AFvsAKAiWtrgUjK7uKE=","5fR1TRHdDoMpaYhFN4ET8XHmhPG8hvpyxjiTF2qwx3M=","lxWH\u002B23ZAM/D8nGa5K0aryPD\u002BJPkC8vLJw2cEPhz8BA=","V8fXm0xeM7wossowKO5U7zhqV0P4uUGyIdkFdI9/LmY=","DGTAL07rwTwMmN0h4z8RtKm1\u002BbRR4K\u002B39bnl/wF43ZM=","rph0gnGKJ2XM54sr0iGk\u002BWTEktu647aepqf4FJUOLY8=","nklMuuwtwGoNNErDuvc4h4TaCmj4xyGZdjpGKgNvLGE=","Onb4gjU\u002B/9a/TKG0C3dG2hXdTEVs7OCECl6pWNTR6pQ=","WY7f0A5zLk9CD0lYECdLRR2b9b8GL2skPQO91AQ5wOM=","Ac8RYrUWtH4wwvUsQ9V6ndbtfhGuDzP1S9Hkh0JQLPg=","ixUpDxEYNKdhPZM9//dDIaFJGC9LvGDbh6rENZRYjWc=","SaPHXK2AwnFe3srooGZwMezdZmaxj0st4ZuBcZ0nfqE=","T5f5jCFFR0KCQwbQwHvZbWrVp7NucmIDfBynM8At\u002BFg=","DMXcRradogfvYUFJEJJT\u002B\u002B5RQjl\u002BI7kUSkHrHCl8oOk=","OLr6tSbzkGk2i5G0fVdSkw7v0IzsX6NL86pLF9m6eX0=","es5rRr8vQCVUTmRO5bFYu0yMvzBffvEDZTKp5IpEEvA=","//xOpsw6IkdGK7auzNWaN3ipl2miVcBMSjnir/YlMBM=","LxLYDw\u002BNEQs1/4eWj5xZUyDYpsFLgH0ApDhFJ57Tdxw=","MFYQHMUPDwTl5G2r85YGLzdn1v369NvEoKIV/yqP9D0=","suYCRRYSyx84XfGpJ642kjRBvpsYCZrXHIQdrDjHhM8=","FWll23MBvwnmTx45GuMEkpaohrEGlqtK5xFGH7EFhFQ=","xVQXdj83lrOmePZ2H/X8gQKeb0ZsdJwmwGlVhgn1iKk=","JBM4mmoRLcKW020j1M5/od\u002BktwV30JiF0IURK3neeVA=","LhQEEPfBv1x4zkjLkNo5UOqbP6vpsuxmDZfWrrYUOuQ=","6Ej25\u002BdEOADcqNkFwaGEjzHy7JwZjxZHE484x/wngas=","eFGzh1RmS7P9u2g03QpW6hWZdSUmi7k6aTjXbhIxvBw=","8EP2SMLjn\u002Ba9MBRxAWB0Chr/dyRQru36g4tGLaVvC5U=","1cSaY4ZOdlRQ4J8JEJcTCTaxFW6wCIkDNaHt4gOO6O0=","lOJzvq/mt94Oz7XdoNgAi5xhxeLtmYb8fQBwlPPQZZE=","OcnWLAVaHOsYs4bxnEnZqIWag3elwA7S4wtI2W/UU/w=","itNr5KUbu31/YaznAa3H9HU94pR2G5E\u002By41ZOAziBso=","9L2A6DEc9nUgGsAfznPoDJDiHK9N5yUnvVAZ55HFU5o=","jrhMriKpKb8MMoF/fFjCvVghgR1nPdlicua/iXMULrs=","CdwSbAeG72nDXEn8OBaMcL1/VmjlgS7xHzBX6FqCAhM=","ZKiapX8zYGlD2F5aGELVEVwu/xqbGH52dLsAPCg\u002BK1c=","MFwB9\u002Bmf\u002BLmDERjgvazd6oBnknubBcqxnX25YF5O\u002BR4=","ychUFdjaQZpbiFmAejbm6r2LE3ryZr0QzpQWAf8pYAU=","HHMN9Vvcgvov4W7M1YjdvfTZsFWuzyUh9TPfALHD8ys=","Rg0Zc7\u002B6aN84D0yIgRswn0g5Z\u002BCedtn8RjWnxPXD6Bc=","nJEkwqZ2WHoYX/lkd1ag99OObwa\u002BUacCxi8cPwQyYZQ=","haqWbxLhmiGrPyfId7Eidma9bDdT\u002BLmPiYFcTJeIvwM=","6Rdh8TmSgxQlWiZ1JiwrbUrqh6GigCZcyq3Y/p/GyEg=","3nVS5wBdgLMIZvvaoi8wriTzs3BDkKg37FtwHfDMhjQ=","PTCwsDOSptetl4jJHyelugE6oXbRSgUnDGBZeR5DJAw=","zzh3FW9R/C\u002BpOP8SPV2JXRRAhd1LLuYlGOyyOnZ9Gnk=","kEChOeuFq85XCariss4dIamJogzRzhHv3I\u002Bwz\u002BTM3qg=","ILgZb/GGIWdwm7iauiYzhswQLxIwoFQmo7WuMsDLZI8=","hPcbJaDUq2Gr6BBrUFWuGPpXtI2\u002Bzf\u002BB131nyeR/VhM=","6VyD1SdAUVe84G4oPqyBEYJ2vsYxzN6p\u002BE2JPzfsaHs=","g3sYtiwGKZqWqJmIFnpgMlXuzekOZOJp7bP\u002BeCGlEJg=","5kGuu3Hg/IoCEyBXsQ7ggsNkiuRTW4VUgJHrzZ6A32A=","V6Cuay3Fa0FmnT45Y/Je3\u002BP\u002BmRZG1Vn7QzNexS/U9QM=","x61JOwZ6Rincvaxrd7L/sxlpqJIbZhN8ugbqRa58Bh0=","2aJE9mIzYveQB88MIjZDblZknjB6XucYyey1JlyCSHw=","om8bC4Me/ps3m/rDiQ48q6XITG3NcGTkzfULk51DvlQ="],"CachedAssets":{},"CachedCopyCandidates":{}} {"GlobalPropertiesHash":"uX1JeFdFTytYlQPawspOQefa+m0agbesQLMiaeAPgD0=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["Ql2PiheSms1jp3ze9191\u002BLNizQeYVsVG\u002B7N0KZ1uG20=","J7kZmrOHXGR7mhUJ1qRNPdV4NRND\u002BvY/dHsYc/Fs5FA=","zoyQzHz20Gq24s2eR\u002BQU8CSBO06r9oxWByDVQGHt4qE=","m0ZalmIclG1CWERwq7TJzaS3UTwdWU7vJTH5wtXTRu0=","kYIUaswTSm/vuWdrFVk9i7vGl7gi4QutG\u002BtCBbnKC6I=","I92NrQVtDRIlAXcy/VupzptYIRXUmfdARzJEd\u002BMwPPI=","vwFknGJfBqZvyW3NEetGDZikd1HNT74cx2PojJjY\u002BPY=","3KENyb8mlCPncPOO5PbFfE0ubEK97voAevXn\u002BluJF7w=","NwDfbvguyiABZkN\u002B7yp6ClTOKkIFe/x4/v8tW4SUWHs=","Hourq1FvI\u002BJdRWbGSIe8r7GJGmkjFaIIQ8xB71hUBj4=","5n3ZEfHdKhL/ejFZA6mAyU6RVQAOd2wCgH3KjVv4d0U=","76\u002Bi/9Jz2zUyw2kfeC1dt0\u002B2uS7aFC2hMxE6ERdLn6s=","nvIt8ExR97wRoREETNPoXJ8D7Pb3KMAHZcwls7Q6c5E=","VfYWVT8Cth4Ztc4/xdY/qocO1V5snDiDHqbnmGMbvSw=","JxOQqF9Br69IsgvR\u002BTp8Vp93AFvsAKAiWtrgUjK7uKE=","5fR1TRHdDoMpaYhFN4ET8XHmhPG8hvpyxjiTF2qwx3M=","lxWH\u002B23ZAM/D8nGa5K0aryPD\u002BJPkC8vLJw2cEPhz8BA=","V8fXm0xeM7wossowKO5U7zhqV0P4uUGyIdkFdI9/LmY=","DGTAL07rwTwMmN0h4z8RtKm1\u002BbRR4K\u002B39bnl/wF43ZM=","rph0gnGKJ2XM54sr0iGk\u002BWTEktu647aepqf4FJUOLY8=","nklMuuwtwGoNNErDuvc4h4TaCmj4xyGZdjpGKgNvLGE=","Onb4gjU\u002B/9a/TKG0C3dG2hXdTEVs7OCECl6pWNTR6pQ=","WY7f0A5zLk9CD0lYECdLRR2b9b8GL2skPQO91AQ5wOM=","Ac8RYrUWtH4wwvUsQ9V6ndbtfhGuDzP1S9Hkh0JQLPg=","ixUpDxEYNKdhPZM9//dDIaFJGC9LvGDbh6rENZRYjWc=","SaPHXK2AwnFe3srooGZwMezdZmaxj0st4ZuBcZ0nfqE=","T5f5jCFFR0KCQwbQwHvZbWrVp7NucmIDfBynM8At\u002BFg=","DMXcRradogfvYUFJEJJT\u002B\u002B5RQjl\u002BI7kUSkHrHCl8oOk=","OLr6tSbzkGk2i5G0fVdSkw7v0IzsX6NL86pLF9m6eX0=","es5rRr8vQCVUTmRO5bFYu0yMvzBffvEDZTKp5IpEEvA=","//xOpsw6IkdGK7auzNWaN3ipl2miVcBMSjnir/YlMBM=","LxLYDw\u002BNEQs1/4eWj5xZUyDYpsFLgH0ApDhFJ57Tdxw=","MFYQHMUPDwTl5G2r85YGLzdn1v369NvEoKIV/yqP9D0=","suYCRRYSyx84XfGpJ642kjRBvpsYCZrXHIQdrDjHhM8=","FWll23MBvwnmTx45GuMEkpaohrEGlqtK5xFGH7EFhFQ=","xVQXdj83lrOmePZ2H/X8gQKeb0ZsdJwmwGlVhgn1iKk=","JBM4mmoRLcKW020j1M5/od\u002BktwV30JiF0IURK3neeVA=","LhQEEPfBv1x4zkjLkNo5UOqbP6vpsuxmDZfWrrYUOuQ=","6Ej25\u002BdEOADcqNkFwaGEjzHy7JwZjxZHE484x/wngas=","eFGzh1RmS7P9u2g03QpW6hWZdSUmi7k6aTjXbhIxvBw=","8EP2SMLjn\u002Ba9MBRxAWB0Chr/dyRQru36g4tGLaVvC5U=","1cSaY4ZOdlRQ4J8JEJcTCTaxFW6wCIkDNaHt4gOO6O0=","lOJzvq/mt94Oz7XdoNgAi5xhxeLtmYb8fQBwlPPQZZE=","OcnWLAVaHOsYs4bxnEnZqIWag3elwA7S4wtI2W/UU/w=","H8aFhn2drJzt36/L24d0engnsOFCb0JKnLejDgKTLi4=","9L2A6DEc9nUgGsAfznPoDJDiHK9N5yUnvVAZ55HFU5o=","jrhMriKpKb8MMoF/fFjCvVghgR1nPdlicua/iXMULrs=","CdwSbAeG72nDXEn8OBaMcL1/VmjlgS7xHzBX6FqCAhM=","rRfEoGduwRYI4dLUcvO1K5zL1Uf4y/R3qc5y1tZ6bbM=","j/BlMWNIm8dU8cN80vx7pKvotDlEPvK3Aw0x0gRwsGw=","unYa1AQD93GWZQpvokZZaLPzmQsIKVtMCYJWev1NKdA=","hTdJsAcxKOAgmREDxM0Q7F0XFAPcSi9LbkooIvw4pDo=","Rg0Zc7\u002B6aN84D0yIgRswn0g5Z\u002BCedtn8RjWnxPXD6Bc=","7i19fmcUtxUfpJGLk9ori6H9NTqI2TYMBHblGvKBU5w=","haqWbxLhmiGrPyfId7Eidma9bDdT\u002BLmPiYFcTJeIvwM=","6Rdh8TmSgxQlWiZ1JiwrbUrqh6GigCZcyq3Y/p/GyEg=","3nVS5wBdgLMIZvvaoi8wriTzs3BDkKg37FtwHfDMhjQ=","PTCwsDOSptetl4jJHyelugE6oXbRSgUnDGBZeR5DJAw=","zzh3FW9R/C\u002BpOP8SPV2JXRRAhd1LLuYlGOyyOnZ9Gnk=","kEChOeuFq85XCariss4dIamJogzRzhHv3I\u002Bwz\u002BTM3qg=","ILgZb/GGIWdwm7iauiYzhswQLxIwoFQmo7WuMsDLZI8=","hPcbJaDUq2Gr6BBrUFWuGPpXtI2\u002Bzf\u002BB131nyeR/VhM=","6VyD1SdAUVe84G4oPqyBEYJ2vsYxzN6p\u002BE2JPzfsaHs=","g3sYtiwGKZqWqJmIFnpgMlXuzekOZOJp7bP\u002BeCGlEJg=","5kGuu3Hg/IoCEyBXsQ7ggsNkiuRTW4VUgJHrzZ6A32A=","V6Cuay3Fa0FmnT45Y/Je3\u002BP\u002BmRZG1Vn7QzNexS/U9QM=","x61JOwZ6Rincvaxrd7L/sxlpqJIbZhN8ugbqRa58Bh0=","2aJE9mIzYveQB88MIjZDblZknjB6XucYyey1JlyCSHw=","G1Q8UgbSRswYv\u002BdHjSZGTEhWf8RSQOrZKntY9Seu1Zw="],"CachedAssets":{},"CachedCopyCandidates":{}}

View File

@@ -1 +1 @@
{"GlobalPropertiesHash":"XVWMafEhfrS/fg2Zj7asTNqgDrfpiwoMDXnjdP5dMDc=","FingerprintPatternsHash":"gq3WsqcKBUGTSNle7RKKyXRIwh7M8ccEqOqYvIzoM04=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["Ql2PiheSms1jp3ze9191\u002BLNizQeYVsVG\u002B7N0KZ1uG20=","J7kZmrOHXGR7mhUJ1qRNPdV4NRND\u002BvY/dHsYc/Fs5FA=","zoyQzHz20Gq24s2eR\u002BQU8CSBO06r9oxWByDVQGHt4qE=","S9txWBMkH4Yj1eG2HUPOkUWz9AoQkGdbSfeW8NgN\u002BxE=","o0aea9nqp02517BUOs9/nGaM6H/UnpWWtWAeDomcgV4=","y2dTx6xFkyjAzITP/\u002BSs40MCBm/Tmm7ZOBpI/DqlBFE=","ZmxUJu7Va54dnyLTpPaeb3LXxiTxJP0LRIHL\u002BnuF44c=","cg4n0kRzzWgY2qlZdUwROVqv25x8/QQaCM/NXeXHAm0=","AcEyg5sF\u002BG7h8cTd4OPHIBGSDc58NkKWM9LXnPCts2s=","VFrRe4girF3FRpDOlYSBnVrkOnl76ekWOxNm7mF4t0A=","j9/Tw8fXyMbeynWjJYmY6kJ7FJ59tcwknts73gweoEI=","8d5OfgLy6a4RJsFXKLcxA1egZHtmIKAbps5lBmeNt38=","AaPPr3bR/sBWrgmYgZKKMSIKNbQeqLf310KQRpKnfsI=","5IT4oOrh1c8VH1VjwWuD7ai4PiPBq/13R4tEiY/TSPI=","Czn9tLfHWPwVf9uh/XrNgA6Ks6J9tVB4JwfLegj/ftM=","SphdH4dZI\u002BUI/NAY8yVibP3CY6lMLtHcvNauNjiMUG4=","NuRRqbDGasbzd5BYo0DL2OjUjjh57dbMlAUsJkIwkPM=","yLN/BA9iAut9Pd7HzcSogC02i9ddxjif2fdbbGIUB70=","CPWWJ2Bp2hzILnMJAY673sNfUfm3FZSJEAufT8hMY6E=","2QKOn\u002BHTSGGnvtnKhUgPyG3helsQD0OCrMBMj\u002B7T3lw=","wtIXZYfkJHNxuSRxgTwoC\u002BU59\u002Byk38nSrpBgrm/qiAo=","9b\u002BWZIOTiDlyAbFbG434M0hhY786ENq3Fu7wCA09jUo=","87spKP4vbfUzWbrg4lDHyoNr6kpsnJEK24nTFEP9rck=","/vMoyd2fA4sgtfeJQc7cppdLQDn8TcwztXnss03HUUw=","oNCxGtvhYEhZorlxe3gldEXtD1YdpsMnXGcFwqqeeQw=","Ld9r0/i9fUO7QsnlP7r1KKriqtVDmSx8cLG0in2YMSo=","53lPHr9hM1ATjEpC\u002B2/TXZeAlArG\u002BcTVBOU0rnOCSYY=","XPDTlgt2uSfOwx8b0oKHXnDrOjRanq/v7VC/aAqsKsg=","XA43zdGlmTrdY6wEAYknKYBFN9IztLZ2jSrofw0b6V4=","InYJRKMtWl6vOkkIYW9DWTiLIRhMbWwp/GcLrfgTYhs=","b/\u002BexuVW46WvMaRrT/V89clZeIFOODWEpaVshFcyvdA=","A0ZKYLLhNwY/0fzk/IVDeOqWtMmS3l3OqAUcDcBwc/A=","CVg6HDxR8p\u002BKSy1NlJ3zIKBQvgufzL\u002BppFGICUQ\u002Bt3w=","QIOQB6Fr0POEbCmn8nJHkvxhD/MBJBkLkRbYJLA/IYQ=","JJFYlRoX9pKL3BogzIBb9yD5WmSNP4CS7LqbhDK3ZV0=","m//7eW/q\u002B\u002BS7cLBAJncoxjjMdd4ob9yeVwXyO\u002BUT9eI=","bK\u002BMzz3RPOuZoQyDguWcV6QBHxrg2U2\u002B/bAVZ\u002BgpVmE=","Xo3U/owG8nW3wjViQjnwmTJExAAnQChLevgIL6SxVgs=","SfZ1OYxt3htPAa47uV4vmWa1Bdgc4ieW\u002B9xakLRDHO8=","vzc7efbyllU994SpWhcuSAj24nDhk3qWXXJzCFKhIec=","Hv9au18n6omxvLxP0EsBJ8HeLnUAyfa1Jg4xpVg87no=","adO3IRtQJ9N8t04wKkZwPZiqyI0LJOP6xF/Suhog1JE=","4pzRrv9HLcQeFngePzOiTXUmXw1iRIiKRoSCce0cugM=","ngTcMNcqz/xhWZBn5CPSCOvjsrREr0HuEN5UW941TxA=","M9OQdzerfnWfXeRb3kqjQR22ZEAOhPUxnUuB5YzydL0=","orh0CcK78/TtV1LjA11aYsn/YxKYUBNSni\u002BannRaWeI=","UGiYv\u002B7Q0HlOyGACdO9FzYJXDNFgT/cKO8xYQLlx5eg=","mplxK8c12PonhfXKpL\u002BHRLxWkaWn30SmMhIBChvSCVE=","BiFEtxAeulxzg4093ODVO/hBU6BTvilbCg7luNc0QSk=","DKhaZ5fHA5jhqYZosYg5BHMriRJHTo30JRbiC\u002BOpd3c=","h0g/Fvvw0atLURHfHCthiHIOZpDTYQ3D\u002BxmffXCZTGs=","OX7hVhGLcy1hGsMR9Q6K5e1m9Inuxss\u002B3dBLxzpfxGo=","zSEvxET0DOTN2cpCiXQExXCGOxdoXNvPpmHsUTUhTXM=","ePeQgUMQPfE9ZZdl8jI2rfGshuKKHGpnajQ0M5shZSk=","BZMtXiMXFAikFlU3GpSO4qnu4ytUYCrr\u002BH44xQ0sqVg=","WhBc1hqkyc8177jVvo4eQuWlpHVI96iHm4VFZAOO7Fc=","mcMbV2\u002BNCfk5eAGwoYnsWOyN8b8NuAO7iH1ewAHyW6U=","DcLX4hxLgf7iG7fZIKLj7eUITuiIGEgGnDYTCSAmcII=","nzN2wI8kPPjBRWwSKLalEYmrDXyx2Y8f5S\u002BJCKVFj1o=","3QVdUFr8xuBbDhinUAe\u002BtHZRSDw8whCbedlQRGg3ByU=","Uml6Zk4Nd3yDJrKkoHqxmSCEYTiat3222CyFbAAoU28=","GstRCs2Ap1VD2t\u002BJ6nr0UpVFlKhrBm8Fi9PmSQbgj\u002B8=","sr4sunvZGYlxTk47R8QnORuMVrTEufupLlUwtph8jAE=","fm0hNxD23Xg4KufltLQTxCmPvcM3fZYY\u002B7jlnuLutTc=","DH6X9\u002BUzPeMZmgXVBMIcvPEMbk70kYRRprZcygSB9Q8="],"CachedAssets":{"Ql2PiheSms1jp3ze9191\u002BLNizQeYVsVG\u002B7N0KZ1uG20=":{"Identity":"D:\\Nextcloud\\Documents\\Open-Archival\\OpenArchival.Blazor\\wwwroot\\favicon.ico","SourceId":"OpenArchival.Blazor","SourceType":"Discovered","ContentRoot":"D:\\Nextcloud\\Documents\\Open-Archival\\OpenArchival.Blazor\\wwwroot\\","BasePath":"_content/OpenArchival.Blazor","RelativePath":"favicon#[.{fingerprint}]?.ico","AssetKind":"All","AssetMode":"All","AssetRole":"Primary","AssetMergeBehavior":null,"AssetMergeSource":"","RelatedAsset":null,"AssetTraitName":null,"AssetTraitValue":null,"Fingerprint":"2jeq8efc6q","Integrity":"8kNQh\u002BLErZHx3sMz237BHWFasAGQ88EWakJrWWYOxTA=","CopyToOutputDirectory":"Never","CopyToPublishDirectory":"PreserveNewest","OriginalItemSpec":"wwwroot\\favicon.ico","FileLength":15086,"LastWriteTime":"2025-08-12T18:28:17.583355+00:00"}},"CachedCopyCandidates":{}} {"GlobalPropertiesHash":"XVWMafEhfrS/fg2Zj7asTNqgDrfpiwoMDXnjdP5dMDc=","FingerprintPatternsHash":"gq3WsqcKBUGTSNle7RKKyXRIwh7M8ccEqOqYvIzoM04=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["Ql2PiheSms1jp3ze9191\u002BLNizQeYVsVG\u002B7N0KZ1uG20=","J7kZmrOHXGR7mhUJ1qRNPdV4NRND\u002BvY/dHsYc/Fs5FA=","zoyQzHz20Gq24s2eR\u002BQU8CSBO06r9oxWByDVQGHt4qE=","S9txWBMkH4Yj1eG2HUPOkUWz9AoQkGdbSfeW8NgN\u002BxE=","o0aea9nqp02517BUOs9/nGaM6H/UnpWWtWAeDomcgV4=","y2dTx6xFkyjAzITP/\u002BSs40MCBm/Tmm7ZOBpI/DqlBFE=","ZmxUJu7Va54dnyLTpPaeb3LXxiTxJP0LRIHL\u002BnuF44c=","cg4n0kRzzWgY2qlZdUwROVqv25x8/QQaCM/NXeXHAm0=","AcEyg5sF\u002BG7h8cTd4OPHIBGSDc58NkKWM9LXnPCts2s=","VFrRe4girF3FRpDOlYSBnVrkOnl76ekWOxNm7mF4t0A=","j9/Tw8fXyMbeynWjJYmY6kJ7FJ59tcwknts73gweoEI=","8d5OfgLy6a4RJsFXKLcxA1egZHtmIKAbps5lBmeNt38=","AaPPr3bR/sBWrgmYgZKKMSIKNbQeqLf310KQRpKnfsI=","5IT4oOrh1c8VH1VjwWuD7ai4PiPBq/13R4tEiY/TSPI=","Czn9tLfHWPwVf9uh/XrNgA6Ks6J9tVB4JwfLegj/ftM=","SphdH4dZI\u002BUI/NAY8yVibP3CY6lMLtHcvNauNjiMUG4=","NuRRqbDGasbzd5BYo0DL2OjUjjh57dbMlAUsJkIwkPM=","yLN/BA9iAut9Pd7HzcSogC02i9ddxjif2fdbbGIUB70=","CPWWJ2Bp2hzILnMJAY673sNfUfm3FZSJEAufT8hMY6E=","2QKOn\u002BHTSGGnvtnKhUgPyG3helsQD0OCrMBMj\u002B7T3lw=","wtIXZYfkJHNxuSRxgTwoC\u002BU59\u002Byk38nSrpBgrm/qiAo=","9b\u002BWZIOTiDlyAbFbG434M0hhY786ENq3Fu7wCA09jUo=","87spKP4vbfUzWbrg4lDHyoNr6kpsnJEK24nTFEP9rck=","/vMoyd2fA4sgtfeJQc7cppdLQDn8TcwztXnss03HUUw=","oNCxGtvhYEhZorlxe3gldEXtD1YdpsMnXGcFwqqeeQw=","Ld9r0/i9fUO7QsnlP7r1KKriqtVDmSx8cLG0in2YMSo=","53lPHr9hM1ATjEpC\u002B2/TXZeAlArG\u002BcTVBOU0rnOCSYY=","XPDTlgt2uSfOwx8b0oKHXnDrOjRanq/v7VC/aAqsKsg=","XA43zdGlmTrdY6wEAYknKYBFN9IztLZ2jSrofw0b6V4=","InYJRKMtWl6vOkkIYW9DWTiLIRhMbWwp/GcLrfgTYhs=","b/\u002BexuVW46WvMaRrT/V89clZeIFOODWEpaVshFcyvdA=","A0ZKYLLhNwY/0fzk/IVDeOqWtMmS3l3OqAUcDcBwc/A=","CVg6HDxR8p\u002BKSy1NlJ3zIKBQvgufzL\u002BppFGICUQ\u002Bt3w=","QIOQB6Fr0POEbCmn8nJHkvxhD/MBJBkLkRbYJLA/IYQ=","JJFYlRoX9pKL3BogzIBb9yD5WmSNP4CS7LqbhDK3ZV0=","m//7eW/q\u002B\u002BS7cLBAJncoxjjMdd4ob9yeVwXyO\u002BUT9eI=","bK\u002BMzz3RPOuZoQyDguWcV6QBHxrg2U2\u002B/bAVZ\u002BgpVmE=","Xo3U/owG8nW3wjViQjnwmTJExAAnQChLevgIL6SxVgs=","SfZ1OYxt3htPAa47uV4vmWa1Bdgc4ieW\u002B9xakLRDHO8=","vzc7efbyllU994SpWhcuSAj24nDhk3qWXXJzCFKhIec=","Hv9au18n6omxvLxP0EsBJ8HeLnUAyfa1Jg4xpVg87no=","adO3IRtQJ9N8t04wKkZwPZiqyI0LJOP6xF/Suhog1JE=","4pzRrv9HLcQeFngePzOiTXUmXw1iRIiKRoSCce0cugM=","ngTcMNcqz/xhWZBn5CPSCOvjsrREr0HuEN5UW941TxA=","BUREzTKq6RTkGHrfniKilZfRuTg4naE2ieRV7bV5lz8=","orh0CcK78/TtV1LjA11aYsn/YxKYUBNSni\u002BannRaWeI=","UGiYv\u002B7Q0HlOyGACdO9FzYJXDNFgT/cKO8xYQLlx5eg=","mplxK8c12PonhfXKpL\u002BHRLxWkaWn30SmMhIBChvSCVE=","NIYgVLh6ji9gJ1Rhs4pFuptF3VfDQWz0HV7NHwzTT6c=","uAozb7aRuFLoAnAhhvZeFjIdKDdTACDgpJiOl6qHZF8=","WJ839ZvY8at/iFC8W6iEpRBlbT1jxwU8ZxLszuamAeA=","WqkWjsLTtPmi62fvid\u002BunNqDvkSqFLJ\u002BnRuuVn/CuK0=","zSEvxET0DOTN2cpCiXQExXCGOxdoXNvPpmHsUTUhTXM=","4n9PKTbTnHbwJbn0rzhgsQnIrFt83FYEMWA4GNooCzA=","BZMtXiMXFAikFlU3GpSO4qnu4ytUYCrr\u002BH44xQ0sqVg=","WhBc1hqkyc8177jVvo4eQuWlpHVI96iHm4VFZAOO7Fc=","mcMbV2\u002BNCfk5eAGwoYnsWOyN8b8NuAO7iH1ewAHyW6U=","DcLX4hxLgf7iG7fZIKLj7eUITuiIGEgGnDYTCSAmcII=","nzN2wI8kPPjBRWwSKLalEYmrDXyx2Y8f5S\u002BJCKVFj1o=","3QVdUFr8xuBbDhinUAe\u002BtHZRSDw8whCbedlQRGg3ByU=","Uml6Zk4Nd3yDJrKkoHqxmSCEYTiat3222CyFbAAoU28=","GstRCs2Ap1VD2t\u002BJ6nr0UpVFlKhrBm8Fi9PmSQbgj\u002B8=","sr4sunvZGYlxTk47R8QnORuMVrTEufupLlUwtph8jAE=","fm0hNxD23Xg4KufltLQTxCmPvcM3fZYY\u002B7jlnuLutTc=","DH6X9\u002BUzPeMZmgXVBMIcvPEMbk70kYRRprZcygSB9Q8="],"CachedAssets":{"Ql2PiheSms1jp3ze9191\u002BLNizQeYVsVG\u002B7N0KZ1uG20=":{"Identity":"D:\\Nextcloud\\Documents\\Open-Archival\\OpenArchival.Blazor\\wwwroot\\favicon.ico","SourceId":"OpenArchival.Blazor","SourceType":"Discovered","ContentRoot":"D:\\Nextcloud\\Documents\\Open-Archival\\OpenArchival.Blazor\\wwwroot\\","BasePath":"_content/OpenArchival.Blazor","RelativePath":"favicon#[.{fingerprint}]?.ico","AssetKind":"All","AssetMode":"All","AssetRole":"Primary","AssetMergeBehavior":null,"AssetMergeSource":"","RelatedAsset":null,"AssetTraitName":null,"AssetTraitValue":null,"Fingerprint":"2jeq8efc6q","Integrity":"8kNQh\u002BLErZHx3sMz237BHWFasAGQ88EWakJrWWYOxTA=","CopyToOutputDirectory":"Never","CopyToPublishDirectory":"PreserveNewest","OriginalItemSpec":"wwwroot\\favicon.ico","FileLength":15086,"LastWriteTime":"2025-08-12T18:28:17.583355+00:00"}},"CachedCopyCandidates":{}}

View File

@@ -218,3 +218,39 @@ D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\st
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json

View File

@@ -50,6 +50,10 @@ public class ApplicationDbContext(DbContextOptions<ApplicationDbContext> options
.HasForeignKey(entry => entry.ArtifactGroupingId) .HasForeignKey(entry => entry.ArtifactGroupingId)
.OnDelete(DeleteBehavior.Cascade); .OnDelete(DeleteBehavior.Cascade);
modelBuilder.Entity<ArtifactGrouping>()
.Navigation(g => g.IdentifierFields)
.UsePropertyAccessMode(PropertyAccessMode.Field);
var dictionaryComparer = new ValueComparer<Dictionary<string, string>>( var dictionaryComparer = new ValueComparer<Dictionary<string, string>>(
(dictionary1, dictionary2) => dictionary1.OrderBy(pair => pair.Key) (dictionary1, dictionary2) => dictionary1.OrderBy(pair => pair.Key)
.SequenceEqual(dictionary2.OrderBy(pair => pair.Key)), .SequenceEqual(dictionary2.OrderBy(pair => pair.Key)),

View File

@@ -15,7 +15,7 @@ public class ArtifactGrouping
{ {
get get
{ {
return ModelHelpers.MakeIdentifier(_identifierFields.Values, Category.FieldSeparator, null); return ModelHelpers.MakeIdentifier(IdentifierFields.Values, Category.FieldSeparator, null);
} }
} }

View File

@@ -6,11 +6,11 @@ namespace OpenArchival.DataAccess;
public class ArtifactGroupingProvider : IArtifactGroupingProvider public class ArtifactGroupingProvider : IArtifactGroupingProvider
{ {
private readonly ApplicationDbContext _context; private readonly IDbContextFactory<ApplicationDbContext> _context;
private readonly ILogger<ArtifactGroupingProvider> _logger; private readonly ILogger<ArtifactGroupingProvider> _logger;
[SetsRequiredMembers] [SetsRequiredMembers]
public ArtifactGroupingProvider(ApplicationDbContext context, ILogger<ArtifactGroupingProvider> logger) public ArtifactGroupingProvider(IDbContextFactory<ApplicationDbContext> context, ILogger<ArtifactGroupingProvider> logger)
{ {
_context = context; _context = context;
_logger = logger; _logger = logger;
@@ -18,57 +18,75 @@ public class ArtifactGroupingProvider : IArtifactGroupingProvider
public async Task<ArtifactGrouping?> GetGroupingAsync(int id) public async Task<ArtifactGrouping?> GetGroupingAsync(int id)
{ {
return await _context.ArtifactGroupings await using var context = await _context.CreateDbContextAsync();
.Where(g => g.Id == id) return await context.ArtifactGroupings
.Include(g => g.Category) .Include(g => g.Category)
.Include(g => g.IdentifierFields)
.Include(g => g.ChildArtifactEntries)
.ThenInclude(e => e.StorageLocation)
.Include(g => g.ChildArtifactEntries)
.ThenInclude(e => e.Type)
.Include(g => g.ChildArtifactEntries)
.ThenInclude(e => e.Files)
.Where(g => g.Id == id)
.FirstOrDefaultAsync(); .FirstOrDefaultAsync();
} }
public async Task<ArtifactGrouping?> GetGroupingAsync(string artifactGroupingIdentifier) public async Task<ArtifactGrouping?> GetGroupingAsync(string artifactGroupingIdentifier)
{ {
return await _context.ArtifactGroupings await using var context = await _context.CreateDbContextAsync();
return await context.ArtifactGroupings
.Where(g => g.ArtifactGroupingIdentifier == artifactGroupingIdentifier) .Where(g => g.ArtifactGroupingIdentifier == artifactGroupingIdentifier)
.Include(g => g.Category) .Include(g => g.Category)
.Include(g => g.ChildArtifactEntries)
.ThenInclude(g => g.StorageLocation)
.ThenInclude(g => g.Location)
.FirstOrDefaultAsync(); .FirstOrDefaultAsync();
} }
public async Task CreateGroupingAsync(ArtifactGrouping grouping) public async Task CreateGroupingAsync(ArtifactGrouping grouping)
{ {
_context.ArtifactGroupings.Add(grouping); await using var context = await _context.CreateDbContextAsync();
await _context.SaveChangesAsync(); context.ArtifactGroupings.Add(grouping);
await context.SaveChangesAsync();
} }
public async Task UpdateGroupingAsync(ArtifactGrouping grouping) public async Task UpdateGroupingAsync(ArtifactGrouping grouping)
{ {
_context.ArtifactGroupings.Update(grouping); await using var context = await _context.CreateDbContextAsync();
await _context.SaveChangesAsync(); context.ArtifactGroupings.Update(grouping);
await context.SaveChangesAsync();
} }
public async Task DeleteGroupingAsync(int id) public async Task DeleteGroupingAsync(int id)
{ {
await _context.ArtifactGroupings await using var context = await _context.CreateDbContextAsync();
await context.ArtifactGroupings
.Where(p => p.Id == id) .Where(p => p.Id == id)
.ExecuteDeleteAsync(); .ExecuteDeleteAsync();
await _context.SaveChangesAsync(); await context.SaveChangesAsync();
} }
public async Task DeleteGroupingAsync(ArtifactGrouping grouping) public async Task DeleteGroupingAsync(ArtifactGrouping grouping)
{ {
_context.ArtifactGroupings.Remove(grouping); await using var context = await _context.CreateDbContextAsync();
await _context.SaveChangesAsync(); context.ArtifactGroupings.Remove(grouping);
await context.SaveChangesAsync();
} }
public async Task<List<ArtifactGrouping>> GetGroupingsPaged(int pageNumber, int resultsCount) public async Task<List<ArtifactGrouping>> GetGroupingsPaged(int pageNumber, int resultsCount)
{ {
await using var context = await _context.CreateDbContextAsync();
if (pageNumber < 1 || resultsCount < 1) if (pageNumber < 1 || resultsCount < 1)
{ {
throw new ArgumentOutOfRangeException($"Either page number or number of results was less than or equal to 0. {nameof(pageNumber)}={pageNumber} {nameof(resultsCount)}={resultsCount}"); throw new ArgumentOutOfRangeException($"Either page number or number of results was less than or equal to 0. {nameof(pageNumber)}={pageNumber} {nameof(resultsCount)}={resultsCount}");
} }
var totalCount = await _context.ArtifactGroupings.CountAsync(); var totalCount = await context.ArtifactGroupings.CountAsync();
var items = await _context.ArtifactGroupings var items = await context.ArtifactGroupings
.Include(g => g.ChildArtifactEntries)
.Include(g => g.Category) .Include(g => g.Category)
.OrderBy(g => g.Id) .OrderBy(g => g.Id)
.Skip((pageNumber - 1) * resultsCount) .Skip((pageNumber - 1) * resultsCount)
@@ -77,4 +95,10 @@ public class ArtifactGroupingProvider : IArtifactGroupingProvider
return items; return items;
} }
public async Task<int> GetTotalCount()
{
await using var context = await _context.CreateDbContextAsync();
return context.ArtifactGroupings.Count();
}
} }

View File

@@ -9,4 +9,5 @@ public interface IArtifactGroupingProvider
Task DeleteGroupingAsync(int id); Task DeleteGroupingAsync(int id);
Task DeleteGroupingAsync(ArtifactGrouping grouping); Task DeleteGroupingAsync(ArtifactGrouping grouping);
Task<List<ArtifactGrouping>> GetGroupingsPaged(int pageNumber, int resultsCount); Task<List<ArtifactGrouping>> GetGroupingsPaged(int pageNumber, int resultsCount);
public Task<int> GetTotalCount();
} }

View File

@@ -15,7 +15,7 @@ using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("OpenArchival.DataAccess")] [assembly: System.Reflection.AssemblyCompanyAttribute("OpenArchival.DataAccess")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+dd3968f6effa8f45f27a3ec91c34762c88380f06")] [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+ff34eb87b9d0eec9553fb4767daadfcc0d97fb44")]
[assembly: System.Reflection.AssemblyProductAttribute("OpenArchival.DataAccess")] [assembly: System.Reflection.AssemblyProductAttribute("OpenArchival.DataAccess")]
[assembly: System.Reflection.AssemblyTitleAttribute("OpenArchival.DataAccess")] [assembly: System.Reflection.AssemblyTitleAttribute("OpenArchival.DataAccess")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]

View File

@@ -1 +1 @@
3f1dc26310f431c1735242d3a315e070d6215de828a0f93ee5bf50c1e5b9de38 9c710d1eda832a1b6dfacbdd6d88e8d851c4fd9722e33c20de29410792da1d82

View File

@@ -1 +1 @@
{"documents":{"D:\\Nextcloud\\Documents\\Open-Archival\\*":"https://raw.githubusercontent.com/vtallen/Open-Archival/dd3968f6effa8f45f27a3ec91c34762c88380f06/*"}} {"documents":{"D:\\Nextcloud\\Documents\\Open-Archival\\*":"https://raw.githubusercontent.com/vtallen/Open-Archival/ff34eb87b9d0eec9553fb4767daadfcc0d97fb44/*"}}

View File

@@ -1 +1 @@
{"GlobalPropertiesHash":"J3r5h7pKF0kY0DRJx0Xqba86ngtHs3jduVq7GPX+nwI=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["51WRq7nT/WTvnhamRxLn7Ony/A1bnAxDelsXO4Ehpwc=","aDrxgmPzfmAYNrzynmphKXORQNARBvx3ZJm3IcIlVIA=","dFQa1Ee6LWN6QaEoa8lulEtbH6imVMCsVrPTv7uB7rA=","KAWcEu8sopHLr7dsoLsr\u002Bz7vrHN0YxMtmdfBYeH1kwI=","\u002Bjyo4JejKGZVNH7yAY1POV7dsMBGmszgVLUsVwm0S6Y=","E6ltkajZSrcZfEd5mYBcKe4AnJ/ZOJ8hZBTp71ugK08="],"CachedAssets":{},"CachedCopyCandidates":{}} {"GlobalPropertiesHash":"J3r5h7pKF0kY0DRJx0Xqba86ngtHs3jduVq7GPX+nwI=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["51WRq7nT/WTvnhamRxLn7Ony/A1bnAxDelsXO4Ehpwc=","aDrxgmPzfmAYNrzynmphKXORQNARBvx3ZJm3IcIlVIA=","dFQa1Ee6LWN6QaEoa8lulEtbH6imVMCsVrPTv7uB7rA=","KAWcEu8sopHLr7dsoLsr\u002Bz7vrHN0YxMtmdfBYeH1kwI=","\u002Bjyo4JejKGZVNH7yAY1POV7dsMBGmszgVLUsVwm0S6Y=","fDpShEUul2xTzLSmjcwncSU4OZgXILMHjt2fTsSSXoo="],"CachedAssets":{},"CachedCopyCandidates":{}}

View File

@@ -1 +1 @@
{"GlobalPropertiesHash":"EHbx5ejyqDv8gH5NpOoZxRAV9glFiYxTGFnRTcGg8no=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["51WRq7nT/WTvnhamRxLn7Ony/A1bnAxDelsXO4Ehpwc=","aDrxgmPzfmAYNrzynmphKXORQNARBvx3ZJm3IcIlVIA=","dFQa1Ee6LWN6QaEoa8lulEtbH6imVMCsVrPTv7uB7rA=","KAWcEu8sopHLr7dsoLsr\u002Bz7vrHN0YxMtmdfBYeH1kwI=","\u002Bjyo4JejKGZVNH7yAY1POV7dsMBGmszgVLUsVwm0S6Y=","E6ltkajZSrcZfEd5mYBcKe4AnJ/ZOJ8hZBTp71ugK08="],"CachedAssets":{},"CachedCopyCandidates":{}} {"GlobalPropertiesHash":"EHbx5ejyqDv8gH5NpOoZxRAV9glFiYxTGFnRTcGg8no=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["51WRq7nT/WTvnhamRxLn7Ony/A1bnAxDelsXO4Ehpwc=","aDrxgmPzfmAYNrzynmphKXORQNARBvx3ZJm3IcIlVIA=","dFQa1Ee6LWN6QaEoa8lulEtbH6imVMCsVrPTv7uB7rA=","KAWcEu8sopHLr7dsoLsr\u002Bz7vrHN0YxMtmdfBYeH1kwI=","\u002Bjyo4JejKGZVNH7yAY1POV7dsMBGmszgVLUsVwm0S6Y=","fDpShEUul2xTzLSmjcwncSU4OZgXILMHjt2fTsSSXoo="],"CachedAssets":{},"CachedCopyCandidates":{}}