Skip to content

Commit 51823a7

Browse files
ZeegaaniOvergaard
andauthored
v15: Remove old values from checkboxlist (#17936)
* Remove old values from checkboxlist * Add validator for MultipleValueEditor * chore: adds mocked "published" handler * chore(mock): adds multiple dropdown * chore(mock): adds dropdown multiple to 'all properties' * adds localization * feat: adds support to show invalid/legacy options * feat: show invalid/legacy options to let the user decide what to do * Add validator for radio buttons --------- Co-authored-by: Jacob Overgaard <[email protected]>
1 parent 171ada2 commit 51823a7

File tree

17 files changed

+260
-27
lines changed

17 files changed

+260
-27
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
using Umbraco.Cms.Core.IO;
2+
using Umbraco.Cms.Core.PropertyEditors.Validators;
3+
using Umbraco.Cms.Core.Serialization;
4+
using Umbraco.Cms.Core.Services;
5+
using Umbraco.Cms.Core.Strings;
6+
7+
namespace Umbraco.Cms.Core.PropertyEditors;
8+
9+
public class RadioValueEditor : DataValueEditor
10+
{
11+
public RadioValueEditor(
12+
ILocalizedTextService localizedTextService,
13+
IShortStringHelper shortStringHelper,
14+
IJsonSerializer jsonSerializer,
15+
IIOHelper ioHelper,
16+
DataEditorAttribute attribute)
17+
: base(localizedTextService, shortStringHelper, jsonSerializer, ioHelper, attribute) =>
18+
Validators.Add(new RadioValueValidator());
19+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
using System.ComponentModel.DataAnnotations;
2+
using Umbraco.Cms.Core.Models.Validation;
3+
using Umbraco.Extensions;
4+
5+
namespace Umbraco.Cms.Core.PropertyEditors.Validators;
6+
7+
public class MultipleValueValidator : IValueValidator
8+
{
9+
public IEnumerable<ValidationResult> Validate(object? value, string? valueType, object? dataTypeConfiguration, PropertyValidationContext validationContext)
10+
{
11+
// don't validate if empty
12+
if (value == null || value.ToString().IsNullOrWhiteSpace())
13+
{
14+
yield break;
15+
}
16+
17+
if (dataTypeConfiguration is not ValueListConfiguration valueListConfiguration)
18+
{
19+
yield break;
20+
}
21+
22+
if (value is not IEnumerable<string> values)
23+
{
24+
yield break;
25+
}
26+
27+
foreach (var selectedValue in values)
28+
{
29+
if (valueListConfiguration.Items.Contains(selectedValue) is false)
30+
{
31+
yield return new ValidationResult(
32+
$"The value {selectedValue} is not a part of the pre-values", ["items"]);
33+
}
34+
}
35+
}
36+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
using System.ComponentModel.DataAnnotations;
2+
using Umbraco.Cms.Core.Models.Validation;
3+
using Umbraco.Extensions;
4+
5+
namespace Umbraco.Cms.Core.PropertyEditors.Validators;
6+
7+
public class RadioValueValidator : IValueValidator
8+
{
9+
public IEnumerable<ValidationResult> Validate(object? value, string? valueType, object? dataTypeConfiguration,
10+
PropertyValidationContext validationContext)
11+
{
12+
// don't validate if empty
13+
if (value == null || value.ToString().IsNullOrWhiteSpace())
14+
{
15+
yield break;
16+
}
17+
18+
if (dataTypeConfiguration is not ValueListConfiguration valueListConfiguration)
19+
{
20+
yield break;
21+
}
22+
23+
if (value is not string valueAsString)
24+
{
25+
yield break;
26+
}
27+
28+
if (valueListConfiguration.Items.Contains(valueAsString) is false)
29+
{
30+
yield return new ValidationResult(
31+
$"The value {valueAsString} is not a part of the pre-values", ["items"]);
32+
}
33+
}
34+
}

src/Umbraco.Infrastructure/PropertyEditors/MultipleValueEditor.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
// See LICENSE for more details.
33

44
using Umbraco.Cms.Core.IO;
5-
using Umbraco.Cms.Core.Models;
65
using Umbraco.Cms.Core.Models.Editors;
6+
using Umbraco.Cms.Core.PropertyEditors.Validators;
77
using Umbraco.Cms.Core.Serialization;
88
using Umbraco.Cms.Core.Services;
99
using Umbraco.Cms.Core.Strings;
@@ -26,8 +26,11 @@ public MultipleValueEditor(
2626
IJsonSerializer jsonSerializer,
2727
IIOHelper ioHelper,
2828
DataEditorAttribute attribute)
29-
: base(localizedTextService, shortStringHelper, jsonSerializer, ioHelper, attribute) =>
29+
: base(localizedTextService, shortStringHelper, jsonSerializer, ioHelper, attribute)
30+
{
3031
_jsonSerializer = jsonSerializer;
32+
Validators.Add(new MultipleValueValidator());
33+
}
3134

3235
/// <summary>
3336
/// When multiple values are selected a json array will be posted back so we need to format for storage in

src/Umbraco.Infrastructure/PropertyEditors/RadioButtonsPropertyEditor.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// See LICENSE for more details.
33

44
using Umbraco.Cms.Core.IO;
5+
using Umbraco.Cms.Core.Models;
56
using Umbraco.Cms.Core.Serialization;
67

78
namespace Umbraco.Cms.Core.PropertyEditors;
@@ -35,4 +36,7 @@ public RadioButtonsPropertyEditor(IDataValueEditorFactory dataValueEditorFactory
3536
/// <returns></returns>
3637
protected override IConfigurationEditor CreateConfigurationEditor() =>
3738
new ValueListConfigurationEditor(_ioHelper, _configurationEditorJsonSerializer);
39+
40+
protected override IDataValueEditor CreateValueEditor() =>
41+
DataValueEditorFactory.Create<RadioValueEditor>(Attribute!);
3842
}

src/Umbraco.Web.UI.Client/src/assets/lang/da-dk.ts

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2031,14 +2031,16 @@ export default {
20312031
entriesShort: 'Minimum %0% element(er), tilføj <strong>%1%</strong> mere.',
20322032
entriesExceed: 'Maksimum %0% element(er), <strong>%1%</strong> for mange.',
20332033
entriesAreasMismatch: 'Ét eller flere områder lever ikke op til kravene for antal indholdselementer.',
2034-
invalidMemberGroupName: 'Invalid member group name',
2035-
invalidUserGroupName: 'Invalid user group name',
2036-
invalidToken: 'Invalid token',
2037-
invalidUsername: 'Invalid username',
2038-
duplicateEmail: "Email '%0%' is already taken",
2039-
duplicateUserGroupName: "User group name '%0%' is already taken",
2040-
duplicateMemberGroupName: "Member group name '%0%' is already taken",
2041-
duplicateUsername: "Username '%0%' is already taken",
2034+
invalidMemberGroupName: 'Ugyldig medlemsgruppenavn',
2035+
invalidUserGroupName: 'Ugyldig brugergruppenavn',
2036+
invalidToken: 'Ugyldig token',
2037+
invalidUsername: 'Ugyldigt brugernavn',
2038+
duplicateEmail: "Email '%0%' er allerede i brug",
2039+
duplicateUserGroupName: "Brugergruppenavn '%0%' er allerede taget",
2040+
duplicateMemberGroupName: "Medlemsgruppenavn '%0%' er allerede taget",
2041+
duplicateUsername: "Brugernavnet '%0%' er allerede taget",
2042+
legacyOption: 'Ugyldig indstilling',
2043+
legacyOptionDescription: 'Denne indstilling understøttes ikke længere, vælg venligst noget andet',
20422044
},
20432045
redirectUrls: {
20442046
disableUrlTracker: 'Slå URL tracker fra',

src/Umbraco.Web.UI.Client/src/assets/lang/en.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2116,6 +2116,8 @@ export default {
21162116
duplicateUserGroupName: "User group name '%0%' is already taken",
21172117
duplicateMemberGroupName: "Member group name '%0%' is already taken",
21182118
duplicateUsername: "Username '%0%' is already taken",
2119+
legacyOption: 'Legacy option',
2120+
legacyOptionDescription: 'This option is no longer supported, please select something else',
21192121
},
21202122
healthcheck: {
21212123
checkSuccessMessage: "Value is set to the recommended value: '%0%'.",

src/Umbraco.Web.UI.Client/src/mocks/data/data-type/data-type.data.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -406,6 +406,27 @@ export const data: Array<UmbMockDataTypeModel> = [
406406
},
407407
],
408408
},
409+
{
410+
name: 'Dropdown (Multiple)',
411+
id: 'dt-dropdown-multiple',
412+
parent: null,
413+
editorAlias: 'Umbraco.DropDown.Flexible',
414+
editorUiAlias: 'Umb.PropertyEditorUi.Dropdown',
415+
hasChildren: false,
416+
isFolder: false,
417+
isDeletable: true,
418+
canIgnoreStartNodes: false,
419+
values: [
420+
{
421+
alias: 'multiple',
422+
value: true,
423+
},
424+
{
425+
alias: 'items',
426+
value: ['First Option', 'Second Option', 'I Am the third Option'],
427+
},
428+
],
429+
},
409430
{
410431
name: 'Dropdown Alignment Options',
411432
id: 'dt-dropdown-align',

src/Umbraco.Web.UI.Client/src/mocks/data/document-type/document-type.data.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,26 @@ export const data: Array<UmbMockDocumentTypeModel> = [
337337
labelOnTop: false,
338338
},
339339
},
340+
{
341+
id: '19',
342+
container: { id: 'all-properties-group-key' },
343+
alias: 'dropdownMultiple',
344+
name: 'Dropdown (Multiple)',
345+
description: '',
346+
dataType: { id: 'dt-dropdown-multiple' },
347+
variesByCulture: false,
348+
variesBySegment: false,
349+
sortOrder: 11,
350+
validation: {
351+
mandatory: true,
352+
mandatoryMessage: null,
353+
regEx: null,
354+
regExMessage: null,
355+
},
356+
appearance: {
357+
labelOnTop: false,
358+
},
359+
},
340360
{
341361
id: '11',
342362
container: { id: 'all-properties-group-key' },

src/Umbraco.Web.UI.Client/src/mocks/data/document/document.data.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,13 @@ export const data: Array<UmbMockDocumentModel> = [
219219
segment: null,
220220
value: null,
221221
},
222+
{
223+
editorAlias: 'Umbraco.DropDown.Flexible',
224+
alias: 'dropdownMultiple',
225+
culture: null,
226+
segment: null,
227+
value: null,
228+
},
222229
{
223230
editorAlias: 'Umbraco.TextArea',
224231
alias: 'textArea',

0 commit comments

Comments
 (0)