17782: Fixes absolute import paths from '~/somedir/...' to 'somedir/...'
[arvados-workbench2.git] / src / views-components / context-menu / actions / download-action.tsx
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 import * as React from 'react';
6 import { ListItemIcon, ListItemText, ListItem } from '@material-ui/core';
7 import { DownloadIcon } from '../../../components/icon/icon';
8 import * as JSZip from 'jszip';
9 import * as FileSaver from 'file-saver';
10 import axios from 'axios';
11
12 export const DownloadAction = (props: { href?: any, download?: any, onClick?: () => void, kind?: string, currentCollectionUuid?: string; }) => {
13     const downloadProps = props.download ? { download: props.download } : {};
14
15     const createZip = (fileUrls: string[], download: string[]) => {
16         let id = 1;
17         const zip = new JSZip();
18         const filteredFileUrls = fileUrls
19             .filter((href: string) => {
20                 const letter = href.split('').pop();
21                 return letter !== '/';
22             });
23
24         filteredFileUrls
25             .map((href: string) => {
26                 axios.get(href).then(response => response).then(({ data }: any) => {
27                     const splittedByDot = href.split('.');
28                     if (splittedByDot[splittedByDot.length - 1] !== 'json') {
29                         if (filteredFileUrls.length === id) {
30                             zip.file(download[id - 1], data);
31                             zip.generateAsync({ type: 'blob' }).then((content) => {
32                                 FileSaver.saveAs(content, `download-${props.currentCollectionUuid}.zip`);
33                             });
34                         } else {
35                             zip.file(download[id - 1], data);
36                             zip.generateAsync({ type: 'blob' });
37                         }
38                     } else {
39                         zip.file(download[id - 1], JSON.stringify(data));
40                         zip.generateAsync({ type: 'blob' });
41                     }
42                     id++;
43                 });
44             });
45     };
46
47     return props.href || props.kind === 'files'
48         ? <a
49             style={{ textDecoration: 'none' }}
50             href={props.kind === 'files' ? undefined : `${props.href}&disposition=attachment`}
51             onClick={props.onClick}
52             {...downloadProps}>
53             <ListItem button onClick={() => props.kind === 'files' ? createZip(props.href, props.download) : undefined}>
54                 {props.kind !== 'files' ?
55                     <ListItemIcon>
56                         <DownloadIcon />
57                     </ListItemIcon> : <span />}
58                 <ListItemText>
59                     {props.kind === 'files' ? 'Download selected' : 'Download'}
60                 </ListItemText>
61             </ListItem>
62         </a>
63         : null;
64 };