diff --git a/ui/app/templates/components/toolbar-download-button.hbs b/ui/app/templates/components/toolbar-download-button.hbs deleted file mode 100644 index b7fd647a7d..0000000000 --- a/ui/app/templates/components/toolbar-download-button.hbs +++ /dev/null @@ -1,2 +0,0 @@ -{{@actionText}} - \ No newline at end of file diff --git a/ui/app/templates/vault/cluster/init.hbs b/ui/app/templates/vault/cluster/init.hbs index 047795d132..a998a3df30 100644 --- a/ui/app/templates/vault/cluster/init.hbs +++ b/ui/app/templates/vault/cluster/init.hbs @@ -90,11 +90,11 @@ {{/if}} diff --git a/ui/app/templates/vault/cluster/policy/show.hbs b/ui/app/templates/vault/cluster/policy/show.hbs index 4422df40f0..7ea4179e24 100644 --- a/ui/app/templates/vault/cluster/policy/show.hbs +++ b/ui/app/templates/vault/cluster/policy/show.hbs @@ -23,12 +23,15 @@ - + > + Download policy + + {{#if (and (not-eq this.model.id "root") (or this.capabilities.canUpdate this.capabilities.canDelete))}} Edit policy diff --git a/ui/lib/core/addon/components/download-button.hbs b/ui/lib/core/addon/components/download-button.hbs new file mode 100644 index 0000000000..492809856e --- /dev/null +++ b/ui/lib/core/addon/components/download-button.hbs @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/ui/lib/core/addon/components/download-button.js b/ui/lib/core/addon/components/download-button.js index 326ea6fc5c..39737574f4 100644 --- a/ui/lib/core/addon/components/download-button.js +++ b/ui/lib/core/addon/components/download-button.js @@ -1,51 +1,62 @@ -import Component from '@ember/component'; -import { computed } from '@ember/object'; -import hbs from 'htmlbars-inline-precompile'; +import { action } from '@ember/object'; +import Component from '@glimmer/component'; +/** + * @module DownloadButton + * DownloadButton components are an action button used to download data. Both the action text and icon are yielded. + * + * @example + * ```js + * + * + * Download + * + * ``` + * @param {string} data - data to download + * @param {boolean} [stringify=false] - argument to stringify the data before passing to the File constructor + * @param {string} [filename] - name of file that prefixes the ISO timestamp generated when download + * @param {string} [mime='text/plain'] - media type to be downloaded + * @param {string} [extension='txt'] - file extension + */ -export default Component.extend({ - layout: hbs`{{#if (has-block)}} {{yield}} {{else}} {{actionText}} {{/if}}`, - tagName: 'a', - role: 'button', - attributeBindings: ['role', 'download', 'href'], - download: computed('filename', 'extension', function () { - return `${this.filename}-${new Date().toISOString()}.${this.extension}`; - }), +export default class DownloadButton extends Component { + get extension() { + return this.args.extension || 'txt'; + } - fileLike: computed('data', 'mime', 'stringify', 'download', function () { - let file; - let data = this.data; - const filename = this.download; - const mime = this.mime; - if (this.stringify) { - data = JSON.stringify(data, null, 2); + get mime() { + return this.args.mime || 'text/plain'; + } + + get filename() { + const defaultFilename = `${new Date().toISOString()}.${this.extension}`; + return this.args.filename ? this.args.filename + '-' + defaultFilename : defaultFilename; + } + + get data() { + if (this.args.stringify) { + return JSON.stringify(this.args.data, null, 2); } - if (window.navigator.msSaveOrOpenBlob) { - file = new Blob([data], { type: mime }); - file.name = filename; - } else { - file = new File([data], filename, { type: mime }); - } - return file; - }), + return this.args.data; + } - href: computed('fileLike', function () { - return window.URL.createObjectURL(this.fileLike); - }), - - click(event) { - if (!window.navigator.msSaveOrOpenBlob) { - return; - } - event.preventDefault(); - const file = this.fileLike; - //lol whyyyy - window.navigator.msSaveOrOpenBlob(file, file.name); - }, - - actionText: 'Download', - data: null, - filename: null, - mime: 'text/plain', - extension: 'txt', - stringify: false, -}); + // TODO refactor and call service instead + @action + handleDownload() { + const { document, URL } = window; + const downloadElement = document.createElement('a'); + const content = new File([this.data], this.filename, { type: this.mime }); + downloadElement.download = this.filename; + downloadElement.href = URL.createObjectURL(content); + document.body.appendChild(downloadElement); + downloadElement.click(); + URL.revokeObjectURL(downloadElement.href); + downloadElement.remove(); + } +} diff --git a/ui/lib/core/addon/components/toolbar-download-button.js b/ui/lib/core/addon/components/toolbar-download-button.js deleted file mode 100644 index ceb301e7bf..0000000000 --- a/ui/lib/core/addon/components/toolbar-download-button.js +++ /dev/null @@ -1,21 +0,0 @@ -/** - * @module ToolbarSecretLink - * `ToolbarSecretLink` styles SecretLink for the Toolbar. - * It should only be used inside of `Toolbar`. - * - * @example - * ```js - * - * - * - * - * - * ``` - * - */ - -import DownloadButton from './download-button'; - -export default DownloadButton.extend({ - classNames: ['toolbar-link'], -}); diff --git a/ui/lib/core/app/components/toolbar-download-button.js b/ui/lib/core/app/components/toolbar-download-button.js deleted file mode 100644 index 1a8170f2a4..0000000000 --- a/ui/lib/core/app/components/toolbar-download-button.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from 'core/components/toolbar-download-button'; diff --git a/ui/lib/kmip/addon/templates/configuration.hbs b/ui/lib/kmip/addon/templates/configuration.hbs index a00223a1c4..cf88f5084d 100644 --- a/ui/lib/kmip/addon/templates/configuration.hbs +++ b/ui/lib/kmip/addon/templates/configuration.hbs @@ -2,12 +2,15 @@ {{#if this.model}} - + > + Download CA cert + + {{/if}} Configure diff --git a/ui/tests/integration/components/toolbar-download-button-test.js b/ui/tests/integration/components/toolbar-download-button-test.js deleted file mode 100644 index 4a82fcadca..0000000000 --- a/ui/tests/integration/components/toolbar-download-button-test.js +++ /dev/null @@ -1,17 +0,0 @@ -import { module, test } from 'qunit'; -import { setupRenderingTest } from 'ember-qunit'; -import { render } from '@ember/test-helpers'; -import { isPresent } from 'ember-cli-page-object'; -import hbs from 'htmlbars-inline-precompile'; - -module('Integration | Component | toolbar-download-button', function (hooks) { - setupRenderingTest(hooks); - - test('it renders', async function (assert) { - await render(hbs``); - - assert.dom(this.element).hasText('Link'); - assert.ok(isPresent('.toolbar-link')); - assert.ok(isPresent('.icon')); - }); -});