Skip to content

Commit deb1a40

Browse files
authored
Merge pull request #475 from leekelleher/v5/feature/data-picker-api-existing-items
Data Picker: Passes selected items to the `Search` endpoint
2 parents c3987ea + 35e4fb3 commit deb1a40

File tree

4 files changed

+28
-5
lines changed

4 files changed

+28
-5
lines changed

src/Umbraco.Community.Contentment/DataEditors/DataPicker/DataPickerApiController.cs

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,14 +66,21 @@ array1[0] is JObject item1 &&
6666
return NotFound($"Unable to locate data source for data type: '{dataTypeKey}'");
6767
}
6868

69+
[Obsolete("Please call the `Search` endpoint using a POST method.")]
6970
[HttpGet]
70-
#pragma warning disable IDE0060 // Remove unused parameter
7171
public async Task<IActionResult> Search(string id, Guid dataTypeKey, int pageNumber = 1, int pageSize = 12, string query = "")
72+
=> await Search(id, dataTypeKey, pageNumber, pageSize, query, []);
73+
74+
[HttpPost]
75+
#pragma warning disable IDE0060 // Remove unused parameter
76+
public async Task<IActionResult> Search(string id, Guid dataTypeKey, int pageNumber = 1, int pageSize = 12, string query = "", [FromBody] string[]? values = null)
7277
#pragma warning restore IDE0060 // Remove unused parameter
7378
{
7479
if (_lookup.TryGetValue(dataTypeKey, out var cached) == true)
7580
{
76-
var results = await cached.Item1.SearchAsync(cached.Item2, pageNumber, pageSize, HttpUtility.UrlDecode(query));
81+
var results = cached.Item1 is IDataPickerSource2 source2
82+
? await source2.SearchAsync(cached.Item2, pageNumber, pageSize, HttpUtility.UrlDecode(query), values ?? [])
83+
: await cached.Item1.SearchAsync(cached.Item2, pageNumber, pageSize, HttpUtility.UrlDecode(query));
7784

7885
return Ok(results);
7986
}
@@ -92,7 +99,9 @@ tmp1 is JArray array1 &&
9299

93100
_ = _lookup.TryAdd(dataTypeKey, (source1, config1));
94101

95-
var results = await source1.SearchAsync(config1, pageNumber, pageSize, HttpUtility.UrlDecode(query));
102+
var results = source1 is IDataPickerSource2 source2
103+
? await source2.SearchAsync(config1, pageNumber, pageSize, HttpUtility.UrlDecode(query), values ?? [])
104+
: await source1.SearchAsync(config1, pageNumber, pageSize, HttpUtility.UrlDecode(query));
96105

97106
return Ok(results);
98107
}

src/Umbraco.Community.Contentment/DataEditors/DataPicker/IDataPickerSource.cs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* Copyright © 2023 Lee Kelleher.
1+
/* Copyright © 2023 Lee Kelleher.
22
* This Source Code Form is subject to the terms of the Mozilla Public
33
* License, v. 2.0. If a copy of the MPL was not distributed with this
44
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
@@ -11,6 +11,18 @@ public interface IDataPickerSource : IContentmentEditorItem
1111
{
1212
Task<IEnumerable<DataListItem>> GetItemsAsync(Dictionary<string, object> config, IEnumerable<string> values);
1313

14+
[Obsolete("Use `SearchAsync` with the additional `values` parameter instead. This method will be removed in Contentment 7.0.")]
1415
Task<PagedResult<DataListItem>> SearchAsync(Dictionary<string, object> config, int pageNumber = 1, int pageSize = 12, string query = "");
1516
}
17+
18+
// NOTE: Added as a separate interface, so not to break binary backwards-compatibility. [LK]
19+
public interface IDataPickerSource2 : IDataPickerSource
20+
{
21+
Task<PagedResult<DataListItem>> SearchAsync(
22+
Dictionary<string, object> config,
23+
int pageNumber = 1,
24+
int pageSize = 12,
25+
string query = "",
26+
IEnumerable<string>? values = null);
27+
}
1628
}

src/Umbraco.Community.Contentment/DataEditors/DataPicker/data-picker.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ angular.module("umbraco").controller("Umbraco.Community.Contentment.DataEditors.
130130
listType: config.displayMode,
131131
maxItems: config.maxItems === 0 ? config.maxItems : config.maxItems - $scope.model.value.length,
132132
pageSize: config.pageSize,
133+
selectedItems: $scope.model.value,
133134
},
134135
submit: function (selection) {
135136

src/Umbraco.Community.Contentment/DataEditors/DataPicker/data-picker.overlay.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ angular.module("umbraco").controller("Umbraco.Community.Contentment.Overlays.Dat
2121
listType: "cards",
2222
maxItems: 0,
2323
pageSize: 12,
24+
selectedItems: [],
2425
};
2526
var config = Object.assign({}, defaultConfig, $scope.model.config);
2627

@@ -69,7 +70,7 @@ angular.module("umbraco").controller("Umbraco.Community.Contentment.Overlays.Dat
6970
vm.loading = true;
7071

7172
umbRequestHelper.resourcePromise(
72-
$http.get("backoffice/Contentment/DataPickerApi/Search", {
73+
$http.post("backoffice/Contentment/DataPickerApi/Search", config.selectedItems, {
7374
params: {
7475
id: config.currentPageId,
7576
dataTypeKey: vm.searchOptions.dataTypeKey,

0 commit comments

Comments
 (0)