Skip to content

Commit c56dbc2

Browse files
authored
Merge pull request #1183 from Patternslib/fix-auto-submit
fix(pat-inject): Fix problem with pat-autosubmit.
2 parents 2c356f4 + 8ab6029 commit c56dbc2

File tree

5 files changed

+75
-21
lines changed

5 files changed

+75
-21
lines changed

src/pat/auto-submit/auto-submit.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import "../../core/jquery-ext";
22
import $ from "jquery";
33
import Base from "../../core/base";
4+
import events from "../../core/events";
45
import input_change_events from "../../lib/input-change-events";
56
import logging from "../../core/logging";
67
import Parser from "../../core/parser";
@@ -119,7 +120,7 @@ export default Base.extend({
119120

120121
onInputChange(e) {
121122
e.stopPropagation();
122-
this.$el.submit();
123+
this.el.dispatchEvent(events.submit_event());
123124
log.debug("triggered by " + e.type);
124125
},
125126
});

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

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ describe("pat-autosubmit", function () {
1111
});
1212

1313
describe("1 - Triggering of the pattern", function () {
14-
it("happens when a form has the pat-autosubmit class", function () {
14+
it("1.1 - happens when a form has the pat-autosubmit class", function () {
1515
document.body.innerHTML = `
1616
<form class="pat-autosubmit">
1717
<fieldset>
@@ -25,7 +25,7 @@ describe("pat-autosubmit", function () {
2525
expect(spy_init).toHaveBeenCalled();
2626
});
2727

28-
it("when a grouping of inputs has the pat-autosubmit class", function () {
28+
it("1.2 - when a grouping of inputs has the pat-autosubmit class", function () {
2929
document.body.innerHTML = `
3030
<form>
3131
<fieldset class="pat-autosubmit">
@@ -39,7 +39,7 @@ describe("pat-autosubmit", function () {
3939
expect(spy_init).toHaveBeenCalled();
4040
});
4141

42-
it("when a single input has the pat-autosubmit class", function () {
42+
it("1.3 - when a single input has the pat-autosubmit class", function () {
4343
document.body.innerHTML = `
4444
<form>
4545
<input
@@ -55,7 +55,7 @@ describe("pat-autosubmit", function () {
5555
expect(spy_init).toHaveBeenCalled();
5656
});
5757

58-
it("calls refreshListeners when pat-clone adds an element", function () {
58+
it("1.4 - calls refreshListeners when pat-clone adds an element", function () {
5959
document.body.innerHTML = `
6060
<form class="pat-autosubmit">
6161
</form>
@@ -69,7 +69,7 @@ describe("pat-autosubmit", function () {
6969
});
7070

7171
describe("2 - Trigger a submit", function () {
72-
it("when a change on a single input happens", async function () {
72+
it("2.1 - when a change on a single input happens", async function () {
7373
document.body.innerHTML = `
7474
<form>
7575
<input
@@ -81,11 +81,19 @@ describe("pat-autosubmit", function () {
8181
</form>
8282
`;
8383
const input = document.querySelector(".pat-autosubmit");
84-
const instance = new Pattern(input);
85-
const spy = jest.spyOn(instance.$el, "submit");
84+
new Pattern(input);
85+
let submit_input_dispatched = false;
86+
let submit_form_dispatched = false;
87+
input.addEventListener("submit", () => {
88+
submit_input_dispatched = true;
89+
});
90+
document.querySelector("form").addEventListener("submit", () => {
91+
submit_form_dispatched = true;
92+
});
8693
input.dispatchEvent(events.input_event());
8794
await utils.timeout(1);
88-
expect(spy).toHaveBeenCalled();
95+
expect(submit_input_dispatched).toBe(true);
96+
expect(submit_form_dispatched).toBe(true);
8997
});
9098

9199
it("2.2 - when pat-clone'd input is changed", async function () {
@@ -104,19 +112,23 @@ describe("pat-autosubmit", function () {
104112
const el_clone = document.querySelector(".pat-clone");
105113
const button_clone = document.querySelector(".add-clone");
106114

107-
const instance = new Pattern(el);
108-
new pattern_clone(el_clone);
115+
let submit_dispatched = false;
116+
el.addEventListener("submit", () => {
117+
submit_dispatched = true;
118+
});
109119

110-
const spy = jest.spyOn(instance.$el, "submit");
120+
new Pattern(el);
121+
new pattern_clone(el_clone);
111122

112123
button_clone.click();
113124

114125
document.querySelector("form input").dispatchEvent(events.input_event());
115126

116-
expect(spy).toHaveBeenCalled();
127+
await utils.timeout(1);
128+
expect(submit_dispatched).toBe(true);
117129
});
118130

119-
it("when pat-clone removes an element", function () {
131+
it("2.3 - when pat-clone removes an element", function () {
120132
document.body.innerHTML = `
121133
<form class="pat-autosubmit">
122134
</form>
@@ -128,7 +140,7 @@ describe("pat-autosubmit", function () {
128140
expect(spy).toHaveBeenCalled();
129141
});
130142

131-
it("when pat-sortable changes the sorting", function () {
143+
it("2.4 - when pat-sortable changes the sorting", function () {
132144
document.body.innerHTML = `
133145
<form class="pat-autosubmit">
134146
</form>
@@ -142,7 +154,7 @@ describe("pat-autosubmit", function () {
142154
});
143155

144156
describe("3 - Parsing of the delay option", function () {
145-
it("can be done in shorthand notation", function () {
157+
it("3.1 - can be done in shorthand notation", function () {
146158
let pat = new Pattern(`<input data-pat-autosubmit="500ms"/>`);
147159
expect(pat.options.delay).toBe(500);
148160
pat = new Pattern(`<input data-pat-autosubmit="500"/>`);
@@ -151,7 +163,7 @@ describe("pat-autosubmit", function () {
151163
expect(pat.options.delay).toBe("defocus");
152164
});
153165

154-
it("can be done in longhand notation", function () {
166+
it("3.2 - can be done in longhand notation", function () {
155167
let pat = new Pattern(`<input data-pat-autosubmit="delay: 500ms"/>`);
156168
expect(pat.options.delay).toBe(500);
157169
pat = new Pattern(`<input data-pat-autosubmit="delay: 500"/>`);

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

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -437,15 +437,20 @@ describe("pat-autosuggest", function () {
437437

438438
const pattern_autosubmit = (await import("../auto-submit/auto-submit")).default; // prettier-ignore
439439
const input = document.querySelector("input");
440+
let submit_dispatched = false;
441+
input.addEventListener("submit", () => {
442+
submit_dispatched = true;
443+
});
444+
440445
new pattern(input);
441-
const instance_autosubmit = new pattern_autosubmit(input);
442-
const spy = jest.spyOn(instance_autosubmit.$el, "submit");
446+
new pattern_autosubmit(input);
447+
443448
await utils.timeout(1); // wait a tick for async to settle.
444449

445450
$(".select2-input").click();
446451
$(document.querySelector(".select2-result")).mouseup();
447452

448-
expect(spy).toHaveBeenCalled();
453+
expect(submit_dispatched).toBe(true);
449454
});
450455

451456
it("4.2 - Works with pat-validate on an empty selection.", async function () {

src/pat/inject/inject.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ const inject = {
6060
if (cfgs.some((e) => e.history === "record") && !("pushState" in history)) {
6161
// if the injection shall add a history entry and HTML5 pushState
6262
// is missing, then don't initialize the injection.
63+
log.warn("HTML5 pushState is missing, aborting");
6364
return $el;
6465
}
6566
$el.data("pat-inject", cfgs);

src/pat/inject/inject.test.js

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,10 +144,12 @@ describe("pat-inject", function () {
144144
await utils.timeout(1); // wait a tick for async to settle.
145145

146146
$a.trigger("click");
147+
expect(spy_onTrigger).toHaveBeenCalled();
147148
expect(spy_confirm).not.toHaveBeenCalled();
148149

149150
$div.addClass("is-dirty");
150151
$a.trigger("click");
152+
expect(spy_onTrigger).toHaveBeenCalledTimes(2);
151153
expect(spy_confirm).toHaveBeenCalled();
152154

153155
spy_onTrigger.mockRestore();
@@ -174,8 +176,8 @@ describe("pat-inject", function () {
174176
await utils.timeout(1); // wait a tick for async to settle.
175177

176178
$a.trigger("click");
177-
expect(spy_confirm).not.toHaveBeenCalled();
178179
expect(spy_onTrigger).toHaveBeenCalled();
180+
expect(spy_confirm).not.toHaveBeenCalled();
179181

180182
spy_onTrigger.mockRestore();
181183
spy_confirm.mockRestore();
@@ -1770,6 +1772,39 @@ describe("pat-inject", function () {
17701772

17711773
spy_ajax.mockRestore();
17721774
});
1775+
1776+
it("11.3 - Test trigger: submit with auto-submit", async () => {
1777+
const PatAutoSubmit = (await import("../auto-submit/auto-submit.js"))
1778+
.default;
1779+
document.body.innerHTML = `
1780+
<form
1781+
class="pat-inject pat-autosubmit"
1782+
data-pat-autosubmit="delay: 0"
1783+
>
1784+
<input
1785+
type="text"
1786+
name="q"
1787+
/>
1788+
</form>
1789+
`;
1790+
1791+
const form = document.querySelector("form");
1792+
const input = document.querySelector("input");
1793+
1794+
const spy_trigger = jest.spyOn(pattern, "onTrigger");
1795+
1796+
pattern.init($(form));
1797+
await utils.timeout(1);
1798+
new PatAutoSubmit(form);
1799+
1800+
expect(spy_trigger).not.toHaveBeenCalled();
1801+
1802+
input.dispatchEvent(events.input_event());
1803+
1804+
expect(spy_trigger).toHaveBeenCalled();
1805+
1806+
spy_trigger.mockRestore();
1807+
});
17731808
});
17741809

17751810
describe("12 - caching", () => {

0 commit comments

Comments
 (0)