From 7b7be754b2da096d086fe1ef55775be0e97c2805 Mon Sep 17 00:00:00 2001 From: Sophearychiv Date: Mon, 24 Jun 2019 14:45:49 -0700 Subject: [PATCH 01/66] setup --- package-lock.json | 102 ++++++++++++++++++++++++++++++++++++++++++++++ package.json | 13 ++++++ 2 files changed, 115 insertions(+) diff --git a/package-lock.json b/package-lock.json index 2207e63b9..3e0662036 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5603,6 +5603,11 @@ "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=" }, + "gud": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gud/-/gud-1.0.0.tgz", + "integrity": "sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==" + }, "gzip-size": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.0.0.tgz", @@ -5777,6 +5782,19 @@ "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==" }, + "history": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/history/-/history-4.9.0.tgz", + "integrity": "sha512-H2DkjCjXf0Op9OAr6nJ56fcRkTSNrUiv41vNJ6IswJjif6wlpZK0BTfFbi7qK9dXLSYZxkq5lBsj3vUjlYBYZA==", + "requires": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^2.2.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^0.4.0" + } + }, "hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", @@ -5787,6 +5805,14 @@ "minimalistic-crypto-utils": "^1.0.1" } }, + "hoist-non-react-statics": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz", + "integrity": "sha512-0XsbTXxgiaCDYDIWFcwkmerZPSwywfUqYmwT4jzewKTQSWoE6FCMoUVOeBJWK3E/CrWbxRG3m5GzY4lnIwGRBA==", + "requires": { + "react-is": "^16.7.0" + } + }, "hosted-git-info": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", @@ -8134,6 +8160,16 @@ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" }, + "mini-create-react-context": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.3.2.tgz", + "integrity": "sha512-2v+OeetEyliMt5VHMXsBhABoJ0/M4RCe7fatd/fBy6SMiKazUSEt3gxxypfnk2SHMkdBYvorHRoQxuGoiwbzAw==", + "requires": { + "@babel/runtime": "^7.4.0", + "gud": "^1.0.0", + "tiny-warning": "^1.0.2" + } + }, "mini-css-extract-plugin": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.5.0.tgz", @@ -10194,6 +10230,52 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz", "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==" }, + "react-router": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.0.1.tgz", + "integrity": "sha512-EM7suCPNKb1NxcTZ2LEOWFtQBQRQXecLxVpdsP4DW4PbbqYWeRiLyV/Tt1SdCrvT2jcyXAXmVTmzvSzrPR63Bg==", + "requires": { + "@babel/runtime": "^7.1.2", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", + "loose-envify": "^1.3.1", + "mini-create-react-context": "^0.3.0", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "path-to-regexp": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", + "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", + "requires": { + "isarray": "0.0.1" + } + } + } + }, + "react-router-dom": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.0.1.tgz", + "integrity": "sha512-zaVHSy7NN0G91/Bz9GD4owex5+eop+KvgbxXsP/O+iW1/Ln+BrJ8QiIR5a6xNPtrdTvLkxqlDClx13QO1uB8CA==", + "requires": { + "@babel/runtime": "^7.1.2", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.0.1", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + } + }, "react-scripts": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-3.0.1.tgz", @@ -10575,6 +10657,11 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" }, + "resolve-pathname": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-2.2.0.tgz", + "integrity": "sha512-bAFz9ld18RzJfddgrO2e/0S2O81710++chRMUxHjXOYKF6jTAMrUNZrEZ1PvV0zlhfjidm08iRPdTLPno1FuRg==" + }, "resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", @@ -11685,6 +11772,16 @@ "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=" }, + "tiny-invariant": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.0.4.tgz", + "integrity": "sha512-lMhRd/djQJ3MoaHEBrw8e2/uM4rs9YMNk0iOr8rHQ0QdbM7D4l0gFl3szKdeixrlyfm9Zqi4dxHCM2qVG8ND5g==" + }, + "tiny-warning": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.2.tgz", + "integrity": "sha512-rru86D9CpQRLvsFG5XFdy0KdLAvjdQDyZCsRcuu60WtzFylDM3eAWSxEVz5kzL2Gp544XiUvPbVKtOA/txLi9Q==" + }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -12122,6 +12219,11 @@ "spdx-expression-parse": "^3.0.0" } }, + "value-equal": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-0.4.0.tgz", + "integrity": "sha512-x+cYdNnaA3CxvMaTX0INdTCN8m8aF2uY9BvEqmxuYp8bL09cs/kWVQPVGcA35fMktdOsP69IgU7wFj/61dJHEw==" + }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", diff --git a/package.json b/package.json index e7e4a7c62..d63126caa 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "dependencies": { "react": "^16.8.6", "react-dom": "^16.8.6", + "react-router-dom": "^5.0.1", "react-scripts": "3.0.1" }, "scripts": { @@ -12,5 +13,17 @@ "build": "react-scripts build", "test": "react-scripts test --env=jsdom", "eject": "react-scripts eject" + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] } } From b279d1afff6002d45a17d7166026f7ae7eea556a Mon Sep 17 00:00:00 2001 From: Jillianne Ramirez Date: Mon, 24 Jun 2019 14:53:06 -0700 Subject: [PATCH 02/66] framework for react router added --- src/App.js | 56 ++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 46 insertions(+), 10 deletions(-) diff --git a/src/App.js b/src/App.js index 203067e4d..ab0d0cda1 100644 --- a/src/App.js +++ b/src/App.js @@ -1,21 +1,57 @@ import React, { Component } from 'react'; -import logo from './logo.svg'; +import { BrowserRouter as Router, Route, Link } from "react-router-dom"; import './App.css'; class App extends Component { render() { return ( -
-
- logo -

Welcome to React

-
-

- To get started, edit src/App.js and save to reload. -

-
+ +
+
+ + + + + +
+
); } } +function Home() { + return

Home

; +} + +function Search() { + return

Search

; +} + +function Library() { + return

Library

; +} + +function Customers() { + return

Customers

; +} + +function Header() { + return ( + + ); +} + export default App; From 90b550725dd22273766ae692e11b991f13871834 Mon Sep 17 00:00:00 2001 From: Sophearychiv Date: Tue, 25 Jun 2019 12:47:19 -0700 Subject: [PATCH 03/66] added components folder --- package-lock.json | 32 ++++++++++++++++++++++++++++++++ package.json | 1 + src/App.js | 8 ++++++++ src/components/Search.js | 0 4 files changed, 41 insertions(+) create mode 100644 src/components/Search.js diff --git a/package-lock.json b/package-lock.json index 3e0662036..9bc9f54a4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1902,6 +1902,38 @@ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" }, + "axios": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.0.tgz", + "integrity": "sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ==", + "requires": { + "follow-redirects": "1.5.10", + "is-buffer": "^2.0.2" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "follow-redirects": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", + "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", + "requires": { + "debug": "=3.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, "axobject-query": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.0.2.tgz", diff --git a/package.json b/package.json index d63126caa..eeff31f0a 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,7 @@ "version": "0.1.0", "private": true, "dependencies": { + "axios": "^0.19.0", "react": "^16.8.6", "react-dom": "^16.8.6", "react-router-dom": "^5.0.1", diff --git a/src/App.js b/src/App.js index ab0d0cda1..8450cc1ef 100644 --- a/src/App.js +++ b/src/App.js @@ -1,8 +1,16 @@ import React, { Component } from 'react'; import { BrowserRouter as Router, Route, Link } from "react-router-dom"; import './App.css'; +import axios from 'axios'; class App extends Component { + + componentDidMount() { + axios.get('http://localhost:3001/') + .then((response) => { + console.log(response); + }) + } render() { return ( diff --git a/src/components/Search.js b/src/components/Search.js new file mode 100644 index 000000000..e69de29bb From 902231752c17021b9126492b83681cbd54939824 Mon Sep 17 00:00:00 2001 From: Jillianne Ramirez Date: Tue, 25 Jun 2019 13:01:05 -0700 Subject: [PATCH 04/66] able to import list of movies and customers from api to view --- src/App.js | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/App.js b/src/App.js index 8450cc1ef..ac6856b18 100644 --- a/src/App.js +++ b/src/App.js @@ -4,13 +4,35 @@ import './App.css'; import axios from 'axios'; class App extends Component { + constructor() { + super(); + + this.state = { + movies: [], + customers: [], + }; + } componentDidMount() { - axios.get('http://localhost:3001/') + axios.get('http://localhost:3001/movies') .then((response) => { console.log(response); + this.setState({ movies: response.data }); }) + .catch((error) => { + this.setState({ error: error.message }); + }); + + axios.get('http://localhost:3001/customers') + .then((response) => { + console.log(response); + this.setState({ customers: response.data }); + }) + .catch((error) => { + this.setState({ error: error.message }); + }); } + render() { return ( From 61238225bffe5c1a8d7bcbae950548b07b0c7b7e Mon Sep 17 00:00:00 2001 From: Sophearychiv Date: Tue, 25 Jun 2019 13:01:51 -0700 Subject: [PATCH 05/66] added Search component --- src/App.js | 15 +++++++++++---- src/components/Search.js | 6 ++++++ 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/App.js b/src/App.js index 8450cc1ef..0f36e6b0e 100644 --- a/src/App.js +++ b/src/App.js @@ -2,16 +2,25 @@ import React, { Component } from 'react'; import { BrowserRouter as Router, Route, Link } from "react-router-dom"; import './App.css'; import axios from 'axios'; +import Search from './components/Search'; class App extends Component { + constructor(props) { + super(props); + this.state = { + movies: [], + }; + } + componentDidMount() { - axios.get('http://localhost:3001/') + axios.get('http://localhost:3001/movies') .then((response) => { console.log(response); }) } render() { + return (
@@ -31,9 +40,7 @@ function Home() { return

Home

; } -function Search() { - return

Search

; -} + function Library() { return

Library

; diff --git a/src/components/Search.js b/src/components/Search.js index e69de29bb..68f2e5675 100644 --- a/src/components/Search.js +++ b/src/components/Search.js @@ -0,0 +1,6 @@ +import React from 'react'; +function Search() { + return

Search

; + } + +export default Search; \ No newline at end of file From 2f683b1303ef04cc258ce7e026e3213062415564 Mon Sep 17 00:00:00 2001 From: Sophearychiv Date: Tue, 25 Jun 2019 13:05:21 -0700 Subject: [PATCH 06/66] added error section --- src/App.js | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/App.js b/src/App.js index 174402969..7caadd90e 100644 --- a/src/App.js +++ b/src/App.js @@ -11,13 +11,7 @@ class App extends Component { this.state = { movies: [], customers: [], - }; - } - - constructor(props) { - super(props); - this.state = { - movies: [], + error: null }; } @@ -43,6 +37,9 @@ class App extends Component { render() { + const errorSection = (this.state.error) ? + (
Error: {this.state.error}
) : null; + return (
@@ -52,6 +49,7 @@ class App extends Component { + {errorSection}
); From 95d4f780d9c83e682bca1bdf2016b674a2cc084d Mon Sep 17 00:00:00 2001 From: Jillianne Ramirez Date: Tue, 25 Jun 2019 14:06:11 -0700 Subject: [PATCH 07/66] able to see all movies, and select movie --- src/App.js | 20 +++++++++++++------- src/components/Library.js | 24 ++++++++++++++++++++++++ src/components/Movie.js | 22 ++++++++++++++++++++++ 3 files changed, 59 insertions(+), 7 deletions(-) create mode 100644 src/components/Library.js create mode 100644 src/components/Movie.js diff --git a/src/App.js b/src/App.js index ac6856b18..9b2dcebb3 100644 --- a/src/App.js +++ b/src/App.js @@ -1,6 +1,8 @@ import React, { Component } from 'react'; import { BrowserRouter as Router, Route, Link } from "react-router-dom"; import './App.css'; +import PropTypes from 'prop-types'; +import Library from './components/Library'; import axios from 'axios'; class App extends Component { @@ -9,15 +11,22 @@ class App extends Component { this.state = { movies: [], + rentedMovie: undefined, customers: [], }; } + onSelectCallback = (index) => { + const selectedMovie = this.state.movies[index] + this.setState({ rentedMovie: selectedMovie }); + } + componentDidMount() { axios.get('http://localhost:3001/movies') .then((response) => { console.log(response); - this.setState({ movies: response.data }); + + this.setState({ movies: response.data}); }) .catch((error) => { this.setState({ error: error.message }); @@ -37,12 +46,13 @@ class App extends Component { return (
+ { this.state.rentedMovie &&

Movie Selection: {this.state.rentedMovie.title}

}
- - + } /> + } />
); @@ -57,10 +67,6 @@ function Search() { return

Search

; } -function Library() { - return

Library

; -} - function Customers() { return

Customers

; } diff --git a/src/components/Library.js b/src/components/Library.js new file mode 100644 index 000000000..1af63798d --- /dev/null +++ b/src/components/Library.js @@ -0,0 +1,24 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import Movie from './Movie'; +// import axios from 'axios'; +// import './Library.css'; + +const Library = (props) => { + const movieCollection = props.library.map((movie, i) => { + return
  • + }); + + return ( +
    +

    Library

    +
      {movieCollection}
    +
    + ) +} + +Library.propTypes = { + library: PropTypes.array.isRequired, +}; + +export default Library; \ No newline at end of file diff --git a/src/components/Movie.js b/src/components/Movie.js new file mode 100644 index 000000000..8418ec438 --- /dev/null +++ b/src/components/Movie.js @@ -0,0 +1,22 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +// import axios from 'axios'; +// import './Movie.css'; + +const Movie = (props) => { + const onClickButton = () => { + props.onSelectCallback(props.id) + } + + return ( +
    {props.title}
    + ) +} + +Movie.propTypes = { + id: PropTypes.number.isRequired, + title: PropTypes.string.isRequired, + onSelectCallback: PropTypes.func.isRequired, +}; + +export default Movie; \ No newline at end of file From 4663000c9fc8abe7f35b5bc464a67cb2a2a91335 Mon Sep 17 00:00:00 2001 From: Sophearychiv Date: Tue, 25 Jun 2019 16:39:52 -0700 Subject: [PATCH 08/66] show search results --- src/App.js | 10 +++-- src/components/Search.js | 81 +++++++++++++++++++++++++++++++++++-- src/components/SearchBar.js | 33 +++++++++++++++ 3 files changed, 116 insertions(+), 8 deletions(-) create mode 100644 src/components/SearchBar.js diff --git a/src/App.js b/src/App.js index 7caadd90e..db311db35 100644 --- a/src/App.js +++ b/src/App.js @@ -10,6 +10,7 @@ class App extends Component { this.state = { movies: [], + externalMovies: [], customers: [], error: null }; @@ -18,7 +19,7 @@ class App extends Component { componentDidMount() { axios.get('http://localhost:3001/movies') .then((response) => { - console.log(response); + // console.log(response); this.setState({ movies: response.data }); }) .catch((error) => { @@ -27,14 +28,16 @@ class App extends Component { axios.get('http://localhost:3001/customers') .then((response) => { - console.log(response); + // console.log(response); this.setState({ customers: response.data }); }) .catch((error) => { this.setState({ error: error.message }); }); + } + render() { const errorSection = (this.state.error) ? @@ -46,7 +49,7 @@ class App extends Component {
    - + }/> {errorSection} @@ -61,7 +64,6 @@ function Home() { } - function Library() { return

    Library

    ; } diff --git a/src/components/Search.js b/src/components/Search.js index 68f2e5675..ba03c6e4c 100644 --- a/src/components/Search.js +++ b/src/components/Search.js @@ -1,6 +1,79 @@ -import React from 'react'; -function Search() { - return

    Search

    ; - } +import React, {Component} from 'react'; +import SearchBar from './SearchBar'; +import axios from 'axios'; +class Search extends Component { + constructor(props) { + super(props); + this.state = { + searchResults: [], + queryString: "", + searched: false, + error: null + }; + } + + componentDidMount(){ + axios.get('http://localhost:3001/movies?query=' + this.state.queryString) + .then((response) => { + this.setState({ + searchResults: response.data + }) + }) + .catch((error) => { + this.setState({ + error: error.message + }); + }); + } + + searchCallback = (queryString) => { + this.componentDidMount() + this.setState({ + queryString, + searched: true + }); + }; + + render() { + + let foundMovies; + let tableHeader; + if (this.state.searchResults !== null) { + tableHeader = ( + + Image + Title + Overview + Release Date + + ) + foundMovies = this.state.searchResults.map((movie, i)=> { + return ( + {movie.title}/ + {movie.title} + {movie.overview} + {movie.release_date} + + ); + }) + }else if (this.state.searched) { + foundMovies = (No matched Results!) + }else { + foundMovies = null + } + + console.log(this.state.searchResults); + + return ( +
    + + + {tableHeader} + {foundMovies} +
    +
    + ) + } +}; export default Search; \ No newline at end of file diff --git a/src/components/SearchBar.js b/src/components/SearchBar.js new file mode 100644 index 000000000..34c34890e --- /dev/null +++ b/src/components/SearchBar.js @@ -0,0 +1,33 @@ +import React, {Component} from 'react'; +class SearchBar extends Component { + constructor(props) { + super(props); + this.state = { + queryString: "" + }; + } + + queryChanged = (event) => { + const queryString = event.target.value; + this.setState({ + queryString + }) + + this.props.searchCallback(queryString); + } + render() { + return ( +
    + +
    + ) + } +}; + +export default SearchBar; \ No newline at end of file From c351088c1ba08ac061b0335b74ec9c5f2c08fe40 Mon Sep 17 00:00:00 2001 From: Jillianne Ramirez Date: Tue, 25 Jun 2019 19:09:32 -0700 Subject: [PATCH 09/66] able to chose a movie and customer for rental, and show details for each movie --- src/App.js | 59 +++++++++++++++++++++++++++---------- src/components/Customer.js | 22 ++++++++++++++ src/components/Customers.js | 25 ++++++++++++++++ src/components/Details.js | 26 ++++++++++++++++ src/components/Library.js | 14 +++++++-- src/components/Movie.js | 19 ++++++++---- 6 files changed, 141 insertions(+), 24 deletions(-) create mode 100644 src/components/Customer.js create mode 100644 src/components/Customers.js create mode 100644 src/components/Details.js diff --git a/src/App.js b/src/App.js index 0a77326fa..edb360ff3 100644 --- a/src/App.js +++ b/src/App.js @@ -3,6 +3,7 @@ import { BrowserRouter as Router, Route, Link } from "react-router-dom"; import './App.css'; import PropTypes from 'prop-types'; import Library from './components/Library'; +import Customers from './components/Customers'; import axios from 'axios'; import Search from './components/Search'; @@ -12,22 +13,36 @@ class App extends Component { this.state = { movies: [], - rentedMovie: undefined, customers: [], + expandedMovies: {}, + rentedMovie: undefined, + chosenCustomer: undefined, error: null }; } - onSelectCallback = (index) => { + onClickDetailsCallback = (id) => { + this.setState((prevState) => ({ + expandedMovies: { + ...prevState.expandedMovies, + [id]: !prevState.expandedMovies[id], + } + })); + } + + onSelectMovieCallback = (index) => { const selectedMovie = this.state.movies[index] this.setState({ rentedMovie: selectedMovie }); } + onSelectCustomerCallback = (index) => { + const selectedCustomer = this.state.customers[index] + this.setState({ chosenCustomer: selectedCustomer }); + } + componentDidMount() { axios.get('http://localhost:3001/movies') .then((response) => { - console.log(response); - this.setState({ movies: response.data}); }) .catch((error) => { @@ -36,7 +51,6 @@ class App extends Component { axios.get('http://localhost:3001/customers') .then((response) => { - console.log(response); this.setState({ customers: response.data }); }) .catch((error) => { @@ -45,20 +59,41 @@ class App extends Component { } render() { - const errorSection = (this.state.error) ? (
    Error: {this.state.error}
    ) : null; return (
    - { this.state.rentedMovie &&

    Movie Selection: {this.state.rentedMovie.title}

    } + { this.state.rentedMovie &&

    Movie Selection: {this.state.rentedMovie.title}

    } + + { this.state.chosenCustomer &&

    Customer Selection: {this.state.chosenCustomer.name}

    } +
    - } /> - } /> + ( + + )} + /> + ( + + )} + /> + {errorSection}
    @@ -70,12 +105,6 @@ function Home() { return

    Home

    ; } - - -function Customers() { - return

    Customers

    ; -} - function Header() { return (
      diff --git a/src/components/Customer.js b/src/components/Customer.js new file mode 100644 index 000000000..a931bd6d8 --- /dev/null +++ b/src/components/Customer.js @@ -0,0 +1,22 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +// import axios from 'axios'; +// import './Customer.css'; + +const Customer = (props) => { + const onClickButton = () => { + props.onSelectCustomerCallback(props.id - 1) + } + + return ( +
      {props.name}
      + ) +} + +Customer.propTypes = { + id: PropTypes.number.isRequired, + name: PropTypes.string.isRequired, + onSelectCustomerCallback: PropTypes.func.isRequired, +}; + +export default Customer; \ No newline at end of file diff --git a/src/components/Customers.js b/src/components/Customers.js new file mode 100644 index 000000000..389c10bfc --- /dev/null +++ b/src/components/Customers.js @@ -0,0 +1,25 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import Customer from './Customer'; +// import axios from 'axios'; +// import './Customers.css'; + +const Customers = (props) => { + const customerCollection = props.customers.map((customer, i) => { + return
    • + }); + + return ( +
      +

      Customers

      +
        {customerCollection}
      +
      + ) +} + +Customers.propTypes = { + customers: PropTypes.array.isRequired, + onSelectCustomerCallback: PropTypes.func.isRequired, +}; + +export default Customers; \ No newline at end of file diff --git a/src/components/Details.js b/src/components/Details.js new file mode 100644 index 000000000..4633024c3 --- /dev/null +++ b/src/components/Details.js @@ -0,0 +1,26 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +// import './Library.css'; + +const Details = (props) => { + const movieDetails = () => { + return ( +
        +
      • Id: {props.id}
      • +
      • Title: {props.title}
      • +
      • Overview: {props.overview}
      • +
      • Release Date: {props.release_date}
      • +
      • {`${props.title}`}/
      • +
      • External Id: {props.external_id}
      • +
      + ) + }; + + return movieDetails(); +} + +Details.propTypes = { + // showMovie: PropTypes.array.isRequired, +}; + +export default Details; \ No newline at end of file diff --git a/src/components/Library.js b/src/components/Library.js index 1af63798d..56dc5609e 100644 --- a/src/components/Library.js +++ b/src/components/Library.js @@ -1,14 +1,20 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import Movie from './Movie'; -// import axios from 'axios'; // import './Library.css'; const Library = (props) => { const movieCollection = props.library.map((movie, i) => { - return
    • + return
    • + +
    • }); - + return (

      Library

      @@ -19,6 +25,8 @@ const Library = (props) => { Library.propTypes = { library: PropTypes.array.isRequired, + onClickDetailsCallback: PropTypes.func.isRequired, + onSelectMovieCallback: PropTypes.func.isRequired, }; export default Library; \ No newline at end of file diff --git a/src/components/Movie.js b/src/components/Movie.js index 8418ec438..60b481bac 100644 --- a/src/components/Movie.js +++ b/src/components/Movie.js @@ -1,22 +1,29 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; -// import axios from 'axios'; +import Details from './Details'; // import './Movie.css'; const Movie = (props) => { const onClickButton = () => { - props.onSelectCallback(props.id) + props.onSelectMovieCallback(props.movie.id) } + const onClickDetailsButton = () => { + props.onClickDetailsCallback(props.movie.id) + } + return ( -
      {props.title}
      +
      {props.movie.title} + + + {props.viewMovieDetails &&
      } +
      ) } Movie.propTypes = { - id: PropTypes.number.isRequired, - title: PropTypes.string.isRequired, - onSelectCallback: PropTypes.func.isRequired, + movie: PropTypes.object.isRequired, + onSelectMovieCallback: PropTypes.func.isRequired, }; export default Movie; \ No newline at end of file From c73f9e999b03e8b60891834686700a0ff2b0d77c Mon Sep 17 00:00:00 2001 From: Sophearychiv Date: Tue, 25 Jun 2019 23:35:39 -0700 Subject: [PATCH 10/66] fixing error in search bar --- src/components/Search.js | 29 ++++++++++++++++------------- src/components/SearchBar.js | 1 + 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/src/components/Search.js b/src/components/Search.js index ba03c6e4c..d8dc163f6 100644 --- a/src/components/Search.js +++ b/src/components/Search.js @@ -35,18 +35,11 @@ class Search extends Component { }; render() { - let foundMovies; let tableHeader; - if (this.state.searchResults !== null) { - tableHeader = ( - - Image - Title - Overview - Release Date - - ) + tableHeader = null; + // if (!this.state.searched) { + if (this.state.searchResults !== null) { foundMovies = this.state.searchResults.map((movie, i)=> { return ( {movie.title}/ @@ -55,14 +48,24 @@ class Search extends Component { {movie.release_date} ); - }) + }); + if (foundMovies && foundMovies.length > 0){ + tableHeader = ( + + Image + Title + Overview + Release Date + + ); + } }else if (this.state.searched) { - foundMovies = (No matched Results!) + foundMovies = (No matched Results!); }else { foundMovies = null } - console.log(this.state.searchResults); + // console.log(this.state.searchResults); return (
      diff --git a/src/components/SearchBar.js b/src/components/SearchBar.js index 34c34890e..326e570a3 100644 --- a/src/components/SearchBar.js +++ b/src/components/SearchBar.js @@ -8,6 +8,7 @@ class SearchBar extends Component { } queryChanged = (event) => { + // event.preventDefault(); const queryString = event.target.value; this.setState({ queryString From 9be0edb840f6084bf30096e8d069125acd6f2c2a Mon Sep 17 00:00:00 2001 From: Sophearychiv Date: Wed, 26 Jun 2019 00:40:33 -0700 Subject: [PATCH 11/66] refactored search page --- src/components/MovieCard.js | 16 ++++++++++ src/components/Search.js | 62 +++++++++++++++++++------------------ 2 files changed, 48 insertions(+), 30 deletions(-) create mode 100644 src/components/MovieCard.js diff --git a/src/components/MovieCard.js b/src/components/MovieCard.js new file mode 100644 index 000000000..72705fd60 --- /dev/null +++ b/src/components/MovieCard.js @@ -0,0 +1,16 @@ +import React, {Component} from 'react'; + +const MovieCard = (props) => { + const {image_url, title, overview, release_date} = props; + return ( + + {title}/ + {title} + {overview} + {release_date} + + + ) +} + +export default MovieCard; \ No newline at end of file diff --git a/src/components/Search.js b/src/components/Search.js index d8dc163f6..63921c490 100644 --- a/src/components/Search.js +++ b/src/components/Search.js @@ -1,12 +1,12 @@ import React, {Component} from 'react'; import SearchBar from './SearchBar'; +import MovieCard from './MovieCard'; import axios from 'axios'; class Search extends Component { constructor(props) { super(props); this.state = { searchResults: [], - queryString: "", searched: false, error: null }; @@ -35,45 +35,47 @@ class Search extends Component { }; render() { - let foundMovies; + + let movieCards; let tableHeader; - tableHeader = null; - // if (!this.state.searched) { - if (this.state.searchResults !== null) { - foundMovies = this.state.searchResults.map((movie, i)=> { - return ( - {movie.title}/ - {movie.title} - {movie.overview} - {movie.release_date} - - ); + + if (this.state.searchResults !== null) { + movieCards = this.state.searchResults.map((movie,i) => { + return [] }); - if (foundMovies && foundMovies.length > 0){ - tableHeader = ( - - Image - Title - Overview - Release Date - - ); + + if (movieCards && movieCards.length > 0){ + tableHeader = ( + + Image + Title + Overview + Release Date + + ); } - }else if (this.state.searched) { - foundMovies = (No matched Results!); - }else { - foundMovies = null + } else if (this.state.searched) { + movieCards = (No matched Results!); + } else { + movieCards = null; } - // console.log(this.state.searchResults); - return (
      - {tableHeader} - {foundMovies} + {tableHeader} + + {movieCards} + +
      +
      ) } From 52e9dd00d456ae99cd02c1462080821acca4f352 Mon Sep 17 00:00:00 2001 From: Sophearychiv Date: Wed, 26 Jun 2019 10:00:39 -0700 Subject: [PATCH 12/66] feature to add movie to the rental library --- src/components/MovieCard.js | 9 ++++++--- src/components/Search.js | 38 +++++++++++++++++++++++++++++++++++-- 2 files changed, 42 insertions(+), 5 deletions(-) diff --git a/src/components/MovieCard.js b/src/components/MovieCard.js index 72705fd60..df196e91d 100644 --- a/src/components/MovieCard.js +++ b/src/components/MovieCard.js @@ -1,14 +1,17 @@ -import React, {Component} from 'react'; +import React from 'react'; const MovieCard = (props) => { - const {image_url, title, overview, release_date} = props; + const {image_url, title, overview, release_date,addMovieCallback } = props; + const addMovie = () => { + addMovieCallback(props); + } return ( {title}/ {title} {overview} {release_date} - + ) } diff --git a/src/components/Search.js b/src/components/Search.js index 63921c490..7ea834a6f 100644 --- a/src/components/Search.js +++ b/src/components/Search.js @@ -8,7 +8,8 @@ class Search extends Component { this.state = { searchResults: [], searched: false, - error: null + error: null, + success: null }; } @@ -34,7 +35,36 @@ class Search extends Component { }); }; + addMovieCallback = (movie) => { + const movieToApi = { + external_id: movie.external_id, + image_url: movie.image_url, + title: movie.title, + overview: movie.overview, + release_date: movie.release_date + } + axios.post('http://localhost:3001/movies', movieToApi) + .then((response)=> { + if (response.status === 200) { + this.setState({ + success: "Movie has been added to the rental library!" + }) + } + }) + .catch((error) => { + this.setState({ + error: error.message + }) + }); + } + render() { + + const errorSection = (this.state.error) ? + (
      Error: {this.state.error}
      ) : null; + + const successSection = (this.state.success) ? + (
      {this.state.success}
      ) : null; let movieCards; let tableHeader; @@ -43,10 +73,12 @@ class Search extends Component { movieCards = this.state.searchResults.map((movie,i) => { return [] + release_date={movie.release_date} + addMovieCallback={this.addMovieCallback}/>] }); if (movieCards && movieCards.length > 0){ @@ -68,6 +100,8 @@ class Search extends Component { return (
      + {errorSection} + {successSection} {tableHeader} From 48c4913936fee67551feeb738c214011aa572875 Mon Sep 17 00:00:00 2001 From: Sophearychiv Date: Wed, 26 Jun 2019 10:58:37 -0700 Subject: [PATCH 13/66] fixed the search results --- src/components/Search.js | 8 +++++--- src/components/SearchBar.js | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/components/Search.js b/src/components/Search.js index 7ea834a6f..9aff27a87 100644 --- a/src/components/Search.js +++ b/src/components/Search.js @@ -13,8 +13,8 @@ class Search extends Component { }; } - componentDidMount(){ - axios.get('http://localhost:3001/movies?query=' + this.state.queryString) + getSearchResults = (queryString) => { + axios.get('http://localhost:3001/movies?query=' + queryString) .then((response) => { this.setState({ searchResults: response.data @@ -28,11 +28,13 @@ class Search extends Component { } searchCallback = (queryString) => { - this.componentDidMount() this.setState({ queryString, searched: true }); + + this.getSearchResults(queryString); + }; addMovieCallback = (movie) => { diff --git a/src/components/SearchBar.js b/src/components/SearchBar.js index 326e570a3..7efd14a59 100644 --- a/src/components/SearchBar.js +++ b/src/components/SearchBar.js @@ -14,7 +14,7 @@ class SearchBar extends Component { queryString }) - this.props.searchCallback(queryString); + this.props.searchCallback(event.target.value); } render() { return ( From a7cf987cac106754891c23fa52c8ff40ddcee11b Mon Sep 17 00:00:00 2001 From: Sophearychiv Date: Wed, 26 Jun 2019 11:23:28 -0700 Subject: [PATCH 14/66] doesn't allow existing movies to be added to the rental library --- src/App.js | 2 +- src/components/Search.js | 43 +++++++++++++++++++++++----------------- 2 files changed, 26 insertions(+), 19 deletions(-) diff --git a/src/App.js b/src/App.js index 942f36e9e..abdd991d6 100644 --- a/src/App.js +++ b/src/App.js @@ -74,7 +74,7 @@ class App extends Component {
      - }/> + }/> ( diff --git a/src/components/Search.js b/src/components/Search.js index 9aff27a87..7da4f4c7b 100644 --- a/src/components/Search.js +++ b/src/components/Search.js @@ -38,26 +38,33 @@ class Search extends Component { }; addMovieCallback = (movie) => { - const movieToApi = { - external_id: movie.external_id, - image_url: movie.image_url, - title: movie.title, - overview: movie.overview, - release_date: movie.release_date - } - axios.post('http://localhost:3001/movies', movieToApi) - .then((response)=> { - if (response.status === 200) { - this.setState({ - success: "Movie has been added to the rental library!" - }) - } - }) - .catch((error) => { + + if (this.props.moviesInLibrary.find(currentMovie => currentMovie.external_id === movie.external_id)) { this.setState({ - error: error.message + error: "Movie already exists!" }) - }); + } else { + const movieToApi = { + external_id: movie.external_id, + image_url: movie.image_url, + title: movie.title, + overview: movie.overview, + release_date: movie.release_date + } + axios.post('http://localhost:3001/movies', movieToApi) + .then((response)=> { + if (response.status === 200) { + this.setState({ + success: "Movie has been added to the rental library!" + }) + } + }) + .catch((error) => { + this.setState({ + error: error.message + }) + }); + } } render() { From 77747a3275b72b551d1389086e8e2dd006da10f0 Mon Sep 17 00:00:00 2001 From: Jillianne Ramirez Date: Wed, 26 Jun 2019 11:51:32 -0700 Subject: [PATCH 15/66] working on rental feature --- src/App.js | 59 ++++++++++++++++++++++++++++++++++++++++ src/components/Rental.js | 40 +++++++++++++++++++++++++++ 2 files changed, 99 insertions(+) create mode 100644 src/components/Rental.js diff --git a/src/App.js b/src/App.js index 942f36e9e..5f57046a9 100644 --- a/src/App.js +++ b/src/App.js @@ -4,6 +4,7 @@ import './App.css'; import PropTypes from 'prop-types'; import Library from './components/Library'; import Customers from './components/Customers'; +import Rental from './components/Rental'; import axios from 'axios'; import Search from './components/Search'; @@ -59,6 +60,61 @@ class App extends Component { } + formatDate = (time) => { + let d = new Date(), + month = d.getMonth() + 1, + day = d.getDate(), + year = d.getFullYear(); + + if (time === "now") { + day = d.getDate() + } else if (time === "future") { + day = d.getDate() + 5 + } + + if (month < 10) month = '0' + month; + if (day < 10) day = '0' + day; + + return [year, month, day].join('/'); + } + // Referred to this post for formatting date: https://stackoverflow.com/questions/23593052/format-javascript-date-to-yyyy-mm-dd + + + rentMovie = () => { + const movie = this.state.rentedMovie + const customer = this.state.chosenCustomer + + const dueDate = this.formatDate("future") + const checkoutDate = this.formatDate("now") + + const url = `http://localhost:3001/rentals/${movie.title}/check-out` + + axios.post(url, { + customer_id: customer.id, + due_date: dueDate + }) + .then((response)=> { + console.log(response) + // if (response.status === 200) { + console.log('success') + this.setState({ + success: `Rented! "${movie.title}" checked out by ${customer.name}`, + rentedMovie: undefined, + chosenCustomer: undefined, + }) + return ( + + ) + // } + }) + .catch((error) => { + console.log(error) + console.log('err') + this.setState({ + error: error.message + }) + }); + } render() { const errorSection = (this.state.error) ? @@ -71,6 +127,9 @@ class App extends Component { { this.state.chosenCustomer &&

      Customer Selection: {this.state.chosenCustomer.name}

      } + { this.state.rentedMovie && this.state.chosenCustomer && } + {/* } */} +
      diff --git a/src/components/Rental.js b/src/components/Rental.js new file mode 100644 index 000000000..54b7f4ad1 --- /dev/null +++ b/src/components/Rental.js @@ -0,0 +1,40 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +// import axios from 'axios'; +// import './Rental.css'; + +const Rental = (props) => { + // const rentMovie = () => { + // const title = props.movie.title + // axios.post(`http://localhost:3001/rentals/${title}/check-out`) + // .then((response)=> { + // if (response.status === 200) { + // this.setState({ + // success: `Rented! "${props.movie.title}" checked out by ${props.chosenCustomer.name} ` + // }) + // } + // }) + // .catch((error) => { + // this.setState({ + // error: error.message + // }) + // }); + // } + return ( +
      + {/* */} + {props.customer} + {props.movie} + {props.dueDate} +
      + ) +} + +Rental.propTypes = { + movie: PropTypes.object.isRequired, + customer: PropTypes.object.isRequired, + checkoutDate: PropTypes.string.isRequired, + dueDate: PropTypes.string.isRequired, +}; + +export default Rental; \ No newline at end of file From 55cfc47c34c1cc91125bba68079ffa2b84b38958 Mon Sep 17 00:00:00 2001 From: Jillianne Ramirez Date: Wed, 26 Jun 2019 13:09:55 -0700 Subject: [PATCH 16/66] able to rent a movie --- package-lock.json | 273 +++++++++++++++++++++++++++++++++++++++ package.json | 2 + src/App.js | 67 ++++------ src/components/Rental.js | 21 +-- 4 files changed, 304 insertions(+), 59 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9bc9f54a4..db958783b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1162,6 +1162,39 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==" }, + "@react-bootstrap/react-popper": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@react-bootstrap/react-popper/-/react-popper-1.2.1.tgz", + "integrity": "sha512-4l3q7LcZEhrSkI4d3Ie3g4CdrXqqTexXX4PFT45CB0z5z2JUbaxgRwKNq7r5j2bLdVpZm+uvUGqxJw8d9vgbJQ==", + "requires": { + "babel-runtime": "6.x.x", + "create-react-context": "^0.2.1", + "popper.js": "^1.14.4", + "prop-types": "^15.6.1", + "typed-styles": "^0.0.5", + "warning": "^3.0.0" + }, + "dependencies": { + "warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", + "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", + "requires": { + "loose-envify": "^1.0.0" + } + } + } + }, + "@restart/context": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@restart/context/-/context-2.1.4.tgz", + "integrity": "sha512-INJYZQJP7g+IoDUh/475NlGiTeMfwTXUEr3tmRneckHIxNolGOW9CTq83S8cxq0CgJwwcMzMJFchxvlwe7Rk8Q==" + }, + "@restart/hooks": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.3.1.tgz", + "integrity": "sha512-kjGGlli8iTe5TFDw6qHZJ5QK1naITMveIO+o8yQJJqwX8VIkiQzLddK98Lduga2krJMzWlNqDR/4isGLiyBlUA==" + }, "@svgr/babel-plugin-add-jsx-attribute": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.2.0.tgz", @@ -2428,6 +2461,11 @@ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" }, + "bootstrap": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.3.1.tgz", + "integrity": "sha512-rXqOmH1VilAt2DyPzluTi2blhk17bO7ef+zLLPlWvG494pDxcM234pJ8wTc/6R40UWizAIIMgxjvxZg5kmsbag==" + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -3359,6 +3397,11 @@ } } }, + "classnames": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", + "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" + }, "clean-css": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", @@ -3709,6 +3752,15 @@ "sha.js": "^2.4.8" } }, + "create-react-context": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/create-react-context/-/create-react-context-0.2.3.tgz", + "integrity": "sha512-CQBmD0+QGgTaxDL3OX1IDXYqjkp2It4RIbcb99jS6AEg27Ga+a9G3JtK6SIu0HBwPLZlmwt9F7UwWA4Bn92Rag==", + "requires": { + "fbjs": "^0.8.0", + "gud": "^1.0.0" + } + }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -4266,6 +4318,14 @@ "utila": "~0.4" } }, + "dom-helpers": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", + "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", + "requires": { + "@babel/runtime": "^7.1.2" + } + }, "dom-serializer": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", @@ -4392,6 +4452,14 @@ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" }, + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "requires": { + "iconv-lite": "~0.4.13" + } + }, "end-of-stream": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", @@ -5232,6 +5300,35 @@ "bser": "^2.0.0" } }, + "fbjs": { + "version": "0.8.17", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz", + "integrity": "sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=", + "requires": { + "core-js": "^1.0.0", + "isomorphic-fetch": "^2.1.1", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.18" + }, + "dependencies": { + "core-js": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "requires": { + "asap": "~2.0.3" + } + } + } + }, "figgy-pudding": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", @@ -6436,6 +6533,15 @@ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" }, + "isomorphic-fetch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", + "requires": { + "node-fetch": "^1.0.1", + "whatwg-fetch": ">=0.10.0" + } + }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", @@ -7759,6 +7865,11 @@ "array-includes": "^3.0.3" } }, + "keycode": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/keycode/-/keycode-2.2.0.tgz", + "integrity": "sha1-PQr1bce4uOXLqNCpfxByBO7CKwQ=" + }, "killable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", @@ -8398,6 +8509,15 @@ "lower-case": "^1.1.1" } }, + "node-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "requires": { + "encoding": "^0.1.11", + "is-stream": "^1.0.1" + } + }, "node-forge": { "version": "0.7.5", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.5.tgz", @@ -9051,6 +9171,11 @@ "ts-pnp": "^1.0.0" } }, + "popper.js": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.15.0.tgz", + "integrity": "sha512-w010cY1oCUmI+9KwwlWki+r5jxKfTFDVoadl7MSrIujHU5MJ5OR6HTDj6Xo8aoR/QsA56x8jKjA59qGH4ELtrA==" + }, "portfinder": { "version": "1.0.20", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.20.tgz", @@ -9992,6 +10117,25 @@ "react-is": "^16.8.1" } }, + "prop-types-extra": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.0.tgz", + "integrity": "sha512-QFyuDxvMipmIVKD2TwxLVPzMnO4e5oOf1vr3tJIomL8E7d0lr6phTHd5nkPhFIzTD1idBLLEPeylL9g+rrTzRg==", + "requires": { + "react-is": "^16.3.2", + "warning": "^3.0.0" + }, + "dependencies": { + "warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", + "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", + "requires": { + "loose-envify": "^1.0.0" + } + } + } + }, "property-information": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.1.0.tgz", @@ -10164,6 +10308,33 @@ "whatwg-fetch": "3.0.0" } }, + "react-bootstrap": { + "version": "1.0.0-beta.9", + "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-1.0.0-beta.9.tgz", + "integrity": "sha512-M0BYLuuUdMITJ16+DDDb1p4vWV87csEBi/uOxZYODuDZh7hvbrJVahfvPXcqeqq4eEpNL+PKSlqb9fNaY0HZyA==", + "requires": { + "@babel/runtime": "^7.4.2", + "@react-bootstrap/react-popper": "1.2.1", + "@restart/context": "^2.1.4", + "@restart/hooks": "^0.3.0", + "classnames": "^2.2.6", + "dom-helpers": "^3.4.0", + "invariant": "^2.2.4", + "keycode": "^2.2.0", + "popper.js": "^1.14.7", + "prop-types": "^15.7.2", + "prop-types-extra": "^1.1.0", + "react-overlays": "^1.2.0", + "react-transition-group": "^4.0.0", + "uncontrollable": "^6.1.0", + "warning": "^4.0.3" + } + }, + "react-context-toolbox": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/react-context-toolbox/-/react-context-toolbox-2.0.2.tgz", + "integrity": "sha512-tY4j0imkYC3n5ZlYSgFkaw7fmlCp3IoQQ6DxpqeNHzcD0hf+6V+/HeJxviLUZ1Rv1Yn3N3xyO2EhkkZwHn0m1A==" + }, "react-dev-utils": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-9.0.1.tgz", @@ -10262,6 +10433,50 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz", "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==" }, + "react-overlays": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-1.2.0.tgz", + "integrity": "sha512-i/FCV8wR6aRaI+Kz/dpJhOdyx+ah2tN1RhT9InPrexyC4uzf3N4bNayFTGtUeQVacj57j1Mqh1CwV60/5153Iw==", + "requires": { + "classnames": "^2.2.6", + "dom-helpers": "^3.4.0", + "prop-types": "^15.6.2", + "prop-types-extra": "^1.1.0", + "react-context-toolbox": "^2.0.2", + "react-popper": "^1.3.2", + "uncontrollable": "^6.0.0", + "warning": "^4.0.2" + } + }, + "react-popper": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-1.3.3.tgz", + "integrity": "sha512-ynMZBPkXONPc5K4P5yFWgZx5JGAUIP3pGGLNs58cfAPgK67olx7fmLp+AdpZ0+GoQ+ieFDa/z4cdV6u7sioH6w==", + "requires": { + "@babel/runtime": "^7.1.2", + "create-react-context": "<=0.2.2", + "popper.js": "^1.14.4", + "prop-types": "^15.6.1", + "typed-styles": "^0.0.7", + "warning": "^4.0.2" + }, + "dependencies": { + "create-react-context": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/create-react-context/-/create-react-context-0.2.2.tgz", + "integrity": "sha512-KkpaLARMhsTsgp0d2NA/R94F/eDLbhXERdIq3LvX2biCAXcDvHYoOqHfWCHf1+OLj+HKBotLG3KqaOOf+C1C+A==", + "requires": { + "fbjs": "^0.8.0", + "gud": "^1.0.0" + } + }, + "typed-styles": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/typed-styles/-/typed-styles-0.0.7.tgz", + "integrity": "sha512-pzP0PWoZUhsECYjABgCGQlRGL1n7tOHsgwYv3oIiEpJwGhFTuty/YNeduxQYzXXa3Ge5BdT6sHYIQYpl4uJ+5Q==" + } + } + }, "react-router": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.0.1.tgz", @@ -10368,6 +10583,27 @@ "workbox-webpack-plugin": "4.2.0" } }, + "react-transition-group": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.1.1.tgz", + "integrity": "sha512-K/N1wqJ2GRP2yj3WBqEUYa0KV5fiaAWpUfU9SpHOHefeKvyrO+VrnMBML21M19QZoVbDZKmuQFHZYoMMi1xuJA==", + "requires": { + "@babel/runtime": "^7.4.5", + "dom-helpers": "^3.4.0", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.5.tgz", + "integrity": "sha512-TuI4qpWZP6lGOGIuGWtp9sPluqYICmbk8T/1vpSysqJxRPkudh/ofFWyqdcMsDf2s7KvDL4/YHgKyvcS3g9CJQ==", + "requires": { + "regenerator-runtime": "^0.13.2" + } + } + } + }, "read-pkg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", @@ -11950,11 +12186,21 @@ "mime-types": "~2.1.24" } }, + "typed-styles": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/typed-styles/-/typed-styles-0.0.5.tgz", + "integrity": "sha512-ht+rEe5UsdEBAa3gr64+QjUOqjOLJfWLvl5HZR5Ev9uo/OnD3p43wPeFSB1hNFc13GXQF/JU1Bn0YHLUqBRIlw==" + }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, + "ua-parser-js": { + "version": "0.7.20", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.20.tgz", + "integrity": "sha512-8OaIKfzL5cpx8eCMAhhvTlft8GYF8b2eQr6JkCyVdrgjcytyOmPCXrqXFcUnhonRpLlh5yxEZVohm6mzaowUOw==" + }, "uglify-js": { "version": "3.4.10", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", @@ -11976,6 +12222,25 @@ } } }, + "uncontrollable": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-6.2.3.tgz", + "integrity": "sha512-VgOAoBU2ptCL2bfTG2Mra0I8i1u6Aq84AFonD5tmCAYSfs3hWvr2Rlw0q2ntoxXTHjcQOmZOh3FKaN+UZVyREQ==", + "requires": { + "@babel/runtime": "^7.4.5", + "invariant": "^2.2.4" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.5.tgz", + "integrity": "sha512-TuI4qpWZP6lGOGIuGWtp9sPluqYICmbk8T/1vpSysqJxRPkudh/ofFWyqdcMsDf2s7KvDL4/YHgKyvcS3g9CJQ==", + "requires": { + "regenerator-runtime": "^0.13.2" + } + } + } + }, "unicode-canonical-property-names-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", @@ -12346,6 +12611,14 @@ "makeerror": "1.0.x" } }, + "warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "requires": { + "loose-envify": "^1.0.0" + } + }, "watchpack": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", diff --git a/package.json b/package.json index eeff31f0a..e092f2f8c 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,9 @@ "private": true, "dependencies": { "axios": "^0.19.0", + "bootstrap": "^4.3.1", "react": "^16.8.6", + "react-bootstrap": "^1.0.0-beta.9", "react-dom": "^16.8.6", "react-router-dom": "^5.0.1", "react-scripts": "3.0.1" diff --git a/src/App.js b/src/App.js index 5f57046a9..fc952d060 100644 --- a/src/App.js +++ b/src/App.js @@ -1,7 +1,7 @@ import React, { Component } from 'react'; import { BrowserRouter as Router, Route, Link } from "react-router-dom"; import './App.css'; -import PropTypes from 'prop-types'; +// import PropTypes from 'prop-types'; import Library from './components/Library'; import Customers from './components/Customers'; import Rental from './components/Rental'; @@ -60,55 +60,44 @@ class App extends Component { } - formatDate = (time) => { - let d = new Date(), - month = d.getMonth() + 1, - day = d.getDate(), - year = d.getFullYear(); - - if (time === "now") { - day = d.getDate() - } else if (time === "future") { - day = d.getDate() + 5 - } - - if (month < 10) month = '0' + month; - if (day < 10) day = '0' + day; - - return [year, month, day].join('/'); - } - // Referred to this post for formatting date: https://stackoverflow.com/questions/23593052/format-javascript-date-to-yyyy-mm-dd - - rentMovie = () => { const movie = this.state.rentedMovie const customer = this.state.chosenCustomer - const dueDate = this.formatDate("future") - const checkoutDate = this.formatDate("now") + const checkoutDate = new Date(); + const dueDate = new Date(); + dueDate.setDate(dueDate.getDate() + 7 ); + + const checkoutDateFormatted = `${checkoutDate.getFullYear()}/${checkoutDate.getMonth() + 1}/${checkoutDate.getDate()}`; + const dueDateFormatted = `${dueDate.getFullYear()}/${dueDate.getMonth() + 1}/${dueDate.getDate()}`; + + console.log(checkoutDate); + console.log(checkoutDateFormatted); + console.log(dueDate); + console.log(dueDateFormatted); - const url = `http://localhost:3001/rentals/${movie.title}/check-out` - axios.post(url, { + const url = `http://localhost:3001/rentals/${movie.title}/check-out`; + + const params = { + due_date: dueDate, customer_id: customer.id, - due_date: dueDate - }) + } + axios.post(url, params) .then((response)=> { console.log(response) - // if (response.status === 200) { - console.log('success') - this.setState({ - success: `Rented! "${movie.title}" checked out by ${customer.name}`, - rentedMovie: undefined, - chosenCustomer: undefined, - }) - return ( - - ) - // } + console.log(`Rented! "${movie.title}" checked out by ${customer.name}`) + + this.setState({ + rentedMovie: undefined, + chosenCustomer: undefined, + }) + return ( + + ) }) .catch((error) => { - console.log(error) + console.log(error.message) console.log('err') this.setState({ error: error.message diff --git a/src/components/Rental.js b/src/components/Rental.js index 54b7f4ad1..553689dbf 100644 --- a/src/components/Rental.js +++ b/src/components/Rental.js @@ -4,28 +4,9 @@ import PropTypes from 'prop-types'; // import './Rental.css'; const Rental = (props) => { - // const rentMovie = () => { - // const title = props.movie.title - // axios.post(`http://localhost:3001/rentals/${title}/check-out`) - // .then((response)=> { - // if (response.status === 200) { - // this.setState({ - // success: `Rented! "${props.movie.title}" checked out by ${props.chosenCustomer.name} ` - // }) - // } - // }) - // .catch((error) => { - // this.setState({ - // error: error.message - // }) - // }); - // } return (
      - {/* */} - {props.customer} - {props.movie} - {props.dueDate} + {props.customer}, {props.movie}, {props.dueDate}
      ) } From e712ceb77bab370dd0c82b65744824e7006c0531 Mon Sep 17 00:00:00 2001 From: Jillianne Ramirez Date: Wed, 26 Jun 2019 13:16:37 -0700 Subject: [PATCH 17/66] moved errer section higher on app --- src/App.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/App.js b/src/App.js index fc952d060..9b29dfba1 100644 --- a/src/App.js +++ b/src/App.js @@ -83,6 +83,7 @@ class App extends Component { due_date: dueDate, customer_id: customer.id, } + axios.post(url, params) .then((response)=> { console.log(response) @@ -97,8 +98,6 @@ class App extends Component { ) }) .catch((error) => { - console.log(error.message) - console.log('err') this.setState({ error: error.message }) @@ -120,6 +119,7 @@ class App extends Component { {/* } */}
      + {errorSection} }/> @@ -143,8 +143,6 @@ class App extends Component { /> )} /> - - {errorSection} ); From ca9aca56b85d3bd9b799965111c5a997990e31f4 Mon Sep 17 00:00:00 2001 From: Sophearychiv Date: Wed, 26 Jun 2019 14:18:48 -0700 Subject: [PATCH 18/66] added styles --- package-lock.json | 273 +++++++++++++++++++++++++++++++++++ package.json | 2 + src/App.css | 1 + src/App.js | 32 ++-- src/components/Customer.js | 7 +- src/components/Customers.js | 17 ++- src/components/Details.css | 3 + src/components/Details.js | 20 ++- src/components/Library.js | 30 ++-- src/components/Movie.js | 9 +- src/components/MovieCard.js | 3 +- src/components/Search.css | 4 + src/components/Search.js | 7 +- src/components/SearchBar.css | 7 + src/components/SearchBar.js | 25 ++-- src/index.js | 1 + 16 files changed, 383 insertions(+), 58 deletions(-) create mode 100644 src/components/Details.css create mode 100644 src/components/Search.css create mode 100644 src/components/SearchBar.css diff --git a/package-lock.json b/package-lock.json index 9bc9f54a4..db958783b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1162,6 +1162,39 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==" }, + "@react-bootstrap/react-popper": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@react-bootstrap/react-popper/-/react-popper-1.2.1.tgz", + "integrity": "sha512-4l3q7LcZEhrSkI4d3Ie3g4CdrXqqTexXX4PFT45CB0z5z2JUbaxgRwKNq7r5j2bLdVpZm+uvUGqxJw8d9vgbJQ==", + "requires": { + "babel-runtime": "6.x.x", + "create-react-context": "^0.2.1", + "popper.js": "^1.14.4", + "prop-types": "^15.6.1", + "typed-styles": "^0.0.5", + "warning": "^3.0.0" + }, + "dependencies": { + "warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", + "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", + "requires": { + "loose-envify": "^1.0.0" + } + } + } + }, + "@restart/context": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@restart/context/-/context-2.1.4.tgz", + "integrity": "sha512-INJYZQJP7g+IoDUh/475NlGiTeMfwTXUEr3tmRneckHIxNolGOW9CTq83S8cxq0CgJwwcMzMJFchxvlwe7Rk8Q==" + }, + "@restart/hooks": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.3.1.tgz", + "integrity": "sha512-kjGGlli8iTe5TFDw6qHZJ5QK1naITMveIO+o8yQJJqwX8VIkiQzLddK98Lduga2krJMzWlNqDR/4isGLiyBlUA==" + }, "@svgr/babel-plugin-add-jsx-attribute": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.2.0.tgz", @@ -2428,6 +2461,11 @@ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" }, + "bootstrap": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.3.1.tgz", + "integrity": "sha512-rXqOmH1VilAt2DyPzluTi2blhk17bO7ef+zLLPlWvG494pDxcM234pJ8wTc/6R40UWizAIIMgxjvxZg5kmsbag==" + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -3359,6 +3397,11 @@ } } }, + "classnames": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", + "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" + }, "clean-css": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", @@ -3709,6 +3752,15 @@ "sha.js": "^2.4.8" } }, + "create-react-context": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/create-react-context/-/create-react-context-0.2.3.tgz", + "integrity": "sha512-CQBmD0+QGgTaxDL3OX1IDXYqjkp2It4RIbcb99jS6AEg27Ga+a9G3JtK6SIu0HBwPLZlmwt9F7UwWA4Bn92Rag==", + "requires": { + "fbjs": "^0.8.0", + "gud": "^1.0.0" + } + }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -4266,6 +4318,14 @@ "utila": "~0.4" } }, + "dom-helpers": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", + "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", + "requires": { + "@babel/runtime": "^7.1.2" + } + }, "dom-serializer": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", @@ -4392,6 +4452,14 @@ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" }, + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "requires": { + "iconv-lite": "~0.4.13" + } + }, "end-of-stream": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", @@ -5232,6 +5300,35 @@ "bser": "^2.0.0" } }, + "fbjs": { + "version": "0.8.17", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz", + "integrity": "sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=", + "requires": { + "core-js": "^1.0.0", + "isomorphic-fetch": "^2.1.1", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.18" + }, + "dependencies": { + "core-js": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "requires": { + "asap": "~2.0.3" + } + } + } + }, "figgy-pudding": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", @@ -6436,6 +6533,15 @@ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" }, + "isomorphic-fetch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", + "requires": { + "node-fetch": "^1.0.1", + "whatwg-fetch": ">=0.10.0" + } + }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", @@ -7759,6 +7865,11 @@ "array-includes": "^3.0.3" } }, + "keycode": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/keycode/-/keycode-2.2.0.tgz", + "integrity": "sha1-PQr1bce4uOXLqNCpfxByBO7CKwQ=" + }, "killable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", @@ -8398,6 +8509,15 @@ "lower-case": "^1.1.1" } }, + "node-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "requires": { + "encoding": "^0.1.11", + "is-stream": "^1.0.1" + } + }, "node-forge": { "version": "0.7.5", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.5.tgz", @@ -9051,6 +9171,11 @@ "ts-pnp": "^1.0.0" } }, + "popper.js": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.15.0.tgz", + "integrity": "sha512-w010cY1oCUmI+9KwwlWki+r5jxKfTFDVoadl7MSrIujHU5MJ5OR6HTDj6Xo8aoR/QsA56x8jKjA59qGH4ELtrA==" + }, "portfinder": { "version": "1.0.20", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.20.tgz", @@ -9992,6 +10117,25 @@ "react-is": "^16.8.1" } }, + "prop-types-extra": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.0.tgz", + "integrity": "sha512-QFyuDxvMipmIVKD2TwxLVPzMnO4e5oOf1vr3tJIomL8E7d0lr6phTHd5nkPhFIzTD1idBLLEPeylL9g+rrTzRg==", + "requires": { + "react-is": "^16.3.2", + "warning": "^3.0.0" + }, + "dependencies": { + "warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", + "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", + "requires": { + "loose-envify": "^1.0.0" + } + } + } + }, "property-information": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.1.0.tgz", @@ -10164,6 +10308,33 @@ "whatwg-fetch": "3.0.0" } }, + "react-bootstrap": { + "version": "1.0.0-beta.9", + "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-1.0.0-beta.9.tgz", + "integrity": "sha512-M0BYLuuUdMITJ16+DDDb1p4vWV87csEBi/uOxZYODuDZh7hvbrJVahfvPXcqeqq4eEpNL+PKSlqb9fNaY0HZyA==", + "requires": { + "@babel/runtime": "^7.4.2", + "@react-bootstrap/react-popper": "1.2.1", + "@restart/context": "^2.1.4", + "@restart/hooks": "^0.3.0", + "classnames": "^2.2.6", + "dom-helpers": "^3.4.0", + "invariant": "^2.2.4", + "keycode": "^2.2.0", + "popper.js": "^1.14.7", + "prop-types": "^15.7.2", + "prop-types-extra": "^1.1.0", + "react-overlays": "^1.2.0", + "react-transition-group": "^4.0.0", + "uncontrollable": "^6.1.0", + "warning": "^4.0.3" + } + }, + "react-context-toolbox": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/react-context-toolbox/-/react-context-toolbox-2.0.2.tgz", + "integrity": "sha512-tY4j0imkYC3n5ZlYSgFkaw7fmlCp3IoQQ6DxpqeNHzcD0hf+6V+/HeJxviLUZ1Rv1Yn3N3xyO2EhkkZwHn0m1A==" + }, "react-dev-utils": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-9.0.1.tgz", @@ -10262,6 +10433,50 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz", "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==" }, + "react-overlays": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-1.2.0.tgz", + "integrity": "sha512-i/FCV8wR6aRaI+Kz/dpJhOdyx+ah2tN1RhT9InPrexyC4uzf3N4bNayFTGtUeQVacj57j1Mqh1CwV60/5153Iw==", + "requires": { + "classnames": "^2.2.6", + "dom-helpers": "^3.4.0", + "prop-types": "^15.6.2", + "prop-types-extra": "^1.1.0", + "react-context-toolbox": "^2.0.2", + "react-popper": "^1.3.2", + "uncontrollable": "^6.0.0", + "warning": "^4.0.2" + } + }, + "react-popper": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-1.3.3.tgz", + "integrity": "sha512-ynMZBPkXONPc5K4P5yFWgZx5JGAUIP3pGGLNs58cfAPgK67olx7fmLp+AdpZ0+GoQ+ieFDa/z4cdV6u7sioH6w==", + "requires": { + "@babel/runtime": "^7.1.2", + "create-react-context": "<=0.2.2", + "popper.js": "^1.14.4", + "prop-types": "^15.6.1", + "typed-styles": "^0.0.7", + "warning": "^4.0.2" + }, + "dependencies": { + "create-react-context": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/create-react-context/-/create-react-context-0.2.2.tgz", + "integrity": "sha512-KkpaLARMhsTsgp0d2NA/R94F/eDLbhXERdIq3LvX2biCAXcDvHYoOqHfWCHf1+OLj+HKBotLG3KqaOOf+C1C+A==", + "requires": { + "fbjs": "^0.8.0", + "gud": "^1.0.0" + } + }, + "typed-styles": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/typed-styles/-/typed-styles-0.0.7.tgz", + "integrity": "sha512-pzP0PWoZUhsECYjABgCGQlRGL1n7tOHsgwYv3oIiEpJwGhFTuty/YNeduxQYzXXa3Ge5BdT6sHYIQYpl4uJ+5Q==" + } + } + }, "react-router": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.0.1.tgz", @@ -10368,6 +10583,27 @@ "workbox-webpack-plugin": "4.2.0" } }, + "react-transition-group": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.1.1.tgz", + "integrity": "sha512-K/N1wqJ2GRP2yj3WBqEUYa0KV5fiaAWpUfU9SpHOHefeKvyrO+VrnMBML21M19QZoVbDZKmuQFHZYoMMi1xuJA==", + "requires": { + "@babel/runtime": "^7.4.5", + "dom-helpers": "^3.4.0", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.5.tgz", + "integrity": "sha512-TuI4qpWZP6lGOGIuGWtp9sPluqYICmbk8T/1vpSysqJxRPkudh/ofFWyqdcMsDf2s7KvDL4/YHgKyvcS3g9CJQ==", + "requires": { + "regenerator-runtime": "^0.13.2" + } + } + } + }, "read-pkg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", @@ -11950,11 +12186,21 @@ "mime-types": "~2.1.24" } }, + "typed-styles": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/typed-styles/-/typed-styles-0.0.5.tgz", + "integrity": "sha512-ht+rEe5UsdEBAa3gr64+QjUOqjOLJfWLvl5HZR5Ev9uo/OnD3p43wPeFSB1hNFc13GXQF/JU1Bn0YHLUqBRIlw==" + }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, + "ua-parser-js": { + "version": "0.7.20", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.20.tgz", + "integrity": "sha512-8OaIKfzL5cpx8eCMAhhvTlft8GYF8b2eQr6JkCyVdrgjcytyOmPCXrqXFcUnhonRpLlh5yxEZVohm6mzaowUOw==" + }, "uglify-js": { "version": "3.4.10", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", @@ -11976,6 +12222,25 @@ } } }, + "uncontrollable": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-6.2.3.tgz", + "integrity": "sha512-VgOAoBU2ptCL2bfTG2Mra0I8i1u6Aq84AFonD5tmCAYSfs3hWvr2Rlw0q2ntoxXTHjcQOmZOh3FKaN+UZVyREQ==", + "requires": { + "@babel/runtime": "^7.4.5", + "invariant": "^2.2.4" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.5.tgz", + "integrity": "sha512-TuI4qpWZP6lGOGIuGWtp9sPluqYICmbk8T/1vpSysqJxRPkudh/ofFWyqdcMsDf2s7KvDL4/YHgKyvcS3g9CJQ==", + "requires": { + "regenerator-runtime": "^0.13.2" + } + } + } + }, "unicode-canonical-property-names-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", @@ -12346,6 +12611,14 @@ "makeerror": "1.0.x" } }, + "warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "requires": { + "loose-envify": "^1.0.0" + } + }, "watchpack": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", diff --git a/package.json b/package.json index eeff31f0a..e092f2f8c 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,9 @@ "private": true, "dependencies": { "axios": "^0.19.0", + "bootstrap": "^4.3.1", "react": "^16.8.6", + "react-bootstrap": "^1.0.0-beta.9", "react-dom": "^16.8.6", "react-router-dom": "^5.0.1", "react-scripts": "3.0.1" diff --git a/src/App.css b/src/App.css index c5c6e8a68..b46285012 100644 --- a/src/App.css +++ b/src/App.css @@ -1,3 +1,4 @@ + .App { text-align: center; } diff --git a/src/App.js b/src/App.js index abdd991d6..0c3264bf9 100644 --- a/src/App.js +++ b/src/App.js @@ -1,4 +1,7 @@ import React, { Component } from 'react'; +import 'bootstrap/dist/css/bootstrap.min.css'; +import Nav from 'react-bootstrap/Nav'; +import Navbar from 'react-bootstrap/Navbar'; import { BrowserRouter as Router, Route, Link } from "react-router-dom"; import './App.css'; import PropTypes from 'prop-types'; @@ -7,6 +10,7 @@ import Customers from './components/Customers'; import axios from 'axios'; import Search from './components/Search'; + class App extends Component { constructor() { super(); @@ -67,12 +71,11 @@ class App extends Component { return (
      +
      { this.state.rentedMovie &&

      Movie Selection: {this.state.rentedMovie.title}

      } { this.state.chosenCustomer &&

      Customer Selection: {this.state.chosenCustomer.name}

      } - -
      - + }/> -
    • - Home -
    • -
    • - Search -
    • -
    • - Library -
    • -
    • - Customers -
    • - + + Video World + + ); } diff --git a/src/components/Customer.js b/src/components/Customer.js index a931bd6d8..7478fb743 100644 --- a/src/components/Customer.js +++ b/src/components/Customer.js @@ -1,5 +1,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; +import Button from 'react-bootstrap/Button' + // import axios from 'axios'; // import './Customer.css'; @@ -9,7 +11,10 @@ const Customer = (props) => { } return ( -
      {props.name}
      +
      + + + ) } diff --git a/src/components/Customers.js b/src/components/Customers.js index 389c10bfc..d217ebcf4 100644 --- a/src/components/Customers.js +++ b/src/components/Customers.js @@ -1,19 +1,28 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import Customer from './Customer'; +import Table from 'react-bootstrap/Table' + // import axios from 'axios'; // import './Customers.css'; const Customers = (props) => { const customerCollection = props.customers.map((customer, i) => { - return
    • + return }); return ( -
      +

      Customers

      -
        {customerCollection}
      -
      +
      {props.name}
      + + + + + + {customerCollection} +
      Customer Name
      +
      ) } diff --git a/src/components/Details.css b/src/components/Details.css new file mode 100644 index 000000000..1a728b7ba --- /dev/null +++ b/src/components/Details.css @@ -0,0 +1,3 @@ +.pic { + width: 200px; +} \ No newline at end of file diff --git a/src/components/Details.js b/src/components/Details.js index 4633024c3..4bdebb034 100644 --- a/src/components/Details.js +++ b/src/components/Details.js @@ -1,18 +1,22 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; +import Card from 'react-bootstrap/Card'; +import './Details.css'; // import './Library.css'; const Details = (props) => { const movieDetails = () => { return ( -
        -
      • Id: {props.id}
      • -
      • Title: {props.title}
      • -
      • Overview: {props.overview}
      • -
      • Release Date: {props.release_date}
      • -
      • {`${props.title}`}/
      • -
      • External Id: {props.external_id}
      • -
      + + + + Title: {props.title} + Overview: {props.overview} +
    • Id: {props.id}
    • +
    • Release Date: {props.release_date}
    • +
    • External Id: {props.external_id}
    • +
      +
      ) }; diff --git a/src/components/Library.js b/src/components/Library.js index 56dc5609e..8309f563e 100644 --- a/src/components/Library.js +++ b/src/components/Library.js @@ -1,25 +1,33 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import Movie from './Movie'; +import Table from 'react-bootstrap/Table' + // import './Library.css'; const Library = (props) => { const movieCollection = props.library.map((movie, i) => { - return
    • - -
    • + return }); return ( -
      +

      Library

      -
        {movieCollection}
      -
      + + + Movie Title + + + + + {movieCollection} + +
      +
      ) } diff --git a/src/components/Movie.js b/src/components/Movie.js index 60b481bac..6b133ca11 100644 --- a/src/components/Movie.js +++ b/src/components/Movie.js @@ -13,11 +13,12 @@ const Movie = (props) => { } return ( -
      {props.movie.title} - - + + {props.movie.title} + + {props.viewMovieDetails &&
      } -
      + ) } diff --git a/src/components/MovieCard.js b/src/components/MovieCard.js index df196e91d..54be0e509 100644 --- a/src/components/MovieCard.js +++ b/src/components/MovieCard.js @@ -1,4 +1,5 @@ import React from 'react'; +import Button from 'react-bootstrap/Button' const MovieCard = (props) => { const {image_url, title, overview, release_date,addMovieCallback } = props; @@ -11,7 +12,7 @@ const MovieCard = (props) => { {title} {overview} {release_date} - + ) } diff --git a/src/components/Search.css b/src/components/Search.css new file mode 100644 index 000000000..3034fa63e --- /dev/null +++ b/src/components/Search.css @@ -0,0 +1,4 @@ +.search_title { + text-align: center; + margin-top: 5rem; +} \ No newline at end of file diff --git a/src/components/Search.js b/src/components/Search.js index 7da4f4c7b..cb204dd53 100644 --- a/src/components/Search.js +++ b/src/components/Search.js @@ -2,6 +2,8 @@ import React, {Component} from 'react'; import SearchBar from './SearchBar'; import MovieCard from './MovieCard'; import axios from 'axios'; +import Table from 'react-bootstrap/Table'; +import './Search.css'; class Search extends Component { constructor(props) { super(props); @@ -108,16 +110,17 @@ class Search extends Component { return (
      +

      Search for Movies

      {errorSection} {successSection} - +
      {tableHeader} {movieCards} -
      +
      ) diff --git a/src/components/SearchBar.css b/src/components/SearchBar.css new file mode 100644 index 000000000..68e7ca272 --- /dev/null +++ b/src/components/SearchBar.css @@ -0,0 +1,7 @@ +.search_bar { + margin: 20px auto; + width: 100%; + max-width: 300px; + height: 40px; + text-align: center; +} \ No newline at end of file diff --git a/src/components/SearchBar.js b/src/components/SearchBar.js index 7efd14a59..908e0f3bd 100644 --- a/src/components/SearchBar.js +++ b/src/components/SearchBar.js @@ -1,4 +1,10 @@ import React, {Component} from 'react'; +import Form from 'react-bootstrap/Form'; +import FormControl from 'react-bootstrap/FormControl'; +import Button from 'react-bootstrap/Button'; +import './SearchBar.css'; + + class SearchBar extends Component { constructor(props) { super(props); @@ -8,7 +14,6 @@ class SearchBar extends Component { } queryChanged = (event) => { - // event.preventDefault(); const queryString = event.target.value; this.setState({ queryString @@ -18,15 +23,15 @@ class SearchBar extends Component { } render() { return ( -
      - -
      +
      +
      + + +
      ) } }; diff --git a/src/index.js b/src/index.js index fae3e3500..cb6856b7c 100644 --- a/src/index.js +++ b/src/index.js @@ -3,6 +3,7 @@ import ReactDOM from 'react-dom'; import './index.css'; import App from './App'; import registerServiceWorker from './registerServiceWorker'; +import 'bootstrap/dist/css/bootstrap.css'; ReactDOM.render(, document.getElementById('root')); registerServiceWorker(); From 636e2ef84807cc8f8bb736307178992a3b44854a Mon Sep 17 00:00:00 2001 From: Sophearychiv Date: Wed, 26 Jun 2019 14:36:26 -0700 Subject: [PATCH 19/66] fixed issues with customer selection --- src/App.css | 5 +++++ src/App.js | 10 +++++----- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/App.css b/src/App.css index b46285012..06f869435 100644 --- a/src/App.css +++ b/src/App.css @@ -1,4 +1,9 @@ +.nav_link { + color: white; + margin-right: 2rem; +} + .App { text-align: center; } diff --git a/src/App.js b/src/App.js index 0c3264bf9..1959e1ce3 100644 --- a/src/App.js +++ b/src/App.js @@ -67,7 +67,7 @@ class App extends Component { render() { const errorSection = (this.state.error) ? (
      Error: {this.state.error}
      ) : null; - + console.log(this.state) return (
      @@ -115,10 +115,10 @@ function Header() { Video World ); From 24d5fc6de168288bceba1afc95bab45e54c81b15 Mon Sep 17 00:00:00 2001 From: Sophearychiv Date: Wed, 26 Jun 2019 14:51:07 -0700 Subject: [PATCH 20/66] fixed brand link --- src/App.css | 6 ++++++ src/App.js | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/App.css b/src/App.css index 06f869435..8767a87c8 100644 --- a/src/App.css +++ b/src/App.css @@ -4,6 +4,12 @@ margin-right: 2rem; } +/* .brand_link { + font-family: 'Courier New', Courier, monospace; + font-size: 2rem; + color: white; +} */ + .App { text-align: center; } diff --git a/src/App.js b/src/App.js index 1959e1ce3..3c183b3e0 100644 --- a/src/App.js +++ b/src/App.js @@ -113,7 +113,7 @@ function Home() { function Header() { return ( - Video World + Video World
      - let buttons =
      -
      + let showButton =
      -
      - -
      -
      + let selectButton =
      + +
      if (props.viewMovieDetails) { movieDescription = null; - buttons =
      -
      + showButton =
      -
      - -
      -
      + } - - console.log("Rendering movie with image URL:", props.movie.image_url); + + if (props.selectedMovie === props.movie) { + selectButton =
      + +
      + } + return ( @@ -53,7 +52,10 @@ const Movie = (props) => { {movieDescription}
      {props.viewMovieDetails &&
      } - {buttons} +
      + {showButton} + {selectButton} +
      diff --git a/src/components/MovieCard.js b/src/components/MovieCard.js index 1820de98d..f30b53c24 100644 --- a/src/components/MovieCard.js +++ b/src/components/MovieCard.js @@ -15,7 +15,6 @@ const MovieCard = (props) => {

      {title}

      Release Date: {release_date}

      Overview: {overview}

      - {/*

      Overview: {overview.length > 200 ? `${overview.substring(0, 150)}...` : overview}

      */}
      From 5046ea023b66709db9acf2923d446e1d6d945531 Mon Sep 17 00:00:00 2001 From: Jillianne Ramirez Date: Thu, 27 Jun 2019 17:39:13 -0700 Subject: [PATCH 40/66] able to view each customers rentals now --- src/App.js | 89 ++++++++++--------- src/components/Customer.js | 34 ++++--- src/components/Customers.js | 13 +-- src/components/Library.js | 7 +- src/components/Log.js | 2 +- src/components/Movie.js | 18 ++-- .../{Details.css => MovieDetails.css} | 0 .../{Details.js => MovieDetails.js} | 19 ++-- 8 files changed, 100 insertions(+), 82 deletions(-) rename src/components/{Details.css => MovieDetails.css} (100%) rename src/components/{Details.js => MovieDetails.js} (55%) diff --git a/src/App.js b/src/App.js index 9667a1fa8..e6301868b 100644 --- a/src/App.js +++ b/src/App.js @@ -15,11 +15,9 @@ class App extends Component { this.state = { movies: [], - customers: [], - allRentals: undefined, - customerRentals: undefined, - overdueMovies: undefined, expandedMovies: {}, + customers: [], + expandedCustomers: {}, rentedMovie: undefined, chosenCustomer: undefined, dueDate: undefined, @@ -30,6 +28,9 @@ class App extends Component { customer: undefined, checkin: false, }, + allRentals: undefined, + customerRentals: undefined, + overdueMovies: undefined, error: null, }; } @@ -37,7 +38,7 @@ class App extends Component { componentDidMount() { axios.get('http://localhost:3001/movies') .then((response) => { - this.setState({ movies: response.data}); + this.setState({ movies: response.data }); }) .catch((error) => { this.setState({ error: error.message }); @@ -59,7 +60,7 @@ class App extends Component { }); } - onClickDetailsCallback = (id) => { + onClickMovieDetailsCallback = (id) => { this.setState((prevState) => ({ expandedMovies: { ...prevState.expandedMovies, @@ -68,20 +69,29 @@ class App extends Component { })); } - onSelectMovieCallback = (index) => { - const selectedMovie = this.state.movies[index] + onSelectMovieCallback = (id) => { + const selectedMovie = this.state.movies[id - 1] this.setState({ rentedMovie: selectedMovie }); } - onSelectCustomerCallback = (index) => { - const selectedCustomer = this.state.customers[index] + onClickCustomerRentalsCallback = (id) => { + this.setState((prevState) => ({ + expandedCustomers: { + ...prevState.expandedCustomers, + [id]: !prevState.expandedCustomers[id], + } + })); + } + + onSelectCustomerCallback = (id) => { + const selectedCustomer = this.state.customers[id - 1] this.setState({ chosenCustomer: selectedCustomer }); } rentMovie = () => { const checkoutDate = new Date(); const dueDate = new Date(); - dueDate.setDate(dueDate.getDate() + 7 ); + dueDate.setDate(dueDate.getDate() + 1 ); const url = `http://localhost:3001/rentals/${this.state.rentedMovie.title}/check-out`; @@ -159,8 +169,27 @@ class App extends Component { }); } + findCustomerRentals = (customerID) => { + const rentals = [] + + for (let key in this.state.allRentals) { + if (this.state.allRentals[key]["customer"] === customerID) { + rentals.push( + { + "movie": this.state.allRentals[key]["movie"], + "checkout_date": this.state.allRentals[key]["checkout_date"], + "due_date": this.state.allRentals[key]["due_date"] + } + ) + } + } + + this.setState({ + customerRentals: rentals, + }); + } - gatherAllRentals = (customerID) => { + onCustomerRentalsCallback = (customerID) => { let uniqueRentals = {} axios.get('http://localhost:3001/rentals') @@ -181,6 +210,7 @@ class App extends Component { }) this.findCustomerRentals(customerID) + this.onClickCustomerRentalsCallback(customerID) }) .catch((error) => { this.setState({ @@ -189,30 +219,6 @@ class App extends Component { }); } - findCustomerRentals = (customerID) => { - const rentals = [] - - for (let key in this.state.allRentals) { - if (this.state.allRentals[key]["customer"] === customerID) { - rentals.push( - { - "movie": this.state.allRentals[key]["movie"], - "checkout_date": this.state.allRentals[key]["checkout_date"], - "due_date": this.state.allRentals[key]["due_date"] - } - ) - } - } - - this.setState({ - customerRentals: rentals, - }); - } - - onCustomerRentalsCallback = (customerID) => { - this.gatherAllRentals(customerID) - } - render() { const errorSection = (this.state.error) ? (
      Error: {this.state.error}
      ) : null; @@ -250,8 +256,8 @@ class App extends Component { )} /> @@ -259,9 +265,9 @@ class App extends Component { path="/customers" render={() => ( @@ -272,9 +278,6 @@ class App extends Component { render={() => ( diff --git a/src/components/Customer.js b/src/components/Customer.js index 1c9ec09ed..9305379b4 100644 --- a/src/components/Customer.js +++ b/src/components/Customer.js @@ -1,19 +1,19 @@ -import React, { Component } from 'react'; +import React from 'react'; import PropTypes from 'prop-types'; +import Card from 'react-bootstrap/Card'; import Button from 'react-bootstrap/Button' -import axios from 'axios'; // import './Customer.css'; const Customer = (props) => { const onSelectCustomer = () => { - props.onSelectCustomerCallback(props.id - 1) + props.onSelectCustomerCallback(props.customer.id) } const onViewRentals = () => { - props.onCustomerRentalsCallback(props.id) + props.onCustomerRentalsCallback(props.customer.id) } - const showCustomerRentals = () => { + const customerRentals = () => { const rentalHTML = props.customerRentals.map((rental, i) => { return {rental["movie"]}{rental["checkout_date"]}{rental["due_date"]} }) @@ -23,18 +23,30 @@ const Customer = (props) => { return ( - {props.name} + {props.customer.name} - - {props.customerRentals && {showCustomerRentals()}
      MovieChecked OutDue On
      } + + + {props.viewCustomerRental && + + + {props.customer.name}'s Rentals + + + + {customerRentals()} +
      +
      +
      +
      } ) } Customer.propTypes = { - id: PropTypes.number.isRequired, - name: PropTypes.string.isRequired, - allRentals: PropTypes.array, + customer: PropTypes.object.isRequired, + viewCustomerRental: PropTypes.bool, + customerRentals: PropTypes.array, onSelectCustomerCallback: PropTypes.func.isRequired, onCustomerRentalsCallback: PropTypes.func.isRequired, }; diff --git a/src/components/Customers.js b/src/components/Customers.js index 82cecc294..a31e38662 100644 --- a/src/components/Customers.js +++ b/src/components/Customers.js @@ -1,24 +1,17 @@ -import React, { Component } from 'react'; +import React from 'react'; import PropTypes from 'prop-types'; import Customer from './Customer'; import Table from 'react-bootstrap/Table' - -// import axios from 'axios'; import './Customers.css'; const Customers = (props) => { const customerCollection = props.customers.map((customer, i) => { - return + return }); return (

      Customers

      - {/* - - Name - - */} {customerCollection}
      @@ -28,7 +21,9 @@ const Customers = (props) => { Customers.propTypes = { customers: PropTypes.array.isRequired, + expandedCustomer: PropTypes.object, onSelectCustomerCallback: PropTypes.func.isRequired, + onCustomerRentalsCallback: PropTypes.func.isRequired, }; export default Customers; \ No newline at end of file diff --git a/src/components/Library.js b/src/components/Library.js index f2c3234cd..fc4df2031 100644 --- a/src/components/Library.js +++ b/src/components/Library.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import React from 'react'; import PropTypes from 'prop-types'; import Movie from './Movie'; import Table from 'react-bootstrap/Table'; @@ -9,7 +9,7 @@ const Library = (props) => { return }); @@ -36,8 +36,9 @@ const Library = (props) => { Library.propTypes = { library: PropTypes.array.isRequired, - onClickDetailsCallback: PropTypes.func.isRequired, + expandedMovies: PropTypes.object, onSelectMovieCallback: PropTypes.func.isRequired, + onClickMovieDetailsCallback: PropTypes.func.isRequired, }; export default Library; \ No newline at end of file diff --git a/src/components/Log.js b/src/components/Log.js index 44fb54f5a..09bc7fe26 100644 --- a/src/components/Log.js +++ b/src/components/Log.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import React from 'react'; import PropTypes from 'prop-types'; import axios from 'axios'; // import './Log.css'; diff --git a/src/components/Movie.js b/src/components/Movie.js index d80672418..28e1cccbf 100644 --- a/src/components/Movie.js +++ b/src/components/Movie.js @@ -1,15 +1,15 @@ -import React, { Component } from 'react'; +import React from 'react'; import PropTypes from 'prop-types'; -import Details from './Details'; +import MovieDetails from './MovieDetails'; import './Movie.css'; const Movie = (props) => { - const onClickButton = () => { + const onSelectMovie = () => { props.onSelectMovieCallback(props.movie.id) } - const onClickDetailsButton = () => { - props.onClickDetailsCallback(props.movie.id) + const onViewMovieDetails = () => { + props.onClickMovieDetailsCallback(props.movie.id) } return ( @@ -20,9 +20,9 @@ const Movie = (props) => {

      {props.movie.title}

      Release Date: {props.movie.release_date}

      Overview: {props.movie.overview.length > 128 ? `${props.movie.overview.substring(0, 150)}...` : props.movie.overview}

      - - - {props.viewMovieDetails &&
      } + + + {props.viewMovieDetails && }
      @@ -31,6 +31,8 @@ const Movie = (props) => { Movie.propTypes = { movie: PropTypes.object.isRequired, + viewMovieDetails: PropTypes.bool, + onClickMovieDetailsCallback: PropTypes.func.isRequired, onSelectMovieCallback: PropTypes.func.isRequired, }; diff --git a/src/components/Details.css b/src/components/MovieDetails.css similarity index 100% rename from src/components/Details.css rename to src/components/MovieDetails.css diff --git a/src/components/Details.js b/src/components/MovieDetails.js similarity index 55% rename from src/components/Details.js rename to src/components/MovieDetails.js index 8b37abd8e..463765136 100644 --- a/src/components/Details.js +++ b/src/components/MovieDetails.js @@ -1,10 +1,10 @@ -import React, { Component } from 'react'; +import React from 'react'; import PropTypes from 'prop-types'; import Card from 'react-bootstrap/Card'; -import './Details.css'; -// import './Library.css'; +// import './MovieDetails.css'; -const Details = (props) => { +const MovieDetails = (props) => { + console.log(props) const movieDetails = () => { return ( @@ -22,8 +22,13 @@ const Details = (props) => { return movieDetails(); } -Details.propTypes = { - // showMovie: PropTypes.array.isRequired, +MovieDetails.propTypes = { + external_id: PropTypes.number.isRequired, + id: PropTypes.number.isRequired, + image_url: PropTypes.string.isRequired, + overview: PropTypes.string.isRequired, + release_date: PropTypes.string.isRequired, + title: PropTypes.string.isRequired, }; -export default Details; \ No newline at end of file +export default MovieDetails; \ No newline at end of file From 4d64fc1af0113f7a52184ad87397bad3d19d9289 Mon Sep 17 00:00:00 2001 From: Jillianne Ramirez Date: Thu, 27 Jun 2019 19:13:02 -0700 Subject: [PATCH 41/66] able to view correct customer rentals --- src/App.js | 26 +++----------------------- src/components/Customer.js | 11 ++--------- src/components/CustomerRentals.js | 17 +++++++++++++++++ src/components/Customers.js | 20 +++++++++++++++++++- 4 files changed, 41 insertions(+), 33 deletions(-) create mode 100644 src/components/CustomerRentals.js diff --git a/src/App.js b/src/App.js index 1a808234e..cf7ce6243 100644 --- a/src/App.js +++ b/src/App.js @@ -30,7 +30,7 @@ class App extends Component { checkin: false, }, allRentals: undefined, - customerRentals: undefined, + // customerRentals: undefined, overdueMovies: undefined, error: null, }; @@ -170,26 +170,6 @@ class App extends Component { }); } - findCustomerRentals = (customerID) => { - const rentals = [] - - for (let key in this.state.allRentals) { - if (this.state.allRentals[key]["customer"] === customerID) { - rentals.push( - { - "movie": this.state.allRentals[key]["movie"], - "checkout_date": this.state.allRentals[key]["checkout_date"], - "due_date": this.state.allRentals[key]["due_date"] - } - ) - } - } - - this.setState({ - customerRentals: rentals, - }); - } - onCustomerRentalsCallback = (customerID) => { let uniqueRentals = {} @@ -210,7 +190,7 @@ class App extends Component { allRentals: uniqueRentals }) - this.findCustomerRentals(customerID) + // this.findCustomerRentals(customerID) this.onClickCustomerRentalsCallback(customerID) }) .catch((error) => { @@ -271,7 +251,7 @@ class App extends Component { diff --git a/src/components/Customer.js b/src/components/Customer.js index 9305379b4..8274633c5 100644 --- a/src/components/Customer.js +++ b/src/components/Customer.js @@ -1,5 +1,6 @@ import React from 'react'; import PropTypes from 'prop-types'; +import CustomerRentals from './CustomerRentals'; import Card from 'react-bootstrap/Card'; import Button from 'react-bootstrap/Button' // import './Customer.css'; @@ -13,14 +14,6 @@ const Customer = (props) => { props.onCustomerRentalsCallback(props.customer.id) } - const customerRentals = () => { - const rentalHTML = props.customerRentals.map((rental, i) => { - return {rental["movie"]}{rental["checkout_date"]}{rental["due_date"]} - }) - - return rentalHTML - } - return ( {props.customer.name} @@ -34,7 +27,7 @@ const Customer = (props) => { - {customerRentals()} +
      diff --git a/src/components/CustomerRentals.js b/src/components/CustomerRentals.js new file mode 100644 index 000000000..e195accba --- /dev/null +++ b/src/components/CustomerRentals.js @@ -0,0 +1,17 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +// import './CustomerRentals.css'; + +const CustomerRentals = (props) => { + const rentalHTML = props.rentals.map((rental, i) => { + return {rental["movie"]}{rental["checkout_date"]}{rental["due_date"]} + }) + + return rentalHTML +} + +CustomerRentals.propTypes = { + rentals: PropTypes.array, +}; + +export default CustomerRentals; \ No newline at end of file diff --git a/src/components/Customers.js b/src/components/Customers.js index a31e38662..8a34f756a 100644 --- a/src/components/Customers.js +++ b/src/components/Customers.js @@ -5,8 +5,26 @@ import Table from 'react-bootstrap/Table' import './Customers.css'; const Customers = (props) => { + + const findRentalsCallback = (customerID) => { + const rentals = [] + for (let key in props.allRentals) { + if (props.allRentals[key]["customer"] === customerID) { + rentals.push( + { + "movie": props.allRentals[key]["movie"], + "checkout_date": props.allRentals[key]["checkout_date"], + "due_date": props.allRentals[key]["due_date"] + } + ) + } + } + return rentals + } + + const customerCollection = props.customers.map((customer, i) => { - return + return }); return ( From bfc1719a84a4ddef443a082d7d8b498383d8a101 Mon Sep 17 00:00:00 2001 From: Jillianne Ramirez Date: Thu, 27 Jun 2019 20:03:25 -0700 Subject: [PATCH 42/66] theme and styling for navigation and front page added --- src/App.css | 40 +++++++++++++++++++--------------------- src/App.js | 22 +++++++++++----------- src/index.css | 7 +++++-- 3 files changed, 35 insertions(+), 34 deletions(-) diff --git a/src/App.css b/src/App.css index a0fd03139..48c235766 100644 --- a/src/App.css +++ b/src/App.css @@ -1,42 +1,40 @@ -@import url('https://fonts.googleapis.com/css?family=Open+Sans'); - .nav_container { - background-color: #99A0B0; + background: #300701 url("https://i.kinja-img.com/gawker-media/image/upload/s--m9daP_xN--/c_scale,f_auto,fl_progressive,q_80,w_800/unsnbwg2cke5spzlpsuy.jpg") no-repeat center top; + background-size: 100% 180%; display: flex; - flex-wrap: wrap; flex-direction: column; position: relative; - height: 12rem; + height: 15rem; } .brand { - color: white; - font-size: 3rem; + color: black; + font-size: 6rem; text-decoration-line: none; - font-family: 'Lobster', cursive; margin-left: 1rem; - /* border: 1px solid black; */ - + text-align: center; + padding-top: 35px; } .nav { position: absolute; + left: 35%; + margin-left: -80px; + bottom: 15px; display: flex; - flex-direction: row; - right: 0; - } .nav_link { color: white; - margin-right: 1rem; - font-size: 1rem; + text-shadow: + -1px -1px 0 #000, + 1px -1px 0 #000, + -1px 1px 0 #000, + 1px 1px 0 #000; + font-size: 2rem; text-decoration: none; - display: inline-block; - padding: .1rem 2.1rem; - margin-top: 9rem; - /* border-left: 2px solid white;; */ - /* float: right; */ + padding-left: 15px; + padding-right: 15px; } .nav_link:first-child { @@ -49,7 +47,7 @@ } .brand:hover { - color: white; + color: #990708; text-decoration: none; } diff --git a/src/App.js b/src/App.js index cf7ce6243..03ecf44dd 100644 --- a/src/App.js +++ b/src/App.js @@ -275,18 +275,18 @@ class App extends Component { function Header() { return ( - + + + +
    ); } diff --git a/src/index.css b/src/index.css index b4cc7250b..61b9f0c0b 100644 --- a/src/index.css +++ b/src/index.css @@ -1,5 +1,8 @@ -body { +@import url('https://fonts.googleapis.com/css?family=Limelight&display=swap'); + +* { margin: 0; padding: 0; - font-family: sans-serif; + /* font-family: sans-serif; */ + font-family: 'Limelight', cursive; } From 38c59cd203d4da602bb8200d0bd00dc6be13a06d Mon Sep 17 00:00:00 2001 From: Sophearychiv Date: Thu, 27 Jun 2019 22:06:52 -0700 Subject: [PATCH 43/66] select and deselect movie --- src/App.js | 16 +++++++++++++--- src/components/Library.js | 2 ++ src/components/Movie.js | 12 +++++++++++- 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/App.js b/src/App.js index 03ecf44dd..d93ca3a18 100644 --- a/src/App.js +++ b/src/App.js @@ -18,7 +18,8 @@ class App extends Component { expandedMovies: {}, customers: [], expandedCustomers: {}, - isDetailsClicked: false, + // isDetailsClicked: false, + deselectedMovie: null, rentedMovie: undefined, chosenCustomer: undefined, dueDate: undefined, @@ -75,6 +76,14 @@ class App extends Component { this.setState({ rentedMovie: selectedMovie }); } + onDeselectMovieCallback = () => { + this.setState({ + deselectedMovie: this.state.rentedMovie, + rentedMovie: null, + }); + } + + onClickCustomerRentalsCallback = (id) => { this.setState((prevState) => ({ expandedCustomers: { @@ -239,8 +248,9 @@ class App extends Component { library={this.state.movies} isDetailsClicked = {this.state.isDetailsClicked} expandedMovies={this.state.expandedMovies} - onSelectMovieCallback={this.onSelectMovieCallback} - onClickMovieDetailsCallback={this.onClickMovieDetailsCallback} + onSelectMovieCallback={this.onSelectMovieCallback} + onDeselectMovieCallback={this.onDeselectMovieCallback} + deselectedMovie={this.state.deselectedMovie} selectedMovie={this.state.rentedMovie} /> )} diff --git a/src/components/Library.js b/src/components/Library.js index 7606a7867..e8a52c5ba 100644 --- a/src/components/Library.js +++ b/src/components/Library.js @@ -11,6 +11,8 @@ const Library = (props) => { viewMovieDetails={props.expandedMovies[movie.id]} onClickMovieDetailsCallback={props.onClickMovieDetailsCallback} onSelectMovieCallback={props.onSelectMovieCallback} + onDeselectMovieCallback={props.onDeselectMovieCallback} + deselectedMovie={props.deselectedMovie} selectedMovie={props.selectedMovie}/> }); diff --git a/src/components/Movie.js b/src/components/Movie.js index 1202060b0..a8d766934 100644 --- a/src/components/Movie.js +++ b/src/components/Movie.js @@ -14,6 +14,10 @@ const Movie = (props) => { props.onClickMovieDetailsCallback(props.movie.id) } + const onDeselectMovie = () => { + props.onDeselectMovieCallback() + } + let movieDescription =

    {props.movie.title}

    Release Date: {props.movie.release_date}

    @@ -38,9 +42,15 @@ const Movie = (props) => { if (props.selectedMovie === props.movie) { selectButton =
    - +
    } + + if (props.deselectedMovie === props.movie) { + selectButton =
    + +
    + } return ( From 038f7fc9ccd0f946a57e6a3bce7fd2e38b38aa14 Mon Sep 17 00:00:00 2001 From: Sophearychiv Date: Thu, 27 Jun 2019 22:26:01 -0700 Subject: [PATCH 44/66] fixed deselecting bug --- src/App.js | 12 +++++++++--- src/components/Movie.js | 3 ++- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/App.js b/src/App.js index d93ca3a18..5797576cc 100644 --- a/src/App.js +++ b/src/App.js @@ -73,12 +73,17 @@ class App extends Component { onSelectMovieCallback = (id) => { const selectedMovie = this.state.movies.find(movie => movie.id === id); - this.setState({ rentedMovie: selectedMovie }); + this.setState({ + rentedMovie: selectedMovie, + deselectedMovie: null + }); } - onDeselectMovieCallback = () => { + onDeselectMovieCallback = (id) => { + const deselectedMovie = this.state.movies.find(movie => movie.id === id); + this.setState({ - deselectedMovie: this.state.rentedMovie, + deselectedMovie: deselectedMovie, rentedMovie: null, }); } @@ -248,6 +253,7 @@ class App extends Component { library={this.state.movies} isDetailsClicked = {this.state.isDetailsClicked} expandedMovies={this.state.expandedMovies} + onClickMovieDetailsCallback={this.onClickMovieDetailsCallback} onSelectMovieCallback={this.onSelectMovieCallback} onDeselectMovieCallback={this.onDeselectMovieCallback} deselectedMovie={this.state.deselectedMovie} diff --git a/src/components/Movie.js b/src/components/Movie.js index a8d766934..8ddd96731 100644 --- a/src/components/Movie.js +++ b/src/components/Movie.js @@ -15,7 +15,7 @@ const Movie = (props) => { } const onDeselectMovie = () => { - props.onDeselectMovieCallback() + props.onDeselectMovieCallback(props.movie.id) } let movieDescription =
    @@ -52,6 +52,7 @@ const Movie = (props) => {
    } + console.log(props.selectedMovie); return ( From d491e1dba99846eec204fedbf915efdaee704e4b Mon Sep 17 00:00:00 2001 From: Sophearychiv Date: Thu, 27 Jun 2019 22:41:00 -0700 Subject: [PATCH 45/66] select and deselect customer --- src/App.js | 18 ++++++++++++++++-- src/components/Customer.js | 12 +++++++++++- src/components/Customers.js | 9 ++++++++- 3 files changed, 35 insertions(+), 4 deletions(-) diff --git a/src/App.js b/src/App.js index 5797576cc..4d3bcadae 100644 --- a/src/App.js +++ b/src/App.js @@ -22,6 +22,7 @@ class App extends Component { deselectedMovie: null, rentedMovie: undefined, chosenCustomer: undefined, + deselectedCustomer: null, dueDate: undefined, checkoutDate: undefined, currentRental: { @@ -100,7 +101,18 @@ class App extends Component { onSelectCustomerCallback = (id) => { const selectedCustomer = this.state.customers.find(customer => customer.id === id); - this.setState({ chosenCustomer: selectedCustomer }); + this.setState({ + deselectedCustomer: null, + chosenCustomer: selectedCustomer + }); + } + + onDeselectCustomerCallback = (id) => { + const deselectedCustomer = this.state.customers.find(customer => customer.id === id); + this.setState({ + chosenCustomer: null, + deselectedCustomer + }); } rentMovie = () => { @@ -251,7 +263,7 @@ class App extends Component { render={() => ( )} diff --git a/src/components/Customer.js b/src/components/Customer.js index 8274633c5..b6093bafd 100644 --- a/src/components/Customer.js +++ b/src/components/Customer.js @@ -10,14 +10,24 @@ const Customer = (props) => { props.onSelectCustomerCallback(props.customer.id) } + const onDeselectCustomer = () => { + props.onDeselectCustomerCallback(props.customer.id) + } + const onViewRentals = () => { props.onCustomerRentalsCallback(props.customer.id) } + + const selectButton = (props.chosenCustomer === props.customer) ? + : + + return ( {props.customer.name} - + {selectButton} + {/* */} {props.viewCustomerRental && diff --git a/src/components/Customers.js b/src/components/Customers.js index 8a34f756a..239b19bb8 100644 --- a/src/components/Customers.js +++ b/src/components/Customers.js @@ -24,7 +24,14 @@ const Customers = (props) => { const customerCollection = props.customers.map((customer, i) => { - return + return }); return ( From 5154a8726ab2a393ba0f5e0df0b8c41b6629a3fe Mon Sep 17 00:00:00 2001 From: Sophearychiv Date: Thu, 27 Jun 2019 23:50:14 -0700 Subject: [PATCH 46/66] changed movie details to show data from the api --- src/App.js | 39 ++++++++++++++++++++++++++-------- src/components/Customer.js | 1 - src/components/Library.js | 6 ++++-- src/components/Movie.css | 8 ++++--- src/components/Movie.js | 38 ++++++++++++++++----------------- src/components/MovieDetails.js | 2 ++ 6 files changed, 59 insertions(+), 35 deletions(-) diff --git a/src/App.js b/src/App.js index 4d3bcadae..292a0202f 100644 --- a/src/App.js +++ b/src/App.js @@ -18,7 +18,6 @@ class App extends Component { expandedMovies: {}, customers: [], expandedCustomers: {}, - // isDetailsClicked: false, deselectedMovie: null, rentedMovie: undefined, chosenCustomer: undefined, @@ -64,12 +63,34 @@ class App extends Component { } onClickMovieDetailsCallback = (id) => { - this.setState((prevState) => ({ - expandedMovies: { - ...prevState.expandedMovies, - [id]: !prevState.expandedMovies[id], - } - })); + const movie = this.state.movies.find(movie => movie.id === id); + const title = movie.title; + // const id = movie.id; + + axios.get("http://localhost:3001/movies/" + title) + .then((response) => { + this.setState({ + expandedMovies: { + ...response.data, + } + }); + }) + .catch((error) => { + this.setState({error: error.message}) + }); + + // this.setState((prevState) => ({ + // expandedMovies: { + // ...prevState.expandedMovies, + // [id]: !prevState.expandedMovies[id], + // } + // })); + } + + onCloseMovieDetailsCallback = () => { + this.setState({ + expandedMovies: null + }); } onSelectMovieCallback = (id) => { @@ -227,7 +248,7 @@ class App extends Component { } render() { - + // console.log(this.state.expandedMovies); const errorSection = (this.state.error) ? (
    Error: {this.state.error}
    ) : null; @@ -263,9 +284,9 @@ class App extends Component { render={() => ( { {props.customer.name} {selectButton} - {/* */} {props.viewCustomerRental && diff --git a/src/components/Library.js b/src/components/Library.js index e8a52c5ba..f0828631d 100644 --- a/src/components/Library.js +++ b/src/components/Library.js @@ -8,8 +8,10 @@ const Library = (props) => { const movieCollection = props.library.map((movie, i) => { return .btn { + margin-right: 1rem; +} + diff --git a/src/components/Movie.js b/src/components/Movie.js index 8ddd96731..fe0e4a1fa 100644 --- a/src/components/Movie.js +++ b/src/components/Movie.js @@ -14,6 +14,10 @@ const Movie = (props) => { props.onClickMovieDetailsCallback(props.movie.id) } + const onCloseMovieDetails = () => { + props.onCloseMovieDetailsCallback(props.movie.id) + } + const onDeselectMovie = () => { props.onDeselectMovieCallback(props.movie.id) } @@ -24,35 +28,29 @@ const Movie = (props) => {

    Overview: {props.movie.overview.length > 128 ? `${props.movie.overview.substring(0, 150)}...` : props.movie.overview}

    - let showButton =
    - -
    - let selectButton =
    - -
    + let movieDetails = null; + let showButton = + let selectButton = if (props.viewMovieDetails) { - movieDescription = null; - showButton =
    - -
    - + if (props.viewMovieDetails.title === props.movie.title) { + movieDescription = null; + movieDetails = + + showButton = + + } } - + // console.log(props.viewMovieDetails); if (props.selectedMovie === props.movie) { - selectButton =
    - -
    + selectButton = } if (props.deselectedMovie === props.movie) { - selectButton =
    - -
    + selectButton = } - console.log(props.selectedMovie); return ( @@ -60,8 +58,8 @@ const Movie = (props) => { {props.movie.title}/
    {movieDescription} + {movieDetails}
    - {props.viewMovieDetails && }
    {showButton} {selectButton} diff --git a/src/components/MovieDetails.js b/src/components/MovieDetails.js index e2da7ffcd..eaef686a0 100644 --- a/src/components/MovieDetails.js +++ b/src/components/MovieDetails.js @@ -9,6 +9,8 @@ const MovieDetails = (props) => {

    {props.title}

    Release Date: {props.release_date}

    Overview: {props.overview}

    +

    Inventory: {props.inventory}

    +

    Available Inventory: {props.available_inventory}

    ) }; From 3c691f128ad2f0bc61e749e1e1b276e77bea1f05 Mon Sep 17 00:00:00 2001 From: Sophearychiv Date: Thu, 27 Jun 2019 23:56:04 -0700 Subject: [PATCH 47/66] clicking on logo will reset state --- src/App.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/App.js b/src/App.js index 292a0202f..8c4fb603e 100644 --- a/src/App.js +++ b/src/App.js @@ -328,7 +328,7 @@ function Header() { return (
    diff --git a/src/components/OverdueMovies.css b/src/components/OverdueMovies.css new file mode 100644 index 000000000..229f417fe --- /dev/null +++ b/src/components/OverdueMovies.css @@ -0,0 +1,5 @@ +.overdue_container { + margin: 50px; + display: flex-wrap; + text-align: center; +} \ No newline at end of file diff --git a/src/components/Log.js b/src/components/OverdueMovies.js similarity index 70% rename from src/components/Log.js rename to src/components/OverdueMovies.js index 09bc7fe26..02b7a166d 100644 --- a/src/components/Log.js +++ b/src/components/OverdueMovies.js @@ -1,9 +1,10 @@ import React from 'react'; import PropTypes from 'prop-types'; import axios from 'axios'; -// import './Log.css'; +import Button from 'react-bootstrap/Button'; +import './OverdueMovies.css'; -const Log = (props) => { +const OverdueMovies = (props) => { const overdueMoviesCall = () => { axios.get('http://localhost:3001/rentals/overdue') .then((response) => { @@ -17,16 +18,16 @@ const Log = (props) => { }); } return ( -
    - +
    + {props.overdueMovies &&
      {props.overdueMovies.length > 0 ? props.overdueMovies : "No Movies are Overdue!" }
    }
    ) } -Log.propTypes = { +OverdueMovies.propTypes = { setOverdueMoviesCallback: PropTypes.func.isRequired, overdueMovies: PropTypes.array, }; -export default Log; \ No newline at end of file +export default OverdueMovies; \ No newline at end of file From 3ce6a5647dc2d470617bc7479b6afe197c543be4 Mon Sep 17 00:00:00 2001 From: Jillianne Ramirez Date: Fri, 28 Jun 2019 10:58:19 -0700 Subject: [PATCH 59/66] removed bullets on overdue movies --- src/components/OverdueMovies.css | 4 ++++ src/components/OverdueMovies.js | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/components/OverdueMovies.css b/src/components/OverdueMovies.css index 229f417fe..ccfd3dce6 100644 --- a/src/components/OverdueMovies.css +++ b/src/components/OverdueMovies.css @@ -2,4 +2,8 @@ margin: 50px; display: flex-wrap; text-align: center; +} + +.overdueMovie { + text-decoration: none; } \ No newline at end of file diff --git a/src/components/OverdueMovies.js b/src/components/OverdueMovies.js index 02b7a166d..49d487a52 100644 --- a/src/components/OverdueMovies.js +++ b/src/components/OverdueMovies.js @@ -9,7 +9,7 @@ const OverdueMovies = (props) => { axios.get('http://localhost:3001/rentals/overdue') .then((response) => { const overdueMovieCollection = response.data.map((overdueMovie) => { - return
  • {overdueMovie.title}
  • + return
  • {overdueMovie.title}
  • }) props.setOverdueMoviesCallback(overdueMovieCollection) }) From bb88c82882c3883ae076326b21a4714fb1cdf327 Mon Sep 17 00:00:00 2001 From: Jillianne Ramirez Date: Fri, 28 Jun 2019 11:03:28 -0700 Subject: [PATCH 60/66] formatting for overdue movies --- src/components/OverdueMovies.css | 5 +---- src/components/OverdueMovies.js | 3 ++- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/components/OverdueMovies.css b/src/components/OverdueMovies.css index ccfd3dce6..ec7375456 100644 --- a/src/components/OverdueMovies.css +++ b/src/components/OverdueMovies.css @@ -2,8 +2,5 @@ margin: 50px; display: flex-wrap; text-align: center; -} - -.overdueMovie { - text-decoration: none; + list-style: none; } \ No newline at end of file diff --git a/src/components/OverdueMovies.js b/src/components/OverdueMovies.js index 49d487a52..97bd7e910 100644 --- a/src/components/OverdueMovies.js +++ b/src/components/OverdueMovies.js @@ -9,7 +9,8 @@ const OverdueMovies = (props) => { axios.get('http://localhost:3001/rentals/overdue') .then((response) => { const overdueMovieCollection = response.data.map((overdueMovie) => { - return
  • {overdueMovie.title}
  • + console.log(overdueMovie) + return
  • {overdueMovie.title} due {overdueMovie.due_date}
  • }) props.setOverdueMoviesCallback(overdueMovieCollection) }) From 9f5604f25e9d6add9e0ae73e6d2e88b60022f410 Mon Sep 17 00:00:00 2001 From: Sophearychiv Date: Fri, 28 Jun 2019 11:06:39 -0700 Subject: [PATCH 61/66] removed bulltes in Overdue movies --- src/components/OverdueMovies.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/components/OverdueMovies.css b/src/components/OverdueMovies.css index ec7375456..4f8f039c7 100644 --- a/src/components/OverdueMovies.css +++ b/src/components/OverdueMovies.css @@ -3,4 +3,8 @@ display: flex-wrap; text-align: center; list-style: none; +} + +.overdueMovie { + list-style: none; } \ No newline at end of file From 34d66e0a7f52b1321160a06a1df5da16b2155957 Mon Sep 17 00:00:00 2001 From: Jillianne Ramirez Date: Fri, 28 Jun 2019 13:26:49 -0700 Subject: [PATCH 62/66] customer page css --- src/components/Customer.js | 10 ++++------ src/components/Customers.css | 33 ++++++++++++++++++++++++++++++--- src/components/Customers.js | 17 ++++++++--------- 3 files changed, 42 insertions(+), 18 deletions(-) diff --git a/src/components/Customer.js b/src/components/Customer.js index 7c78f26cc..d078fef4c 100644 --- a/src/components/Customer.js +++ b/src/components/Customer.js @@ -29,11 +29,9 @@ const Customer = (props) => { return ( - - {props.customer.id} - {props.customer.name} - {selectButton} - {rentalButton} +
    +

    #{props.customer.id}. {props.customer.name}

    +

    {selectButton}{rentalButton}

    {props.viewCustomerRental && @@ -54,7 +52,7 @@ const Customer = (props) => { } - +
    ) } diff --git a/src/components/Customers.css b/src/components/Customers.css index 6e95746ea..e3c9b9a82 100644 --- a/src/components/Customers.css +++ b/src/components/Customers.css @@ -1,7 +1,34 @@ -/* h1 { +.header { + padding-top: 20px; text-align: center; -} */ + font-size: 3em; + color: #fff3c9; + background: #000; +} .customers_container { - margin: 1rem; + background: #000; + padding: 50px; + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: center; + padding-top: 20px; +} + +.user { + font-size: 25px; + text-align: center; +} + + +.avatar { + background-color: white; + border-radius: 25px; + border: 5px outset #fff3c9; + margin: 15px; +} + +.buttons { + padding-left: 10px; } \ No newline at end of file diff --git a/src/components/Customers.js b/src/components/Customers.js index 239b19bb8..3732296ae 100644 --- a/src/components/Customers.js +++ b/src/components/Customers.js @@ -1,7 +1,6 @@ import React from 'react'; import PropTypes from 'prop-types'; import Customer from './Customer'; -import Table from 'react-bootstrap/Table' import './Customers.css'; const Customers = (props) => { @@ -24,23 +23,23 @@ const Customers = (props) => { const customerCollection = props.customers.map((customer, i) => { - return + onCustomerRentalsCallback={props.onCustomerRentalsCallback}/>
    }); return ( -
    -

    Customers

    - - {customerCollection} -
    -
    + +
    - Our Community -
    +
    + {customerCollection} +
    + ) } From 9c04a839923b1ac56d6a012d2201929b1037e31d Mon Sep 17 00:00:00 2001 From: Jillianne Ramirez Date: Fri, 28 Jun 2019 13:33:27 -0700 Subject: [PATCH 63/66] coloring of navigation links --- src/App.css | 12 +++++++++++- src/App.js | 4 ++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/App.css b/src/App.css index 3d83ae00a..a141c34e8 100644 --- a/src/App.css +++ b/src/App.css @@ -50,12 +50,22 @@ } .nav_link:hover { - color: white; + color: red; + text-shadow: + -1px -1px 0 #990708, + 1px -1px 0 #990708, + -1px 1px 0 #990708, + 1px 1px 0 #990708; text-decoration: none; } .brand:hover { color: #990708; + text-shadow: + -1px -1px 0 red, + 1px -1px 0 red, + -1px 1px 0 red, + 1px 1px 0 red; text-decoration: none; } diff --git a/src/App.js b/src/App.js index 55a4b7cf0..f5b915fe7 100644 --- a/src/App.js +++ b/src/App.js @@ -343,8 +343,8 @@ function Header() { From fbc6323636712f1fec822d90dfb2f203275fd5ed Mon Sep 17 00:00:00 2001 From: Jillianne Ramirez Date: Fri, 28 Jun 2019 13:47:02 -0700 Subject: [PATCH 64/66] styling on library page --- src/components/Customers.css | 3 ++- src/components/Customers.js | 2 +- src/components/Library.css | 18 ++++++++++++++++-- src/components/Library.js | 2 +- 4 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/components/Customers.css b/src/components/Customers.css index e3c9b9a82..c202f0240 100644 --- a/src/components/Customers.css +++ b/src/components/Customers.css @@ -1,4 +1,4 @@ -.header { +#communityHeader { padding-top: 20px; text-align: center; font-size: 3em; @@ -7,6 +7,7 @@ } .customers_container { + /* border-top: */ background: #000; padding: 50px; display: flex; diff --git a/src/components/Customers.js b/src/components/Customers.js index 3732296ae..b12bb76d5 100644 --- a/src/components/Customers.js +++ b/src/components/Customers.js @@ -35,7 +35,7 @@ const Customers = (props) => { return ( -
    - Our Community -
    +
    - Our Community -
    {customerCollection}
    diff --git a/src/components/Library.css b/src/components/Library.css index 761006b04..9f98006c3 100644 --- a/src/components/Library.css +++ b/src/components/Library.css @@ -1,4 +1,18 @@ .library_container { - margin: 3rem; + background: #000; text-align: left; -} \ No newline at end of file + padding: 30px; +} + +#collectionHeader { + text-align: center; + font-size: 3em; + color: #fff3c9; +} + +.movie_container { + background: white; + margin: 5px; + margin-left: 40px; + margin-right: 40px; +} diff --git a/src/components/Library.js b/src/components/Library.js index 58a03c18e..1c3547a6e 100644 --- a/src/components/Library.js +++ b/src/components/Library.js @@ -19,7 +19,7 @@ const Library = (props) => { return (
    -

    Library

    +

    - Our Collection -

    From fbc626f32a20372583a3dbe28b21ee1659bec0d6 Mon Sep 17 00:00:00 2001 From: Jillianne Ramirez Date: Fri, 28 Jun 2019 14:07:12 -0700 Subject: [PATCH 65/66] styling added to all pages' --- src/components/Customers.css | 8 ++++---- src/components/Library.css | 5 +++-- src/components/OverdueMovies.css | 5 ++++- src/components/Search.css | 4 +++- src/components/Search.js | 2 -- 5 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/components/Customers.css b/src/components/Customers.css index c202f0240..de4df6af7 100644 --- a/src/components/Customers.css +++ b/src/components/Customers.css @@ -1,14 +1,14 @@ #communityHeader { + border-top: 10px solid black; padding-top: 20px; text-align: center; font-size: 3em; - color: #fff3c9; - background: #000; + color: black; + background: #DCDCDC; } .customers_container { - /* border-top: */ - background: #000; + background: #DCDCDC; padding: 50px; display: flex; flex-wrap: wrap; diff --git a/src/components/Library.css b/src/components/Library.css index 9f98006c3..d35d8a906 100644 --- a/src/components/Library.css +++ b/src/components/Library.css @@ -1,5 +1,6 @@ .library_container { - background: #000; + border-top: 10px solid black; + background: #DCDCDC; text-align: left; padding: 30px; } @@ -7,7 +8,7 @@ #collectionHeader { text-align: center; font-size: 3em; - color: #fff3c9; + color: #000; } .movie_container { diff --git a/src/components/OverdueMovies.css b/src/components/OverdueMovies.css index 4f8f039c7..d407bb6c2 100644 --- a/src/components/OverdueMovies.css +++ b/src/components/OverdueMovies.css @@ -1,5 +1,8 @@ .overdue_container { - margin: 50px; + border-top: 10px solid black; + background: #DCDCDC; + padding: 80px; + min-height: 800px; display: flex-wrap; text-align: center; list-style: none; diff --git a/src/components/Search.css b/src/components/Search.css index 38aa863cd..faf93744d 100644 --- a/src/components/Search.css +++ b/src/components/Search.css @@ -4,5 +4,7 @@ } .search_container { - margin: 1rem; + min-height: 800px; + border-top: 10px solid black; + background: #DCDCDC; } \ No newline at end of file diff --git a/src/components/Search.js b/src/components/Search.js index 9303f0c3c..bd400bda2 100644 --- a/src/components/Search.js +++ b/src/components/Search.js @@ -106,11 +106,9 @@ class Search extends Component { {errorSection} {successSection}
    - {/* {tableHeader} */} {movieCards} -
    From c145a5a86ebe48dedd076f827d09ee3a8c0131e3 Mon Sep 17 00:00:00 2001 From: Jillianne Ramirez Date: Fri, 28 Jun 2019 14:18:21 -0700 Subject: [PATCH 66/66] final styling for rental section --- src/App.css | 11 +++++++++++ src/App.js | 14 +++++++------- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/App.css b/src/App.css index a141c34e8..d81badff8 100644 --- a/src/App.css +++ b/src/App.css @@ -69,7 +69,14 @@ text-decoration: none; } +#rentalSection { + border-top: 10px solid black; + background: white; + padding-bottom: 15px; +} + .currently-selected { + font-size: 1em; text-align: center; margin-left: 500px; margin-right: 500px; @@ -77,4 +84,8 @@ border: 4px dotted black; margin-top: 1rem; padding: 15px; +} + +.rentalHeader { + font-size: 2em; } \ No newline at end of file diff --git a/src/App.js b/src/App.js index f5b915fe7..0e6a437dd 100644 --- a/src/App.js +++ b/src/App.js @@ -246,12 +246,12 @@ class App extends Component { const currentlySelected = (this.state.rentedMovie || this.state.chosenCustomer) ?
    -

    ACTIVE SELECTION

    +

    ACTIVE RENTAL SELECTION

    { this.state.rentedMovie &&

    Movie: {this.state.rentedMovie.title}

    } { this.state.chosenCustomer &&

    Customer: {this.state.chosenCustomer.name}

    } - { this.state.chosenCustomer && this.state.rentedMovie && } + { this.state.chosenCustomer && this.state.rentedMovie && }
    : null return ( @@ -259,22 +259,22 @@ class App extends Component {
    -
    +
    {currentlySelected} { this.state.currentRental.count &&
    - Rental #{this.state.currentRental.count}: - "{this.state.currentRental.movie}" checked out by Customer #{this.state.currentRental.customer} - {this.state.currentRental.count && } +

    Rental #{this.state.currentRental.count}

    +

    "{this.state.currentRental.movie}" checked out by Customer #{this.state.currentRental.customer}

    + {this.state.currentRental.count && }
    } { !this.state.chosenCustomer && !this.state.rentedMovie && this.state.currentRental.checkin && -

    Movie Successfully Checked-In!

    +

    Movie Successfully Checked-In!

    }