feat:
- include nested checkboxes - include hint button - include test for titles - increase size of textboxes
This commit is contained in:
		
							parent
							
								
									5bfe82f9ba
								
							
						
					
					
						commit
						b9d208ac53
					
				|  | @ -4,6 +4,10 @@ | |||
|     <meta charset="UTF-8" /> | ||||
|     <link rel="icon" type="image/svg+xml" href="/vite.svg" /> | ||||
|     <meta name="viewport" content="width=device-width, initial-scale=1.0" /> | ||||
|     <link | ||||
|       rel="stylesheet" | ||||
|       href="//cdnjs.cloudflare.com/ajax/libs/font-awesome/6.2.1/css/all.min.css" | ||||
|     /> | ||||
|     <title>Vite + React</title> | ||||
|   </head> | ||||
|   <body> | ||||
|  |  | |||
|  | @ -11,7 +11,9 @@ | |||
|   }, | ||||
|   "dependencies": { | ||||
|     "@fontsource/montserrat": "^4.5.14", | ||||
|     "@fortawesome/react-fontawesome": "^0.2.0", | ||||
|     "react": "^18.2.0", | ||||
|     "react-checkbox-tree": "^1.8.0", | ||||
|     "react-dom": "^18.2.0", | ||||
|     "underscore": "^1.13.6" | ||||
|   }, | ||||
|  |  | |||
|  | @ -4,9 +4,15 @@ dependencies: | |||
|   '@fontsource/montserrat': | ||||
|     specifier: ^4.5.14 | ||||
|     version: 4.5.14 | ||||
|   '@fortawesome/react-fontawesome': | ||||
|     specifier: ^0.2.0 | ||||
|     version: 0.2.0(@fortawesome/fontawesome-svg-core@6.4.0)(react@18.2.0) | ||||
|   react: | ||||
|     specifier: ^18.2.0 | ||||
|     version: 18.2.0 | ||||
|   react-checkbox-tree: | ||||
|     specifier: ^1.8.0 | ||||
|     version: 1.8.0(react@18.2.0) | ||||
|   react-dom: | ||||
|     specifier: ^18.2.0 | ||||
|     version: 18.2.0(react@18.2.0) | ||||
|  | @ -509,6 +515,31 @@ packages: | |||
|     resolution: {integrity: sha512-fTvrteVzuFUePhr4QYBGoK8G/YHLJ3IhF1HhKg0AxcFvZajJT7rM7ULdmKLSd2PkX44R3aaFZq1zDbmjbGGI+w==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /@fortawesome/fontawesome-common-types@6.4.0: | ||||
|     resolution: {integrity: sha512-HNii132xfomg5QVZw0HwXXpN22s7VBHQBv9CeOu9tfJnhsWQNd2lmTNi8CSrnw5B+5YOmzu1UoPAyxaXsJ6RgQ==} | ||||
|     engines: {node: '>=6'} | ||||
|     requiresBuild: true | ||||
|     dev: false | ||||
| 
 | ||||
|   /@fortawesome/fontawesome-svg-core@6.4.0: | ||||
|     resolution: {integrity: sha512-Bertv8xOiVELz5raB2FlXDPKt+m94MQ3JgDfsVbrqNpLU9+UE2E18GKjLKw+d3XbeYPqg1pzyQKGsrzbw+pPaw==} | ||||
|     engines: {node: '>=6'} | ||||
|     requiresBuild: true | ||||
|     dependencies: | ||||
|       '@fortawesome/fontawesome-common-types': 6.4.0 | ||||
|     dev: false | ||||
| 
 | ||||
|   /@fortawesome/react-fontawesome@0.2.0(@fortawesome/fontawesome-svg-core@6.4.0)(react@18.2.0): | ||||
|     resolution: {integrity: sha512-uHg75Rb/XORTtVt7OS9WoK8uM276Ufi7gCzshVWkUJbHhh3svsUUeqXerrM96Wm7fRiDzfKRwSoahhMIkGAYHw==} | ||||
|     peerDependencies: | ||||
|       '@fortawesome/fontawesome-svg-core': ~1 || ~6 | ||||
|       react: '>=16.3' | ||||
|     dependencies: | ||||
|       '@fortawesome/fontawesome-svg-core': 6.4.0 | ||||
|       prop-types: 15.8.1 | ||||
|       react: 18.2.0 | ||||
|     dev: false | ||||
| 
 | ||||
|   /@humanwhocodes/config-array@0.11.8: | ||||
|     resolution: {integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==} | ||||
|     engines: {node: '>=10.10.0'} | ||||
|  | @ -765,6 +796,10 @@ packages: | |||
|       supports-color: 7.2.0 | ||||
|     dev: true | ||||
| 
 | ||||
|   /classnames@2.3.2: | ||||
|     resolution: {integrity: sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /color-convert@1.9.3: | ||||
|     resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} | ||||
|     dependencies: | ||||
|  | @ -1504,6 +1539,10 @@ packages: | |||
|     resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} | ||||
|     dev: true | ||||
| 
 | ||||
|   /lodash@4.17.21: | ||||
|     resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /loose-envify@1.4.0: | ||||
|     resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} | ||||
|     hasBin: true | ||||
|  | @ -1530,7 +1569,6 @@ packages: | |||
|     resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} | ||||
|     engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} | ||||
|     hasBin: true | ||||
|     dev: true | ||||
| 
 | ||||
|   /natural-compare@1.4.0: | ||||
|     resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} | ||||
|  | @ -1543,7 +1581,6 @@ packages: | |||
|   /object-assign@4.1.1: | ||||
|     resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} | ||||
|     engines: {node: '>=0.10.0'} | ||||
|     dev: true | ||||
| 
 | ||||
|   /object-inspect@1.12.3: | ||||
|     resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} | ||||
|  | @ -1680,7 +1717,6 @@ packages: | |||
|       loose-envify: 1.4.0 | ||||
|       object-assign: 4.1.1 | ||||
|       react-is: 16.13.1 | ||||
|     dev: true | ||||
| 
 | ||||
|   /punycode@2.3.0: | ||||
|     resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} | ||||
|  | @ -1691,6 +1727,18 @@ packages: | |||
|     resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} | ||||
|     dev: true | ||||
| 
 | ||||
|   /react-checkbox-tree@1.8.0(react@18.2.0): | ||||
|     resolution: {integrity: sha512-ufC4aorihOvjLpvY1beab2hjVLGZbDTFRzw62foG0+th+KX7e/sdmWu/nD1ZS/U5Yr0rWGwedGH5GOtR0IkUXw==} | ||||
|     peerDependencies: | ||||
|       react: ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 | ||||
|     dependencies: | ||||
|       classnames: 2.3.2 | ||||
|       lodash: 4.17.21 | ||||
|       nanoid: 3.3.6 | ||||
|       prop-types: 15.8.1 | ||||
|       react: 18.2.0 | ||||
|     dev: false | ||||
| 
 | ||||
|   /react-dom@18.2.0(react@18.2.0): | ||||
|     resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} | ||||
|     peerDependencies: | ||||
|  | @ -1703,7 +1751,6 @@ packages: | |||
| 
 | ||||
|   /react-is@16.13.1: | ||||
|     resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} | ||||
|     dev: true | ||||
| 
 | ||||
|   /react-refresh@0.14.0: | ||||
|     resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} | ||||
|  |  | |||
|  | @ -0,0 +1,71 @@ | |||
| import React from 'react'; | ||||
| import { useState } from "react"; | ||||
| import CheckboxTree from 'react-checkbox-tree'; | ||||
| import 'react-checkbox-tree/lib/react-checkbox-tree.css'; | ||||
| // import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' | ||||
| 
 | ||||
| const nodes = [ | ||||
|   { | ||||
|     value: 'loa', | ||||
|     label: 'Lessons on Assurance' | ||||
|   }, | ||||
|   { | ||||
|     value: 'tms60', | ||||
|     label: 'TMS60', | ||||
|     children: [ | ||||
|         { value: 'pack-a', label: 'Pack A' }, | ||||
|         { value: 'pack-b', label: 'Pack B' }, | ||||
|         { value: 'pack-c', label: 'Pack C' }, | ||||
|         { value: 'pack-d', label: 'Pack D' }, | ||||
|         { value: 'pack-e', label: 'Pack E' } | ||||
|     ] | ||||
|   }, | ||||
|   { | ||||
|     value: 'dep', | ||||
|     label: 'DEP', | ||||
|     children: [ | ||||
|       { value: 'dep1', label: 'DEP 1' }, | ||||
|       { value: 'dep2', label: 'DEP 2' }, | ||||
|       { value: 'dep3', label: 'DEP 3' }, | ||||
|       { value: 'dep4', label: 'DEP 4' } | ||||
|     ] | ||||
|   } | ||||
| ]; | ||||
| 
 | ||||
| // class Widget extends React.Component { | ||||
| //     state = { | ||||
| //         checked: [], | ||||
| //         expanded: [], | ||||
| //     }; | ||||
| //  | ||||
| //     render() { | ||||
| //         return ( | ||||
| //             <CheckboxTree | ||||
| //                 nodes={nodes} | ||||
| //                 checked={this.state.checked} | ||||
| //                 expanded={this.state.expanded} | ||||
| //                 onCheck={checked => this.setState({ checked })} | ||||
| //                 onExpand={expanded => this.setState({ expanded })} | ||||
| //             /> | ||||
| //         ); | ||||
| //     } | ||||
| // } | ||||
| 
 | ||||
| function Widget() { | ||||
|   const [checked, setChecked] = useState([]) | ||||
|   const [expanded, setExpanded] = useState([]) | ||||
|   console.log(checked) | ||||
|   return ( | ||||
|     <div className="CheckboxTree"> | ||||
|       <CheckboxTree | ||||
|         nodes={nodes} | ||||
|         checked={checked} | ||||
|         expanded={expanded} | ||||
|         onCheck={setChecked} | ||||
|         onExpand={setExpanded} | ||||
|       /> | ||||
|     </div> | ||||
|   ); | ||||
| } | ||||
| 
 | ||||
| export default Widget | ||||
|  | @ -5,17 +5,6 @@ | |||
|   text-align: left; | ||||
| } | ||||
| 
 | ||||
| .VerseValidator { | ||||
|   padding: 5px; | ||||
|   border: 1px; | ||||
|   border-style: solid; | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| .verse-box { | ||||
|   padding: 5px; | ||||
| } | ||||
| 
 | ||||
| .box-label { | ||||
|   padding: 5px; | ||||
| } | ||||
|  |  | |||
|  | @ -5,95 +5,15 @@ Implemented features: | |||
| */ | ||||
| import VerseData from "./assets/verse.json" | ||||
| import { useState } from "react"; | ||||
| import CheckboxTree from 'react-checkbox-tree'; | ||||
| import 'react-checkbox-tree/lib/react-checkbox-tree.css'; | ||||
| import _ from 'underscore'; | ||||
| import './VerseSampler.css' | ||||
| 
 | ||||
| // const ArrayPrinter = ({ array }) => { | ||||
| //   const list = array.map((element, i) =>  | ||||
| //     <div className="ArrayPrinter" key={i}> | ||||
| //       <li key={element.reference}>{element.reference}</li> | ||||
| //       <li key={element.title}>{element.title}</li> | ||||
| //       <li key={element.verse}>{element.verse}</li> | ||||
| //     </div> | ||||
| //   ) | ||||
| //   return list | ||||
| // } | ||||
| 
 | ||||
| const ArrayTester = ({ array }) => { | ||||
|   const list = array.map((element, i) => ( | ||||
|     <VerseValidator element={element} /> | ||||
|   )) | ||||
|   return list | ||||
| } | ||||
| 
 | ||||
| const VerseValidator = ({ element: { id, title, reference, verse } }) => { | ||||
|   const [inputVerse, setVerse] = useState('') | ||||
|   const [resultBool, setBool] = useState(false) | ||||
|   const verseChange = (e) => { | ||||
|     const value = e.target.value | ||||
|     let string1 = value; | ||||
|     let string2 = verse; | ||||
|     console.log(verse); | ||||
|     console.log(value); | ||||
|     string1 = String(string1).replace(/[^\w\s]/g, "").replace(/\s+/g, "").toLowerCase(); | ||||
|     string2 = String(string2).replace(/[^\w\s]/g, "").replace(/\s+/g, "").toLowerCase(); | ||||
| 
 | ||||
|     const bool = string1 === string2; | ||||
| 
 | ||||
|     setVerse(value) | ||||
|     setBool(bool) | ||||
|   } | ||||
| 
 | ||||
|   return ( | ||||
|     <div className="VerseValidator"> | ||||
|       <label className='box-label' htmlFor='verseBox'>{reference}</label> | ||||
|       <input  | ||||
|         className="verse-box" | ||||
|         type='text' | ||||
|         id='verseBox' | ||||
|         name='verseBox' | ||||
|         onChange={verseChange} | ||||
|       /> | ||||
|       <ul>{inputVerse}</ul> | ||||
|       <ul>{String(resultBool)}</ul> | ||||
|     </div> | ||||
|   ) | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| const ButtonMapper = ({packs, setPacks})  => { | ||||
|   return ( | ||||
|   packs.map(({ pack, include }, i) => ( | ||||
|       <div key={i}> | ||||
|         <label htmlFor={i}> | ||||
|           <input | ||||
|             type="checkbox" | ||||
|             onChange={() => handleChange(setPacks, packs, include, i)} | ||||
|             checked={include} | ||||
|             id={i} | ||||
|           /> | ||||
|           <span>{pack}</span> | ||||
|         </label> | ||||
|       </div> | ||||
|   ) | ||||
| ))} | ||||
| 
 | ||||
| 
 | ||||
| const handleChange = (setPacks, packs, include, i) => { | ||||
|   // extract desired item | ||||
|   let tmp = packs[i]; | ||||
|   tmp.include = !include; | ||||
|   // clone existing array | ||||
|   let packsClone = [...packs]; | ||||
|   // assign modified item back | ||||
|   packsClone[i] = tmp; | ||||
|   setPacks([...packsClone]); | ||||
| }; | ||||
| import VerseValidator from "./VerseValidator"; | ||||
| 
 | ||||
| const GenerateTestList = ({ packs, testCount}) => { | ||||
|   let testList = packs.filter((pack) => pack.include) | ||||
|                         .map((element) => element.pack) | ||||
|                         .reduce( | ||||
|   let testList = packs.reduce( | ||||
|                           // grab all elements included checked in "packs" | ||||
|                           (accumulator, currentValue) => accumulator.concat(VerseData[currentValue]), | ||||
|                           new Array() | ||||
|                         ); | ||||
|  | @ -103,9 +23,65 @@ const GenerateTestList = ({ packs, testCount}) => { | |||
|   ) | ||||
| } | ||||
| 
 | ||||
| const ArrayTester = ({ array }) => { | ||||
|   const list = array.map((element) => ( | ||||
|     <VerseValidator key={element.reference} element={element} /> | ||||
|   )) | ||||
|   return list | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| const nodes = [ | ||||
|   { | ||||
|     value: 'loa', | ||||
|     label: 'Lessons on Assurance' | ||||
|   }, | ||||
|   { | ||||
|     value: 'tms60', | ||||
|     label: 'TMS60', | ||||
|     children: [ | ||||
|         { value: 'tms-60-pack-a', label: 'Pack A' }, | ||||
|         { value: 'tms-60-pack-b', label: 'Pack B' }, | ||||
|         { value: 'tms-60-pack-c', label: 'Pack C' }, | ||||
|         { value: 'tms-60-pack-d', label: 'Pack D' }, | ||||
|         { value: 'tms-60-pack-e', label: 'Pack E' } | ||||
|     ] | ||||
|   }, | ||||
|   { | ||||
|     value: 'dep', | ||||
|     label: 'DEP', | ||||
|     children: [ | ||||
|       { value: 'dep-1', label: 'DEP 1' }, | ||||
|       { value: 'dep-2', label: 'DEP 2' }, | ||||
|       { value: 'dep-3', label: 'DEP 3' }, | ||||
|       { value: 'dep-4', label: 'DEP 4' } | ||||
|     ] | ||||
|   } | ||||
| ]; | ||||
| 
 | ||||
| const CheckboxWidget = ({checked, expanded, setChecked, setExpanded}) => { | ||||
|   return ( | ||||
|     <div className="CheckboxTree"> | ||||
|       <CheckboxTree | ||||
|         nodes={nodes} | ||||
|         checked={checked} | ||||
|         expanded={expanded} | ||||
|         onCheck={setChecked} | ||||
|         onExpand={setExpanded} | ||||
|       /> | ||||
|     </div> | ||||
|   ); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| function App() { | ||||
|   // create checklist array for pack selection | ||||
|   const packList = Object.keys(VerseData); | ||||
|   // return a list of packObj's | ||||
|   // 1. packObj.pack for the pack name  | ||||
|   // 2. packObj.include for whether to include the pack | ||||
|   const packObjList = packList.map((element) => { | ||||
|     const packObj = new Object(); | ||||
|     packObj.pack = element; | ||||
|  | @ -115,40 +91,52 @@ function App() { | |||
|   ) | ||||
|   const [packs, setPacks] = useState(packObjList) | ||||
| 
 | ||||
|   // set number for number of samples | ||||
|   // initialize state variable testCount | ||||
|   // purpose: to set number of verses to test | ||||
|   const [testCount, setTestCount] = useState(5) | ||||
|   const testCountChange = (e) => { | ||||
|     const value = e.target.value | ||||
|     setTestCount(value) | ||||
|   } | ||||
| 
 | ||||
| 
 | ||||
|   // variables for pack selection | ||||
|   const [checked, setChecked] = useState([]) | ||||
|   const [expanded, setExpanded] = useState([]) | ||||
| 
 | ||||
| 
 | ||||
|    | ||||
|   return ( | ||||
|     <div className="App"> | ||||
|       <h1>Pick Number of Verses:</h1> | ||||
|       <label className='test-count-box-label' htmlFor='testCountBox'>Number of Verses Tested:</label> | ||||
|       <input  | ||||
|       <label className="test-count-box-label" htmlFor="testCountBox"> | ||||
|         Number of Verses Tested: | ||||
|       </label> | ||||
|       <input | ||||
|         className="test-count-box" | ||||
|         type='text' | ||||
|         id='testCountBox' | ||||
|         name='testCountBox' | ||||
|         type="text" | ||||
|         id="testCountBox" | ||||
|         name="testCountBox" | ||||
|         onChange={testCountChange} | ||||
|       /> | ||||
| 
 | ||||
|       <h1>Pick Your Packs:</h1> | ||||
|       <ButtonMapper packs={packs} setPacks={setPacks} /> | ||||
|       <CheckboxWidget | ||||
|         checked={checked} | ||||
|         expanded={expanded} | ||||
|         setChecked={setChecked} | ||||
|         setExpanded={setExpanded} | ||||
|       /> | ||||
| 
 | ||||
|             <div className="PackDisplay"> | ||||
|       {/*<div className="PackDisplay"> | ||||
|         <h1>Packs Tested:</h1> | ||||
|         {packs | ||||
|           .filter((pack) => pack.include) | ||||
|         {checked | ||||
|           .map((element) => ( | ||||
|             <li key={element.pack}>{element.pack}</li> | ||||
|             <li key={element}>{element}</li> | ||||
|           ))} | ||||
|       </div> | ||||
|         </div>*/} | ||||
|       <h1>Verses:</h1> | ||||
|       <GenerateTestList packs={packs} testCount={testCount} /> | ||||
|        | ||||
|       <GenerateTestList packs={checked} testCount={testCount} /> | ||||
|     </div> | ||||
|   ); | ||||
| }   | ||||
|  |  | |||
|  | @ -0,0 +1,38 @@ | |||
| .VerseValidator { | ||||
|   padding: 5px; | ||||
|   border: 1px; | ||||
|   border-style: solid; | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| .title-box { | ||||
|   /*padding: 5px;*/ | ||||
|   height: 3vh; | ||||
|   display: block; | ||||
|   width: 100%; | ||||
|   border: 0; | ||||
|   border-radius: 5px; | ||||
|   font-size: 15px; | ||||
| } | ||||
| 
 | ||||
| .chapter-title-box { | ||||
|   /*padding: 5px;*/ | ||||
|   height: 3vh; | ||||
|   display: block; | ||||
|   width: 100%; | ||||
|   border: 0; | ||||
|   border-radius: 5px; | ||||
|   font-size: 15px; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| .verse-box { | ||||
|   /*padding: 5px;*/ | ||||
|   height: 10vh; | ||||
|   display: block; | ||||
|   width: 100%; | ||||
|   border: 0; | ||||
|   border-radius: 5px; | ||||
|   font-size: 15px; | ||||
| } | ||||
| 
 | ||||
|  | @ -0,0 +1,139 @@ | |||
| import { useState } from "react"; | ||||
| import "./VerseValidator.css" | ||||
| 
 | ||||
| const VerseValidator = ({ element: { title, chapterTitle, reference, verse } }) => { | ||||
|   const [inputVerse, setVerse] = useState('') | ||||
|   const [verseBool, setVerseBool] = useState(false) | ||||
|   const [inputTitle, setTitle] = useState('') | ||||
|   const [titleBool, setTitleBool] = useState(false) | ||||
|   const [inputChapterTitle, setChapterTitle] = useState('') | ||||
|   const [chapterTitleBool, setChapterTitleBool] = useState(false) | ||||
|   const[hintBool, setHintBool] = useState(false) | ||||
| 
 | ||||
|   const verseChange = (e) => { | ||||
|     const value = e.target.value; | ||||
|     let string1 = value; | ||||
|     let string2 = verse; | ||||
|     string1 = String(string1) | ||||
|       .replace(/[^\w\s]/g, "") | ||||
|       .replace(/\s+/g, "") | ||||
|       .toLowerCase(); | ||||
|     string2 = String(string2) | ||||
|       .replace(/[^\w\s]/g, "") | ||||
|       .replace(/\s+/g, "") | ||||
|       .toLowerCase(); | ||||
| 
 | ||||
|     const bool = string1 === string2; | ||||
| 
 | ||||
|     setVerse(value); | ||||
|     setVerseBool(bool); | ||||
|   }; | ||||
| 
 | ||||
|   const titleChange = (e) => { | ||||
|     const value = e.target.value; | ||||
|     let string1 = value; | ||||
|     let string2 = title; | ||||
|     string1 = String(string1) | ||||
|       .replace(/[^\w\s]/g, "") | ||||
|       .replace(/\s+/g, "") | ||||
|       .toLowerCase(); | ||||
|     string2 = String(string2) | ||||
|       .replace(/[^\w\s]/g, "") | ||||
|       .replace(/\s+/g, "") | ||||
|       .toLowerCase(); | ||||
| 
 | ||||
|     const bool = string1 === string2; | ||||
| 
 | ||||
|     setTitle(value); | ||||
|     setTitleBool(bool); | ||||
|   }; | ||||
| 
 | ||||
|   const chapterTitleChange = (e) => { | ||||
|     const value = e.target.value; | ||||
|     let string1 = value; | ||||
|     let string2 = title; | ||||
|     string1 = String(string1) | ||||
|       .replace(/[^\w\s]/g, "") | ||||
|       .replace(/\s+/g, "") | ||||
|       .toLowerCase(); | ||||
|     string2 = String(string2) | ||||
|       .replace(/[^\w\s]/g, "") | ||||
|       .replace(/\s+/g, "") | ||||
|       .toLowerCase(); | ||||
| 
 | ||||
|     const bool = string1 === string2; | ||||
| 
 | ||||
|     setChapterTitle(value); | ||||
|     setChapterTitleBool(bool); | ||||
|   }; | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|   let result = ""; | ||||
| 
 | ||||
|   if (verseBool && titleBool) { | ||||
|     result = "Correct"; | ||||
|   } else { | ||||
|     result = ""; | ||||
|   } | ||||
| 
 | ||||
| 
 | ||||
|   return ( | ||||
|     <div className="VerseValidator"> | ||||
|       <h2>{reference}</h2> | ||||
| 
 | ||||
|       {chapterTitle && ( | ||||
|         <> | ||||
|           <label className="main-title-box-label" htmlFor="chapterTitleBox"> | ||||
|             Input Chapter Title: | ||||
|           </label> | ||||
|           <textarea | ||||
|             className="chapter-title-box" | ||||
|             type="text" | ||||
|             id="chapterTitleBox" | ||||
|             name="chapterTitleBox" | ||||
|             onChange={chapterTitleChange} | ||||
|           /> | ||||
|         </> | ||||
|       )} | ||||
| 
 | ||||
|       <label className="title-box-label" htmlFor="titleBox"> | ||||
|         Input Title: | ||||
|       </label> | ||||
|       <textarea | ||||
|         className="title-box" | ||||
|         type="text" | ||||
|         id="titleBox" | ||||
|         name="titleBox" | ||||
|         onChange={titleChange} | ||||
|       /> | ||||
| 
 | ||||
|       <label className="verse-box-label" htmlFor="verseBox"> | ||||
|         Input Verse: | ||||
|       </label> | ||||
|       <textarea | ||||
|         className="verse-box" | ||||
|         type="text" | ||||
|         id="verseBox" | ||||
|         name="verseBox" | ||||
|         onChange={verseChange} | ||||
|       /> | ||||
| 
 | ||||
|       <ul>{result}</ul> | ||||
| 
 | ||||
|       <button onClick={() => setHintBool(!hintBool)}>Show hint:</button> | ||||
| 
 | ||||
|       {hintBool && ( | ||||
|         <> | ||||
|           <h3>{chapterTitle}</h3> | ||||
|           <h4>{title}</h4> | ||||
|           <p>{verse}</p> | ||||
|         </> | ||||
|       )} | ||||
|     </div> | ||||
|   ); | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| export default VerseValidator | ||||
|  | @ -1,32 +1,107 @@ | |||
| { | ||||
|   "LessonsOnAssurance": [ | ||||
|   "loa": [ | ||||
|     { | ||||
|       "id": 1, | ||||
|       "title": "Assurance of Salvation", | ||||
|       "chapterTitle": "", | ||||
|       "reference": "1 John 5:11-12", | ||||
|       "verse": "And this is the testimony: God has given us eternal life, and this life is in his Son. He who has the Son has life; he who does not have the Son of God does not have life." | ||||
|     }, | ||||
|     { | ||||
|       "id": 2, | ||||
|       "title": "Assurance of Answered Prayer", | ||||
|       "chapterTitle": "", | ||||
|       "reference": "John 16:24", | ||||
|       "verse": "Until now you have not asked for anything in my name. Ask and you will receive, and your joy will be complete." | ||||
|     }, | ||||
|     { | ||||
|       "title": "Assurance of Victory", | ||||
|       "chapterTitle": "", | ||||
|       "reference": "1 Corinthians 10:13", | ||||
|       "verse": "No temptation has seized you except what is common to man. And God is faithful; he will not let you be tempted beyond what you can bear. But when you are tempted, he will also provide a way out so that you can stand up under it." | ||||
|     }, | ||||
|     { | ||||
|       "title": "Assurance of Forgiveness", | ||||
|       "chapterTitle": "", | ||||
|       "reference": "1 John 1:9", | ||||
|       "verse": "If we confess our sins, he is faithful and just and will forgive us our sins and purify us from all unrighteousness." | ||||
|     }, | ||||
|     { | ||||
|       "title": "Assurance of Guidance", | ||||
|       "chapterTitle": "", | ||||
|       "reference": "Proverbs 3:5-6", | ||||
|       "verse": "Trust in the LORD with all your heart and lean not on your own understanding;in all your ways acknowledge him, and he will make your paths straight." | ||||
|     } | ||||
|   ], | ||||
|   "TMS60": [ | ||||
|   "tms-60-pack-a": [ | ||||
|     { | ||||
|       "id": 1, | ||||
|       "title": "Christ the Center", | ||||
|       "chapterTitle": "Living the New Life", | ||||
|       "reference": "2 Cor 5:17", | ||||
|       "verse": "Therefore, if anyone is in Christ, he is a new creation; the old has gone, the new has come!" | ||||
|     } | ||||
|   ], | ||||
|   "DEP1": [ | ||||
|   "tms-60-pack-b": [ | ||||
|     { | ||||
|       "title": "All Have Sinned", | ||||
|       "chapterTitle": "Proclaiming Christ", | ||||
|       "reference": "Romans 3:23", | ||||
|       "verse": "for all have sinned and fall short of the glory of God, " | ||||
|     } | ||||
|   ], | ||||
|   "tms-60-pack-c": [ | ||||
|     { | ||||
|       "title": "His Spirit", | ||||
|       "chapterTitle": "Reliance on God's Resources", | ||||
|       "reference": "1 Corinthians 3:16", | ||||
|       "verse": "Don't you know that you yourselves are God's temple and that God's Spirit lives in you?" | ||||
|     } | ||||
|   ], | ||||
|   "tms-60-pack-d": [ | ||||
|     { | ||||
|       "title": "Put Christ First", | ||||
|       "chapterTitle": "Being Christ's Disciple", | ||||
|       "reference": "Matthew 6:33", | ||||
|       "verse": "But seek first his kingdom and his righteousness, and all these things will be given to you as well." | ||||
|     } | ||||
|   ], | ||||
|   "tms-60-pack-e": [ | ||||
|     { | ||||
|       "title": "Love", | ||||
|       "chapterTitle": "Growth in Christlikeness", | ||||
|       "reference": "John 13:34-35", | ||||
|       "verse": "A new command I give you: Love one another. As I have loved you, so you must love one another. By this all men will know that you are my disciples, if you love one another." | ||||
|     } | ||||
|   ], | ||||
|   "dep-1": [ | ||||
|     { | ||||
|       "id": 1, | ||||
|       "title": "Can be assured", | ||||
|       "chapterTitle": "", | ||||
|       "reference": "2 Corinthians 13:5", | ||||
|       "verse": "Examine yourselves to see whether you are in the faith; test yourselves.  Do you not realize that Christ Jesus is in you--unless, of course, you fail the test?" | ||||
|     } | ||||
|   ], | ||||
|   "dep-2": [ | ||||
|     { | ||||
|       "title": "God wants to fellowship with us", | ||||
|       "chapterTitle": "why do we have quiet time", | ||||
|       "reference": "1 Corinthians 1:9", | ||||
|       "verse": "God, who has called you into fellowship with his Son Jesus Christ our Lord, is faithful." | ||||
|     } | ||||
|   ], | ||||
|   "dep-3": [ | ||||
|     { | ||||
|       "title": "Inspired by God", | ||||
|       "chapterTitle": "Authority of the Word", | ||||
|       "reference": "2 Timothy 3:16", | ||||
|       "verse": "All Scripture is God-breathed and is useful for teaching, rebuking, correcting and training in righteousness," | ||||
|     } | ||||
|   ], | ||||
|   "dep-4": [ | ||||
|     { | ||||
|       "title": "Cease not to pray", | ||||
|       "chapterTitle": "Command of Prayer", | ||||
|       "reference": "1 Thessalonians 5:17 (KJV)", | ||||
|       "verse": "Pray without ceasing." | ||||
|     } | ||||
|   ] | ||||
| 
 | ||||
| } | ||||
|  | @ -3,6 +3,7 @@ import ReactDOM from 'react-dom/client' | |||
| // import App from './App.jsx' | ||||
| import App from './VerseSampler.jsx' | ||||
| // import App from './MultiCheckbox.jsx' | ||||
| // import Widget from './ReactCheckboxTree.jsx' | ||||
| import './index.css' | ||||
| import "@fontsource/montserrat" | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue