Skip to content

Commit 964462f

Browse files
committed
Fix for #51
1 parent d1552a7 commit 964462f

File tree

2 files changed

+71
-1
lines changed

2 files changed

+71
-1
lines changed

grails-app/assets/javascripts/forms-knockout-bindings.js

+17-1
Original file line numberDiff line numberDiff line change
@@ -531,8 +531,15 @@
531531
};
532532
};
533533

534+
/**
535+
* Provides support for applying https://select2.org for options selection.
536+
* The value supplied to this binding will be passed through as options to the select2
537+
* widget. It is expected this binding will be used in conjunction with the value binding
538+
* so that updates to the view model will be reflected in the select 2 component.
539+
* @type {{init: ko.bindingHandlers.select2.init}}
540+
*/
534541
ko.bindingHandlers.select2 = {
535-
init: function(element, valueAccessor) {
542+
init: function(element, valueAccessor, allBindings) {
536543
var defaults = {
537544
placeholder:'Please select...',
538545
dropdownAutoWidth:true,
@@ -547,6 +554,15 @@
547554
}
548555
$(element).select2(options);
549556
applySelect2ValidationCompatibility(element);
557+
558+
// Listen for changes to the view model and ensure the select2 component is
559+
// updated to reflect the change.
560+
var valueBinding = allBindings.get('value');
561+
if (ko.isObservable(valueBinding)) {
562+
valueBinding.subscribe(function() {
563+
$(element).trigger('change');
564+
});
565+
}
550566
}
551567
};
552568

test/functional/au/org/ala/ecodata/forms/Select2Spec.groovy

+54
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,66 @@ class Select2Spec extends GebReportingSpec {
1313
title == "Preview Select2 example"
1414
page.model != null
1515

16+
and: "configured placeholders are displayed"
17+
def item1 = page.findFieldByModelName("item1")
18+
item1.next().find(".select2-selection__placeholder").text() == "Please select..."
19+
def item2 = page.findFieldByModelName("item2")
20+
item2.next().find(".select2-selection__placeholder").text() == "Custom placeholder"
21+
def item3 = page.findFieldByModelName("item3")
22+
item3.next().find("input.select2-search__field").attr("placeholder") == "Custom placeholder"
23+
def item4 = page.findFieldByModelName("item4")
24+
item4.next().find(".select2-selection__placeholder").text() == "Please select..."
25+
def item5 = page.findFieldByModelName("item5")
26+
item5.next().find(".select2-selection__placeholder").text() == "Custom placeholder"
27+
def item6 = page.findFieldByModelName("item6")
28+
item6.next().find("input.select2-search__field").attr("placeholder") == "Select all that apply..."
29+
1630
when: "We enter data into the fields"
1731
page.findFieldByModelName("item1").value("value 1")
1832
page.findFieldByModelName("item2").value("value 2")
1933
page.findFieldByModelName("item3").value(["value 1", "value 3"])
34+
page.findFieldByModelName("item4").value("this is a much longer value")
35+
page.findFieldByModelName("item5").value("value 2")
36+
page.findFieldByModelName("item6").value(["value 2", "value 3"])
37+
2038

2139
then: "The model has been updated with the selected values"
2240
page.model.data.item1 == "value 1"
2341
page.model.data.item2 == "value 2"
2442
page.model.data.item3 == ["value 1", "value 3"]
43+
page.model.data.nested[0].item4 == "this is a much longer value"
44+
page.model.data.nested[0].item5 == "value 2"
45+
page.model.data.nested[0].item6 == ["value 2", "value 3"]
46+
}
47+
48+
def "Select2 components will display existing data in the model when the page loads"() {
49+
when:
50+
to ([name:'select2Example', data:'select2-view-data'], PreviewPage)
51+
52+
then:
53+
title == "Preview Select2 example"
54+
page.model != null
55+
56+
and: "The values from the data model are displayed"
57+
58+
page.findFieldByModelName("item1").next().find("span.select2-selection__rendered").text().contains("value 1")
59+
page.findFieldByModelName("item2").next().find("span.select2-selection__rendered").text().contains("value 2")
60+
page.findFieldByModelName("item3").next().find("li.select2-selection__choice")*.attr("title") == ["value 1", "value 3"]
61+
page.findFieldByModelName("item4").next().find("span.select2-selection__rendered")*.attr("title") == ["this is a much longer value", "value 3"]
62+
page.findFieldByModelName("item5").next().find("span.select2-selection__rendered")*.attr("title") == ["value 2", "value 1"]
63+
page.findFieldByModelName("item6").next().find("li.select2-selection__choice")*.attr("title") == ["value 3", "value 1", "value 2", "value 3", "tag"]
64+
65+
66+
then: "The model hasn't been changed"
67+
page.model.data.item1 == "value 1"
68+
page.model.data.item2 == "value 2"
69+
page.model.data.item3 == ["value 1", "value 3"]
70+
page.model.data.nested[0].item4 == "this is a much longer value"
71+
page.model.data.nested[0].item5 == "value 2"
72+
page.model.data.nested[0].item6 == ["value 3"]
73+
page.model.data.nested[1].item4 == "value 3"
74+
page.model.data.nested[1].item5 == "value 1"
75+
page.model.data.nested[1].item6 == ["value 1", "value 2", "value 3", "tag"]
2576

2677
}
2778

@@ -36,6 +87,9 @@ class Select2Spec extends GebReportingSpec {
3687
$("span[data-bind*=item1").text() == "value 1"
3788
$("span[data-bind*=item2").text() == "value 2"
3889
$("span[data-bind*=item3").text() == "value 1, value 3"
90+
$("span[data-bind*=item4")*.text() == ["this is a much longer value", "value 3"]
91+
$("span[data-bind*=item5")*.text() == ["value 2", "value 1"]
92+
$("span[data-bind*=item6")*.text() == ["value 3", "value 1, value 2, value 3, tag"]
3993

4094
}
4195
}

0 commit comments

Comments
 (0)