diff --git a/backend/Controllers/DownloadController.php b/backend/Controllers/DownloadController.php index 163dce5..451c793 100644 --- a/backend/Controllers/DownloadController.php +++ b/backend/Controllers/DownloadController.php @@ -78,6 +78,19 @@ class DownloadController 'binary' ); + // @codeCoverageIgnoreStart + if (APP_ENV == 'development') { + $streamedResponse->headers->set( + 'Access-Control-Allow-Origin', + $request->headers->get('Origin') + ); + $streamedResponse->headers->set( + 'Access-Control-Allow-Credentials', + 'true' + ); + } + // @codeCoverageIgnoreEnd + // close session so we can continue streaming, note: dev is single-threaded $this->session->save(); diff --git a/frontend/api/api.js b/frontend/api/api.js index 464cff2..00e7132 100644 --- a/frontend/api/api.js +++ b/frontend/api/api.js @@ -1,4 +1,5 @@ import axios from 'axios' +import { Base64 } from 'js-base64' const api = { getConfig() { @@ -190,6 +191,13 @@ const api = { .catch(error => reject(error)) }) }, + downloadItem (params) { + return new Promise((resolve, reject) => { + axios.get('download&path='+encodeURIComponent(Base64.encode(params.path))) + .then(res => resolve(res.data)) + .catch(error => reject(error)) + }) + }, } export default api diff --git a/frontend/mixins/shared.js b/frontend/mixins/shared.js index c93140f..ea072be 100644 --- a/frontend/mixins/shared.js +++ b/frontend/mixins/shared.js @@ -1,6 +1,8 @@ +import Vue from 'vue' import moment from 'moment' import store from '../store.js' import api from '../api/api' +import { Base64 } from 'js-base64' import english from '../translations/english' import spanish from '../translations/spanish' @@ -46,7 +48,7 @@ const funcs = { let args = rest if(!available_languages[language] || available_languages[language][term] == undefined) { // translation required - return 'TR: '+term + return term } return available_languages[language][term].replace(/{(\d+)}/g, function(match, number) { return typeof args[number] != 'undefined' @@ -116,7 +118,10 @@ const funcs = { type: 'is-danger', duration: 5000, }) - } + }, + getDownloadLink(path) { + return Vue.config.baseURL+'/download&path='+encodeURIComponent(Base64.encode(path)) + }, } } diff --git a/frontend/translations/english.js b/frontend/translations/english.js index 5105115..c47a7d1 100644 --- a/frontend/translations/english.js +++ b/frontend/translations/english.js @@ -70,6 +70,7 @@ const data = { 'Updated': 'Updated', 'Deleted': 'Deleted', 'Your file is ready': 'Your file is ready', + 'View': 'View', } export default data diff --git a/frontend/views/Browser.vue b/frontend/views/Browser.vue index c10cbda..4ea7465 100644 --- a/frontend/views/Browser.vue +++ b/frontend/views/Browser.vue @@ -113,6 +113,9 @@ {{ lang('Download') }} + + {{ lang('View') }} + {{ lang('Copy') }} @@ -151,11 +154,11 @@ import Vue from 'vue' import Menu from './partials/Menu' import Tree from './partials/Tree' +import Preview from './partials/Preview' import Pagination from './partials/Pagination' import Upload from './partials/Upload' import api from '../api/api' import VueClipboard from 'vue-clipboard2' -import { Base64 } from 'js-base64' import _ from 'lodash' Vue.use(VueClipboard) @@ -250,7 +253,7 @@ export default { if (item.type == 'dir' || item.type == 'back') { this.goTo(item.path) } else { - this.download(item) + this.preview(item) } }, selectDir() { @@ -335,17 +338,19 @@ export default { this.handleError(error) }) }, - getDownloadLink(item) { - return Vue.config.baseURL+'/download&path='+encodeURIComponent(Base64.encode(item.path)) - }, download(item) { - window.open(this.getDownloadLink(item), '_blank') + window.open(this.getDownloadLink(item.path), '_blank') }, search() { // TODO: create search logic }, - edit() { - // TODO: create edit file logic + preview(item) { + this.$modal.open({ + parent: this, + props: { item: item }, + hasModalCard: true, + component: Preview, + }) }, isArchive(item) { return item.type == 'file' && item.name.split('.').pop() == 'zip' diff --git a/frontend/views/partials/Preview.vue b/frontend/views/partials/Preview.vue new file mode 100644 index 0000000..af21841 --- /dev/null +++ b/frontend/views/partials/Preview.vue @@ -0,0 +1,65 @@ +/* eslint-disable */ +