Skip to content

Commit 6a7fda2

Browse files
authored
Merge pull request #977 from Patternslib/pattern-events
Pattern events
2 parents 3d91ddc + ac371e0 commit 6a7fda2

File tree

4 files changed

+91
-1
lines changed

4 files changed

+91
-1
lines changed

src/core/base.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,9 @@ Base.prototype = {
6161
on(eventName, eventCallback) {
6262
this.$el.on(`${eventName}.${this.name}.patterns`, eventCallback);
6363
},
64+
one(eventName, eventCallback) {
65+
this.$el.one(`${eventName}.${this.name}.patterns`, eventCallback);
66+
},
6467
emit(eventName, args) {
6568
// args should be a list
6669
if (args === undefined) {

src/core/base.test.js

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,13 +135,33 @@ describe("pat-base: The Base class for patterns", function () {
135135
new Tmp3($("<div>"), { option: "value" });
136136
});
137137

138-
it("has on/emit helpers to prefix events", function () {
138+
it("has on/emit helpers to prefix events", function (done) {
139139
var Tmp = Base.extend({
140140
name: "tmp",
141141
trigger: ".pat-tmp",
142142
init: function () {
143143
this.on("something", function (e, arg1) {
144144
expect(arg1).toEqual("yaay!");
145+
done();
146+
});
147+
this.emit("somethingelse", ["yaay!"]);
148+
},
149+
});
150+
new Tmp(
151+
$("<div/>").on("somethingelse.tmp.patterns", function (e, arg1) {
152+
$(this).trigger("something.tmp.patterns", [arg1]);
153+
})
154+
);
155+
});
156+
157+
it("has ``one`` helper to prefix events", function (done) {
158+
var Tmp = Base.extend({
159+
name: "tmp",
160+
trigger: ".pat-tmp",
161+
init: function () {
162+
this.one("something", function (e, arg1) {
163+
expect(arg1).toEqual("yaay!");
164+
done();
145165
});
146166
this.emit("somethingelse", ["yaay!"]);
147167
},

src/core/events.js

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,41 @@ const remove_event_listener = (el, id) => {
5858
}
5959
};
6060

61+
/**
62+
* Await an event to be thrown.
63+
*
64+
* Usage:
65+
* await events.await_event(button, "click");
66+
*
67+
* @param {DOM Node} el - The element to listen on.
68+
* @param {String} event_name - The event name to listen for.
69+
*
70+
* @returns {Promise} - Returns a Promise which can be used for ``await`` and which will be resolved when the event is throwm.
71+
*
72+
*/
73+
const await_event = (el, event_name) => {
74+
// See: https://stackoverflow.com/a/44746691/1337474
75+
return new Promise((resolve) =>
76+
el.addEventListener(event_name, resolve, { once: true })
77+
);
78+
};
79+
80+
/**
81+
* Await pattern init.
82+
*
83+
* Usage:
84+
* await events.await_pattern_init(PATTERN);
85+
*
86+
* @param {Pattern instance} pattern - The pattern instance.
87+
*
88+
* @returns {Promise} - Returns a Promise which can be used for ``await`` and which will be resolved when the event is throwm.
89+
*
90+
*/
91+
const await_pattern_init = (pattern) => {
92+
// See: https://stackoverflow.com/a/44746691/1337474
93+
return new Promise((resolve) => pattern.one("init", resolve));
94+
};
95+
6196
/**
6297
* Event factories
6398
*/
@@ -100,6 +135,8 @@ const submit_event = () => {
100135
export default {
101136
add_event_listener: add_event_listener,
102137
remove_event_listener: remove_event_listener,
138+
await_event: await_event,
139+
await_pattern_init: await_pattern_init,
103140
click_event: click_event,
104141
change_event: change_event,
105142
input_event: input_event,

src/core/events.test.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import Base from "./base";
12
import events from "./events";
23
import utils from "./utils";
34

@@ -47,6 +48,35 @@ describe("core.events tests", () => {
4748

4849
done();
4950
});
51+
52+
it("Awaits an event to happen", async () => {
53+
const el = document.createElement("div");
54+
55+
window.setTimeout(() => {
56+
el.dispatchEvent(new Event("init"));
57+
}, 1);
58+
59+
await events.await_event(el, "init");
60+
61+
// If test reaches this expect statement, all is fine.
62+
expect(true).toBe(true);
63+
});
64+
65+
it("Awaits a pattern to be initialized", async () => {
66+
const pat = Base.extend({
67+
name: "tmp",
68+
trigger: ".pat-tmp",
69+
init: function () {},
70+
});
71+
72+
const el = document.createElement("div");
73+
const instance = new pat(el);
74+
75+
await events.await_pattern_init(instance);
76+
77+
// If test reaches this expect statement, all is fine.
78+
expect(true).toBe(true);
79+
});
5080
});
5181

5282
describe("2 - event factories", () => {

0 commit comments

Comments
 (0)