mirror of
https://github.com/discourse/discourse.git
synced 2025-02-20 09:28:30 +08:00
DEV: emoji picker - make it possible to choose picker's placement and add a dedicated class for an anchor (#16969)
This commit is contained in:
parent
e579e9e61c
commit
0bbbd8371e
|
@ -38,6 +38,7 @@ export default Component.extend({
|
||||||
hoveredEmoji: null,
|
hoveredEmoji: null,
|
||||||
isActive: false,
|
isActive: false,
|
||||||
usePopper: true,
|
usePopper: true,
|
||||||
|
placement: "auto", // one of popper.js' placements, see https://popper.js.org/docs/v2/constructors/#options
|
||||||
initialFilter: "",
|
initialFilter: "",
|
||||||
|
|
||||||
init() {
|
init() {
|
||||||
|
@ -96,11 +97,9 @@ export default Component.extend({
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const textareaWrapper = document.querySelector(
|
const popperAnchor = this._getPopperAnchor();
|
||||||
".d-editor-textarea-wrapper"
|
|
||||||
);
|
|
||||||
|
|
||||||
if (!this.site.isMobileDevice && this.usePopper && textareaWrapper) {
|
if (!this.site.isMobileDevice && this.usePopper && popperAnchor) {
|
||||||
const modifiers = [
|
const modifiers = [
|
||||||
{
|
{
|
||||||
name: "preventOverflow",
|
name: "preventOverflow",
|
||||||
|
@ -113,7 +112,10 @@ export default Component.extend({
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
if (window.innerWidth < textareaWrapper.clientWidth * 2) {
|
if (
|
||||||
|
this.placement === "auto" &&
|
||||||
|
window.innerWidth < popperAnchor.clientWidth * 2
|
||||||
|
) {
|
||||||
modifiers.push({
|
modifiers.push({
|
||||||
name: "computeStyles",
|
name: "computeStyles",
|
||||||
enabled: true,
|
enabled: true,
|
||||||
|
@ -131,9 +133,8 @@ export default Component.extend({
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
this._popper = createPopper(textareaWrapper, emojiPicker, {
|
this._popper = createPopper(popperAnchor, emojiPicker, {
|
||||||
placement: "auto",
|
placement: this.placement,
|
||||||
modifiers,
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -338,6 +339,15 @@ export default Component.extend({
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_getPopperAnchor() {
|
||||||
|
// .d-editor-textarea-wrapper is only for backward compatibility here
|
||||||
|
// in new code use .emoji-picker-anchor
|
||||||
|
return (
|
||||||
|
document.querySelector(".emoji-picker-anchor") ??
|
||||||
|
document.querySelector(".d-editor-textarea-wrapper")
|
||||||
|
);
|
||||||
|
},
|
||||||
|
|
||||||
@bind
|
@bind
|
||||||
handleOutsideClick(event) {
|
handleOutsideClick(event) {
|
||||||
const emojiPicker = document.querySelector(".emoji-picker");
|
const emojiPicker = document.querySelector(".emoji-picker");
|
||||||
|
|
|
@ -0,0 +1,52 @@
|
||||||
|
import componentTest, {
|
||||||
|
setupRenderingTest,
|
||||||
|
} from "discourse/tests/helpers/component-test";
|
||||||
|
import { discourseModule, query } from "discourse/tests/helpers/qunit-helpers";
|
||||||
|
import hbs from "htmlbars-inline-precompile";
|
||||||
|
import { click } from "@ember/test-helpers";
|
||||||
|
|
||||||
|
discourseModule("Integration | Component | emoji-picker", function (hooks) {
|
||||||
|
setupRenderingTest(hooks);
|
||||||
|
|
||||||
|
componentTest("when placement == bottom, places the picker on the bottom", {
|
||||||
|
template: hbs`
|
||||||
|
{{d-button class="emoji-picker-anchor" action=showEmojiPicker}}
|
||||||
|
{{emoji-picker isActive=pickerIsActive placement="bottom"}}
|
||||||
|
`,
|
||||||
|
|
||||||
|
beforeEach() {
|
||||||
|
this.set("showEmojiPicker", () => {
|
||||||
|
this.set("pickerIsActive", true);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
async test(assert) {
|
||||||
|
await click(".emoji-picker-anchor");
|
||||||
|
assert.equal(
|
||||||
|
query(".emoji-picker.opened").getAttribute("data-popper-placement"),
|
||||||
|
"bottom"
|
||||||
|
);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
componentTest("when placement == right, places the picker on the right", {
|
||||||
|
template: hbs`
|
||||||
|
{{d-button class="emoji-picker-anchor" action=showEmojiPicker}}
|
||||||
|
{{emoji-picker isActive=pickerIsActive placement="right"}}
|
||||||
|
`,
|
||||||
|
|
||||||
|
beforeEach() {
|
||||||
|
this.set("showEmojiPicker", () => {
|
||||||
|
this.set("pickerIsActive", true);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
async test(assert) {
|
||||||
|
await click(".emoji-picker-anchor");
|
||||||
|
assert.equal(
|
||||||
|
query(".emoji-picker.opened").getAttribute("data-popper-placement"),
|
||||||
|
"right"
|
||||||
|
);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
Loading…
Reference in New Issue
Block a user