From 72e3d29abcd305417c6dac5e21de5ecd0f4b4f81 Mon Sep 17 00:00:00 2001 From: claire bontempo <68122737+hellobontempo@users.noreply.github.com> Date: Thu, 8 Jul 2021 08:21:10 -0700 Subject: [PATCH] Truncate Secret Engine Description Text (#11995) Co-authored-by: hashishaw --- changelog/11995.txt | 3 + ui/app/styles/components/linkable-item.scss | 21 ++ ui/app/styles/components/read-more.scss | 18 ++ ui/app/styles/core.scss | 2 + .../vault/cluster/secrets/backends.hbs | 218 +++++++----------- ui/lib/core/addon/components/linkable-item.js | 22 ++ .../addon/components/linkable-item/content.js | 30 +++ .../addon/components/linkable-item/menu.js | 21 ++ ui/lib/core/addon/components/read-more.js | 38 +++ .../templates/components/linkable-item.hbs | 17 ++ .../components/linkable-item/content.hbs | 49 ++++ .../components/linkable-item/menu.hbs | 3 + .../addon/templates/components/read-more.hbs | 20 ++ ui/lib/core/app/components/linkable-item.js | 1 + .../app/components/linkable-item/content.js | 1 + .../core/app/components/linkable-item/menu.js | 1 + ui/lib/core/app/components/read-more.js | 1 + ui/lib/core/stories/linkable-item.md | 26 +++ ui/lib/core/stories/linkable-item.stories.js | 47 ++++ ui/lib/core/stories/read-more.stories.js | 19 ++ ui/package.json | 1 + .../secrets/backend/alicloud/secret-test.js | 1 + .../components/linkable-item-test.js | 83 +++++++ .../integration/components/read-more-test.js | 50 ++++ ui/tests/pages/secrets/backends.js | 2 +- ui/yarn.lock | 50 ++++ 26 files changed, 613 insertions(+), 132 deletions(-) create mode 100644 changelog/11995.txt create mode 100644 ui/app/styles/components/linkable-item.scss create mode 100644 ui/app/styles/components/read-more.scss create mode 100644 ui/lib/core/addon/components/linkable-item.js create mode 100644 ui/lib/core/addon/components/linkable-item/content.js create mode 100644 ui/lib/core/addon/components/linkable-item/menu.js create mode 100644 ui/lib/core/addon/components/read-more.js create mode 100644 ui/lib/core/addon/templates/components/linkable-item.hbs create mode 100644 ui/lib/core/addon/templates/components/linkable-item/content.hbs create mode 100644 ui/lib/core/addon/templates/components/linkable-item/menu.hbs create mode 100644 ui/lib/core/addon/templates/components/read-more.hbs create mode 100644 ui/lib/core/app/components/linkable-item.js create mode 100644 ui/lib/core/app/components/linkable-item/content.js create mode 100644 ui/lib/core/app/components/linkable-item/menu.js create mode 100644 ui/lib/core/app/components/read-more.js create mode 100644 ui/lib/core/stories/linkable-item.md create mode 100644 ui/lib/core/stories/linkable-item.stories.js create mode 100644 ui/lib/core/stories/read-more.stories.js create mode 100644 ui/tests/integration/components/linkable-item-test.js create mode 100644 ui/tests/integration/components/read-more-test.js diff --git a/changelog/11995.txt b/changelog/11995.txt new file mode 100644 index 000000000..ccabb849d --- /dev/null +++ b/changelog/11995.txt @@ -0,0 +1,3 @@ +```release-note:improvement +ui: Show description on secret engine list +``` \ No newline at end of file diff --git a/ui/app/styles/components/linkable-item.scss b/ui/app/styles/components/linkable-item.scss new file mode 100644 index 000000000..a691a6d07 --- /dev/null +++ b/ui/app/styles/components/linkable-item.scss @@ -0,0 +1,21 @@ +.linkable-item { + display: grid; + grid-template-columns: minmax(0, 1fr) 50px 35px; + gap: 1em 1em; +} + +.linkable-item-menu { + box-sizing: border-box; + grid-column: 3; + grid-row: 1; + align-self: center; +} + +.overflow-ellipsis { + box-sizing: border-box; + &.is-closed { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } +} diff --git a/ui/app/styles/components/read-more.scss b/ui/app/styles/components/read-more.scss new file mode 100644 index 000000000..a7ea33f90 --- /dev/null +++ b/ui/app/styles/components/read-more.scss @@ -0,0 +1,18 @@ +.linkable-item-seemore { + grid-column: 2; + grid-row: 1; + align-self: baseline; +} + +.overflow-ellipsis { + box-sizing: border-box; + &.is-closed { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } +} + +.has-font-weight-normal { + font-weight: $font-weight-normal; +} diff --git a/ui/app/styles/core.scss b/ui/app/styles/core.scss index 31a825cb9..a2d5b1aba 100644 --- a/ui/app/styles/core.scss +++ b/ui/app/styles/core.scss @@ -65,6 +65,7 @@ @import './components/kmip-role-edit'; @import './components/known-secondaries-card.scss'; @import './components/license-banners'; +@import './components/linkable-item'; @import './components/linked-block'; @import './components/list-item-row'; @import './components/list-pagination'; @@ -81,6 +82,7 @@ @import './components/radio-card'; @import './components/radial-progress'; @import './components/raft-join'; +@import './components/read-more'; @import './components/regex-validator'; @import './components/replication-dashboard'; @import './components/replication-doc-link'; diff --git a/ui/app/templates/vault/cluster/secrets/backends.hbs b/ui/app/templates/vault/cluster/secrets/backends.hbs index fb0657311..0b17badd7 100644 --- a/ui/app/templates/vault/cluster/secrets/backends.hbs +++ b/ui/app/templates/vault/cluster/secrets/backends.hbs @@ -11,7 +11,7 @@ + > Enable new engine @@ -24,138 +24,94 @@ "vault.cluster.secrets.backend.overview" "vault.cluster.secrets.backend.list-root" )) as |backendLink|}} - {{#linked-block - backendLink - backend.id - class="list-item-row" - data-test-secret-backend-row=backend.id - }} -
-
-
- - - - - -
- {{backend.engineType}} -
-
-
- - {{backend.path}} - -
- - {{#if (eq backend.options.version 2)}} - v2 - {{/if}} - - - {{backend.accessor}} - -
-
-
-
- - - - - -
-
-
- {{/linked-block}} + + + + + + + + + + {{/let}} {{/each}} + {{#each unsupportedBackends as |backend|}} -
-
-
-
-
- - - + + + + +
- - {{backend.accessor}} - -
-
-
-
- - - - - -
-
-
-
+ + + + + + + {{/each}} diff --git a/ui/lib/core/addon/components/linkable-item.js b/ui/lib/core/addon/components/linkable-item.js new file mode 100644 index 000000000..ae38c301f --- /dev/null +++ b/ui/lib/core/addon/components/linkable-item.js @@ -0,0 +1,22 @@ +/** + * @module LinkableItem + * LinkableItem components have two contextual components, a Content component used to show information on the left with a Menu component on the right, all aligned vertically centered. If passed a link, the block will be clickable. + * + * @example + * ```js + * + * // Use and here + * + * ``` + * + * @param {object} [link=null] - Link should have route and model + * @param {boolean} [disabled=false] - If no link then should be given a disabled attribute equal to true + */ + +import Component from '@glimmer/component'; +import layout from '../templates/components/linkable-item'; +import { setComponentTemplate } from '@ember/component'; + +class LinkableItemComponent extends Component {} + +export default setComponentTemplate(layout, LinkableItemComponent); diff --git a/ui/lib/core/addon/components/linkable-item/content.js b/ui/lib/core/addon/components/linkable-item/content.js new file mode 100644 index 000000000..3f5558fef --- /dev/null +++ b/ui/lib/core/addon/components/linkable-item/content.js @@ -0,0 +1,30 @@ +/** + * @module Content + * Content components are contextual components of LinkableItem, used to display content on the left side of a LinkableItem component. + * + * @example + * ```js + * + * + * + * ``` + * @param {string} accessor=null - formatted as HTML tag + * @param {string} description=null - will truncate if wider than parent div + * @param {string} glyphText=null - tooltip for glyph + * @param {string} glyph=null - will display as icon beside the title + * @param {string} titl=null - if @link object is passed in then title will link to @link.route + */ + +import Component from '@glimmer/component'; +import layout from '../../templates/components/linkable-item/content'; +import { setComponentTemplate } from '@ember/component'; + +class ContentComponent extends Component {} + +export default setComponentTemplate(layout, ContentComponent); diff --git a/ui/lib/core/addon/components/linkable-item/menu.js b/ui/lib/core/addon/components/linkable-item/menu.js new file mode 100644 index 000000000..caddedbfc --- /dev/null +++ b/ui/lib/core/addon/components/linkable-item/menu.js @@ -0,0 +1,21 @@ +/** + * @module Menu + * Menu components are contextual components of LinkableItem, used to display a menu on the right side of a LinkableItem component. + * + * @example + * ```js + * + * + * Some menu here + * + * + * ``` + */ + +import Component from '@glimmer/component'; +import layout from '../../templates/components/linkable-item/menu'; +import { setComponentTemplate } from '@ember/component'; + +class MenuComponent extends Component {} + +export default setComponentTemplate(layout, MenuComponent); diff --git a/ui/lib/core/addon/components/read-more.js b/ui/lib/core/addon/components/read-more.js new file mode 100644 index 000000000..07cd2df44 --- /dev/null +++ b/ui/lib/core/addon/components/read-more.js @@ -0,0 +1,38 @@ +/** + * @module ReadMore + * ReadMore components are used to wrap long text that we'd like to show as one line initially with the option to expand and read. Text which is shorter than the surrounding div will not truncate or show the See More button. + * + * @example + * ```js + * My super long text goes in here + * ``` + */ + +import Component from '@glimmer/component'; +import layout from '../templates/components/read-more'; +import { setComponentTemplate } from '@ember/component'; +import { action } from '@ember/object'; +import { tracked } from '@glimmer/tracking'; + +class ReadMoreComponent extends Component { + @action + calculateOverflow(e) { + const spanText = e.querySelector('.description-block'); + if (spanText.offsetWidth > e.offsetWidth) { + this.hasOverflow = true; + } + } + + @tracked + isOpen = false; + + @tracked + hasOverflow = false; + + @action + toggleOpen() { + this.isOpen = !this.isOpen; + } +} + +export default setComponentTemplate(layout, ReadMoreComponent); diff --git a/ui/lib/core/addon/templates/components/linkable-item.hbs b/ui/lib/core/addon/templates/components/linkable-item.hbs new file mode 100644 index 000000000..873697073 --- /dev/null +++ b/ui/lib/core/addon/templates/components/linkable-item.hbs @@ -0,0 +1,17 @@ +
+ {{#if @disabled }} +
+ {{yield (hash content=(component 'linkable-item/content'))}} + {{yield (hash menu=(component 'linkable-item/menu'))}} +
+ {{else}} + + {{yield (hash content=(component 'linkable-item/content'))}} + {{yield (hash menu=(component 'linkable-item/menu'))}} + + {{/if}} +
diff --git a/ui/lib/core/addon/templates/components/linkable-item/content.hbs b/ui/lib/core/addon/templates/components/linkable-item/content.hbs new file mode 100644 index 000000000..088742be7 --- /dev/null +++ b/ui/lib/core/addon/templates/components/linkable-item/content.hbs @@ -0,0 +1,49 @@ +
+
+ {{#if @glyph}} + + + + + +
+ {{or @glyphText @title}} +
+
+
+ {{/if}} + + {{#if @title}} + {{#if @link}} + + {{@title}} + + {{else}} + {{@title}} + {{/if}} + {{/if}} +
+ {{#if @accessor}} + + {{@accessor}} + + {{/if}} + + {{#if @description}} + + {{@description}} + + {{/if}} + + {{yield}} +
diff --git a/ui/lib/core/addon/templates/components/linkable-item/menu.hbs b/ui/lib/core/addon/templates/components/linkable-item/menu.hbs new file mode 100644 index 000000000..50e91b3f0 --- /dev/null +++ b/ui/lib/core/addon/templates/components/linkable-item/menu.hbs @@ -0,0 +1,3 @@ +
+ {{yield}} +
\ No newline at end of file diff --git a/ui/lib/core/addon/templates/components/read-more.hbs b/ui/lib/core/addon/templates/components/read-more.hbs new file mode 100644 index 000000000..01836044d --- /dev/null +++ b/ui/lib/core/addon/templates/components/read-more.hbs @@ -0,0 +1,20 @@ +
+ + {{yield}} + + {{#if this.hasOverflow}} +
+ +
+ {{/if}} +
diff --git a/ui/lib/core/app/components/linkable-item.js b/ui/lib/core/app/components/linkable-item.js new file mode 100644 index 000000000..d0405c829 --- /dev/null +++ b/ui/lib/core/app/components/linkable-item.js @@ -0,0 +1 @@ +export { default } from 'core/components/linkable-item'; diff --git a/ui/lib/core/app/components/linkable-item/content.js b/ui/lib/core/app/components/linkable-item/content.js new file mode 100644 index 000000000..996f144d6 --- /dev/null +++ b/ui/lib/core/app/components/linkable-item/content.js @@ -0,0 +1 @@ +export { default } from 'core/components/linkable-item/content'; diff --git a/ui/lib/core/app/components/linkable-item/menu.js b/ui/lib/core/app/components/linkable-item/menu.js new file mode 100644 index 000000000..c95fca8ea --- /dev/null +++ b/ui/lib/core/app/components/linkable-item/menu.js @@ -0,0 +1 @@ +export { default } from 'core/components/linkable-item/menu'; diff --git a/ui/lib/core/app/components/read-more.js b/ui/lib/core/app/components/read-more.js new file mode 100644 index 000000000..cac58b44a --- /dev/null +++ b/ui/lib/core/app/components/read-more.js @@ -0,0 +1 @@ +export { default } from 'core/components/read-more'; diff --git a/ui/lib/core/stories/linkable-item.md b/ui/lib/core/stories/linkable-item.md new file mode 100644 index 000000000..a3bb73084 --- /dev/null +++ b/ui/lib/core/stories/linkable-item.md @@ -0,0 +1,26 @@ + + +## LinkableItem +LinkableItem components have two contextual components, a Content component used to show information on the left with a Menu component on the right, all aligned vertically centered. If passed a link, the block will be clickable. + +**Params** + +| Param | Type | Default | Description | +| --- | --- | --- | --- | +| [link] | object | | Link should have route and model | +| [disabled] | boolean | false | If no link then should be given a disabled attribute equal to true | + +**Example** + +```js + +// Use and here + +``` + +**See** + +- [Uses of LinkableItem](https://github.com/hashicorp/vault/search?l=Handlebars&q=LinkableItem+OR+linkable-item) +- [LinkableItem Source Code](https://github.com/hashicorp/vault/blob/master/ui/lib/core/addon/components/linkable-item.js) + +--- diff --git a/ui/lib/core/stories/linkable-item.stories.js b/ui/lib/core/stories/linkable-item.stories.js new file mode 100644 index 000000000..598380cf4 --- /dev/null +++ b/ui/lib/core/stories/linkable-item.stories.js @@ -0,0 +1,47 @@ +import hbs from 'htmlbars-inline-precompile'; +import { storiesOf } from '@storybook/ember'; +import { text, withKnobs, boolean } from '@storybook/addon-knobs'; +import notes from './linkable-item.md'; + +storiesOf('LinkableItem', module) + .addParameters({ options: { showPanel: true } }) + .addDecorator(withKnobs()) + .add( + `LinkableItem with attributes`, + () => ({ + template: hbs` +
Linkable Item
+ + + {{menu}} + + `, + context: { + disabled: boolean('disabled', false), + title: text('title', 'My Title'), + accessor: text('accessor', 'v2 secret'), + description: text( + 'description', + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam volutpat vulputate lacus sit amet lobortis. Nulla fermentum porta consequat. Mauris porttitor libero nibh, ac facilisis ex molestie non. Nulla dolor est, pharetra et maximus vel, varius eu augue. Maecenas eget nisl convallis, vehicula massa quis, pharetra justo. Praesent porttitor arcu at gravida dignissim. Vestibulum condimentum, risus a fermentum pulvinar, enim massa venenatis velit, a venenatis leo sem eget dolor. Morbi convallis dui sit amet egestas commodo. Nulla et ultricies leo.' + ), + menu: text('menu component', 'menu button goes here'), + }, + }), + { notes } + ) + .add( + `LinkableItem with blocks`, + () => ({ + template: hbs` +
Linkable Item with block content
+ + + {{menu}} + + `, + context: { + disabled: boolean('disabled', false), + }, + }), + { notes } + ); diff --git a/ui/lib/core/stories/read-more.stories.js b/ui/lib/core/stories/read-more.stories.js new file mode 100644 index 000000000..a1541bd2b --- /dev/null +++ b/ui/lib/core/stories/read-more.stories.js @@ -0,0 +1,19 @@ +import hbs from 'htmlbars-inline-precompile'; +import { storiesOf } from '@storybook/ember'; +import { withKnobs } from '@storybook/addon-knobs'; + +storiesOf('ReadMore', module) + .addParameters({ options: { showPanel: true } }) + .addDecorator(withKnobs()) + .add(`ReadMore`, () => ({ + template: hbs` +
Read More
+
NOTE: normally this component has a "See More" button when it truncates text, which is clickable and will expand the height of the outer box (shown here with a black outline).
+
+ + Anything can go in here Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam volutpat vulputate lacus sit amet lobortis. Nulla fermentum porta consequat. Mauris porttitor libero nibh, ac facilisis ex molestie non. Nulla dolor est, pharetra et maximus vel, varius eu augue. Maecenas eget nisl convallis, vehicula massa quis, pharetra justo. + +
+ `, + context: {}, + })); diff --git a/ui/package.json b/ui/package.json index 8a4363d47..3c98e76f9 100644 --- a/ui/package.json +++ b/ui/package.json @@ -44,6 +44,7 @@ "@babel/plugin-proposal-object-rest-spread": "^7.12.1", "@babel/plugin-transform-block-scoping": "^7.12.1", "@ember/optional-features": "^2.0.0", + "@ember/render-modifiers": "^1.0.2", "@glimmer/component": "^1.0.2", "@glimmer/tracking": "^1.0.2", "@hashicorp/structure-icons": "^1.3.0", diff --git a/ui/tests/acceptance/secrets/backend/alicloud/secret-test.js b/ui/tests/acceptance/secrets/backend/alicloud/secret-test.js index e1b5e3826..2e6c9827c 100644 --- a/ui/tests/acceptance/secrets/backend/alicloud/secret-test.js +++ b/ui/tests/acceptance/secrets/backend/alicloud/secret-test.js @@ -25,6 +25,7 @@ module('Acceptance | alicloud/enable', function(hooks) { await settled(); assert.equal(currentRouteName(), 'vault.cluster.secrets.backends', 'redirects to the backends page'); + await settled(); assert.ok(backendsPage.rows.filterBy('path', `${enginePath}/`)[0], 'shows the alicloud engine'); }); }); diff --git a/ui/tests/integration/components/linkable-item-test.js b/ui/tests/integration/components/linkable-item-test.js new file mode 100644 index 000000000..a82c49e26 --- /dev/null +++ b/ui/tests/integration/components/linkable-item-test.js @@ -0,0 +1,83 @@ +import { module, test } from 'qunit'; +import { setupRenderingTest } from 'ember-qunit'; +import { render } from '@ember/test-helpers'; +import { hbs } from 'ember-cli-htmlbars'; + +module('Integration | Component | linkable-item', function(hooks) { + setupRenderingTest(hooks); + + test('it renders anything passed in', async function(assert) { + await render(hbs``); + assert.equal(this.element.textContent.trim(), '', 'No content rendered'); + + await render(hbs` + + + stuff here + + + menu + + + `); + assert.dom('[data-test-linkable-item-content]').hasText('stuff here'); + assert.dom('[data-test-linkable-item-menu]').hasText('menu'); + }); + + test('it is not wrapped in a linked block if disabled is true', async function(assert) { + await render(hbs` + + + stuff here + + + `); + assert.dom('.list-item-row').exists('List item row exists'); + assert.dom('.list-item-row.linked-block').doesNotExist('Does not render linked block'); + assert.dom('[data-test-secret-path]').doesNotExist('Title is not rendered'); + assert.dom('[data-test-linkable-item-accessor]').doesNotExist('Accessor is not rendered'); + assert.dom('[data-test-linkable-item-accessor]').doesNotExist('Accessor is not rendered'); + assert.dom('[data-test-linkable-item-glyph]').doesNotExist('Glyph is not rendered'); + }); + + test('it is wrapped in a linked block if a link is passed', async function(assert) { + await render(hbs` + + + stuff here + + + `); + + assert.dom('.list-item-row.linked-block').exists('Renders linked block'); + }); + + test('it renders standard attributes on content', async function(assert) { + this.set('title', 'A Title'); + this.set('accessor', 'my accessor'); + this.set('description', 'my description'); + this.set('glyph', 'key'); + this.set('glyphText', 'Here is some extra info'); + + // Template block usage: + await render(hbs` + + + + `); + assert.dom('.list-item-row').exists('List item row exists'); + assert.dom('[data-test-secret-path]').hasText(this.title, 'Title is rendered'); + assert.dom('[data-test-linkable-item-accessor]').hasText(this.accessor, 'Accessor is rendered'); + assert.dom('[data-test-linkable-item-description]').hasText(this.description, 'Description is rendered'); + assert.dom('[data-test-linkable-item-glyph]').exists('Glyph is rendered'); + }); +}); diff --git a/ui/tests/integration/components/read-more-test.js b/ui/tests/integration/components/read-more-test.js new file mode 100644 index 000000000..ace032f94 --- /dev/null +++ b/ui/tests/integration/components/read-more-test.js @@ -0,0 +1,50 @@ +import { module, test } from 'qunit'; +import { setupRenderingTest } from 'ember-qunit'; +import { render, click } from '@ember/test-helpers'; +import { hbs } from 'ember-cli-htmlbars'; + +module('Integration | Component | read-more', function(hooks) { + setupRenderingTest(hooks); + + test('it renders', async function(assert) { + await render(hbs``); + assert.equal(this.element.textContent.trim(), ''); + }); + test('it can toggle open and closed when text is longer than parent', async function(assert) { + this.set( + 'description', + 'My super long template block text dignissim dictum sem, ut varius ligula lacinia quis.' + ); + await render(hbs` +
+ + {{this.description}} + +
+ `); + assert.dom('[data-test-readmore-content]').includesText(this.description); + assert.dom('[data-test-readmore-toggle]').exists('toggle exists'); + assert.dom('[data-test-readmore-toggle]').hasText('See More', 'Toggle should have text to see more'); + assert + .dom('.overflow-ellipsis.is-closed') + .exists('Overflow div has is-closed class when more text to show'); + await click('[data-test-readmore-toggle] button'); + assert.dom('.overflow-ellipsis').exists('Div with overflow class still exists'); + assert.dom('.overflow-ellipsis.is-closed').doesNotExist('Div with overflow class no longer is-closed'); + assert.dom('[data-test-readmore-toggle]').hasText('See Less', 'Toggle should have text to see less'); + }); + + test('it does not show show more button if parent is wider than content', async function(assert) { + this.set('description', 'Hello'); + await render(hbs` +
+ + {{this.description}} + +
+ `); + assert.dom('[data-test-readmore-content]').includesText(this.description); + assert.dom('[data-test-readmore-toggle]').doesNotExist('toggle exists'); + assert.dom('.overflow-ellipsis').exists('Overflow div exists'); + }); +}); diff --git a/ui/tests/pages/secrets/backends.js b/ui/tests/pages/secrets/backends.js index 555a4455a..4f6d20a89 100644 --- a/ui/tests/pages/secrets/backends.js +++ b/ui/tests/pages/secrets/backends.js @@ -2,7 +2,6 @@ import { create, visitable, collection, clickable, text } from 'ember-cli-page-o import uiPanel from 'vault/tests/pages/components/console/ui-panel'; export default create({ - console: uiPanel, consoleToggle: clickable('[data-test-console-toggle]'), visit: visitable('/vault/secrets'), rows: collection('[data-test-secret-backend-row]', { @@ -18,4 +17,5 @@ export default create({ confirmDisable: clickable('[data-test-confirm-button]', { testContainer: '#ember-testing', }), + console: uiPanel, }); diff --git a/ui/yarn.lock b/ui/yarn.lock index b75161606..20373c586 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -1228,6 +1228,14 @@ ember-cli-babel "^6.16.0" ember-compatibility-helpers "^1.1.1" +"@ember/render-modifiers@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@ember/render-modifiers/-/render-modifiers-1.0.2.tgz#2e87c48db49d922ce4850d707215caaac60d8444" + integrity sha512-6tEnHl5+62NTSAG2mwhGMFPhUrJQjoVqV+slsn+rlTknm2Zik+iwxBQEbwaiQOU1FUYxkS8RWcieovRNMR8inQ== + dependencies: + ember-cli-babel "^7.10.0" + ember-modifier-manager-polyfill "^1.1.0" + "@ember/test-helpers@^1.7.1": version "1.7.3" resolved "https://registry.yarnpkg.com/@ember/test-helpers/-/test-helpers-1.7.3.tgz#d06b36cb579b172186b11b236b90f0a1aba15ab0" @@ -7669,6 +7677,39 @@ ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.10.0, ember-cli-babel@^6.16.0, ember-cli-version-checker "^2.1.2" semver "^5.5.0" +ember-cli-babel@^7.10.0: + version "7.26.6" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.26.6.tgz#322fbbd3baad9dd99e3276ff05bc6faef5e54b39" + integrity sha512-040svtfj2RC35j/WMwdWJFusZaXmNoytLAMyBDGLMSlRvznudTxZjGlPV6UupmtTBApy58cEF8Fq4a+COWoEmQ== + dependencies: + "@babel/core" "^7.12.0" + "@babel/helper-compilation-targets" "^7.12.0" + "@babel/plugin-proposal-class-properties" "^7.13.0" + "@babel/plugin-proposal-decorators" "^7.13.5" + "@babel/plugin-transform-modules-amd" "^7.13.0" + "@babel/plugin-transform-runtime" "^7.13.9" + "@babel/plugin-transform-typescript" "^7.13.0" + "@babel/polyfill" "^7.11.5" + "@babel/preset-env" "^7.12.0" + "@babel/runtime" "7.12.18" + amd-name-resolver "^1.3.1" + babel-plugin-debug-macros "^0.3.4" + babel-plugin-ember-data-packages-polyfill "^0.1.2" + babel-plugin-ember-modules-api-polyfill "^3.5.0" + babel-plugin-module-resolver "^3.2.0" + broccoli-babel-transpiler "^7.8.0" + broccoli-debug "^0.6.4" + broccoli-funnel "^2.0.2" + broccoli-source "^2.1.2" + clone "^2.1.2" + ember-cli-babel-plugin-helpers "^1.1.1" + ember-cli-version-checker "^4.1.0" + ensure-posix-path "^1.0.2" + fixturify-project "^1.10.0" + resolve-package-path "^3.1.0" + rimraf "^3.0.1" + semver "^5.5.0" + ember-cli-browserstack@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/ember-cli-browserstack/-/ember-cli-browserstack-1.1.0.tgz#1d2bcf84370c196dc0c091ee65d54193072dadfc" @@ -8351,6 +8392,15 @@ ember-maybe-in-element@^0.4.0: dependencies: ember-cli-babel "^7.1.0" +ember-modifier-manager-polyfill@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/ember-modifier-manager-polyfill/-/ember-modifier-manager-polyfill-1.2.0.tgz#cf4444e11a42ac84f5c8badd85e635df57565dda" + integrity sha512-bnaKF1LLKMkBNeDoetvIJ4vhwRPKIIumWr6dbVuW6W6p4QV8ZiO+GdF8J7mxDNlog9CeL9Z/7wam4YS86G8BYA== + dependencies: + ember-cli-babel "^7.10.0" + ember-cli-version-checker "^2.1.2" + ember-compatibility-helpers "^1.2.0" + ember-native-dom-helpers@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/ember-native-dom-helpers/-/ember-native-dom-helpers-0.7.0.tgz#98a87c11a391cec5c12382a4857e59ea2fb4b00a"