mirror of
https://github.com/Theodor-Springmann-Stiftung/hamann-ausgabe-core.git
synced 2025-10-29 17:25:32 +00:00
Added Models for displaying files and all kinds of stuff
This commit is contained in:
@@ -169,6 +169,25 @@ public class APIController : Controller {
|
|||||||
_ = _lib.SetLibrary(savedfile.PhysicalPath, ModelState);
|
_ = _lib.SetLibrary(savedfile.PhysicalPath, ModelState);
|
||||||
if (!ModelState.IsValid)
|
if (!ModelState.IsValid)
|
||||||
return BadRequest(ModelState);
|
return BadRequest(ModelState);
|
||||||
|
return Created("/", _xmlProvider.GetHamannFiles());
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpPost]
|
||||||
|
[Route("API/SetUsed/{id}")]
|
||||||
|
[DisableFormValueModelBinding]
|
||||||
|
[ValidateAntiForgeryToken]
|
||||||
|
[FeatureGate(Features.UploadService, Features.AdminService)]
|
||||||
|
public async Task<IActionResult> SetUsed(string id) {
|
||||||
|
return Ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
[HttpPost]
|
||||||
|
[Route("API/SetUsedHamann")]
|
||||||
|
[DisableFormValueModelBinding]
|
||||||
|
[ValidateAntiForgeryToken]
|
||||||
|
[FeatureGate(Features.UploadService, Features.AdminService)]
|
||||||
|
public async Task<IActionResult> SetUsedHamann() {
|
||||||
return Ok();
|
return Ok();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -10,6 +10,7 @@ using HaWeb.Filters;
|
|||||||
using HaWeb.XMLParser;
|
using HaWeb.XMLParser;
|
||||||
using HaWeb.Models;
|
using HaWeb.Models;
|
||||||
using HaWeb.FileHelpers;
|
using HaWeb.FileHelpers;
|
||||||
|
using Microsoft.AspNetCore.Mvc.Rendering;
|
||||||
|
|
||||||
public class UploadController : Controller {
|
public class UploadController : Controller {
|
||||||
// DI
|
// DI
|
||||||
@@ -43,28 +44,56 @@ public class UploadController : Controller {
|
|||||||
[FeatureGate(Features.AdminService)]
|
[FeatureGate(Features.AdminService)]
|
||||||
[GenerateAntiforgeryTokenCookie]
|
[GenerateAntiforgeryTokenCookie]
|
||||||
public IActionResult Index(string? id) {
|
public IActionResult Index(string? id) {
|
||||||
|
var roots = _xmlService.GetRootsList();
|
||||||
|
if (roots == null) return error404();
|
||||||
|
|
||||||
|
var hF = _xmlProvider.GetHamannFiles();
|
||||||
|
List<(string, DateTime)>? hamannFiles = null;
|
||||||
|
if (hF != null)
|
||||||
|
hamannFiles = hF
|
||||||
|
.OrderByDescending(x => x.LastModified)
|
||||||
|
.Select(x => (x.Name, x.LastModified.LocalDateTime))
|
||||||
|
.ToList();
|
||||||
|
|
||||||
|
var uF = _xmlService.GetUsedDictionary();
|
||||||
|
var pF = _xmlService.GetInProduction();
|
||||||
|
|
||||||
|
Dictionary<string, List<FileModel>?>? usedFiles = null;
|
||||||
|
if (uF != null) {
|
||||||
|
usedFiles = new Dictionary<string, List<FileModel>?>();
|
||||||
|
foreach (var kv in uF) {
|
||||||
|
if (kv.Value == null) continue;
|
||||||
|
usedFiles.Add(kv.Key, XMLFileHelpers.ToFileModel(kv.Value, pF, uF));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Dictionary<string, List<FileModel>?>? productionFiles = null;
|
||||||
|
if (pF != null) {
|
||||||
|
productionFiles = new Dictionary<string, List<FileModel>?>();
|
||||||
|
foreach (var kv in pF) {
|
||||||
|
if (kv.Value == null) continue;
|
||||||
|
productionFiles.Add(kv.Key, XMLFileHelpers.ToFileModel(kv.Value, pF, uF));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (id != null) {
|
if (id != null) {
|
||||||
id = id.ToLower();
|
id = id.ToLower();
|
||||||
|
|
||||||
var root = _xmlService.GetRoot(id);
|
var root = _xmlService.GetRoot(id);
|
||||||
if (root == null) return error404();
|
if (root == null) return error404();
|
||||||
|
|
||||||
var roots = _xmlService.GetRootsList();
|
var model = new UploadViewModel(root.Type, id, roots, usedFiles);
|
||||||
if (roots == null) return error404();
|
model.ProductionFiles = productionFiles;
|
||||||
|
model.HamannFiles = hamannFiles;
|
||||||
var usedFiles = _xmlService.GetUsedDictionary();
|
model.AvailableFiles = XMLFileHelpers.ToFileModel(_xmlProvider.GetFiles(id), pF, uF);
|
||||||
var availableFiles = _xmlProvider.GetFiles(id);
|
|
||||||
|
|
||||||
var model = new UploadViewModel(root.Type, id, roots, availableFiles, usedFiles);
|
|
||||||
return View("../Admin/Upload/Index", model);
|
return View("../Admin/Upload/Index", model);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
var roots = _xmlService.GetRootsList();
|
var model = new UploadViewModel("Upload", id, roots, usedFiles);
|
||||||
if (roots == null) return error404();
|
model.ProductionFiles = productionFiles;
|
||||||
|
model.HamannFiles = hamannFiles;
|
||||||
|
|
||||||
var usedFiles = _xmlService.GetUsedDictionary();
|
|
||||||
|
|
||||||
var model = new UploadViewModel("Upload", id, roots, null, usedFiles);
|
|
||||||
return View("../Admin/Upload/Index", model);
|
return View("../Admin/Upload/Index", model);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,26 +1,43 @@
|
|||||||
namespace HaWeb.FileHelpers;
|
namespace HaWeb.FileHelpers;
|
||||||
using HaDocument.Interfaces;
|
using HaDocument.Interfaces;
|
||||||
using Microsoft.AspNetCore.Mvc.ModelBinding;
|
using Microsoft.AspNetCore.Mvc.ModelBinding;
|
||||||
|
using Microsoft.Extensions.FileProviders;
|
||||||
|
|
||||||
public class HaDocumentWrapper : IHaDocumentWrappper {
|
public class HaDocumentWrapper : IHaDocumentWrappper {
|
||||||
public ILibrary Library;
|
private ILibrary Library;
|
||||||
|
private IXMLProvider _xmlProvider;
|
||||||
|
|
||||||
|
private int _startYear;
|
||||||
|
private int _endYear;
|
||||||
|
|
||||||
|
public HaDocumentWrapper(IXMLProvider xmlProvider, IConfiguration configuration) {
|
||||||
|
_xmlProvider = xmlProvider;
|
||||||
|
|
||||||
|
_startYear = configuration.GetValue<int>("AvailableStartYear");
|
||||||
|
_endYear = configuration.GetValue<int>("AvailableEndYear");
|
||||||
|
|
||||||
|
var filelist = xmlProvider.GetHamannFiles();
|
||||||
|
if (filelist != null && filelist.Any())
|
||||||
|
_AutoLoad(filelist);
|
||||||
|
|
||||||
|
// Use Fallback library
|
||||||
|
if (Library == null)
|
||||||
|
Library = HaDocument.Document.Create(new HaWeb.Settings.HaDocumentOptions() { AvailableYearRange = (_startYear, _endYear) });
|
||||||
|
|
||||||
public HaDocumentWrapper() {
|
|
||||||
Library = HaDocument.Document.Create(new HaWeb.Settings.HaDocumentOptions());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public ILibrary SetLibrary() {
|
public ILibrary ResetLibrary() {
|
||||||
Library = HaDocument.Document.Create(new HaWeb.Settings.HaDocumentOptions());
|
Library = HaDocument.Document.Create(new HaWeb.Settings.HaDocumentOptions() { AvailableYearRange = (_startYear, _endYear) });
|
||||||
return Library;
|
return Library;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ILibrary? SetLibrary(string filepath, ModelStateDictionary ModelState) {
|
public ILibrary? SetLibrary(string filepath, ModelStateDictionary? ModelState = null) {
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
Library = HaDocument.Document.Create(new HaWeb.Settings.HaDocumentOptions() { HamannXMLFilePath = filepath });
|
Library = HaDocument.Document.Create(new HaWeb.Settings.HaDocumentOptions() { HamannXMLFilePath = filepath, AvailableYearRange = (_startYear, _endYear) });
|
||||||
}
|
}
|
||||||
catch (Exception ex) {
|
catch (Exception ex) {
|
||||||
ModelState.AddModelError("Error:", "Das Dokument konnte nicht geparst werden: " + ex.Message);
|
if (ModelState != null) ModelState.AddModelError("Error:", "Das Dokument konnte nicht geparst werden: " + ex.Message);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return Library;
|
return Library;
|
||||||
@@ -29,4 +46,11 @@ public class HaDocumentWrapper : IHaDocumentWrappper {
|
|||||||
public ILibrary GetLibrary() {
|
public ILibrary GetLibrary() {
|
||||||
return Library;
|
return Library;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void _AutoLoad(List<IFileInfo> files) {
|
||||||
|
var orderdlist = files.OrderByDescending(x => x.LastModified);
|
||||||
|
foreach(var item in orderdlist) {
|
||||||
|
if (SetLibrary(item.PhysicalPath) != null) return;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -3,7 +3,7 @@ using HaDocument.Interfaces;
|
|||||||
using Microsoft.AspNetCore.Mvc.ModelBinding;
|
using Microsoft.AspNetCore.Mvc.ModelBinding;
|
||||||
|
|
||||||
public interface IHaDocumentWrappper {
|
public interface IHaDocumentWrappper {
|
||||||
public ILibrary SetLibrary();
|
public ILibrary ResetLibrary();
|
||||||
public ILibrary? SetLibrary(string filepath, ModelStateDictionary ModelState);
|
public ILibrary? SetLibrary(string filepath, ModelStateDictionary ModelState);
|
||||||
public ILibrary GetLibrary();
|
public ILibrary GetLibrary();
|
||||||
}
|
}
|
||||||
@@ -9,4 +9,5 @@ public interface IXMLProvider {
|
|||||||
public FileList? GetFiles(string prefix);
|
public FileList? GetFiles(string prefix);
|
||||||
public Task Save(XMLRootDocument doc, string basefilepath, ModelStateDictionary ModelState);
|
public Task Save(XMLRootDocument doc, string basefilepath, ModelStateDictionary ModelState);
|
||||||
public Task<IFileInfo?> SaveHamannFile(XElement element, string basefilepath, ModelStateDictionary ModelState);
|
public Task<IFileInfo?> SaveHamannFile(XElement element, string basefilepath, ModelStateDictionary ModelState);
|
||||||
|
public List<IFileInfo>? GetHamannFiles();
|
||||||
}
|
}
|
||||||
@@ -11,6 +11,7 @@ using Microsoft.AspNetCore.Http;
|
|||||||
using Microsoft.AspNetCore.Mvc.ModelBinding;
|
using Microsoft.AspNetCore.Mvc.ModelBinding;
|
||||||
using Microsoft.AspNetCore.WebUtilities;
|
using Microsoft.AspNetCore.WebUtilities;
|
||||||
using Microsoft.Net.Http.Headers;
|
using Microsoft.Net.Http.Headers;
|
||||||
|
using HaWeb.Models;
|
||||||
|
|
||||||
public static class XMLFileHelpers {
|
public static class XMLFileHelpers {
|
||||||
// File Signatures Database (https://www.filesignatures.net/)
|
// File Signatures Database (https://www.filesignatures.net/)
|
||||||
@@ -139,6 +140,34 @@ public static class XMLFileHelpers {
|
|||||||
// return Array.Empty<byte>();
|
// return Array.Empty<byte>();
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
public static List<FileModel>? ToFileModel(FileList? fileList, Dictionary<string, FileList?>? productionFiles = null, Dictionary<string, FileList?>? usedFiles = null) {
|
||||||
|
if (fileList == null) return null;
|
||||||
|
var fL = fileList.GetFileList();
|
||||||
|
if (fL == null) return null;
|
||||||
|
var ret = new List<FileModel>();
|
||||||
|
foreach (var f in fL) {
|
||||||
|
if (f.File == null) continue;
|
||||||
|
ret.Add(ToFileModel(f, productionFiles, usedFiles));
|
||||||
|
};
|
||||||
|
return ret.OrderBy(x => x.LastModified).ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static FileModel ToFileModel(XMLRootDocument document, Dictionary<string, FileList?>? productionFiles = null, Dictionary<string, FileList?>? usedFiles = null) {
|
||||||
|
string id = document.Prefix;
|
||||||
|
|
||||||
|
bool inProduction = false;
|
||||||
|
if (productionFiles != null && productionFiles.ContainsKey(id)) {
|
||||||
|
inProduction = productionFiles[id]!.Contains(document);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isUsed = false;
|
||||||
|
if (usedFiles != null && usedFiles.ContainsKey(id)) {
|
||||||
|
isUsed = usedFiles[id]!.Contains(document);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new FileModel(document.FileName, document.Prefix, document.File.LastModified.LocalDateTime, isUsed, inProduction) { Fields = document.Fields };
|
||||||
|
}
|
||||||
|
|
||||||
public static async Task<byte[]?> ProcessStreamedFile(
|
public static async Task<byte[]?> ProcessStreamedFile(
|
||||||
MultipartSection section, ContentDispositionHeaderValue contentDisposition,
|
MultipartSection section, ContentDispositionHeaderValue contentDisposition,
|
||||||
ModelStateDictionary modelState, string[] permittedExtensions, long sizeLimit) {
|
ModelStateDictionary modelState, string[] permittedExtensions, long sizeLimit) {
|
||||||
|
|||||||
@@ -10,11 +10,13 @@ public class XMLProvider : IXMLProvider {
|
|||||||
private Dictionary<string, FileList?>? _Files;
|
private Dictionary<string, FileList?>? _Files;
|
||||||
private Dictionary<string, IXMLRoot>? _Roots;
|
private Dictionary<string, IXMLRoot>? _Roots;
|
||||||
private List<IFileInfo>? _HamannFiles;
|
private List<IFileInfo>? _HamannFiles;
|
||||||
|
private IFileInfo? _InProduction;
|
||||||
|
|
||||||
public XMLProvider(IFileProvider provider, IXMLService xmlservice) {
|
public XMLProvider(IFileProvider provider, IXMLService xmlservice) {
|
||||||
_fileProvider = provider;
|
_fileProvider = provider;
|
||||||
_Roots = xmlservice.GetRootsDictionary();
|
_Roots = xmlservice.GetRootsDictionary();
|
||||||
_Files = _ScanFiles();
|
_Files = _ScanFiles();
|
||||||
|
_HamannFiles = _ScanHamannFiles();
|
||||||
|
|
||||||
if (_Files != null)
|
if (_Files != null)
|
||||||
foreach(var category in _Files)
|
foreach(var category in _Files)
|
||||||
@@ -22,6 +24,8 @@ public class XMLProvider : IXMLProvider {
|
|||||||
xmlservice.AutoUse(category.Value);
|
xmlservice.AutoUse(category.Value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<IFileInfo>? GetHamannFiles() => this._HamannFiles;
|
||||||
|
|
||||||
public FileList? GetFiles(string prefix)
|
public FileList? GetFiles(string prefix)
|
||||||
=> _Files != null && _Files.ContainsKey(prefix) ? _Files[prefix] : null;
|
=> _Files != null && _Files.ContainsKey(prefix) ? _Files[prefix] : null;
|
||||||
|
|
||||||
@@ -80,7 +84,7 @@ public class XMLProvider : IXMLProvider {
|
|||||||
|
|
||||||
if (_HamannFiles == null) _HamannFiles = new List<IFileInfo>();
|
if (_HamannFiles == null) _HamannFiles = new List<IFileInfo>();
|
||||||
_HamannFiles.Add(info);
|
_HamannFiles.Add(info);
|
||||||
|
_InProduction = info;
|
||||||
return info;
|
return info;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -110,4 +114,12 @@ public class XMLProvider : IXMLProvider {
|
|||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private List<IFileInfo>? _ScanHamannFiles() {
|
||||||
|
var dir = _fileProvider.GetDirectoryContents(string.Empty).Where(x => x.IsDirectory && x.Name == "hamann");
|
||||||
|
if (dir == null || !dir.Any()) return null;
|
||||||
|
var files = _fileProvider.GetDirectoryContents(dir.First().Name).Where(x => !x.IsDirectory && x.Name.StartsWith("hamann") && x.Name.EndsWith(".xml"));
|
||||||
|
if (files == null || !files.Any()) return null;
|
||||||
|
return files.ToList();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -20,6 +20,19 @@ public class FileList {
|
|||||||
if (!_Files.Contains(document)) _Files.Add(document);
|
if (!_Files.Contains(document)) _Files.Add(document);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool Contains(XMLRootDocument doc) {
|
||||||
|
if (_Files == null) return false;
|
||||||
|
return _Files.Contains(doc);
|
||||||
|
}
|
||||||
|
|
||||||
public List<XMLRootDocument>? GetFileList()
|
public List<XMLRootDocument>? GetFileList()
|
||||||
=> this._Files != null ? this._Files.ToList() : null;
|
=> this._Files != null ? this._Files.ToList() : null;
|
||||||
|
|
||||||
|
public FileList Clone() {
|
||||||
|
var ret = new FileList(this.XMLRoot);
|
||||||
|
foreach (var file in _Files) {
|
||||||
|
ret.Add(file);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
17
HaWeb/Models/FileModel.cs
Normal file
17
HaWeb/Models/FileModel.cs
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
namespace HaWeb.Models;
|
||||||
|
|
||||||
|
public class FileModel {
|
||||||
|
public string FileName { get; private set; }
|
||||||
|
public string Prefix { get; private set; }
|
||||||
|
public DateTime LastModified { get; private set; }
|
||||||
|
public bool IsUsed { get; private set; }
|
||||||
|
public bool InProduction { get; private set; }
|
||||||
|
public List<(string, string?)>? Fields { get; set; }
|
||||||
|
|
||||||
|
public FileModel(string name, string prefix, DateTime lastModified, bool isUSed, bool inProduction) {
|
||||||
|
FileName = name;
|
||||||
|
IsUsed = IsUsed;
|
||||||
|
LastModified = lastModified;
|
||||||
|
InProduction = InProduction;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,19 +1,22 @@
|
|||||||
namespace HaWeb.Models;
|
namespace HaWeb.Models;
|
||||||
using HaWeb.XMLParser;
|
using HaWeb.XMLParser;
|
||||||
|
using Microsoft.Extensions.FileProviders;
|
||||||
|
using Microsoft.AspNetCore.Mvc.Rendering;
|
||||||
|
|
||||||
public class UploadViewModel {
|
public class UploadViewModel {
|
||||||
public string ActiveTitle { get; private set; }
|
public string ActiveTitle { get; private set; }
|
||||||
public string? Prefix { get; private set; }
|
public string? Prefix { get; private set; }
|
||||||
public List<IXMLRoot>? AvailableRoots { get; private set; }
|
public List<IXMLRoot>? AvailableRoots { get; private set; }
|
||||||
public FileList? AvailableFiles { get; private set; }
|
public List<FileModel>? AvailableFiles { get; set; }
|
||||||
public Dictionary<string, FileList>? UsedFiles { get; private set; }
|
public Dictionary<string, List<FileModel>?>? UsedFiles { get; private set; }
|
||||||
|
public Dictionary<string, List<FileModel>?>? ProductionFiles { get; set; }
|
||||||
|
|
||||||
|
public List<(string, DateTime)>? HamannFiles { get; set; }
|
||||||
|
|
||||||
public UploadViewModel(string title, string? prefix, List<IXMLRoot>? roots, FileList? availableFiles, Dictionary<string, FileList>? usedFiles) {
|
public UploadViewModel(string title, string? prefix, List<IXMLRoot>? roots, Dictionary<string, List<FileModel>?>? usedFiles) {
|
||||||
Prefix = prefix;
|
Prefix = prefix;
|
||||||
ActiveTitle = title;
|
ActiveTitle = title;
|
||||||
AvailableRoots = roots;
|
AvailableRoots = roots;
|
||||||
AvailableFiles = availableFiles;
|
|
||||||
UsedFiles = usedFiles;
|
UsedFiles = usedFiles;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -44,6 +44,6 @@ TODO pills are not mobile friendly (hover / click)
|
|||||||
TODO Evtl alignment von center / right an der letzten oder nächsten zeile
|
TODO Evtl alignment von center / right an der letzten oder nächsten zeile
|
||||||
TODO Abhärten des Konstruktors von XMLRootDokument für von außerhalb platzierte Dokumente
|
TODO Abhärten des Konstruktors von XMLRootDokument für von außerhalb platzierte Dokumente
|
||||||
TODO XML-Check im Client
|
TODO XML-Check im Client
|
||||||
TODO Lock für die Liste
|
TODO Lock für die Liste, Bzw ConcurretBag
|
||||||
TODO Up-Button
|
TODO Up-Button
|
||||||
TODO Neue Forschungsliteratur einsenden
|
TODO Neue Forschungsliteratur einsenden
|
||||||
@@ -1,13 +1,13 @@
|
|||||||
@model UploadViewModel?;
|
@model UploadViewModel;
|
||||||
|
|
||||||
<div class="ha-adminuploadfields" id="ha-adminuploadfields">
|
<div class="ha-adminuploadfields" id="ha-adminuploadfields">
|
||||||
@foreach (var item in Model.AvailableRoots.OrderBy(x => x.Type)) {
|
@foreach (var item in Model.AvailableRoots!.OrderBy(x => x.Type)) {
|
||||||
<a class="ha-uploadfield" asp-controller="Upload" asp-action="Index" asp-route-id="@item.Prefix">
|
<a class="ha-uploadfield" asp-controller="Upload" asp-action="Index" asp-route-id="@item.Prefix">
|
||||||
<div class="ha-uploadfieldname">@item.Type</div>
|
<div class="ha-uploadfieldname">@item.Type</div>
|
||||||
@if (Model.UsedFiles != null && Model.UsedFiles.ContainsKey(item.Prefix)) {
|
@if (Model.UsedFiles != null && Model.UsedFiles.ContainsKey(item.Prefix)) {
|
||||||
<div class="ha-uploadusedfiles">
|
<div class="ha-uploadusedfiles">
|
||||||
@foreach(var file in Model.UsedFiles[item.Prefix].GetFileList()!) {
|
@foreach(var file in Model.UsedFiles[item.Prefix]!) {
|
||||||
@if (file == Model.UsedFiles[item.Prefix].GetFileList()!.Last())
|
@if (file == Model.UsedFiles[item.Prefix]!.Last())
|
||||||
{
|
{
|
||||||
<span class="ha-uploadusedfile">@file.FileName</span>
|
<span class="ha-uploadusedfile">@file.FileName</span>
|
||||||
}
|
}
|
||||||
@@ -38,7 +38,7 @@
|
|||||||
|
|
||||||
<form class="ha-publishform" id="ha-publishform" asp-controller="API" asp-action="LocalPublish" method="post" enctype="multipart/form-data">
|
<form class="ha-publishform" id="ha-publishform" asp-controller="API" asp-action="LocalPublish" method="post" enctype="multipart/form-data">
|
||||||
<label class="ha-publishfilelabel" id="ha-publishfilelabel">
|
<label class="ha-publishfilelabel" id="ha-publishfilelabel">
|
||||||
Veröffentlichen
|
<div class="ha-publishtext">Veröffentlichen</div>
|
||||||
<div class="ha-lds-ellipsis" id="ha-lds-ellipsis-publish"><div></div><div></div><div></div><div></div></div>
|
<div class="ha-lds-ellipsis" id="ha-lds-ellipsis-publish"><div></div><div></div><div></div><div></div></div>
|
||||||
</label>
|
</label>
|
||||||
<div class="ha-publishmessage" id="ha-publishmessage">
|
<div class="ha-publishmessage" id="ha-publishmessage">
|
||||||
@@ -56,9 +56,9 @@
|
|||||||
<div class="ha-usedfilesheader">
|
<div class="ha-usedfilesheader">
|
||||||
<div class="ha-usedfilesheaderlist">
|
<div class="ha-usedfilesheaderlist">
|
||||||
@if(Model.UsedFiles != null && Model.UsedFiles.ContainsKey(Model.Prefix)) {
|
@if(Model.UsedFiles != null && Model.UsedFiles.ContainsKey(Model.Prefix)) {
|
||||||
@foreach (var item in Model.UsedFiles[Model.Prefix].GetFileList())
|
@foreach (var item in Model.UsedFiles[Model.Prefix]!)
|
||||||
{
|
{
|
||||||
<div class="ha-usedfilesheaderfile">@item.File.Name</div>
|
<div class="ha-usedfilesheaderfile">@item.FileName</div>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -88,6 +88,11 @@
|
|||||||
|
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
<form class="ha-selecthamannfilesform" id="selecthamannfilesform" asp-controller="API" asp-action="SetUsedHamann" method="post" enctype="multipart/form-data">
|
||||||
|
|
||||||
|
</form>
|
||||||
|
}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@section Scripts {
|
@section Scripts {
|
||||||
@@ -121,6 +126,8 @@
|
|||||||
|
|
||||||
const LOCALPUBLISHSubmit = async function (oFormElement) {
|
const LOCALPUBLISHSubmit = async function (oFormElement) {
|
||||||
var fd = new FormData();
|
var fd = new FormData();
|
||||||
|
document.getElementById("ha-publishfilelabel").style.pointerEvents = "none";
|
||||||
|
document.getElementById("ha-lds-ellipsis-publish").style.display = "inline-block";
|
||||||
document.getElementById("ha-publishmessage").style.opacity = "0";
|
document.getElementById("ha-publishmessage").style.opacity = "0";
|
||||||
await fetch(oFormElement.action, {
|
await fetch(oFormElement.action, {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
@@ -131,19 +138,29 @@
|
|||||||
.then(response => response.json())
|
.then(response => response.json())
|
||||||
.then(json => {
|
.then(json => {
|
||||||
if ("Error" in json) {
|
if ("Error" in json) {
|
||||||
|
document.getElementById("ha-publishfilelabel").style.pointerEvents = "auto";
|
||||||
|
document.getElementById("ha-lds-ellipsis-publish").style.display = "none";
|
||||||
document.getElementById("ha-publishmessage").style.opacity = "1";
|
document.getElementById("ha-publishmessage").style.opacity = "1";
|
||||||
oFormElement.elements.namedItem("update-result").value = json.Error;
|
oFormElement.elements.namedItem("update-result").value = json.Error;
|
||||||
} else {
|
} else {
|
||||||
|
document.getElementById("ha-publishfilelabel").style.pointerEvents = "auto";
|
||||||
|
document.getElementById("ha-lds-ellipsis-publish").style.display = "none";
|
||||||
|
document.getElementById("ha-publishmessage").style.opacity = "1";
|
||||||
oFormElement.elements.namedItem("update-result").value = "Erfolg!";
|
oFormElement.elements.namedItem("update-result").value = "Erfolg!";
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.catch ((e) => console.log('Error:', e))
|
.catch ((e) => {
|
||||||
|
document.getElementById("ha-publishfilelabel").style.pointerEvents = "auto";
|
||||||
|
document.getElementById("ha-lds-ellipsis-publish").style.display = "none";
|
||||||
|
console.log('Error:', e);
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
const UPLOADSubmit = async function (oFormElement, file = null) {
|
const UPLOADSubmit = async function (oFormElement, file = null) {
|
||||||
var fd = new FormData();
|
var fd = new FormData();
|
||||||
if (file !== null) fd.append("file", file);
|
if (file !== null) fd.append("file", file);
|
||||||
else fd = new FormData(oFormElement);
|
else fd = new FormData(oFormElement);
|
||||||
|
document.getElementById("dropzone").style.pointerEvents = "none";
|
||||||
document.getElementById("ha-lds-ellipsis").style.display = "inline-block";
|
document.getElementById("ha-lds-ellipsis").style.display = "inline-block";
|
||||||
document.getElementById("ha-uploadmessage").style.opacity = "0";
|
document.getElementById("ha-uploadmessage").style.opacity = "0";
|
||||||
await fetch(oFormElement.action, {
|
await fetch(oFormElement.action, {
|
||||||
@@ -156,18 +173,27 @@
|
|||||||
.then(response => response.json())
|
.then(response => response.json())
|
||||||
.then(json => {
|
.then(json => {
|
||||||
if ("Error" in json) {
|
if ("Error" in json) {
|
||||||
|
document.getElementById("dropzone").style.pointerEvents = "auto";
|
||||||
document.getElementById("ha-lds-ellipsis").style.display = "none";
|
document.getElementById("ha-lds-ellipsis").style.display = "none";
|
||||||
document.getElementById("ha-uploadmessage").style.opacity = "1";
|
document.getElementById("ha-uploadmessage").style.opacity = "1";
|
||||||
oFormElement.elements.namedItem("upload-result").value = json.Error;
|
oFormElement.elements.namedItem("upload-result").value = json.Error;
|
||||||
} else {
|
} else {
|
||||||
|
document.getElementById("dropzone").style.pointerEvents = "auto";
|
||||||
document.getElementById("ha-lds-ellipsis").style.display = "none";
|
document.getElementById("ha-lds-ellipsis").style.display = "none";
|
||||||
oFormElement.elements.namedItem("upload-result").value = "Erfolg!";
|
oFormElement.elements.namedItem("upload-result").value = "Erfolg!";
|
||||||
if ("Prefix" in json[0]) {
|
if ("Prefix" in json[0]) {
|
||||||
|
document.getElementById("dropzone").style.pointerEvents = "auto";
|
||||||
|
document.getElementById("ha-lds-ellipsis").style.display = "none";
|
||||||
window.location.replace("/Admin/Upload/" + json[0].Prefix);
|
window.location.replace("/Admin/Upload/" + json[0].Prefix);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.catch ((e) => console.log('Error:', e))
|
.catch ((e) => {
|
||||||
|
document.getElementById("dropzone").style.pointerEvents = "auto";
|
||||||
|
document.getElementById("ha-lds-ellipsis").style.display = "none";
|
||||||
|
document.getElementById("ha-uploadmessage").style.opacity = "1";
|
||||||
|
oFormElement.elements.namedItem("upload-result").value = "Keine Antwort. Bitte Seite neu laden!";
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
function getCookie(name) {
|
function getCookie(name) {
|
||||||
|
|||||||
@@ -13,4 +13,5 @@ public interface IXMLService {
|
|||||||
public void Use(XMLRootDocument doc);
|
public void Use(XMLRootDocument doc);
|
||||||
public void AutoUse(string prefix);
|
public void AutoUse(string prefix);
|
||||||
public void AutoUse(FileList filelist);
|
public void AutoUse(FileList filelist);
|
||||||
|
public Dictionary<string, FileList?>? GetInProduction();
|
||||||
}
|
}
|
||||||
@@ -7,6 +7,8 @@ public class XMLService : IXMLService {
|
|||||||
private Dictionary<string, FileList?>? _Used;
|
private Dictionary<string, FileList?>? _Used;
|
||||||
private Dictionary<string, IXMLRoot>? _Roots;
|
private Dictionary<string, IXMLRoot>? _Roots;
|
||||||
|
|
||||||
|
private Dictionary<string, FileList?>? _InProduction;
|
||||||
|
|
||||||
public XMLService() {
|
public XMLService() {
|
||||||
// Getting all classes which implement IXMLRoot for possible document endpoints
|
// Getting all classes which implement IXMLRoot for possible document endpoints
|
||||||
var types = _GetAllTypesThatImplementInterface<IXMLRoot>().ToList();
|
var types = _GetAllTypesThatImplementInterface<IXMLRoot>().ToList();
|
||||||
@@ -30,6 +32,8 @@ public class XMLService : IXMLService {
|
|||||||
|
|
||||||
public Dictionary<string, IXMLRoot>? GetRootsDictionary() => this._Roots == null ? null : this._Roots;
|
public Dictionary<string, IXMLRoot>? GetRootsDictionary() => this._Roots == null ? null : this._Roots;
|
||||||
|
|
||||||
|
public Dictionary<string, FileList?>? GetInProduction() => this._InProduction;
|
||||||
|
|
||||||
public List<XMLRootDocument>? ProbeHamannFile(XDocument document, ModelStateDictionary ModelState) {
|
public List<XMLRootDocument>? ProbeHamannFile(XDocument document, ModelStateDictionary ModelState) {
|
||||||
if (document.Root!.Name != "opus") {
|
if (document.Root!.Name != "opus") {
|
||||||
ModelState.AddModelError("Error", "A valid Hamann-Docuemnt must begin with <opus>");
|
ModelState.AddModelError("Error", "A valid Hamann-Docuemnt must begin with <opus>");
|
||||||
@@ -93,17 +97,20 @@ public class XMLService : IXMLService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var opus = new XElement("opus");
|
var opus = new XElement("opus");
|
||||||
|
var inProduction = new Dictionary<string, FileList?>();
|
||||||
foreach (var category in _Used) {
|
foreach (var category in _Used) {
|
||||||
if (category.Value == null || category.Value.GetFileList() == null || !category.Value.GetFileList()!.Any()) {
|
if (category.Value == null || category.Value.GetFileList() == null || !category.Value.GetFileList()!.Any()) {
|
||||||
ModelState.AddModelError("Error", _Roots![category.Key].Type + " nicht vorhanden.");
|
ModelState.AddModelError("Error", _Roots![category.Key].Type + " nicht vorhanden.");
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
inProduction.Add(category.Key, category.Value);
|
||||||
var documents = category.Value.GetFileList();
|
var documents = category.Value.GetFileList();
|
||||||
foreach (var document in documents!) {
|
foreach (var document in documents!) {
|
||||||
document.XMLRoot.MergeIntoFile(opus, document);
|
document.XMLRoot.MergeIntoFile(opus, document);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_InProduction = inProduction;
|
||||||
return opus;
|
return opus;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -15,5 +15,7 @@
|
|||||||
"AllowedHosts": "*",
|
"AllowedHosts": "*",
|
||||||
"StoredFilePathLinux": "/home/simon/Downloads/test/",
|
"StoredFilePathLinux": "/home/simon/Downloads/test/",
|
||||||
"StoredFilePathWindows": "D:/test/",
|
"StoredFilePathWindows": "D:/test/",
|
||||||
"FileSizeLimit": 52428800
|
"FileSizeLimit": 52428800,
|
||||||
|
"AvailableStartYear": 1700,
|
||||||
|
"AvailableEndYear": 1800
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -900,7 +900,7 @@ body {
|
|||||||
.ha-letterheader .ha-lettermetalinks {
|
.ha-letterheader .ha-lettermetalinks {
|
||||||
border-bottom-width: 2px;
|
border-bottom-width: 2px;
|
||||||
--tw-border-opacity: 1;
|
--tw-border-opacity: 1;
|
||||||
border-color: rgb(226 232 240 / var(--tw-border-opacity));
|
border-color: rgb(203 213 225 / var(--tw-border-opacity));
|
||||||
}
|
}
|
||||||
|
|
||||||
.ha-letterheader .ha-lettermetalinks a {
|
.ha-letterheader .ha-lettermetalinks a {
|
||||||
@@ -1943,6 +1943,11 @@ body {
|
|||||||
padding-top: 0.5rem;
|
padding-top: 0.5rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.ha-adminuploadfields .ha-uploadform .ha-uploadfilelabel:hover {
|
||||||
|
--tw-bg-opacity: 1;
|
||||||
|
background-color: rgb(241 245 249 / var(--tw-bg-opacity));
|
||||||
|
}
|
||||||
|
|
||||||
.ha-adminuploadfields .ha-uploadform .ha-uploadmessage {
|
.ha-adminuploadfields .ha-uploadform .ha-uploadmessage {
|
||||||
border-radius: 0.125rem;
|
border-radius: 0.125rem;
|
||||||
background-color: rgb(51 65 85 / var(--tw-bg-opacity));
|
background-color: rgb(51 65 85 / var(--tw-bg-opacity));
|
||||||
@@ -1980,6 +1985,15 @@ body {
|
|||||||
padding-top: 0.5rem;
|
padding-top: 0.5rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.ha-adminuploadfields .ha-publishform .ha-publishfilelabel:hover {
|
||||||
|
--tw-bg-opacity: 1;
|
||||||
|
background-color: rgb(241 245 249 / var(--tw-bg-opacity));
|
||||||
|
}
|
||||||
|
|
||||||
|
.ha-adminuploadfields .ha-publishform .ha-publishtext {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
.ha-adminuploadfields .ha-publishform .ha-publishmessage {
|
.ha-adminuploadfields .ha-publishform .ha-publishmessage {
|
||||||
border-radius: 0.125rem;
|
border-radius: 0.125rem;
|
||||||
background-color: rgb(51 65 85 / var(--tw-bg-opacity));
|
background-color: rgb(51 65 85 / var(--tw-bg-opacity));
|
||||||
@@ -2674,8 +2688,8 @@ body {
|
|||||||
|
|
||||||
.ha-added, .ha-added *:not(.ha-linecount *, .ha-linecount, .ha-marginalbox *, .ha-marginalbox, .ha-marginal, .ha-marginal *, .ha-btn-collapsed-box) {
|
.ha-added, .ha-added *:not(.ha-linecount *, .ha-linecount, .ha-marginalbox *, .ha-marginalbox, .ha-marginal, .ha-marginal *, .ha-btn-collapsed-box) {
|
||||||
border-radius: 0.125rem;
|
border-radius: 0.125rem;
|
||||||
padding-left: 0.25rem;
|
padding-left: 0.125rem;
|
||||||
padding-right: 0.25rem;
|
padding-right: 0.125rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.ha-note, .ha-note *:not(.ha-linecount *, .ha-linecount, .ha-marginalbox *, .ha-marginalbox, .ha-marginal, .ha-marginal *, .ha-btn-collapsed-box) {
|
.ha-note, .ha-note *:not(.ha-linecount *, .ha-linecount, .ha-marginalbox *, .ha-marginalbox, .ha-marginal, .ha-marginal *, .ha-btn-collapsed-box) {
|
||||||
|
|||||||
@@ -229,7 +229,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.ha-letterheader .ha-lettermetalinks {
|
.ha-letterheader .ha-lettermetalinks {
|
||||||
@apply border-b-2 border-slate-200
|
@apply border-b-2 border-slate-300
|
||||||
}
|
}
|
||||||
|
|
||||||
.ha-letterheader .ha-lettermetalinks a {
|
.ha-letterheader .ha-lettermetalinks a {
|
||||||
@@ -698,7 +698,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.ha-adminuploadfields .ha-uploadform {
|
.ha-adminuploadfields .ha-uploadform {
|
||||||
@apply bg-slate-50 rounded shadow grow relative
|
@apply bg-slate-50 rounded shadow grow relative
|
||||||
}
|
}
|
||||||
|
|
||||||
.ha-adminuploadfields .ha-uploadform .ha-uploadtext {
|
.ha-adminuploadfields .ha-uploadform .ha-uploadtext {
|
||||||
@@ -710,7 +710,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.ha-adminuploadfields .ha-uploadform .ha-uploadfilelabel {
|
.ha-adminuploadfields .ha-uploadform .ha-uploadfilelabel {
|
||||||
@apply inline-block px-2 py-1 pt-2 cursor-pointer w-full h-full
|
@apply inline-block px-2 py-1 pt-2 cursor-pointer w-full h-full hover:bg-slate-100
|
||||||
}
|
}
|
||||||
|
|
||||||
.ha-adminuploadfields .ha-uploadform .ha-uploadmessage {
|
.ha-adminuploadfields .ha-uploadform .ha-uploadmessage {
|
||||||
@@ -726,7 +726,11 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.ha-adminuploadfields .ha-publishform .ha-publishfilelabel {
|
.ha-adminuploadfields .ha-publishform .ha-publishfilelabel {
|
||||||
@apply inline-block px-2 py-1 pt-2 cursor-pointer w-full h-full
|
@apply inline-block px-2 py-1 pt-2 cursor-pointer w-full h-full hover:bg-slate-100
|
||||||
|
}
|
||||||
|
|
||||||
|
.ha-adminuploadfields .ha-publishform .ha-publishtext {
|
||||||
|
@apply text-center
|
||||||
}
|
}
|
||||||
|
|
||||||
.ha-adminuploadfields .ha-publishform .ha-publishmessage {
|
.ha-adminuploadfields .ha-publishform .ha-publishmessage {
|
||||||
@@ -1107,7 +1111,7 @@
|
|||||||
|
|
||||||
.ha-added,
|
.ha-added,
|
||||||
.ha-added *:not(.ha-linecount *, .ha-linecount, .ha-marginalbox *, .ha-marginalbox, .ha-marginal, .ha-marginal *, .ha-btn-collapsed-box) {
|
.ha-added *:not(.ha-linecount *, .ha-linecount, .ha-marginalbox *, .ha-marginalbox, .ha-marginal, .ha-marginal *, .ha-btn-collapsed-box) {
|
||||||
@apply px-1 rounded-sm
|
@apply px-0.5 rounded-sm
|
||||||
}
|
}
|
||||||
|
|
||||||
.ha-note,
|
.ha-note,
|
||||||
|
|||||||
Reference in New Issue
Block a user