UNPKG

coupdoeil

Version:

Javascript for Ruby on Rails Coupdoeil gem

141 lines (115 loc) 3.83 kB
import {triggeredOnHover} from "./attributes" import {CLOSING_DELAY_MS} from "./config" import {leave} from "el-transition" import {addToCurrents, CURRENT_POPOVERS_BY_ID, removeFromCurrents} from "./current" function detachFromParent(controller) { if (controller.parent) { controller.parent.children.delete(controller) controller.parent = null } } export function cancelOpenCloseActions(controller) { cancelOpening(controller) cancelCloseRequest(controller) } function cancelOpening(controller) { delete controller.coupdoeilElement.openingPopover } export function cancelCloseRequest(controller) { clearTimeout(controller.closingRequest) controller.closingRequest = null addToCurrents(controller.coupdoeilElement) } export function closeNow(controller, allowAnimation = true) { if (controller.closing || (controller.isClosed && !controller.coupdoeilElement.openingPopover)) return controller.closing = true cancelOpenCloseActions(controller) controller.children.forEach((childController) => { closeNow(childController) }) detachFromParent(controller) if (allowAnimation && controller.card && controller.card.dataset.animation) { closeWithAnimation(controller) } else { closeWithoutAnimation(controller) } } async function closeWithAnimation(controller) { await leave(controller.card, 'popover') closeWithoutAnimation(controller) } function closeWithoutAnimation(controller) { if (controller.card) { controller.card.remove() controller.card = null } delete controller.closing delete controller.coupdoeilElement.dataset.popoverOpen } export function clear(controller) { closeNow(controller, false) } export function closeLater(controller) { cancelOpenCloseActions(controller) controller.closingRequest = setTimeout(() => { closeNow(controller) }, CLOSING_DELAY_MS) } export function closeChildrenNow(controller) { controller.children.forEach((childController) => { closeNow(childController) }) } export function closeChildrenLater(controller) { controller.children.forEach((childController) => { closeLater(childController) }) } export function closeOnHoverChildrenLater(controller) { controller.children.forEach((childController) => { if (triggeredOnHover(childController)) { closeLater(childController) } }) } export function closeAllNow() { for (const coupdoeilElement of CURRENT_POPOVERS_BY_ID.values()) { closeNow(coupdoeilElement.popoverController) removeFromCurrents(coupdoeilElement) } } export function clearAll() { for (const coupdoeilElement of CURRENT_POPOVERS_BY_ID.values()) { clear(coupdoeilElement.popoverController) removeFromCurrents(coupdoeilElement) } } export function closeTriggeredOnHoverNow() { for (const coupdoeilElement of CURRENT_POPOVERS_BY_ID.values()) { if (triggeredOnHover(coupdoeilElement.popoverController)) { closeNow(coupdoeilElement.popoverController) removeFromCurrents(coupdoeilElement) } } } export function closeTriggeredOnHoverLater() { for (const coupdoeilElement of CURRENT_POPOVERS_BY_ID.values()) { if (triggeredOnHover(coupdoeilElement.popoverController)) { closeLater(coupdoeilElement.popoverController) removeFromCurrents(coupdoeilElement) } } } export function closeTriggeredOnHoverNowUnlessAncestor(controller) { let topMostParent = controller while (topMostParent.parent) { topMostParent = topMostParent.parent } const idToSkip = topMostParent.coupdoeilElement.uniqueId for (const coupdoeilElement of CURRENT_POPOVERS_BY_ID.values()) { if (coupdoeilElement.uniqueId !== idToSkip && triggeredOnHover(coupdoeilElement.popoverController)) { closeNow(coupdoeilElement.popoverController) removeFromCurrents(coupdoeilElement) } } }