Skip to content
Snippets Groups Projects
Select Git revision
  • Develop default protected
  • master protected
  • v1.2.0
  • v1.1.1
  • v1.1.0
  • V1.0.1
  • V1.0.0
  • V1.0.0-RC
8 results

GuardarModal.js

Blame
  • Forked from PortalMEC / PortalMEC-React
    99 commits behind the upstream repository.
    GuardarModal.js 14.34 KiB
    /*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 { Store } from '../Store.js'
    import { apiDomain } from '../env';
    import CloseIcon from '@material-ui/icons/Close';
    import PublicIcon from '@material-ui/icons/Public';
    import LockIcon from '@material-ui/icons/Lock';
    import LoadingSpinner from './LoadingSpinner.js'
    import CriarColecaoForm from './CriarColecaoForm.js'
    import SnackbarComponent from './SnackbarComponent'
    import { getRequest, postRequest } from './HelperFunctions/getAxiosConfig'
    
    function CloseModalButton(props) {
        return (
            <StyledCloseModalButton onClick={props.handleClose}>
                <CloseIcon />
            </StyledCloseModalButton>
        )
    }
    
    export default function GuardarModal(props) {
        const { state } = useContext(Store)
        const [collsArr, setcolls] = useState([])
        const [loading, toggleLoading] = useState(true)
        const [creatingCol, setCreating] = useState(false)
        const [snackbarOpen, setSnackOpen] = useState({
            open: false,
            severity: "",
            text: "",
            color: ""
        })
    
    
        function handleSuccessGetCols(data) {
            setcolls(data)
            toggleLoading(false)
        }
    
        function handleError(error) {
            toggleLoading(false)
            setSnackOpen({
                open: true,
                severity: "error",
                text: "Error ao guardar o recurso",
                color: "red",
            })
        }
    
        const getCols = () => {
            if (collsArr.length === 0) {
                const id = state.currentUser.id
    
                const url = `/users/${id}/collections/`
    
                getRequest(url, handleSuccessGetCols, handleError)
            }
        }
    
    
        function handleSuccessPostToCol(data) {
            setSnackOpen({
                open: true,
                severity: "info",
                text: "O Recurso foi guardado na coleção!",
                color: ""
            })
            setCreating(false)
            props.handleClose()
        }
    
        const postToCol = (colId) => {
            const url = `/collections/${colId}/items`
            const payload = {
                "collection": {
                    "items": [{ "id": props.recursoId, "type": "LearningObject" }]
                }
            }
            postRequest(url, payload, handleSuccessPostToCol, handleError)
    
        }
    
        return (
            <React.Fragment>
                <SnackbarComponent
                    snackbarOpen={snackbarOpen.open}
                    severity={snackbarOpen.severity}
                    handleClose={() => {
                        setSnackOpen({
                            open: false,
                            severity: "",
                            text: "",
                            color: ""
                        })
                    }}
                    text={snackbarOpen.text}
                    color={snackbarOpen.color}
                />
                <StyledModal
                    aria-labelledby="transition-modal-title"
                    aria-describedby="transition-modal-description"
                    open={props.open}
    
                    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={props.thumb ? apiDomain + props.thumb : require('../img/logo_small.svg')} 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}
                                                            />
                                                        )
                                                        :
                                                        (
                                                            collsArr.length === 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>
                                                                    </>
                                                                )
    
                                                        )
                                                }
                                            </ChooseColContainer>
    
                                        )
                                }                                     
                                <div style={{ display: "flex", justifyContent: "center" }}>
                                    <CriarColButton onClick={() => { setCreating(true) }}>CRIAR COLEÇÃO</CriarColButton>
                                </div>
                            </Content>
                        </Container>
                    </Fade>
                </StyledModal>
            </React.Fragment>
        )
    }
    
    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 : column;
        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%;
        }
    `