-
Notifications
You must be signed in to change notification settings - Fork 28
/
Copy pathMultiUrlPickerValueConverter.cs
129 lines (107 loc) · 4.07 KB
/
MultiUrlPickerValueConverter.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
using Umbraco.Core.Logging;
using Umbraco.Core.PropertyEditors.ValueConverters;
namespace RJP.MultiUrlPicker
{
using System;
using System.Linq;
using System.Collections.Generic;
using Newtonsoft.Json.Linq;
using Umbraco.Core;
using Umbraco.Core.Models;
using Umbraco.Core.Models.PublishedContent;
using Umbraco.Core.PropertyEditors;
using Umbraco.Core.Services;
using Models;
public class MultiUrlPickerValueConverter : PropertyValueConverterBase, IPropertyValueConverterMeta
{
private readonly IDataTypeService _dataTypeService;
public MultiUrlPickerValueConverter(IDataTypeService dataTypeService)
{
_dataTypeService = dataTypeService;
}
public MultiUrlPickerValueConverter() : this(ApplicationContext.Current.Services.DataTypeService)
{
}
public override bool IsConverter(PublishedPropertyType propertyType)
{
return propertyType.PropertyEditorAlias.Equals("RJP.MultiUrlPicker");
}
public override object ConvertDataToSource(PublishedPropertyType propertyType, object source, bool preview)
{
var sourceString = source?.ToString();
if (string.IsNullOrWhiteSpace(sourceString))
{
return null;
}
if (sourceString.DetectIsJson())
{
try
{
return JArray.Parse(sourceString);
}
catch (Exception ex)
{
LogHelper.Error<MultiUrlPickerValueConverter>("Error parsing JSON", ex);
}
}
return null;
}
public override object ConvertSourceToObject(PublishedPropertyType propertyType, object source, bool preview)
{
bool isMultiple = IsMultipleDataType(propertyType.DataTypeId, out int maxNumberOfItems);
if (source == null)
{
return isMultiple ? new MultiUrls() : null;
}
var urls = new MultiUrls((JArray)source);
if (isMultiple)
{
if (maxNumberOfItems > 0)
{
return urls.Take(maxNumberOfItems);
}
return urls;
}
return urls.FirstOrDefault();
}
public Type GetPropertyValueType(PublishedPropertyType propertyType)
{
if (IsMultipleDataType(propertyType.DataTypeId, out int maxNumberOfItems))
{
return typeof(IEnumerable<Link>);
}
return typeof(Link);
}
public PropertyCacheLevel GetPropertyCacheLevel(PublishedPropertyType propertyType, PropertyCacheValue cacheValue)
{
switch (cacheValue)
{
case PropertyCacheValue.Source:
return PropertyCacheLevel.Content;
case PropertyCacheValue.Object:
case PropertyCacheValue.XPath:
return PropertyCacheLevel.ContentCache;
}
return PropertyCacheLevel.None;
}
private bool IsMultipleDataType(int dataTypeId, out int maxNumberOfItems)
{
IDictionary<string, PreValue> preValues = _dataTypeService
.GetPreValuesCollectionByDataTypeId(dataTypeId)
.PreValuesAsDictionary;
if (preValues.TryGetValue("maxNumberOfItems", out PreValue maxNumberOfItemsPreValue) &&
int.TryParse(maxNumberOfItemsPreValue.Value, out maxNumberOfItems))
{
// For backwards compatibility, always return true if version is less than 2.0.0
if (preValues.TryGetValue("version", out PreValue versionPreValue) &&
Version.TryParse(versionPreValue.Value, out Version version)
&& version >= new Version(2, 0, 0))
{
return maxNumberOfItems != 1;
}
}
maxNumberOfItems = 0;
return true;
}
}
}