diff --git a/frontend/src/components/Terminal.vue b/frontend/src/components/Terminal.vue index 4e63cdfcf..a35f87b81 100644 --- a/frontend/src/components/Terminal.vue +++ b/frontend/src/components/Terminal.vue @@ -1,24 +1,12 @@ @@ -63,13 +50,7 @@ import superagent from 'superagent'; -import Button from 'primevue/button'; -import Dialog from 'primevue/dialog'; -import InputText from 'primevue/inputtext'; -import Menu from 'primevue/menu'; -import ProgressSpinner from 'primevue/progressspinner'; - -import { TopBar, MainLayout, FileUploader } from 'pankow'; +import { Button, Dialog, FileUploader, InputDialog, MainLayout, TopBar } from 'pankow'; import '@xterm/xterm/css/xterm.css'; import { Terminal } from '@xterm/xterm'; @@ -86,10 +67,8 @@ export default { Button, Dialog, FileUploader, - InputText, + InputDialog, MainLayout, - Menu, - ProgressSpinner, TopBar }, data() { @@ -108,51 +87,50 @@ export default { name: '', socket: null, terminal: null, - downloadFileDialog: { - busy: false, - name: '', - error: '', - downloadUrl: '', - visible: false, - } + downloadFileDownloadUrl: '' }; }, methods: { + onFatalError(errorMessage) { + this.fatalError = errorMessage; + this.$refs.fatalErrorDialog.open(); + }, // generic dialog focus handler TODO move to pankow and reuse in filemanger onDialogShow(focusElementId) { setTimeout(() => document.getElementById(focusElementId).focus(), 0); }, - onDownload() { - this.downloadFileDialog.busy = false; - this.downloadFileDialog.name = ''; - this.downloadFileDialog.error = ''; - this.downloadFileDialog.downloadUrl = ''; - this.downloadFileDialog.visible = true; - }, - async onDownloadFileDialogSubmit() { - this.downloadFileDialog.busy = true; + async onDownload() { + this.downloadFileDownloadUrl = ''; + + const downloadFileName = await this.$refs.inputDialog.prompt({ + message: this.$t('terminal.downloadAction'), + value: '', + confirmStyle: 'success', + confirmLabel: this.$t('terminal.download.download'), + rejectLabel: this.$t('main.dialog.cancel'), + modal: false + }); + + if (!downloadFileName) return; try { const result = await superagent.head(`${this.apiOrigin}/api/v1/apps/${this.id}/download`).query({ - file: this.downloadFileDialog.name, + file: downloadFileName, access_token: this.accessToken }); } catch (error) { - this.downloadFileDialog.busy = false; - - if (error.status === 404) this.downloadFileDialog.error = 'The requested file does not exist.'; + if (error.status === 404) console.error('The requested file does not exist.'); else console.error('Failed', error); return; } - this.downloadFileDialog.downloadUrl = `${this.apiOrigin}/api/v1/apps/${this.id}/download?file=${encodeURIComponent(this.downloadFileDialog.name)}&access_token=${this.accessToken}`; + this.downloadFileDownloadUrl = `${this.apiOrigin}/api/v1/apps/${this.id}/download?file=${encodeURIComponent(downloadFileName)}&access_token=${this.accessToken}`; // we have to click the link to make the browser do the download // don't know how to prevent the browsers this.$nextTick(() => { document.getElementById('fileDownloadLink').click(); - this.downloadFileDialog.visible = false; }); }, onUpload() { @@ -247,11 +225,6 @@ export default { this.terminal.loadAddon(new AttachAddon(this.socket)); - // Let the browser handle paste - // this.terminal.attachCustomKeyEventHandler((event) => { - // if (event.key === 'V' && (event.ctrlKey || event.metaKey)) return false; - // }); - this.socket.addEventListener('open', (event) => { this.connected = true; }); @@ -298,14 +271,13 @@ export default { this.schedulerMenuModel = !app.manifest.addons.scheduler ? [] : Object.keys(app.manifest.addons.scheduler).map((k) => { return { - label: () => k, - command: () => this.terminalInject('scheduler', app.manifest.addons.scheduler[k].command) + label: k, + action: () => this.terminalInject('scheduler', app.manifest.addons.scheduler[k].command) }; }); } catch (e) { console.error(`Failed to get app info for ${this.id}:`, e); - this.fatalError = `Unknown app ${this.id}. Cannot continue.`; - return; + return this.onFatalError(`Unknown app ${this.id}. Cannot continue.`); } window.document.title = `Terminal - ${this.name}`; diff --git a/frontend/src/terminal.js b/frontend/src/terminal.js index e8d1f6595..3416b0d3c 100644 --- a/frontend/src/terminal.js +++ b/frontend/src/terminal.js @@ -5,16 +5,7 @@ import './style.css'; import '@fontsource/noto-sans'; -import 'primevue/resources/themes/saga-blue/theme.css'; -// import 'primevue/resources/themes/arya-blue/theme.css'; -import 'primevue/resources/primevue.min.css'; -import 'primeicons/primeicons.css'; - - -import PrimeVue from 'primevue/config'; -import ConfirmationService from 'primevue/confirmationservice'; import superagent from 'superagent'; -import Tooltip from 'primevue/tooltip'; import Terminal from './components/Terminal.vue'; @@ -56,9 +47,6 @@ const i18n = createI18n({ const app = createApp(Terminal); app.use(i18n); - app.use(PrimeVue, { ripple: true }); - app.use(ConfirmationService); - app.directive('tooltip', Tooltip); app.mount('#app'); })();