mirror of
https://github.com/cpvalente/ontime.git
synced 2026-09-11 00:59:35 +00:00
feat: download
- able to download file from express
This commit is contained in:
@@ -1,6 +1,21 @@
|
|||||||
import axios from 'axios';
|
import axios from 'axios';
|
||||||
import { eventsURL } from '../api/apiConstants';
|
import { eventsURL } from '../api/apiConstants';
|
||||||
|
|
||||||
|
export const downloadEvents = async () => {
|
||||||
|
await axios({
|
||||||
|
url: eventsURL + '/download',
|
||||||
|
method: 'GET',
|
||||||
|
responseType: 'blob', // important
|
||||||
|
}).then((response) => {
|
||||||
|
const url = window.URL.createObjectURL(new Blob([response.data]));
|
||||||
|
const link = document.createElement('a');
|
||||||
|
link.href = url;
|
||||||
|
link.setAttribute('download', 'events.json');
|
||||||
|
document.body.appendChild(link);
|
||||||
|
link.click();
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
export const fetchAllEvents = async () => {
|
export const fetchAllEvents = async () => {
|
||||||
const res = await axios.get(eventsURL);
|
const res = await axios.get(eventsURL);
|
||||||
return res.data;
|
return res.data;
|
||||||
|
|||||||
@@ -0,0 +1,18 @@
|
|||||||
|
import { IconButton } from '@chakra-ui/button';
|
||||||
|
import { FiDownload } from 'react-icons/fi';
|
||||||
|
|
||||||
|
export default function DownloadIconBtn(props) {
|
||||||
|
const { clickhandler, ...rest } = props;
|
||||||
|
return (
|
||||||
|
<IconButton
|
||||||
|
size={props.size || 'xs'}
|
||||||
|
icon={<FiDownload />}
|
||||||
|
isRound
|
||||||
|
variant='outline'
|
||||||
|
onClick={clickhandler}
|
||||||
|
_focus={{ boxShadow: 'none' }}
|
||||||
|
colorScheme='whiteAlpha'
|
||||||
|
{...rest}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -9,6 +9,8 @@ import { useDisclosure } from '@chakra-ui/hooks';
|
|||||||
import SettingsModal from '../modals/SettingsModal';
|
import SettingsModal from '../modals/SettingsModal';
|
||||||
import SettingsIconBtn from 'common/components/buttons/SettingsIconBtn';
|
import SettingsIconBtn from 'common/components/buttons/SettingsIconBtn';
|
||||||
import { useEffect } from 'react';
|
import { useEffect } from 'react';
|
||||||
|
import DownloadIconBtn from 'common/components/buttons/DownloadIconBtn';
|
||||||
|
import { downloadEvents } from 'app/api/eventsApi';
|
||||||
|
|
||||||
export default function Editor() {
|
export default function Editor() {
|
||||||
const { isOpen, onOpen, onClose } = useDisclosure();
|
const { isOpen, onOpen, onClose } = useDisclosure();
|
||||||
@@ -18,6 +20,11 @@ export default function Editor() {
|
|||||||
document.title = 'ontime - Editor';
|
document.title = 'ontime - Editor';
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
|
const handleDownload = () => {
|
||||||
|
console.log('debug download');
|
||||||
|
downloadEvents();
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<SettingsModal isOpen={isOpen} onClose={onClose} />
|
<SettingsModal isOpen={isOpen} onClose={onClose} />
|
||||||
@@ -67,6 +74,7 @@ export default function Editor() {
|
|||||||
<Box className={styles.settings}>
|
<Box className={styles.settings}>
|
||||||
<div className={styles.content}>
|
<div className={styles.content}>
|
||||||
<SettingsIconBtn size='md' clickhandler={onOpen} />
|
<SettingsIconBtn size='md' clickhandler={onOpen} />
|
||||||
|
<DownloadIconBtn size='md' clickhandler={handleDownload} />
|
||||||
</div>
|
</div>
|
||||||
</Box>
|
</Box>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -101,6 +101,12 @@
|
|||||||
padding-top: 1.5em;
|
padding-top: 1.5em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.settings > .content {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
.cornerButtonContainer {
|
.cornerButtonContainer {
|
||||||
position: relative;
|
position: relative;
|
||||||
top: -4.5em;
|
top: -4.5em;
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
// Create controller for GET request to '/ontime/download'
|
||||||
|
// Returns -
|
||||||
|
export const eventsDownload = async (req, res) => {
|
||||||
|
res.download('db.json', 'ontime events.json', (err) => {
|
||||||
|
if (err) {
|
||||||
|
res.status(500).send({
|
||||||
|
message: 'Could not download the file. ' + err,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
import express from 'express';
|
||||||
|
export const router = express.Router();
|
||||||
|
|
||||||
|
// create route between controller and '/ontime/download' endpoint
|
||||||
|
router.get('/download', eventsDownload);
|
||||||
Reference in New Issue
Block a user