Skip to content

Commit e9073ff

Browse files
core: frontend: LogManager: Prevent download and delete from running concurrently
Disable download button while deleting and vice versa to prevent file operation conflicts. Closes bluerobotics#3642 Signed-off-by: Patrick José Pereira <patrickelectric@gmail.com>
1 parent b64f29f commit e9073ff

File tree

1 file changed

+23
-10
lines changed

1 file changed

+23
-10
lines changed

core/frontend/src/components/logs/LogManager.vue

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
v-tooltip="'Download selected logs'"
1919
icon
2020
color="success"
21-
:disabled="disable_batch_operations"
21+
:disabled="disable_batch_operations || deleting"
2222
@click="downloadSelectedLogs"
2323
>
2424
<v-icon>mdi-download-multiple</v-icon>
@@ -27,7 +27,7 @@
2727
v-tooltip="'Delete selected logs'"
2828
icon
2929
color="error"
30-
:disabled="disable_batch_operations"
30+
:disabled="disable_batch_operations || downloading"
3131
@click="removeLogs"
3232
>
3333
<v-icon>mdi-trash-can</v-icon>
@@ -58,6 +58,7 @@
5858
<v-btn
5959
v-tooltip="'Download log'"
6060
icon
61+
:disabled="deleting"
6162
@click="downloadLogs([item])"
6263
>
6364
<v-icon>mdi-download</v-icon>
@@ -97,6 +98,8 @@ export default Vue.extend({
9798
available_logs: [] as FilebrowserFile[],
9899
logs_fetched: false,
99100
selected_logs: [] as FilebrowserFile[],
101+
deleting: false,
102+
downloading: false,
100103
headers: [
101104
{
102105
text: 'Name',
@@ -156,23 +159,33 @@ export default Vue.extend({
156159
(log) => ['.bin', '.tlog'].includes(log.extension.toLowerCase()) && log.size > 100,
157160
)
158161
},
159-
downloadSelectedLogs(): void {
160-
this.downloadLogs(this.selected_logs)
162+
async downloadSelectedLogs(): Promise<void> {
163+
await this.downloadLogs(this.selected_logs)
161164
this.selected_logs = []
162165
},
163-
downloadLogs(logs: FilebrowserFile[]): void {
164-
filebrowser.downloadFiles(logs)
166+
async downloadLogs(logs: FilebrowserFile[]): Promise<void> {
167+
if (this.downloading) return
168+
this.downloading = true
169+
try {
170+
await filebrowser.downloadFiles(logs)
171+
} finally {
172+
this.downloading = false
173+
}
165174
},
166175
printSize(size_bytes: number): string {
167176
return prettifySize(size_bytes / 1024)
168177
},
169178
async removeLogs(): Promise<void> {
170179
if (this.selected_logs.isEmpty()) return
171180
172-
await filebrowser.deleteFiles(this.selected_logs)
173-
174-
await this.fetchAvailableLogs()
175-
this.selected_logs = []
181+
this.deleting = true
182+
try {
183+
await filebrowser.deleteFiles(this.selected_logs)
184+
await this.fetchAvailableLogs()
185+
this.selected_logs = []
186+
} finally {
187+
this.deleting = false
188+
}
176189
},
177190
async replay_log(log: FilebrowserFile): Promise<void> {
178191
const log_url = encodeURIComponent(await filebrowser.singleFileRelativeURL(log))

0 commit comments

Comments
 (0)