import Component from '@ember/component'; import { computed } from '@ember/object'; import { htmlSafe } from '@ember/template'; import layout from '../templates/components/confirm'; import { next } from '@ember/runloop'; /** * @module Confirm * `Confirm` components prevent users from performing actions they do not intend to by showing a confirmation message as an overlay. This is a contextual component that should always be rendered with a `Message` which triggers the message. * * @example * ```js *
* * * *
* ``` */ export default Component.extend({ layout, openTrigger: null, height: 0, focusTrigger: null, style: computed('height', function () { return htmlSafe(`height: ${this.height}px`); }), wormholeReference: null, wormholeId: computed('elementId', function () { return `confirm-${this.elementId}`; }), didInsertElement() { this._super(...arguments); this.set('wormholeReference', this.element.querySelector(`#${this.wormholeId}`)); }, didRender() { this._super(...arguments); this.updateHeight(); }, updateHeight: function () { const height = this.openTrigger ? this.element.querySelector('.confirm-overlay').clientHeight : this.element.querySelector('.confirm').clientHeight; this.set('height', height); }, actions: { onTrigger: function (itemId, e) { this.set('openTrigger', itemId); // store a reference to the trigger so we can focus the element // after clicking cancel this.set('focusTrigger', e.target); this.updateHeight(); }, onCancel: function () { this.set('openTrigger', ''); this.updateHeight(); next(() => { this.focusTrigger.focus(); this.set('focusTrigger', null); }); }, }, });