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