Skip to content

Commit

Permalink
New: (Cardigann) Add multi-select type for settings
Browse files Browse the repository at this point in the history
  • Loading branch information
mynameisbogdan committed Nov 25, 2023
1 parent c19802c commit 466f358
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 2 deletions.
17 changes: 17 additions & 0 deletions src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -336,6 +336,23 @@ protected string HandleJsonSelector(SelectorBlock selector, JToken parentObj, Di

variables[name] = selected.Key;
break;
case "multi-select":
if (indexerLogging)
{
_logger.Trace($"Setting options: {setting.Options.ToJson()}");
}

var sortedMulti = setting.Options.OrderBy(x => x.Key).ToList();
var values = (long[])value;
var selectedMulti = sortedMulti.Where((x, i) => values.Contains(i)).ToArray();

if (indexerLogging)
{
_logger.Debug($"Selected option: {selectedMulti.ToJson()}");
}

variables[name] = selectedMulti.Select(x => x.Key).ToArray();
break;
case "info":
variables[name] = value;
break;
Expand Down
31 changes: 29 additions & 2 deletions src/Prowlarr.Api.V1/Indexers/IndexerResource.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.Json;
using NzbDrone.Common.Extensions;
using NzbDrone.Core.Annotations;
using NzbDrone.Core.Indexers;
Expand Down Expand Up @@ -155,6 +156,14 @@ private object MapValue(SettingsField setting, object value)
return setting.Type switch
{
"select" => value.ToString().ParseInt64() ?? 0,
"multi-select" => value switch
{
JsonElement { ValueKind: JsonValueKind.Array } values
=> values.EnumerateArray().Select(e => e.ToString().ParseInt64() ?? 0).ToArray(),
JsonElement { ValueKind: JsonValueKind.Number or JsonValueKind.String } singleValue
=> new[] { singleValue.ToString().ParseInt64() ?? 0 },
_ => Array.Empty<long>()
},
"checkbox" => bool.TryParse(value.ToString(), out var result) && result,
_ => value?.ToString() ?? string.Empty
};
Expand All @@ -167,7 +176,12 @@ private Field MapField(SettingsField setting, int order)
Name = setting.Name,
Label = setting.Label,
Order = order,
Type = setting.Type == "text" ? "textbox" : setting.Type
Type = setting.Type switch
{
"text" => "textbox",
"multi-select" => "tagSelect",
_ => setting.Type
}
};

if (setting.Type == "select")
Expand All @@ -176,11 +190,24 @@ private Field MapField(SettingsField setting, int order)
field.SelectOptions = sorted.Select((x, i) => new SelectOption
{
Value = i,
Name = x.Value
Name = x.Value,
Order = i
}).ToList();

field.Value = sorted.Select(x => x.Key).ToList().IndexOf(setting.Default);
}
else if (setting.Type == "multi-select")
{
var sorted = setting.Options.OrderBy(x => x.Key).ToList();
field.SelectOptions = sorted.Select((x, i) => new SelectOption
{
Value = i,
Name = x.Value,
Order = i
}).ToList();

field.Value = setting.Defaults.Select(d => sorted.Select(x => x.Key).ToList().IndexOf(d)).ToArray();
}
else if (setting.Type == "checkbox")
{
field.Value = bool.TryParse(setting.Default, out var value) && value;
Expand Down

0 comments on commit 466f358

Please sign in to comment.