wrap up #16

Merged
rozetko merged 5 commits from remove-columns into master 2 years ago
  1. 2
      package.json
  2. 20
      src/panels/corpglory-dataexporter-panel/components/Panel.tsx
  3. 1
      src/panels/corpglory-dataexporter-panel/types.ts
  4. 21
      src/services/api_service.ts

2
package.json

@ -1,6 +1,6 @@
{ {
"name": "corpglory-dataexporter-app", "name": "corpglory-dataexporter-app",
"version": "1.0.3", "version": "1.0.5",
"description": "", "description": "",
"scripts": { "scripts": {
"lint": "eslint --cache --ext .js,.jsx,.ts,.tsx --max-warnings=0 ./src", "lint": "eslint --cache --ext .js,.jsx,.ts,.tsx --max-warnings=0 ./src",

20
src/panels/corpglory-dataexporter-panel/components/Panel.tsx

@ -341,11 +341,6 @@ export function Panel({ width, height, timeRange, eventBus, timeZone }: Props) {
], ],
}, },
}, },
{
name: 'Status Updated At',
type: FieldType.number,
values: _.map(sortedTasks, (task) => convertTimestampToDate(task.progress?.time)),
},
{ {
name: 'From', name: 'From',
type: FieldType.number, type: FieldType.number,
@ -356,11 +351,6 @@ export function Panel({ width, height, timeRange, eventBus, timeZone }: Props) {
type: FieldType.number, type: FieldType.number,
values: _.map(sortedTasks, (task) => convertTimestampToDate(task.timeRange.to)), values: _.map(sortedTasks, (task) => convertTimestampToDate(task.timeRange.to)),
}, },
{
name: 'User',
type: FieldType.string,
values: _.map(sortedTasks, (task) => task.username),
},
{ {
name: 'Exported Rows', name: 'Exported Rows',
type: FieldType.number, type: FieldType.number,
@ -408,7 +398,7 @@ export function Panel({ width, height, timeRange, eventBus, timeZone }: Props) {
links: [ links: [
{ {
targetBlank: false, targetBlank: false,
title: 'Download', title: 'Delete',
url: '#', url: '#',
onClick: (event: DataLinkClickEvent) => onDeleteClick(event), onClick: (event: DataLinkClickEvent) => onDeleteClick(event),
}, },
@ -436,7 +426,7 @@ export function Panel({ width, height, timeRange, eventBus, timeZone }: Props) {
const sortedTasks = _.orderBy(tasks, (task) => task.progress?.time, 'desc'); const sortedTasks = _.orderBy(tasks, (task) => task.progress?.time, 'desc');
const taskToDelete = sortedTasks[rowIndex]; const taskToDelete = sortedTasks[rowIndex];
if (taskToDelete.progress?.status === ExportStatus.EXPORTING || taskToDelete.id === taskIdBeingDownloaded) { if (taskToDelete.progress?.status === ExportStatus.EXPORTING || taskToDelete.id === taskIdBeingDownloaded) {
appEvents.emit(AppEvents.alertError, ['Data Exporter', 'Active task can`t be deleted']); appEvents.emit(AppEvents.alertWarning, ['Data Exporter', 'Active task can`t be deleted']);
return; return;
} }
await deleteTask(taskToDelete?.id); await deleteTask(taskToDelete?.id);
@ -450,15 +440,15 @@ export function Panel({ width, height, timeRange, eventBus, timeZone }: Props) {
const sortedTasks = _.orderBy(tasks, (task) => task.progress?.time, 'desc'); const sortedTasks = _.orderBy(tasks, (task) => task.progress?.time, 'desc');
const task = sortedTasks[rowIndex]; const task = sortedTasks[rowIndex];
if (task.progress?.status === ExportStatus.EXPORTING || task.id === taskIdBeingDownloaded) { if (task.progress?.status === ExportStatus.EXPORTING || task.id === taskIdBeingDownloaded) {
appEvents.emit(AppEvents.alertError, ['Data Exporter', 'Active task can`t be downloaded']); appEvents.emit(AppEvents.alertWarning, ['Data Exporter', 'Active task can`t be downloaded']);
return; return;
} }
if (task.progress?.status === ExportStatus.ERROR) { if (task.progress?.status === ExportStatus.ERROR) {
appEvents.emit(AppEvents.alertError, ['Data Exporter', 'Failed task can`t be downloaded']); appEvents.emit(AppEvents.alertWarning, ['Data Exporter', 'Failed task can`t be downloaded']);
return; return;
} }
setTaskIdBeingDownloaded(task.id as string); setTaskIdBeingDownloaded(task.id as string);
await getStaticFile(task?.id); await getStaticFile(task?.filename);
setTaskIdBeingDownloaded(null); setTaskIdBeingDownloaded(null);
} }

1
src/panels/corpglory-dataexporter-panel/types.ts

@ -43,6 +43,7 @@ export type ExportTask = {
csvDelimiter: string; csvDelimiter: string;
progress?: ExportProgress; progress?: ExportProgress;
id?: string; id?: string;
filename?: string;
}; };
export type DashboardQuery = { export type DashboardQuery = {

21
src/services/api_service.ts

@ -1,5 +1,8 @@
import { ExportTask } from '../panels/corpglory-dataexporter-panel/types'; import { ExportTask } from '../panels/corpglory-dataexporter-panel/types';
import appEvents from 'grafana/app/core/app_events';
import { AppEvents } from '@grafana/data';
import axios from 'axios'; import axios from 'axios';
import * as _ from 'lodash'; import * as _ from 'lodash';
@ -55,24 +58,20 @@ export async function deleteTask(taskId?: string): Promise<void> {
await queryApi<ExportTask[]>('/task', { method: 'DELETE', data: { taskId } }); await queryApi<ExportTask[]>('/task', { method: 'DELETE', data: { taskId } });
} }
export async function getStaticFile(taskId?: string): Promise<void> { export async function getStaticFile(filename?: string): Promise<void> {
if (_.isEmpty(taskId)) { if (_.isEmpty(filename)) {
console.warn(`can't download file without taskId`); appEvents.emit(AppEvents.alertWarning, ['Data Exporter', 'Can`t download a file without filename']);
console.warn(`can't download file without filename`);
return; return;
} }
const respData = await queryApi(`/static/${taskId}.csv`, {});
// TODO: check if resp exists
// create file link in browser's memory
const href = URL.createObjectURL(new Blob([respData], { type: 'text/csv' }));
// create "a" HTML element with href to file & click // create "a" HTML element with href to file & click
const link = document.createElement('a'); const link = document.createElement('a');
link.href = href; link.href = `${API_PROXY_PREFIX}${API_PATH_PREFIX}/static/${filename}.csv`;
link.setAttribute('download', `${taskId}.csv`); link.target = '_blank';
link.download = `${filename}.csv`;
document.body.appendChild(link); document.body.appendChild(link);
link.click(); link.click();
// clean up "a" element & remove ObjectURL
document.body.removeChild(link); document.body.removeChild(link);
URL.revokeObjectURL(href);
} }

Loading…
Cancel
Save