Skip to content

Commit 4c39332

Browse files
committed
fix(pat auto suggest): Fix regression introduced in 7.0 where auto suggest wasn't able to handle pre-filled json items properly.
1 parent 62e1978 commit 4c39332

File tree

2 files changed

+63
-10
lines changed

2 files changed

+63
-10
lines changed

src/pat/auto-suggest/auto-suggest.js

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -102,15 +102,11 @@ export default Base.extend({
102102
}
103103
});
104104

105-
this.$el.on("click", () => {
106-
// Work around the situation that a jQuery "change" event,
107-
// submitted by select2, isn't caught by pat-validation.
108-
// Select2 also triggers a click event, which we will use here to
109-
// trigger a standard JS change event.
110-
this.el.dispatchEvent(events.change_event());
111-
// Also dispatch a ``input`` event for ``input-change-events``
112-
// and pat-auto-suggest to pick this up.
113-
// TODO: Revisit after ``input-change-events`` is removed.
105+
this.$el.on("change", () => {
106+
// The jQuery "change" event isn't caught by normal JavaScript
107+
// event listeners, e.g. in pat-validation.
108+
// Let's re-trigger as input-event, so that pat-validation but also
109+
// ``input-change-events`` can pick it up.
114110
this.el.dispatchEvent(events.input_event());
115111
});
116112

src/pat/auto-suggest/auto-suggest.test.js

Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import $ from "jquery";
2+
import events from "../../core/events";
23
import pattern from "./auto-suggest";
34
import utils from "../../core/utils";
45
import registry from "../../core/registry";
@@ -95,7 +96,7 @@ describe("pat-autosuggest", function () {
9596
});
9697

9798
describe("2.1 - Selected items", function () {
98-
it("4.1 - can be given custom CSS classes", async function () {
99+
it("2.1 - can be given custom CSS classes", async function () {
99100
testutils.createInputElement({
100101
data: 'words: apple,orange,pear; pre-fill: orange; selection-classes: {"orange": ["fruit", "orange"]}',
101102
});
@@ -180,6 +181,62 @@ describe("pat-autosuggest", function () {
180181
expect(selected[1].textContent.trim()).toBe("orange");
181182
expect(input.value).toBe("apple,orange");
182183
});
184+
185+
it("2.5 - items can be pre-filled with json.", async function () {
186+
// Check if json pre-filled fields do work as expected.
187+
// Version 7.0 introduced a problem where at json pre-filled fields
188+
// no items could be deleted or added.
189+
// Version 7.11 fixes that problem.
190+
191+
document.body.innerHTML = `
192+
<input
193+
type="text"
194+
class="pat-autosuggest"
195+
data-pat-autosuggest='
196+
words-json: [
197+
{"id": "id-apple", "text":"Apple"},
198+
{"id": "id-orange", "text": "Orange"},
199+
{"id": "id-lemon", "text":"Lemon"}
200+
];
201+
prefill-json: {
202+
"id-orange": "Orange"
203+
};
204+
' />
205+
`;
206+
207+
const input = document.querySelector("input");
208+
new pattern(input);
209+
await utils.timeout(1); // wait a tick for async to settle.
210+
211+
let selected = document.querySelectorAll(".select2-search-choice");
212+
expect(selected.length).toBe(1);
213+
expect(selected[0].textContent.trim()).toBe("Orange");
214+
expect(input.value).toBe("id-orange");
215+
216+
// NOTE: the keyboard event init key ``which`` is deprecated,
217+
// but that's what select2 3.5.1 is expecting.
218+
document
219+
.querySelector(".select2-input")
220+
.dispatchEvent(new KeyboardEvent("keydown", { which: 8 }));
221+
// Need to send two times.
222+
document
223+
.querySelector(".select2-input")
224+
.dispatchEvent(new KeyboardEvent("keydown", { which: 8 }));
225+
226+
selected = document.querySelectorAll(".select2-search-choice");
227+
expect(selected.length).toBe(0);
228+
229+
document.querySelector(".select2-input").click();
230+
document.querySelector(".select2-result").dispatchEvent(events.mouseup_event()); // prettier-ignore
231+
document.querySelector(".select2-input").click();
232+
document.querySelector(".select2-result").dispatchEvent(events.mouseup_event()); // prettier-ignore
233+
234+
selected = document.querySelectorAll(".select2-search-choice");
235+
expect(selected.length).toBe(2);
236+
expect(selected[0].textContent.trim()).toBe("Apple");
237+
expect(selected[1].textContent.trim()).toBe("Orange");
238+
expect(input.value).toBe("id-apple,id-orange");
239+
});
183240
});
184241

185242
describe("3 - Placeholder tests", function () {

0 commit comments

Comments
 (0)