Olga1108 hace 4 años
padre
commit
364abab92d

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 1 - 0
.eslintcache


+ 0 - 38
src/App.css

@@ -1,38 +0,0 @@
-.App {
-  text-align: center;
-}
-
-.App-logo {
-  height: 40vmin;
-  pointer-events: none;
-}
-
-@media (prefers-reduced-motion: no-preference) {
-  .App-logo {
-    animation: App-logo-spin infinite 20s linear;
-  }
-}
-
-.App-header {
-  background-color: #282c34;
-  min-height: 100vh;
-  display: flex;
-  flex-direction: column;
-  align-items: center;
-  justify-content: center;
-  font-size: calc(10px + 2vmin);
-  color: white;
-}
-
-.App-link {
-  color: #61dafb;
-}
-
-@keyframes App-logo-spin {
-  from {
-    transform: rotate(0deg);
-  }
-  to {
-    transform: rotate(360deg);
-  }
-}

+ 0 - 25
src/App.js

@@ -1,25 +0,0 @@
-import logo from './logo.svg';
-import './App.css';
-
-function App() {
-  return (
-    <div className="App">
-      <header className="App-header">
-        <img src={logo} className="App-logo" alt="logo" />
-        <p>
-          Edit <code>src/App.js</code> and save to reload.
-        </p>
-        <a
-          className="App-link"
-          href="https://reactjs.org"
-          target="_blank"
-          rel="noopener noreferrer"
-        >
-          Learn React
-        </a>
-      </header>
-    </div>
-  );
-}
-
-export default App;

+ 0 - 8
src/App.test.js

@@ -1,8 +0,0 @@
-import { render, screen } from '@testing-library/react';
-import App from './App';
-
-test('renders learn react link', () => {
-  render(<App />);
-  const linkElement = screen.getByText(/learn react/i);
-  expect(linkElement).toBeInTheDocument();
-});

+ 34 - 0
src/App/App.css

@@ -0,0 +1,34 @@
+*,
+*::before,
+*::after {
+  box-sizing: border-box;
+}
+
+.wrapper {
+  position: relative;
+  max-width: 100%;
+  overflow: hidden;
+}
+
+.container {
+  width: 100%;
+  max-width: 1400px;
+  margin: 0 auto;
+  padding: 0 15px;
+}
+
+body {
+  margin: 0;
+}
+
+img {
+  width: 100px;
+}
+
+.listOfItems {
+  width: 100%;
+  display: flex;
+  justify-content: space-around;
+  align-items: center;
+  flex-wrap: wrap;
+}

+ 22 - 0
src/App/App.jsx

@@ -0,0 +1,22 @@
+import React, {useState} from 'react';
+import {userData} from '../data/userData'
+import Main from '../containers/Main'
+import Header from '../containers/Header'
+// import Modal from './components/Modal'
+import './App.css';
+
+
+const App = () => {
+
+  const [usersArr, setUsersArr] = useState([...userData]);
+
+
+return (
+    <div className="wrapper">
+      <Header setUsersArr={setUsersArr} userData={userData}/>
+      <Main usersArr={usersArr}/>
+    </div>
+  );
+}
+
+export default App;

+ 2 - 0
src/App/index.js

@@ -0,0 +1,2 @@
+import App from './App'
+export default App;

+ 13 - 0
src/components/Button/Button.jsx

@@ -0,0 +1,13 @@
+import React from 'react';
+import './button.css';
+
+const Button = ({clear}) => {
+
+  return (
+      
+      <button className="clear" onClick={clear}>Clear</button>    
+        
+        );
+  }
+
+  export default Button;

+ 0 - 0
src/components/Button/button.css


+ 2 - 0
src/components/Button/index.js

@@ -0,0 +1,2 @@
+import Button from './Button'
+export default Button;

+ 15 - 0
src/components/Input/Input.jsx

@@ -0,0 +1,15 @@
+import React from 'react';
+import './input.css';
+
+const Input = (props) => {
+    return (
+        <input 
+        name={props.name}
+        type={props.type}
+        placeholder={props.placeholder}
+        onChange={(e) => {props.handleSearchName(e.target.value)}}
+        />
+    )
+}
+
+export default Input;

+ 2 - 0
src/components/Input/index.js

@@ -0,0 +1,2 @@
+import Input from './Input'
+export default Input;

+ 0 - 0
src/components/Input/input.css


+ 14 - 0
src/components/Select/Select.jsx

@@ -0,0 +1,14 @@
+import React from 'react';
+import './select.css';
+
+const Select = ({name, handleSortAge}) => {
+    return (
+        <select name={name} onChange={(e) => handleSortAge(e.target.value)}>
+                    <option value="default">default</option>
+                    <option value="ascending">ascending</option>
+                    <option value="descending">descending</option>
+                </select>
+    )
+}
+
+export default Select;

+ 2 - 0
src/components/Select/index.js

@@ -0,0 +1,2 @@
+import Select from './Select'
+export default Select;

+ 0 - 0
src/components/Select/select.css


+ 56 - 0
src/containers/Header/Header.jsx

@@ -0,0 +1,56 @@
+import React from 'react';
+import './header.css';
+import Button from '../../components/Button'
+import Input from '../../components/Input'
+import Select from '../../components/Select'
+
+
+
+const Header = ({setUsersArr, userData}) => {
+
+  const handleSearchName = (value) => {
+        const foundUserName = userData.filter(user => user.name.toLocaleLowerCase().includes(value.toLocaleLowerCase()));
+        setUsersArr(foundUserName);
+      }
+
+  const handleSortAge = (value) => {
+    let sortAge = [...userData].sort((a, b) => {
+      if (value === 'ascending') {
+        return a.age - b.age;
+      } else if (value === 'descending') {
+        return b.age - a.age;
+      }
+      return setUsersArr(userData);
+    });
+    setUsersArr(sortAge);
+  }
+
+const clear = (e) => {
+    setUsersArr(userData);
+    e.target.closest("form").reset()
+}
+
+return (
+    <header className="container-header">
+        <div className="container">
+            <form onSubmit={(e) => e.preventDefault()}>
+                <Input 
+                    type={"search"}
+                    name={"search"}
+                    placeholder={"Enter name"}
+                    handleSearchName={handleSearchName}
+                />
+                <Select
+                  name={"sort"}
+                  handleSortAge={handleSortAge}
+                />
+                
+                <Button 
+                  clear={clear}
+                />
+            </form>
+        </div>
+    </header>
+  );
+}
+export default Header;

+ 14 - 0
src/containers/Header/header.css

@@ -0,0 +1,14 @@
+.container-header {
+    width: 100%;
+    background-color: rgb(185, 224, 241);
+}
+
+.container {
+    display: flex;
+    justify-content: space-around;
+    align-items: center;
+}
+form {
+    margin-top: 20px;
+    margin-bottom: 20px; 
+}

+ 2 - 0
src/containers/Header/index.js

@@ -0,0 +1,2 @@
+import Header from './Header';
+export default Header;

+ 21 - 0
src/containers/Item/Item.jsx

@@ -0,0 +1,21 @@
+import React from 'react';
+// import Modal from '../Modal'
+import './item.css';
+const Item = (props) => {
+
+  // const [isOpenModalWindow, setOpenModalWindow] = useState(false);
+  
+    return (
+      
+          <div className="item">
+            <img src={props.picture} alt='#'/>
+            <h2>Name: {props.name}</h2>
+            <p>Age: {props.age}</p>
+            <p>Gender: {props.gender}</p>
+            <p>Balance: {props.balance}</p>
+          </div>
+        
+        );
+  }
+
+  export default Item;

+ 2 - 0
src/containers/Item/index.js

@@ -0,0 +1,2 @@
+import Item from './Item'
+export default Item;

+ 18 - 0
src/containers/Item/item.css

@@ -0,0 +1,18 @@
+.item {
+    width: 80%;
+    height: 400px;
+    box-sizing: border-box;
+    padding: 10px 20px;
+}
+
+@media (min-width: 768px) {
+    .item {
+        width: 50%;
+    }
+}
+
+@media (min-width: 1200px) {
+    .item {
+        width: calc(100% / 3 - 30px);
+    }
+}

+ 20 - 0
src/containers/Main/Main.jsx

@@ -0,0 +1,20 @@
+import React from 'react';
+import Item from '../Item';
+import './main.css';
+
+const Main = ({usersArr}) => {
+
+  return (
+      
+      <main className="listOfItems">
+          {usersArr.map((user) => {
+          return <Item {...user} key={user._id}/>
+        })
+
+        }
+      </main>    
+        
+        );
+  }
+
+  export default Main;

+ 2 - 0
src/containers/Main/index.js

@@ -0,0 +1,2 @@
+import Main from './Main'
+export default Main;

+ 0 - 0
src/containers/Main/main.css


+ 29 - 0
src/containers/Modal/Modal.jsx

@@ -0,0 +1,29 @@
+import React from 'react';
+import './modal.css';
+
+const Modal = ({props, handeModal}) => {
+    const closeWindow = (e) => {
+        if (e.target.classList.contains("modal")) {
+            handeModal();
+        }
+    }
+
+    return (
+        <div className="modal_window" onClick={closeWindow}>
+            <span className="close" onClick={handeModal}>X</span>
+            <h3>{props.name}</h3>
+            <p>Age: {props.age}</p>
+            <p>Gender: {props.gender}</p>
+            <p>Balance: {props.balance}</p>
+            <p>Company: {props.company}</p>
+            <p>Email: {props.email}</p>
+            <p>Phone: {props.phone}</p>
+            <p>Address: {props.address}</p>
+            <p>Registered: {props.registered}</p>
+            <p>Eye color: {props.eyeColor}</p>
+            <p>{props.isActive}</p>
+        </div>
+    )
+}
+
+export default Modal;

+ 2 - 0
src/containers/Modal/index.js

@@ -0,0 +1,2 @@
+import Modal from './Item'
+export default Modal;

+ 6 - 0
src/containers/Modal/modal.css

@@ -0,0 +1,6 @@
+.item {
+    width: 45%;
+    height: 400px;
+    box-sizing: border-box;
+    padding: 10px 20px;
+}

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 573 - 0
src/data/userData.js


+ 1 - 1
src/index.css

@@ -10,4 +10,4 @@ body {
 code {
   font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
     monospace;
-}
+}

+ 3 - 8
src/index.js

@@ -1,17 +1,12 @@
 import React from 'react';
 import ReactDOM from 'react-dom';
 import './index.css';
-import App from './App';
-import reportWebVitals from './reportWebVitals';
+import App from './App/App';
+
 
 ReactDOM.render(
   <React.StrictMode>
     <App />
   </React.StrictMode>,
   document.getElementById('root')
-);
-
-// If you want to start measuring performance in your app, pass a function
-// to log results (for example: reportWebVitals(console.log))
-// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
-reportWebVitals();
+);

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 1
src/logo.svg


+ 0 - 13
src/reportWebVitals.js

@@ -1,13 +0,0 @@
-const reportWebVitals = onPerfEntry => {
-  if (onPerfEntry && onPerfEntry instanceof Function) {
-    import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {
-      getCLS(onPerfEntry);
-      getFID(onPerfEntry);
-      getFCP(onPerfEntry);
-      getLCP(onPerfEntry);
-      getTTFB(onPerfEntry);
-    });
-  }
-};
-
-export default reportWebVitals;

+ 0 - 5
src/setupTests.js

@@ -1,5 +0,0 @@
-// jest-dom adds custom jest matchers for asserting on DOM nodes.
-// allows you to do things like:
-// expect(element).toHaveTextContent(/react/i)
-// learn more: https://github.com/testing-library/jest-dom
-import '@testing-library/jest-dom';