From 9d1262acf4ef0f35e9c726c0d29be7c27b79f1b5 Mon Sep 17 00:00:00 2001 From: Jomar Banting Date: Wed, 12 Jul 2023 04:13:46 -0400 Subject: [PATCH 1/2] build from state and completed flags --- frontend/components/App.js | 31 +++++++++++++++++++++++++++++- package-lock.json | 39 +++++++++++++++----------------------- 2 files changed, 45 insertions(+), 25 deletions(-) diff --git a/frontend/components/App.js b/frontend/components/App.js index 38b7a2f5..63ef3b94 100644 --- a/frontend/components/App.js +++ b/frontend/components/App.js @@ -1,10 +1,39 @@ import React from 'react' export default class App extends React.Component { + constructor() { + super(); + this.state = { + todos: [ + { + name: 'Organize Garage', + id: 1528817077286, // could look different, you could use a timestamp to generate it + completed: false + }, + { + name: 'Bake Cookies', + id: 1528817084358, + completed: false + }, + ] + } + } render() { + const { todos } = this.state; return (
- Todo App +

Todos

+ + +
+ + Add +
+
) } diff --git a/package-lock.json b/package-lock.json index 0f5d77b0..2921dac7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12473,7 +12473,8 @@ "node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true }, "node_modules/react-router": { "version": "6.2.2", @@ -17928,8 +17929,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.1.1.tgz", "integrity": "sha512-1FBc1f9G4P/AxMqIgfZgeOTuRnwZMten8E7zap5zgpPInnCrP8D4Q81+4CWIch8i/Nf7nXjP0v6CjjbHOrXhKg==", - "dev": true, - "requires": {} + "dev": true }, "@webpack-cli/info": { "version": "1.4.1", @@ -17944,8 +17944,7 @@ "version": "1.6.1", "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.6.1.tgz", "integrity": "sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw==", - "dev": true, - "requires": {} + "dev": true }, "@xmldom/xmldom": { "version": "0.7.5", @@ -18014,15 +18013,13 @@ "version": "1.8.0", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "dev": true, - "requires": {} + "dev": true }, "acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} + "dev": true }, "acorn-walk": { "version": "7.2.0", @@ -18094,8 +18091,7 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} + "dev": true }, "ansi-align": { "version": "3.0.1", @@ -21120,8 +21116,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true, - "requires": {} + "dev": true }, "ieee754": { "version": "1.2.1", @@ -22450,8 +22445,7 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", - "dev": true, - "requires": {} + "dev": true }, "jest-regex-util": { "version": "27.5.1", @@ -24376,8 +24370,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "dev": true, - "requires": {} + "dev": true }, "postcss-modules-local-by-default": { "version": "4.0.0", @@ -24663,7 +24656,8 @@ "react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true }, "react-router": { "version": "6.2.2", @@ -25646,8 +25640,7 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", - "dev": true, - "requires": {} + "dev": true }, "styled-components": { "version": "5.3.3", @@ -26506,8 +26499,7 @@ "version": "8.5.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", - "dev": true, - "requires": {} + "dev": true } } }, @@ -26720,8 +26712,7 @@ "version": "7.5.7", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz", "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==", - "dev": true, - "requires": {} + "dev": true }, "xdg-basedir": { "version": "4.0.0", From 4376e20e226d7ccc2ae5004449a4e2582373c32d Mon Sep 17 00:00:00 2001 From: Jomar Banting Date: Thu, 13 Jul 2023 01:16:00 -0400 Subject: [PATCH 2/2] Finished the project --- frontend/components/App.js | 58 ++++++++++++++++++++++++++------- frontend/components/Form.js | 30 +++++++++++++---- frontend/components/Todo.js | 11 ++++--- frontend/components/TodoList.js | 11 ++++--- 4 files changed, 82 insertions(+), 28 deletions(-) diff --git a/frontend/components/App.js b/frontend/components/App.js index 63ef3b94..61bfbcac 100644 --- a/frontend/components/App.js +++ b/frontend/components/App.js @@ -1,4 +1,6 @@ import React from 'react' +import TodoList from './TodoList'; +import TodoForm from "./Form"; export default class App extends React.Component { constructor() { @@ -15,25 +17,59 @@ export default class App extends React.Component { id: 1528817084358, completed: false }, + { + name: 'Workout', + id: 1528817084351, + completed: true + }, ] } } + + handleClear = () => { + this.setState({ + ...this.state, + todos: this.state.todos.filter(element => { + return (element.completed === false); + }) + }); + } + + handleAdd = (value) => { + this.setState({ + ...this.state, + todos: [...this.state.todos, { + name: value, + id: (Math.random() * (1 - 1528817084351) + 1), + completed: false + }] + }) + } + + handleToggle = (clickedID) => { + this.setState({ + ...this.state, + todos: this.state.todos.map(element => { + if (element.id === clickedID) { + return ({ + ...element, + completed: !element.completed + }) + } + return element; + }) + }) + } + + render() { const { todos } = this.state; return (

Todos

-
    - {todos.map(element => { - return (
  • {element.name} {todos.completed?- completed : }
  • ) - })} -
- -
- - Add -
- + + +
) } diff --git a/frontend/components/Form.js b/frontend/components/Form.js index 30fbc48d..65e02010 100644 --- a/frontend/components/Form.js +++ b/frontend/components/Form.js @@ -1,11 +1,27 @@ -import React from 'react' +import React from "react"; + +export default class TodoForm extends React.Component { + + handleSubmit = (event) => { + event.preventDefault(); + this.props.handleAdd(this.state.input); + } + + handleChange = (event) => { + this.setState({ + ...this.state, + input: event.target.value + }) + } -export default class Form extends React.Component { render() { - return ( -
- Form -
- ) + return( +
+ + +
); } } diff --git a/frontend/components/Todo.js b/frontend/components/Todo.js index ca86f981..dd684e39 100644 --- a/frontend/components/Todo.js +++ b/frontend/components/Todo.js @@ -1,11 +1,12 @@ import React from 'react' export default class Todo extends React.Component { + + handleClick = () => { + this.props.handleToggle(this.props.element.id); + } + render() { - return ( -
- Todo -
- ) + return (
  • {this.props.element.name} {this.props.element.completed?- completed : }
  • ) } } diff --git a/frontend/components/TodoList.js b/frontend/components/TodoList.js index 95410373..d6c3c08c 100644 --- a/frontend/components/TodoList.js +++ b/frontend/components/TodoList.js @@ -1,11 +1,12 @@ import React from 'react' +import Todo from './Todo' export default class TodoList extends React.Component { render() { - return ( -
    - TodoList -
    - ) + return () } }