From dd9dae4d071f66146500af1792b3a6c4bb3a4e13 Mon Sep 17 00:00:00 2001 From: Lucas Schoenfelder <les17@inf.ufpr.br> Date: Tue, 26 May 2020 12:04:03 -0300 Subject: [PATCH] added create collection form and made collections view scrollable --- src/Components/GuardarModal.js | 396 +++++++++++++++++++++++++++++++++ 1 file changed, 396 insertions(+) create mode 100644 src/Components/GuardarModal.js diff --git a/src/Components/GuardarModal.js b/src/Components/GuardarModal.js new file mode 100644 index 00000000..49b96262 --- /dev/null +++ b/src/Components/GuardarModal.js @@ -0,0 +1,396 @@ +/*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, {useContext, useState} from 'react'; +import { Button } from '@material-ui/core'; +import Modal from '@material-ui/core/Modal'; +import Backdrop from '@material-ui/core/Backdrop'; +import Fade from '@material-ui/core/Fade'; +import styled from 'styled-components' +import SignUpContainer from './SignUpContainerFunction.js' +import {Store} from '../Store.js' +import axios from 'axios' +import {apiUrl, apiDomain} from '../env'; +import CloseIcon from '@material-ui/icons/Close'; +import Grid from '@material-ui/core/Grid'; +import PublicIcon from '@material-ui/icons/Public'; +import LockIcon from '@material-ui/icons/Lock'; +import LoadingSpinner from './LoadingSpinner.js' +import CriarColecaoForm from './CriarColecaoForm.js' + +function CloseModalButton (props) { + return ( + <StyledCloseModalButton onClick={props.handleClose}> + <CloseIcon/> + </StyledCloseModalButton> + ) +} + +function getConfig () { + let config = { + headers : { + 'Accept': 'application/json', + 'Content-Type': 'application/json', + 'Access-Token': sessionStorage.getItem('@portalmec/accessToken'), + 'Client': sessionStorage.getItem('@portalmec/clientToken'), + 'Uid': sessionStorage.getItem('@portalmec/uid') + } + } + return config +} + +export default function ReportModal (props) { + const {state} = useContext(Store) + const [collsArr, setcolls] = useState([]) + const [loading, toggleLoading] = useState(true) + const [creatingCol, setCreating] = useState(false) + + const getCols = () => { + if (collsArr.length === 0) { + const id = state.currentUser.id + const config = getConfig() + + axios.get( (`${apiUrl}/users/` + id + '/collections'), config + ).then( (response) => { + if ( response.headers['access-token'] ) { + sessionStorage.setItem('@portalmec/accessToken', response.headers['access-token']) + } + console.log(response) + setcolls(response.data) + toggleLoading(false) + }, (error) => {console.log('error')}) + } + } + + const postToCol = (colId) => { + const config = getConfig() + const payload = { + "collection" : { + "items" : [ {"id":props.recursoId, "type":"LearningObject"} ] + } + } + + axios.post( (`${apiUrl}/collections/` + colId + '/items'), payload, config + ).then( (response) => { + if ( response.headers['access-token'] ) { + sessionStorage.setItem('@portalmec/accessToken', response.headers['access-token']) + } + console.log(response) + props.handleSnackbar(4) + setCreating(false) + props.handleClose() + }, (error) => {console.log(error)}) + } + + return ( + <StyledModal + aria-labelledby="transition-modal-title" + aria-describedby="transition-modal-description" + open={props.open} + animation={true} + centered={true} + onClose={props.handleClose} + closeAfterTransition + BackdropComponent={Backdrop} + BackdropProps={{ + timeout: 500, + }} + onRendered={() => {getCols()}} + > + <Fade in={props.open}> + <Container> + <Header> + <span style={{width:"32px"}}/> + <h2>Guardar recurso</h2> + <CloseModalButton handleClose={props.handleClose}/> + </Header> + <Content style={{paddingTop : "0"}}> + <ResourceInfo> + <img src={apiDomain + props.thumb} alt="thumbnail recurso"/> + <div className="text"> + <h3>{props.title}</h3> + </div> + </ResourceInfo> + { + loading ? + ( + <LoadingSpinner text="Carregando coleções"/> + ) + : + ( + <ChooseColContainer> + { + creatingCol ? + ( + <CriarColecaoForm + handleClose={() => setCreating(false)} + finalize = {postToCol} + /> + ) + : + ( + state.currentUser.collectionsCount === 0 ? + ( + <> + <div classname="no-cols"> + <h2>Você não possui coleções ainda.</h2> + </div> + </> + ) + : + ( + <> + <ChooseCol> + <h2>Escolha uma Coleção: </h2> + <div className="cols-list"> + { + collsArr.map(collection => + <div className="row" key={collection.id}> + <div style={{display : "flex", flexDirection : "row", justifyContent : "space-between", alignItems : "center"}}> + { + collection.privacy === "public" ? + <PublicIcon className="icon"/> + : <LockIcon className="icon"/> + } + <h5>{collection.name}</h5> + </div> + <GuardarBotao onClick={() => {postToCol(collection.id)}}>GUARDAR</GuardarBotao> + </div> + ) + } + </div> + </ChooseCol> + <div style={{display : "flex", justifyContent : "center"}}> + <CriarColButton onClick={() => {setCreating(true)}}>CRIAR COLEÇÃO</CriarColButton> + </div> + </> + ) + + ) + } + </ChooseColContainer> + ) + } + </Content> + </Container> + </Fade> + </StyledModal> + ) +} + +const GuardarBotao = styled(Button)` + &:hover { + background-color : #503096 !important; + } + max-height : 36px !important; + background-color : #673ab7 !important; + color : #fff !important; + box-shadow : 0 2px 5px 0 rgba(0,0,0,.26) !important; + padding-left : 32px !important; + padding-right : 32px !important; +` + +const ChooseCol = styled.div` + display : flex; + flex-direction : column; + h2 { + margin-top : 20px; + margin-bottom : 10px; + font-size : 24px; + font-weight : 500; + } + + .icon { + vertical-align : middle !important; + font-weight : normal !important; + font-style : normal !important; + font-size : 24px !important; + line-height : 1 !important; + letter-spacing : normal !important; + text-transform : none !important; + display : inline-block !important; + white-space : nowrap !important; + word-wrap : normal !important; + direction : ltr !important; + padding-right : 2px; + } + + .cols-list { + overflow-x : hidden; + overflow-y : auto; + + .row { + display : flex; + flex-direction : row; + padding : 10px; + border-radius : 5px; + max-height : 60px; + align-items : center; + align-content : center; + max-width : 100%; + justify-content : space-between; + + h5 { + padding : 0 20px; + margin : 0; + font-size : 14px; + font-weight : 600; + } + } + } +` + +const CriarColButton = styled(Button)` + width : 200px !important; + margin-top : 16px !important; + background-color : #673ab7 !important; + margin-left : auto !important; + margin-right : auto !important; + color : #fff !important; + font-weight : 600 !important; + box-shadow : !important; + padding-left : 0 2px 5px 0 rgba(0,0,0,.26) 16px !important; + padding-right : 16px !important; +` + +const ChooseColContainer = styled.div` + display : flex; + flex-direction : column; + color : #666; + + .no-cols { + align-self : center; + margin-top : 20px; + margin-bottom : 30px; + font-size : 24px; + font-weight : 500; + } +` + +const ResourceInfo = styled.div` + margin-top : 0; + background-color : #f4f4f4; + overflow : hidden; + border-radius : 5px; + display : flex; + flex-direction : row; + align-items : center; + align-content : center; + max-wdith : 100%; + justify-content : space-between; + + .text { + max-height : 100%; + max-width : 66.66%; + display : flex; + flex-direction : column; + text-align : center; + + h3 { + font-size : 20px; + font-weight : 500; + padding : 10px; + } + } + + img { + object-fit : cover; + height : 115px; + max-width : 165px; + background-color : #e5e5e5; + float : left; + padding : 0; + + @media screen and (min-width : 600px) { + margin-right : 20px; + margin-bottom : 0; + } + @media screen and (max-width : 768px) { + width : 100%; + } + } + +` + +const Content = styled.div` + padding : 20px 30px; + overflow-y : scroll; + +` + +const Header = styled.div` + display : flex; + flex-direction : row; + padding : 10px 26px 0 26px; + align-items : center; + justify-content : space-between; + height : 64px; + + h2 { + font-size : 26px; + font-weight : lighter; + color : #666 + } +` + +const StyledCloseModalButton = styled(Button)` + display : inline-block; + position : relative; + float : right !important; + margin-right : -8px !important; + background : transparent !important; + min-width: 0 !important; + width : 40px; +` + +const StyledModal = styled(Modal)` + .djXaxP{ + margin : 0 !important; + } + display : flex; + align-items: center; + justify-content : center; + text-align : center; + padding : 10px !important; + max-width : none; + max-height : none; +` + +const Container = styled.div` + box-sizing : border-box; + box-shadow : 0 7px 8px -4px rgba(0,0,0,.2),0 13px 19px 2px rgba(0,0,0,.14),0 5px 24px 4px rgba(0,0,0,.12); + background-color : white; + align : center; + display : flex; + flex-direction : column; + min-width : 240px; + max-height : none; + position : relative; + padding : 10px; + border-radius : 4px; + + @media screen and (min-width : 700px) { + max-width : 600px; + max-height : 600px; + } + + @media screen and (max-width : 699px) { + width : 100%; + height : 100%; + } +` -- GitLab