mirror of
https://github.com/discourse/discourse.git
synced 2024-12-11 21:44:08 +08:00
0854785175
Usage: ``` const content = [{foo: "FOO", bar: "BAR", value: 1, name: "foo-bar"}]; {{combo-box content=content value=value labelProperty="foo" titleProperty="bar" }} ```
329 lines
7.2 KiB
JavaScript
329 lines
7.2 KiB
JavaScript
import { isEmpty } from "@ember/utils";
|
|
|
|
function checkSelectKitIsNotExpanded(selector) {
|
|
if (find(selector).hasClass("is-expanded")) {
|
|
// eslint-disable-next-line no-console
|
|
console.warn("You expected select-kit to be collapsed but it is expanded.");
|
|
}
|
|
}
|
|
|
|
function checkSelectKitIsNotCollapsed(selector) {
|
|
if (!find(selector).hasClass("is-expanded")) {
|
|
// eslint-disable-next-line no-console
|
|
console.warn("You expected select-kit to be expanded but it is collapsed.");
|
|
}
|
|
}
|
|
|
|
async function expandSelectKit(selector) {
|
|
checkSelectKitIsNotExpanded(selector);
|
|
return await click(`${selector} .select-kit-header`);
|
|
}
|
|
|
|
async function collapseSelectKit(selector) {
|
|
checkSelectKitIsNotCollapsed(selector);
|
|
return await click(`${selector} .select-kit-header`);
|
|
}
|
|
|
|
async function selectKitFillInFilter(filter, selector) {
|
|
checkSelectKitIsNotCollapsed(selector);
|
|
await fillIn(
|
|
`${selector} .filter-input`,
|
|
find(`${selector} .filter-input`).val() + filter
|
|
);
|
|
}
|
|
|
|
async function selectKitEmptyFilter(selector) {
|
|
checkSelectKitIsNotCollapsed(selector);
|
|
await fillIn(`${selector} .filter-input`, "");
|
|
}
|
|
|
|
async function selectKitSelectRowByValue(value, selector) {
|
|
checkSelectKitIsNotCollapsed(selector);
|
|
await click(`${selector} .select-kit-row[data-value='${value}']`);
|
|
}
|
|
|
|
async function selectKitSelectRowByName(name, selector) {
|
|
checkSelectKitIsNotCollapsed(selector);
|
|
await click(`${selector} .select-kit-row[data-name='${name}']`);
|
|
}
|
|
|
|
async function selectKitSelectNoneRow(selector) {
|
|
checkSelectKitIsNotCollapsed(selector);
|
|
await click(`${selector} .select-kit-row.none`);
|
|
}
|
|
|
|
async function selectKitSelectRowByIndex(index, selector) {
|
|
checkSelectKitIsNotCollapsed(selector);
|
|
await click(find(`${selector} .select-kit-row`).eq(index));
|
|
}
|
|
|
|
async function keyboardHelper(value, target, selector) {
|
|
target = find(selector).find(target || ".filter-input");
|
|
|
|
if (value === "selectAll") {
|
|
// special casing the only one not working with triggerEvent
|
|
const event = jQuery.Event("keydown");
|
|
event.keyCode = 65;
|
|
event.metaKey = true;
|
|
target.trigger(event);
|
|
} else {
|
|
const mapping = {
|
|
enter: { keyCode: 13 },
|
|
backspace: { keyCode: 8 },
|
|
escape: { keyCode: 27 },
|
|
down: { keyCode: 40 },
|
|
up: { keyCode: 38 },
|
|
tab: { keyCode: 9 }
|
|
};
|
|
|
|
await triggerEvent(
|
|
target,
|
|
"keydown",
|
|
mapping[value] || { keyCode: value.charCodeAt(0) }
|
|
);
|
|
}
|
|
}
|
|
|
|
function rowHelper(row) {
|
|
return {
|
|
name() {
|
|
return row.attr("data-name");
|
|
},
|
|
icon() {
|
|
return row.find(".d-icon");
|
|
},
|
|
title() {
|
|
return row.attr("title");
|
|
},
|
|
label() {
|
|
return row
|
|
.find(".name")
|
|
.text()
|
|
.trim();
|
|
},
|
|
value() {
|
|
const value = row.attr("data-value");
|
|
return isEmpty(value) ? null : value;
|
|
},
|
|
exists() {
|
|
return exists(row);
|
|
},
|
|
el() {
|
|
return row;
|
|
}
|
|
};
|
|
}
|
|
|
|
function headerHelper(header) {
|
|
return {
|
|
value() {
|
|
const value = header.attr("data-value");
|
|
return isEmpty(value) ? null : value;
|
|
},
|
|
name() {
|
|
return header.attr("data-name");
|
|
},
|
|
label() {
|
|
return header.text().trim();
|
|
},
|
|
icon() {
|
|
return header.find(".d-icon");
|
|
},
|
|
title() {
|
|
return header.find(".selected-name").attr("title");
|
|
},
|
|
el() {
|
|
return header;
|
|
}
|
|
};
|
|
}
|
|
|
|
function filterHelper(filter) {
|
|
return {
|
|
icon() {
|
|
return filter.find(".d-icon");
|
|
},
|
|
exists() {
|
|
return exists(filter);
|
|
},
|
|
value() {
|
|
return filter.find("input").val();
|
|
},
|
|
el() {
|
|
return filter;
|
|
}
|
|
};
|
|
}
|
|
|
|
export default function selectKit(selector) {
|
|
selector = selector || ".select-kit";
|
|
|
|
return {
|
|
async expand() {
|
|
await expandSelectKit(selector);
|
|
},
|
|
|
|
async collapse() {
|
|
await collapseSelectKit(selector);
|
|
},
|
|
|
|
async selectRowByIndex(index) {
|
|
await selectKitSelectRowByIndex(index, selector);
|
|
},
|
|
|
|
async selectRowByValue(value) {
|
|
await selectKitSelectRowByValue(value, selector);
|
|
},
|
|
|
|
async selectKitSelectRowByName(name) {
|
|
await selectKitSelectRowByName(name, selector);
|
|
},
|
|
|
|
async selectRowByName(name) {
|
|
await selectKitSelectRowByName(name, selector);
|
|
},
|
|
|
|
async selectNoneRow() {
|
|
await selectKitSelectNoneRow(selector);
|
|
},
|
|
|
|
async fillInFilter(filter) {
|
|
await selectKitFillInFilter(filter, selector);
|
|
},
|
|
|
|
async emptyFilter() {
|
|
await selectKitEmptyFilter(selector);
|
|
},
|
|
|
|
async keyboard(value, target) {
|
|
await keyboardHelper(value, target, selector);
|
|
},
|
|
|
|
isExpanded() {
|
|
return find(selector).hasClass("is-expanded");
|
|
},
|
|
|
|
isFocused() {
|
|
return find(selector).hasClass("is-focused");
|
|
},
|
|
|
|
isHidden() {
|
|
return find(selector).hasClass("is-hidden");
|
|
},
|
|
|
|
header() {
|
|
return headerHelper(find(selector).find(".select-kit-header"));
|
|
},
|
|
|
|
filter() {
|
|
return filterHelper(find(selector).find(".select-kit-filter"));
|
|
},
|
|
|
|
rows() {
|
|
return find(selector).find(".select-kit-row");
|
|
},
|
|
|
|
displayedContent() {
|
|
return this.rows()
|
|
.map((_, row) => {
|
|
return {
|
|
name: row.getAttribute("data-name"),
|
|
id: row.getAttribute("data-value")
|
|
};
|
|
})
|
|
.toArray();
|
|
},
|
|
|
|
rowByValue(value) {
|
|
return rowHelper(
|
|
find(selector).find('.select-kit-row[data-value="' + value + '"]')
|
|
);
|
|
},
|
|
|
|
rowByName(name) {
|
|
return rowHelper(
|
|
find(selector).find('.select-kit-row[data-name="' + name + '"]')
|
|
);
|
|
},
|
|
|
|
rowByIndex(index) {
|
|
return rowHelper(
|
|
find(selector).find(".select-kit-row:eq(" + index + ")")
|
|
);
|
|
},
|
|
|
|
el() {
|
|
return find(selector);
|
|
},
|
|
|
|
noneRow() {
|
|
return rowHelper(find(selector).find(".select-kit-row.none"));
|
|
},
|
|
|
|
validationMessage() {
|
|
const validationMessage = find(selector).find(".validation-message");
|
|
|
|
if (validationMessage.length) {
|
|
return validationMessage.html().trim();
|
|
} else {
|
|
return null;
|
|
}
|
|
},
|
|
|
|
selectedRow() {
|
|
return rowHelper(find(selector).find(".select-kit-row.is-selected"));
|
|
},
|
|
|
|
highlightedRow() {
|
|
return rowHelper(find(selector).find(".select-kit-row.is-highlighted"));
|
|
},
|
|
|
|
async deselectItem(value) {
|
|
await click(
|
|
find(selector)
|
|
.find(".select-kit-header")
|
|
.find(`[data-value=${value}]`)
|
|
);
|
|
},
|
|
|
|
exists() {
|
|
return exists(selector);
|
|
}
|
|
};
|
|
}
|
|
|
|
export function testSelectKitModule(moduleName, options = {}) {
|
|
moduleForComponent(`select-kit/${moduleName}`, {
|
|
integration: true,
|
|
|
|
beforeEach() {
|
|
this.set("subject", selectKit());
|
|
options.beforeEach && options.beforeEach.call(this);
|
|
},
|
|
|
|
afterEach() {
|
|
options.afterEach && options.afterEach.call(this);
|
|
}
|
|
});
|
|
}
|
|
|
|
export const DEFAULT_CONTENT = [
|
|
{ id: 1, name: "foo" },
|
|
{ id: 2, name: "bar" },
|
|
{ id: 3, name: "baz" }
|
|
];
|
|
|
|
export function setDefaultState(ctx, value, options = {}) {
|
|
const properties = Object.assign(
|
|
{
|
|
value,
|
|
onChange: v => {
|
|
ctx.set("value", v);
|
|
}
|
|
},
|
|
options || {}
|
|
);
|
|
|
|
ctx.setProperties(properties);
|
|
}
|