mirror of
https://github.com/aljazceru/btcpayserver.git
synced 2026-01-01 21:24:21 +01:00
* wip * Cleanups * UI updates * Update UIFormsController.cs * Make predefined forms usable statically * Add support for pos app + forms * pay request form rough support * invoice form through receipt page * Display form name in inherit from store setting * Do not request additional forms on invoice from pay request * fix up code * move checkoutform id in checkout appearance outside of checkotu v2 toggle * general fixes for form system * fix pav bug * UI updates * Fix warnings in Form builder (#4331) * Fix build warnings about string? Enable nullable on UIFormsController.cs Fixes CS8632 The annotation for nullable reference types should only be used in code within a '#nullable' annotations context. * Clean up lack of space in injected services in Submit() of UIFormsController.cs * Remove unused variables (CS0219) and assignment of nullable value to nullable type (CS8600) * Cleanup double semicolons while we're at tit * Fix: If reverse proxy wasn't well configured, and error message should have been displayed (#4322) * fix monero issue * Server Settings: Update Policies page (#4326) Handles the multiple submit buttons on that page and closes #4319. Contains some UI unifications with other pages and also shows the block explorers without needing to toggle the section via JS. * Change confirmed to settled. (#4328) * POS: Fix null pointer Introduced in #4307, the referenced object needs to be `itemChoice` instead of `choice`. * Add documentation link to plugins (#4329) * Add documentation link to plugins * Minor UI updates Co-authored-by: Dennis Reimann <mail@dennisreimann.de> * Fix flaky test (#4330) * Fix flaky test * Update BTCPayServer/PayoutProcessors/BaseAutomatedPayoutProcessor.cs Co-authored-by: d11n <mail@dennisreimann.de> Co-authored-by: d11n <mail@dennisreimann.de> * Remove invoice and store level form * add form test * fix migration for forms * fix * make pay request form submission redirect to invoice * Refactor FormQuery to only be able to query single store and single form * Put the Authorize at controller level on UIForms * Fix warnings * Fix ef request * Fix query to forms, ensure no permission bypass * Fix modify * Remove storeId from step form * Remove useless storeId parameter * Hide custom form feature in UI * Minor cleanups * Remove custom form options from select for now * More minor syntax cleanups * Update test * Add index - needs migration * Refactoring: Use PostRedirect instead of TempData for data transfer * Remove untested and unfinished code * formResponse should be a JObject, not a string * Fix case for Form type Co-authored-by: Dennis Reimann <mail@dennisreimann.de> Co-authored-by: JesterHodl <103882255+jesterhodl@users.noreply.github.com> Co-authored-by: Nicolas Dorier <nicolas.dorier@gmail.com> Co-authored-by: Andreas Tasch <andy.tasch@gmail.com>
155 lines
4.4 KiB
C#
155 lines
4.4 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using Microsoft.AspNetCore.Http;
|
|
using Newtonsoft.Json.Linq;
|
|
|
|
namespace BTCPayServer.Abstractions.Form;
|
|
|
|
public class Form
|
|
{
|
|
#nullable enable
|
|
public static Form Parse(string str)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(str);
|
|
return JObject.Parse(str).ToObject<Form>(CamelCaseSerializerSettings.Serializer) ?? throw new InvalidOperationException("Impossible to deserialize Form");
|
|
}
|
|
public override string ToString()
|
|
{
|
|
return JObject.FromObject(this, CamelCaseSerializerSettings.Serializer).ToString(Newtonsoft.Json.Formatting.Indented);
|
|
}
|
|
#nullable restore
|
|
// Messages to be shown at the top of the form indicating user feedback like "Saved successfully" or "Please change X because of Y." or a warning, etc...
|
|
public List<AlertMessage> TopMessages { get; set; } = new();
|
|
|
|
// Groups of fields in the form
|
|
public List<Field> Fields { get; set; } = new();
|
|
|
|
// Are all the fields valid in the form?
|
|
public bool IsValid()
|
|
{
|
|
return Fields.All(field => field.IsValid());
|
|
}
|
|
|
|
public Field GetFieldByName(string name)
|
|
{
|
|
return GetFieldByName(name, Fields, null);
|
|
}
|
|
|
|
private static Field GetFieldByName(string name, List<Field> fields, string prefix)
|
|
{
|
|
prefix ??= string.Empty;
|
|
foreach (var field in fields)
|
|
{
|
|
var currentPrefix = prefix;
|
|
if (!string.IsNullOrEmpty(field.Name))
|
|
{
|
|
|
|
currentPrefix = $"{prefix}{field.Name}";
|
|
if (currentPrefix.Equals(name, StringComparison.InvariantCultureIgnoreCase))
|
|
{
|
|
return field;
|
|
}
|
|
|
|
currentPrefix += "_";
|
|
}
|
|
|
|
var subFieldResult = GetFieldByName(name, field.Fields, currentPrefix);
|
|
if (subFieldResult is not null)
|
|
{
|
|
return subFieldResult;
|
|
}
|
|
|
|
}
|
|
return null;
|
|
}
|
|
public List<string> GetAllNames()
|
|
{
|
|
return GetAllNames(Fields);
|
|
}
|
|
|
|
private static List<string> GetAllNames(List<Field> fields)
|
|
{
|
|
var names = new List<string>();
|
|
|
|
foreach (var field in fields)
|
|
{
|
|
string prefix = string.Empty;
|
|
if (!string.IsNullOrEmpty(field.Name))
|
|
{
|
|
names.Add(field.Name);
|
|
prefix = $"{field.Name}_";
|
|
}
|
|
|
|
if (field.Fields.Any())
|
|
{
|
|
names.AddRange(GetAllNames(field.Fields).Select(s => $"{prefix}{s}" ));
|
|
}
|
|
}
|
|
|
|
return names;
|
|
}
|
|
|
|
public void ApplyValuesFromOtherForm(Form form)
|
|
{
|
|
foreach (var fieldset in Fields)
|
|
{
|
|
foreach (var field in fieldset.Fields)
|
|
{
|
|
field.Value = form
|
|
.GetFieldByName(
|
|
$"{(string.IsNullOrEmpty(fieldset.Name) ? string.Empty : fieldset.Name + "_")}{field.Name}")
|
|
?.Value;
|
|
}
|
|
}
|
|
}
|
|
|
|
public void ApplyValuesFromForm(IFormCollection form)
|
|
{
|
|
var names = GetAllNames();
|
|
foreach (var name in names)
|
|
{
|
|
var field = GetFieldByName(name);
|
|
if (field is null || !form.TryGetValue(name, out var val))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
field.Value = val;
|
|
}
|
|
}
|
|
|
|
public Dictionary<string, object> GetValues()
|
|
{
|
|
return GetValues(Fields);
|
|
}
|
|
|
|
private static Dictionary<string, object> GetValues(List<Field> fields)
|
|
{
|
|
var result = new Dictionary<string, object>();
|
|
foreach (Field field in fields)
|
|
{
|
|
var name = field.Name ?? string.Empty;
|
|
if (field.Fields.Any())
|
|
{
|
|
var values = GetValues(fields);
|
|
values.Remove(string.Empty, out var keylessValue);
|
|
|
|
result.TryAdd(name, values);
|
|
|
|
if (keylessValue is not Dictionary<string, object> dict) continue;
|
|
foreach (KeyValuePair<string,object> keyValuePair in dict)
|
|
{
|
|
result.TryAdd(keyValuePair.Key, keyValuePair.Value);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
result.TryAdd(name, field.Value);
|
|
}
|
|
}
|
|
|
|
return result;
|
|
}
|
|
}
|