mirror of
https://github.com/discourse/discourse.git
synced 2025-02-25 18:55:32 -06:00
DEV: Minor refactor of tooltip and menu services (#27466)
* use `TrackedSet` instead of `@tracked []` * correct return type annotations * move code to outside Promise blocks where possible * fix an outdated comment
This commit is contained in:
parent
3b653a918e
commit
b289351a3f
@ -1,12 +1,12 @@
|
||||
import { tracked } from "@glimmer/tracking";
|
||||
import { getOwner } from "@ember/application";
|
||||
import { action } from "@ember/object";
|
||||
import { schedule } from "@ember/runloop";
|
||||
import Service from "@ember/service";
|
||||
import { TrackedSet } from "@ember-compat/tracked-built-ins";
|
||||
import DMenuInstance from "float-kit/lib/d-menu-instance";
|
||||
|
||||
export default class Menu extends Service {
|
||||
@tracked registeredMenus = [];
|
||||
registeredMenus = new TrackedSet();
|
||||
|
||||
/**
|
||||
* Render a menu
|
||||
@ -25,7 +25,7 @@ export default class Menu extends Service {
|
||||
* @param {String} [options.groupIdentifier] - Only one menu with the same groupIdentifier can be open at a time
|
||||
* @param {Boolean} [options.inline] - Improves positioning for trigger that spans over multiple lines
|
||||
*
|
||||
* @returns {Promise<DMenuInstance>}
|
||||
* @returns {Promise<DMenuInstance | undefined>}
|
||||
*/
|
||||
@action
|
||||
async show() {
|
||||
@ -38,7 +38,7 @@ export default class Menu extends Service {
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
instance = this.registeredMenus.find(
|
||||
instance = [...this.registeredMenus].find(
|
||||
(registeredMenu) => registeredMenu.trigger === arguments[0]
|
||||
);
|
||||
|
||||
@ -66,20 +66,17 @@ export default class Menu extends Service {
|
||||
}
|
||||
|
||||
if (instance.expanded) {
|
||||
return await this.close(instance);
|
||||
await this.close(instance);
|
||||
return;
|
||||
}
|
||||
|
||||
await new Promise((resolve) => {
|
||||
if (!this.registeredMenus.includes(instance)) {
|
||||
this.registeredMenus = this.registeredMenus.concat(instance);
|
||||
}
|
||||
if (!this.registeredMenus.has(instance)) {
|
||||
this.registeredMenus.add(instance);
|
||||
}
|
||||
|
||||
instance.expanded = true;
|
||||
instance.expanded = true;
|
||||
|
||||
schedule("afterRender", () => {
|
||||
resolve();
|
||||
});
|
||||
});
|
||||
await new Promise((resolve) => schedule("afterRender", resolve));
|
||||
|
||||
return instance;
|
||||
}
|
||||
@ -89,10 +86,10 @@ export default class Menu extends Service {
|
||||
*
|
||||
* @param {String} identifier - the menu identifier to retrieve
|
||||
*
|
||||
* @returns {Promise<DMenuInstance>}
|
||||
* @returns {DMenuInstance | undefined}
|
||||
*/
|
||||
getByIdentifier(identifier) {
|
||||
return this.registeredMenus.find(
|
||||
return [...this.registeredMenus].find(
|
||||
(registeredMenu) => registeredMenu.options.identifier === identifier
|
||||
);
|
||||
}
|
||||
@ -105,7 +102,7 @@ export default class Menu extends Service {
|
||||
@action
|
||||
async close(menu) {
|
||||
if (typeof menu === "string") {
|
||||
menu = this.registeredMenus.find(
|
||||
menu = [...this.registeredMenus].find(
|
||||
(registeredMenu) => registeredMenu.options.identifier === menu
|
||||
);
|
||||
}
|
||||
@ -114,19 +111,13 @@ export default class Menu extends Service {
|
||||
return;
|
||||
}
|
||||
|
||||
await new Promise((resolve) => {
|
||||
menu.expanded = false;
|
||||
menu.expanded = false;
|
||||
|
||||
if (this.registeredMenus.includes(menu)) {
|
||||
this.registeredMenus = this.registeredMenus.filter(
|
||||
(registeredMenu) => registeredMenu !== menu
|
||||
);
|
||||
}
|
||||
if (this.registeredMenus.has(menu)) {
|
||||
this.registeredMenus.delete(menu);
|
||||
}
|
||||
|
||||
schedule("afterRender", () => {
|
||||
resolve();
|
||||
});
|
||||
});
|
||||
await new Promise((resolve) => schedule("afterRender", resolve));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1,12 +1,12 @@
|
||||
import { tracked } from "@glimmer/tracking";
|
||||
import { getOwner } from "@ember/application";
|
||||
import { action } from "@ember/object";
|
||||
import { schedule } from "@ember/runloop";
|
||||
import Service from "@ember/service";
|
||||
import { TrackedSet } from "@ember-compat/tracked-built-ins";
|
||||
import DTooltipInstance from "float-kit/lib/d-tooltip-instance";
|
||||
|
||||
export default class Tooltip extends Service {
|
||||
@tracked registeredTooltips = [];
|
||||
registeredTooltips = new TrackedSet();
|
||||
|
||||
/**
|
||||
* Render a tooltip
|
||||
@ -23,7 +23,7 @@ export default class Tooltip extends Service {
|
||||
* @param {String} [options.identifier] - Add a data-identifier attribute to the trigger and the content
|
||||
* @param {Boolean} [options.inline] - Improves positioning for trigger that spans over multiple lines
|
||||
*
|
||||
* @returns {Promise<DTooltipInstance>}
|
||||
* @returns {Promise<DTooltipInstance | undefined>}
|
||||
*/
|
||||
@action
|
||||
async show() {
|
||||
@ -36,7 +36,7 @@ export default class Tooltip extends Service {
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
instance = this.registeredTooltips.find(
|
||||
instance = [...this.registeredTooltips].find(
|
||||
(registeredTooltips) => registeredTooltips.trigger === arguments[0]
|
||||
);
|
||||
if (!instance) {
|
||||
@ -58,32 +58,29 @@ export default class Tooltip extends Service {
|
||||
}
|
||||
|
||||
if (instance.expanded) {
|
||||
return await this.close(instance);
|
||||
await this.close(instance);
|
||||
return;
|
||||
}
|
||||
|
||||
await new Promise((resolve) => {
|
||||
if (!this.registeredTooltips.includes(instance)) {
|
||||
this.registeredTooltips = this.registeredTooltips.concat(instance);
|
||||
}
|
||||
if (!this.registeredTooltips.has(instance)) {
|
||||
this.registeredTooltips.add(instance);
|
||||
}
|
||||
|
||||
instance.expanded = true;
|
||||
instance.expanded = true;
|
||||
|
||||
schedule("afterRender", () => {
|
||||
resolve();
|
||||
});
|
||||
});
|
||||
await new Promise((resolve) => schedule("afterRender", resolve));
|
||||
|
||||
return instance;
|
||||
}
|
||||
|
||||
/**
|
||||
* Closes the active tooltip
|
||||
* @param {DTooltipInstance} [tooltip] - the tooltip to close, if not provider will close any active tooltip
|
||||
* Closes the given tooltip
|
||||
* @param {DTooltipInstance | String} [tooltip | identifier] - the tooltip to close, can accept an instance or an identifier
|
||||
*/
|
||||
@action
|
||||
async close(tooltip) {
|
||||
if (typeof tooltip === "string") {
|
||||
tooltip = this.registeredTooltips.find(
|
||||
tooltip = [...this.registeredTooltips].find(
|
||||
(registeredTooltip) => registeredTooltip.options.identifier === tooltip
|
||||
);
|
||||
}
|
||||
@ -94,17 +91,11 @@ export default class Tooltip extends Service {
|
||||
|
||||
tooltip.expanded = false;
|
||||
|
||||
await new Promise((resolve) => {
|
||||
if (this.registeredTooltips.includes(tooltip)) {
|
||||
this.registeredTooltips = this.registeredTooltips.filter(
|
||||
(registeredTooltip) => registeredTooltip !== tooltip
|
||||
);
|
||||
}
|
||||
if (this.registeredTooltips.has(tooltip)) {
|
||||
this.registeredTooltips.delete(tooltip);
|
||||
}
|
||||
|
||||
schedule("afterRender", () => {
|
||||
resolve();
|
||||
});
|
||||
});
|
||||
await new Promise((resolve) => schedule("afterRender", resolve));
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user