mirror of
https://github.com/discourse/discourse.git
synced 2025-02-12 06:14:54 +00:00
This reverts commit 20780a1eeed56b321daf18ee6bbfe681a51d1bf4. * SECURITY: re-adds accidentally reverted commit: 03d26cd6: ensure embed_url contains valid http(s) uri * when the merge commit e62a85cf was reverted, git chose the 2660c2e2 parent to land on instead of the 03d26cd6 parent (which contains security fixes)
323 lines
7.1 KiB
JavaScript
323 lines
7.1 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");
|
|
},
|
|
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.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);
|
|
}
|