blob: 592de5d422261a49df4017edb64f361aa601017b [file] [log] [blame]
<!--
Copyright (c) 2020 Contributors to the Eclipse Foundation
See the NOTICE file(s) distributed with this work for additional
information regarding copyright ownership.
This program and the accompanying materials are made available under the
terms of the Eclipse Public License 2.0 which is available at
http://www.eclipse.org/legal/epl-2.0
SPDX-License-Identifier: EPL-2.0
-->
<template xmlns:v-clipboard="http://www.w3.org/1999/xhtml">
<el-container style="height: 100%">
<el-dialog
:title="this.getAddFileTitle()"
:visible.sync="transferViewVisible"
width="40%" :close-on-click-modal=false>
<TransferFile :fileType="currentMenuItem" :transferViewVisible="transferViewVisible"
@transferFileFinishNotify="()=>{this.transferViewVisible = false; this.go(1)}"
style="margin-top: -20px"/>
</el-dialog>
<el-header>
<view-menu subject="finder"
:fileType="currentMenuItem"
:title="this.getAddFileTitle()"
@chooseMenu="item => this.currentMenuItem= item"
@addFile="() => this.transferViewVisible = true"/>
</el-header>
<el-dialog
:title="$t('jifa.prompt')"
:visible="true"
v-if="fileToDelete"
width="25%"
:before-close="cancelDelete">
<span style="font-size: 20px; color: #e6a23c"><i class="el-icon-warning"/> &nbsp;</span>
<span style="font-size: 18px">{{ $t('jifa.deletePrompt') }}</span>
<span slot="footer" class="dialog-footer">
<el-button @click="cancelDelete">{{ $t('jifa.cancel') }}</el-button>
<el-button @click="doDelete" type="primary">{{ $t('jifa.confirm') }}</el-button>
</span>
</el-dialog>
<el-main v-loading.fullscreen.lock="loading" style="height: 100%">
<el-row type="flex" v-for="row in rows" :key="row">
<el-col :span="6" v-for="col in (row < rows ? cols : colsOfLastRow)" :key="col">
<el-card class="box-card" shadow="hover" style="margin: 20px">
<div>
<el-row type="flex">
<el-col :span="16">
<p style='font-size: 15px; margin:0 auto; white-space: nowrap; text-overflow:ellipsis; overflow:hidden;
color: #606266;'>
<i class="el-icon-document"></i>
{{file(row, col).displayName ? file(row, col).displayName : file(row, col).name}}
</p>
</el-col>
<el-col :span="8" align="right">
<span>
<el-link icon="el-icon-document-copy" v-clipboard:copy="file(row, col).name"
:underline="false" target="_blank"/>
</span>
<span v-if="file(row,col).hasOwnProperty('displayName')">
<el-divider direction="vertical"></el-divider>
<el-link icon="el-icon-edit" :underline="false" @click="updateFile(file(row,col))"/>
</span>
<span v-if="file(row,col).hasOwnProperty('shared')">
<el-divider direction="vertical"></el-divider>
<el-link :icon="file(row, col).shared ? 'el-icon-unlock' : 'el-icon-lock'"
v-on:click="toggleSharedState(file(row, col))"
:underline="false"
target="_blank"/>
</span>
<span v-if="downloadable(file(row,col))">
<el-divider direction="vertical"></el-divider>
<el-link icon="el-icon-download" :underline="false"
:href="service('/file/download/' + currentMenuItem + '/' + file(row, col).name)"
target="_blank"/>
</span>
<span v-if="canDelete(file(row,col))">
<el-divider direction="vertical"></el-divider>
<el-link icon="el-icon-delete" :underline="false"
v-on:click="fileToDelete = file(row, col).name"/>
</span>
</el-col>
</el-row>
<el-row :align='"middle"' type="flex">
<el-col :span="12">
<p style="font-size: 12px; margin: 10px auto 7px; white-space: nowrap; color: #606266;" align="left">
{{toSizeString(file(row, col).size)}}</p>
</el-col>
<el-col :span="12">
<p style="font-size: 12px; margin:10px auto 7px; white-space: nowrap; color: #606266;" align="right">
{{formatDate(new Date(file(row, col).creationTime), "yyyy-MM-dd HH:mm:ss")}}</p>
</el-col>
</el-row>
<el-row>
<hr style="margin: 0 auto 7px;"/>
</el-row>
<el-row type="flex" justify="space-around" style="margin-bottom: -15px">
<el-col :span="8" align="middle"
v-if="file(row, col).transferState === 'NOT_STARTED' || file(row, col).transferState ==='IN_PROGRESS'">
<el-button type="text"><i class="el-icon-loading"></i> {{$t('jifa.transferring')}}</el-button>
</el-col>
<el-col :span="8" align="middle"
v-if="file(row, col).transferState === 'ERROR'">
<el-button type="text"><i class="el-icon-error"></i> {{$t('jifa.transferError')}}</el-button>
</el-col>
<el-col :span="8" align="middle"
v-if="file(row, col).transferState === 'SUCCESS'">
<router-link
:to="{path : analysisPath() , query: {file: file(row, col).name, displayName: file(row, col).displayName} }">
<el-button type="text"><i class="el-icon-view"></i> {{$t('jifa.analyze')}}</el-button>
</router-link>
</el-col>
</el-row>
</div>
</el-card>
</el-col>
</el-row>
<el-row type="flex" justify="space-around" style="margin-top: 77px">
<el-col :span="8">
<el-pagination
background
layout="prev, pager, next"
:current-page="page"
:page-size="pageSize"
:total="totalSize"
@current-change="handleCurrentPageChange"
hide-on-single-page
align="center">
</el-pagination>
</el-col>
</el-row>
</el-main>
<el-footer>
<Footer/>
</el-footer>
</el-container>
</template>
<script>
import axios from 'axios'
import Footer from "./footer"
import {formatDate} from 'element-ui/src/utils/date-util'
import {service, toSizeString} from '../util'
import TransferFile from './transferFile'
import ViewMenu from './menu/ViewMenu'
const defaultMenuItem = 'HEAP_DUMP'
export default {
components: {TransferFile, ViewMenu, Footer},
data() {
return {
files: [],
cols: 4,
rows: 0,
colsOfLastRow: 0,
page: 0,
pageSize: 12,
totalSize: 0,
loading: false,
defaultMenuItem,
transferViewVisible: false,
fileToDelete: null,
currentMenuItem: defaultMenuItem,
}
},
methods: {
getAddFileTitle() {
switch (this.currentMenuItem) {
case "HEAP_DUMP":
return this.$i18n.t('jifa.addHeapDumpFile');
default:
return this.$i18n.t('jifa.addFile');
}
},
file(row, col) {
return this.files[(row - 1) * this.cols + col - 1]
},
service,
formatDate,
toSizeString,
handleCurrentPageChange(page) {
this.go(page)
},
analysisPath() {
let lowered = this.currentMenuItem.toLowerCase().split("_");
if (lowered.length === 0) {
return "";
} else if (lowered.length === 1) {
return lowered[0];
}
let finalPath = lowered[0];
for (let i = 1; i < lowered.length; i++) {
if (lowered[i].length === 0) {
continue;
}
finalPath += lowered[i][0].toUpperCase();
if (lowered[i].length > 1) {
finalPath += lowered[i].substring(1);
}
}
return finalPath;
},
go(page) {
this.page = page
this.fetchFiles()
},
toggleSharedState(file) {
let formData = new FormData()
formData.append('name', file.name)
axios.post(service(file.shared ? "/file/unsetShared" : "/file/setShared"),
new URLSearchParams(formData)).then(() => {
file.shared = !file.shared
})
},
downloadable(file) {
return file.downloadble && this.transferIsSuccess(file)
},
transferIsSuccess(file) {
return file.transferState === 'SUCCESS'
},
canDelete(file) {
return file.transferState === 'SUCCESS' || file.transferState === 'ERROR'
},
cancelDelete() {
this.fileToDelete = null
this.$message({
type: 'info',
message: this.$t('jifa.deleteCanceled'),
duration: 1000
});
},
doDelete() {
if (!this.fileToDelete) {
return
}
let formData = new FormData()
formData.append('type', this.currentMenuItem)
formData.append('name', this.fileToDelete)
axios.post(service("/file/delete"), new URLSearchParams(formData)).then(() => {
this.fileToDelete = null
this.$message({
message: this.$t('jifa.deleteSuccessPrompt'),
type: 'success',
duration: 500,
onClose: () => {
if (this.files.length === 1) {
this.go(this.page > 1 ? this.page - 1 : this.page)
} else {
this.go(this.page)
}
}
});
}).catch(() => {
this.fileToDelete = null
this.$message({
message: this.$t('jifa.deleteFailedPrompt'),
type: 'error',
duration: 1000
});
})
},
fetchFiles() {
this.loading = true;
axios.get(service('/files'), {
params: {
type: this.currentMenuItem,
page: this.page,
pageSize: this.pageSize
}
}).then(resp => {
this.files = resp.data.data
this.totalSize = resp.data.totalSize
if (this.files.length > 0) {
this.rows = Math.ceil(this.files.length / this.cols)
let mod = this.files.length % this.cols
this.colsOfLastRow = mod > 0 ? mod : this.cols
} else {
this.rows = 0
this.colsOfLastRow = 0
}
this.loading = false
})
},
updateFile(file) {
this.$prompt('New display name: ', 'Edit', {
confirmButtonText: this.$t("jifa.confirm"),
cancelButtonText: this.$t('jifa.cancel'),
inputValue: file.displayName
}).then(({value}) => {
let formData = new FormData()
formData.append('name', file.name)
formData.append('displayName', value)
axios.post(service("/file/updateDisplayName"), new URLSearchParams(formData))
.then(() => {
this.go(this.page)
})
})
}
},
watch: {
currentMenuItem() {
this.go(1)
},
},
created() {
this.go(1)
}
}
</script>