11import '../styles/Bookshelf.css' ;
22import { useState , useEffect } from 'react' ;
3+ import { useNavigate } from 'react-router' ;
34import Container from 'react-bootstrap/Container' ;
45import ButtonGroup from 'react-bootstrap/ButtonGroup' ;
56import ToggleButton from 'react-bootstrap/ToggleButton' ;
7+ import Button from 'react-bootstrap/Button' ;
68import FutureDocument from '../components/FutureDocument.jsx' ;
79import DocumentsCards from '../components/DocumentsCards.jsx' ;
810import Graph from '../components/Graph.jsx' ;
911import Col from 'react-bootstrap/Col' ;
1012import Row from 'react-bootstrap/Row' ;
13+ import { v4 as uuid } from 'uuid' ;
1114
1215function Bookshelf ( { backend, user } ) {
1316 const [ documents , setDocuments ] = useState ( [ ] ) ;
1417 const [ lastUpdate , setLastUpdate ] = useState ( ) ;
1518 const [ displayMode , setDisplayMode ] = useState ( localStorage . getItem ( 'displayMode' ) || 'graph' ) ;
19+ const [ selectedDocs , setSelectedDocs ] = useState ( [ ] ) ;
1620
21+ const navigate = useNavigate ( ) ;
1722 const displayModesList = [ 'graph' , 'list' ] ;
1823
1924 useEffect ( ( ) => {
2025 backend . getAllDocuments ( user )
2126 . then ( setDocuments ) ;
2227 } , [ lastUpdate , user , backend ] ) ;
28+
2329 const docs = [
2430 ...new Map (
2531 documents ?. filter ( x => ! ! x )
@@ -28,6 +34,34 @@ function Bookshelf({ backend, user }) {
2834 ] ;
2935 const displayedDocs = docs ?. flatMap ( d => d [ 0 ] ) ;
3036
37+ const handleCreateQuotation = async ( ) => {
38+ const _id = uuid ( ) . replace ( / - / g, '' ) ;
39+ const doc = {
40+ _id,
41+ editors : [ user ] ,
42+ dc_creator : '…' ,
43+ dc_title : '…' ,
44+ dc_issued : new Date ( ) ,
45+ dc_isPartOf : null ,
46+ dc_license : null ,
47+ dc_translator : null ,
48+ dc_language : null ,
49+ dc_publisher : null ,
50+ dc_spatial : null ,
51+ text : '…' ,
52+ links : selectedDocs . map ( ( object ) => ( { verb : 'includes' , object } ) )
53+ } ;
54+
55+ try {
56+ await backend . putDocument ( doc ) ;
57+ setLastUpdate ( _id ) ;
58+ setSelectedDocs ( [ ] ) ;
59+ navigate ( `/${ _id } #${ _id } ` ) ;
60+ } catch ( error ) {
61+ console . error ( error ) ;
62+ }
63+ } ;
64+
3165 function DisplayDocuments ( ) {
3266 switch ( displayMode ) {
3367 case 'graph' :
@@ -42,9 +76,28 @@ function Bookshelf({ backend, user }) {
4276 </ Row >
4377 ) ;
4478 case 'list' :
45- return < DocumentsCards docs = { documents } byRow = { 4 } createOn = { [ ] }
46- { ...{ setLastUpdate, backend, user} }
47- /> ;
79+ return (
80+ < >
81+ { selectedDocs . length > 0 && (
82+ < div className = "card p-3 mb-4 justify-content-between align-items-center flex-direction-row" >
83+ < div > Create a new quotation with the < strong > { selectedDocs . length } </ strong > selected document(s)</ div >
84+ < Button variant = "danger" onClick = { handleCreateQuotation } >
85+ Create Quotation
86+ </ Button >
87+ </ div >
88+ ) }
89+ < DocumentsCards
90+ docs = { documents }
91+ byRow = { 4 }
92+ createOn = { [ ] }
93+ selectedDocs = { selectedDocs }
94+ setSelectedDocs = { setSelectedDocs }
95+ { ...{ setLastUpdate, backend, user} }
96+ />
97+ </ >
98+ ) ;
99+ default :
100+ return null ;
48101 }
49102 }
50103
@@ -75,5 +128,4 @@ function Bookshelf({ backend, user }) {
75128 ) ;
76129}
77130
78- export default Bookshelf ;
79-
131+ export default Bookshelf ;
0 commit comments