You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
58 lines
1.4 KiB
JavaScript
58 lines
1.4 KiB
JavaScript
'use strict';
|
|
|
|
const riotQuery = require("riot-query");
|
|
const arrayDiff = require("arraydiff");
|
|
|
|
module.exports = {
|
|
init: function() {
|
|
let knownTags = [];
|
|
let listeners = {};
|
|
|
|
function triggerEvent(action, query, item) {
|
|
if (listeners[query] != null && listeners[query][action] != null) {
|
|
listeners[query][action].forEach((handler) => {
|
|
handler(item);
|
|
});
|
|
}
|
|
}
|
|
|
|
this.on("updated", () => {
|
|
Object.keys(listeners).forEach((query) => {
|
|
let currentTags = riotQuery(this, query);
|
|
let diff = arrayDiff(knownTags, currentTags);
|
|
|
|
diff.forEach((item) => {
|
|
if (item.type === "remove") {
|
|
for (let i = item.index; i < (item.index + item.howMany); i++) {
|
|
triggerEvent("remove", query, knownTags[i]);
|
|
}
|
|
} else if (item.type === "move") {
|
|
for (let i = item.index; i < (item.from + item.howMany); i++) {
|
|
triggerEvent("move", query, knownTags[i]);
|
|
}
|
|
} else if (item.type === "insert") {
|
|
item.values.forEach((value) => {
|
|
triggerEvent("create", query, value);
|
|
})
|
|
}
|
|
});
|
|
|
|
knownTags = currentTags;
|
|
});
|
|
});
|
|
|
|
this.onChild = function(eventName, handler) {
|
|
let [action, query] = eventName.split(":", 2);
|
|
|
|
if (listeners[query] == null) {
|
|
listeners[query] = {};
|
|
}
|
|
|
|
if (listeners[query][action] == null) {
|
|
listeners[query][action] = [];
|
|
}
|
|
|
|
listeners[query][action].push(handler);
|
|
}
|
|
}
|
|
} |