Files
vault/ui/lib/core/addon/components/text-file.js
claire bontempo e61bd967e3 Add docfy for addon components (#27188)
* move script to scripts folder

* add docfy to router and scripts

* add docfy to router and scripts

* fix jsdoc syntax

* add component markdown files to gitignore

* improve error handling for scripts

* tidy up remaining jsdoc syntax

* add sample jsdoc components

* add known issue info

* make not using multi-line components clearer

* make generating docs clearer

* update copy

* final how to docfy cleanup

* fix ts file @module syntax

* fix read more syntax

* make docfy typescript compatible
2024-05-29 14:06:38 -07:00

75 lines
2.2 KiB
JavaScript

/**
* Copyright (c) HashiCorp, Inc.
* SPDX-License-Identifier: BUSL-1.1
*/
import Component from '@glimmer/component';
import { action } from '@ember/object';
import { tracked } from '@glimmer/tracking';
import { guidFor } from '@ember/object/internals';
import { buildWaiter } from '@ember/test-waiters';
/**
* @module TextFile
* `TextFile` components render a file upload input with the option to toggle a "Enter as text" button
* that changes the input into a textarea
*
* @example
* <TextFile @uploadOnly={{true}} @helpText="help text" @onChange={{this.handleChange}} @label="PEM Bundle" />
*
* @param {function} onChange - Callback function to call when the value of the input changes, returns an object in the shape of { value: fileContents, filename: 'some-file.txt' }
* @param {bool} [uploadOnly=false] - When true, renders a static file upload input and removes the option to toggle and input plain text
* @param {string} [helpText] - Text underneath label.
* @param {string} [label=File] - Text to use as the label for the file input. If none, default of 'File' is rendered
*/
const waiter = buildWaiter('text-file');
export default class TextFileComponent extends Component {
@tracked content = '';
@tracked filename = '';
@tracked uploadError = '';
@tracked showTextArea = false;
elementId = guidFor(this);
async readFile(file) {
const waiterToken = waiter.beginAsync();
try {
this.content = await file.text();
this.filename = file.name;
this.handleChange();
} catch (error) {
this.clearFile();
this.uploadError = 'There was a problem uploading. Please try again.';
} finally {
waiter.endAsync(waiterToken);
}
}
@action
handleFileUpload(e) {
e.preventDefault();
const { files } = e.target;
if (!files.length) return;
this.readFile(files[0]);
}
@action
handleTextInput(e) {
e.preventDefault();
this.content = e.target.value;
this.handleChange();
}
@action
clearFile() {
this.content = '';
this.filename = '';
this.handleChange();
}
handleChange() {
this.args.onChange({ value: this.content, filename: this.filename });
this.uploadError = '';
}
}