/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre Departamento de Informatica - Universidade Federal do Parana This file is part of Plataforma Integrada MEC. Plataforma Integrada MEC is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Plataforma Integrada MEC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ import React, { useState, useEffect } from 'react'; import { Grid } from '@material-ui/core'; import styled from 'styled-components'; import axios from 'axios'; import Button from '@material-ui/core/Button'; import CheckBoxOutlineBlankIcon from '@material-ui/icons/CheckBoxOutlineBlank'; import CheckBoxIcon from '@material-ui/icons/CheckBox'; import GetAppIcon from '@material-ui/icons/GetApp'; import ResourceCardFunction from './ResourceCardFunction.js'; import FloatingDownloadButton from './FloatingDownloadButton.js'; import Snackbar from '@material-ui/core/Snackbar'; import MuiAlert from '@material-ui/lab/Alert'; import { apiUrl } from '../env.js'; function Alert(props) { return <MuiAlert elevation={6} variant="filled" {...props} />; } export default function ResourceList(props) { const [selected, setSelected] = useState(Array.apply( null, { length: props.resources.length }).map(i => false)); const [selectable, setSelectable] = useState(false); const [download_url, setDownloadUrl] = useState(''); const [snackInfo, setSnackInfo] = useState({ open: false, text: "", severity: "", }); const updateSelected = (index) => { let new_selected = selected.slice(); new_selected[index] = !new_selected[index]; setSelected(new_selected); } const handleSnackInfo = (info) => { setSnackInfo({ ...info }) } const checkBoxIcon = (s) => { if (s) return <CheckBoxIcon />; else return <CheckBoxOutlineBlankIcon />; } const handleDownloadSelection = (e) => { e.preventDefault() // const selected_resources = props.resources.filter(resource => selected[props.resources.indexOf(resource)]); let snackInfo = {} if (download_url) { window.open(download_url, '_blank') snackInfo = { open: true, text: "Os recursos estão sendo baixados...", severity: "success", } handleSnackInfo(snackInfo) } else { snackInfo = { open: true, text: "Selecione os recursos que deseja baixar", severity: "warning", } handleSnackInfo(snackInfo) } } const handleCloseSnack = () => { const snackInfo = { open: false, text: "", severity: "", } handleSnackInfo(snackInfo) } useEffect(() => { if (selectable) { var resources = [] let i = 0; while (i < props.resources.length) { if (selected[i]) resources.push({ "type": "LearningObject", "id": props.resources[i].id }); i++; } var body = { "package": { "object": resources } }; if (resources.length) axios .post(apiUrl + '/package', body) .catch(err => { if (err.response && err.response.status === 302) { setDownloadUrl(apiUrl.slice().replace('/v1', '') + '/' + err.response.data.url); } }); } }, [selected, selectable]); return ( <ResourceListContainer> <Grid container direction="row" justify="space-around" alignItems="center"> <Grid item> <Title> {props.resources.length ? props.resources.length + " recurso" + (props.resources.length === 1 ? "" : "s") : "Carregando coleção"} </Title> </Grid> <Grid item> <Button color="primary" onClick={() => setSelectable(!selectable)}> <PanelButtonText> {selectable ? "Desativar" : "Ativar"} seleção </PanelButtonText> </Button> </Grid> <Grid item> <Button color="primary" variant="outlined" startIcon={<GetAppIcon fontSize="large" />} onClick={handleDownloadSelection} > <PanelButtonText>baixar seleção</PanelButtonText> </Button> </Grid> </Grid> <Grid container direction="row" justify="center" alignItems="center"> {props.resources.map((card) => { return ( <ResourceGrid item key={card.title}> <ResourceCardFunction avatar={card.avatar} id={card.id} thumbnail={card.thumbnail} type={card.type ? card.type : "Outros"} title={card.title} published={card.state === "published" ? true : false} likeCount={card.likeCount} liked={card.liked} rating={card.rating} author={card.publisher} tags={card.tags} href={"/recurso/" + card.id} downloadableLink={card.downloadableLink} /> {selectable ? (<SelectButton variant="outline" color="primary" startIcon={checkBoxIcon(selected[props.resources.indexOf(card)])} onClick={() => updateSelected(props.resources.indexOf(card))} > Selecionar </SelectButton>) : <span></span>} </ResourceGrid> ); })} </Grid> <Snackbar open={snackInfo.open} autoHideDuration={6000} onClose={handleCloseSnack} anchorOrigin={{ vertical: 'top', horizontal: 'right' }} > <Alert onClose={handleCloseSnack} severity={snackInfo.severity}> {snackInfo.text} </Alert> </Snackbar> <FloatingDownloadButton handleDownloadSelection={handleDownloadSelection} /> </ResourceListContainer> ); } const ResourceListContainer = styled.div` margin-left: 20; margin-right: 20; ` const Title = styled.p` color: rgb(102, 102, 102); font-size: 2em; font-weigth: 300; ` const SelectButton = styled(Button)` width: 100%; ` const PanelButtonText = styled.span` font-weight: 900; ` const ResourceGrid = styled(Grid)` padding-right: 7px; `