discourse/test/javascripts/helpers/select-kit-helper.js

289 lines
6.5 KiB
JavaScript

function checkSelectKitIsNotExpanded(selector) {
if (find(selector).hasClass("is-expanded")) {
throw new Error(
"You expected select-kit to be collapsed but it is expanded."
);
}
}
function checkSelectKitIsNotCollapsed(selector) {
if (!find(selector).hasClass("is-expanded")) {
throw new Error(
"You expected select-kit to be expanded but it is collapsed."
);
}
}
Ember.Test.registerAsyncHelper("expandSelectKit", function(app, selector) {
checkSelectKitIsNotExpanded(selector);
click(selector + " .select-kit-header");
});
Ember.Test.registerAsyncHelper("collapseSelectKit", function(app, selector) {
checkSelectKitIsNotCollapsed(selector);
click(selector + " .select-kit-header");
});
Ember.Test.registerAsyncHelper("selectKitFillInFilter", function(
app,
filter,
selector
) {
checkSelectKitIsNotCollapsed(selector);
fillIn(selector + " .filter-input", filter);
});
Ember.Test.registerAsyncHelper("selectKitSelectRowByValue", function(
app,
value,
selector
) {
checkSelectKitIsNotCollapsed(selector);
click(selector + " .select-kit-row[data-value='" + value + "']");
});
Ember.Test.registerAsyncHelper("selectKitSelectRowByName", function(
app,
name,
selector
) {
checkSelectKitIsNotCollapsed(selector);
click(selector + " .select-kit-row[data-name='" + name + "']");
});
Ember.Test.registerAsyncHelper("selectKitSelectNoneRow", function(
app,
selector
) {
checkSelectKitIsNotCollapsed(selector);
click(selector + " .select-kit-row.none");
});
Ember.Test.registerAsyncHelper("selectKitSelectRowByIndex", function(
app,
index,
selector
) {
checkSelectKitIsNotCollapsed(selector);
click(find(selector + " .select-kit-row").eq(index));
});
Ember.Test.registerAsyncHelper("keyboardHelper", function(
app,
value,
target,
selector
) {
function createEvent(element, keyCode, options) {
element = element || ".filter-input";
selector = find(selector).find(element);
options = options || {};
var type = options.type || "keydown";
var event = jQuery.Event(type);
event.keyCode = keyCode;
if (options && options.metaKey) {
event.metaKey = true;
}
andThen(() => {
find(selector).trigger(event);
});
}
switch (value) {
case "enter":
return createEvent(target, 13);
case "backspace":
return createEvent(target, 8);
case "selectAll":
return createEvent(target, 65, { metaKey: true });
case "escape":
return createEvent(target, 27);
case "down":
return createEvent(target, 40);
case "up":
return createEvent(target, 38);
case "tab":
return createEvent(target, 9);
}
});
// eslint-disable-next-line no-unused-vars
function selectKit(selector) {
selector = selector || ".select-kit";
function rowHelper(row) {
return {
name: function() {
return row.attr("data-name");
},
icon: function() {
return row.find(".d-icon");
},
title: function() {
return row.attr("title");
},
value: function() {
return row.attr("data-value");
},
exists: function() {
return exists(row);
},
el: function() {
return row;
}
};
}
function headerHelper(header) {
return {
value: function() {
return header.attr("data-value");
},
name: function() {
return header.attr("data-name");
},
label: function() {
return header.text().trim();
},
icon: function() {
return header.find(".icon");
},
title: function() {
return header.attr("title");
},
el: function() {
return header;
}
};
}
function filterHelper(filter) {
return {
icon: function() {
return filter.find(".d-icon");
},
exists: function() {
return exists(filter);
},
el: function() {
return filter;
}
};
}
return {
expand: function() {
return expandSelectKit(selector);
},
collapse: function() {
return collapseSelectKit(selector);
},
selectRowByIndex: function(index) {
selectKitSelectRowByIndex(index, selector);
return selectKit(selector);
},
selectRowByValue: function(value) {
return selectKitSelectRowByValue(value, selector);
},
// Remove when stable is updated to Discourse 2.1
selectRowByValueAwait: function(value) {
return selectKitSelectRowByValue(value, selector);
},
selectRowByName: function(name) {
selectKitSelectRowByValue(name, selector);
return selectKit(selector);
},
selectNoneRow: function() {
return selectKitSelectNoneRow(selector);
},
fillInFilter: function(filter) {
return selectKitFillInFilter(filter, selector);
},
keyboard: function(value, target) {
return keyboardHelper(value, target, selector);
},
isExpanded: function() {
return find(selector).hasClass("is-expanded");
},
isFocused: function() {
return find(selector).hasClass("is-focused");
},
isHidden: function() {
return find(selector).hasClass("is-hidden");
},
header: function() {
return headerHelper(find(selector).find(".select-kit-header"));
},
filter: function() {
return filterHelper(find(selector).find(".select-kit-filter"));
},
rows: function() {
return find(selector).find(".select-kit-row");
},
rowByValue: function(value) {
return rowHelper(
find(selector).find('.select-kit-row[data-value="' + value + '"]')
);
},
rowByName: function(name) {
return rowHelper(
find(selector).find('.select-kit-row[data-name="' + name + '"]')
);
},
rowByIndex: function(index) {
return rowHelper(
find(selector).find(".select-kit-row:eq(" + index + ")")
);
},
el: function() {
return find(selector);
},
noneRow: function() {
return rowHelper(find(selector).find(".select-kit-row.none"));
},
validationMessage: function() {
var validationMessage = find(selector).find(".validation-message");
if (validationMessage.length) {
return validationMessage.html().trim();
} else {
return null;
}
},
selectedRow: function() {
return rowHelper(find(selector).find(".select-kit-row.is-selected"));
},
highlightedRow: function() {
return rowHelper(find(selector).find(".select-kit-row.is-highlighted"));
},
exists: function() {
return exists(selector);
}
};
}