From be36d35bc6d3295b28d459b303ab2ab5fc1a47bf Mon Sep 17 00:00:00 2001 From: IgnatOffice Date: Wed, 25 May 2022 12:03:18 +0300 Subject: [PATCH] add hw2 --- src/s1-main/App.tsx | 3 +- src/s2-homeworks/hw02/Affair.tsx | 44 ++++++++++++ src/s2-homeworks/hw02/Affairs.module.css | 45 ++++++++++++ src/s2-homeworks/hw02/Affairs.tsx | 65 +++++++++++++++++ src/s2-homeworks/hw02/AlternativeAffairs.tsx | 11 +++ src/s2-homeworks/hw02/HW2.tsx | 69 +++++++++++++++++++ .../hw02/tests/deleteAffair.test.tsx | 36 ++++++++++ .../hw02/tests/filterAffairs.test.tsx | 32 +++++++++ 8 files changed, 304 insertions(+), 1 deletion(-) create mode 100644 src/s2-homeworks/hw02/Affair.tsx create mode 100644 src/s2-homeworks/hw02/Affairs.module.css create mode 100644 src/s2-homeworks/hw02/Affairs.tsx create mode 100644 src/s2-homeworks/hw02/AlternativeAffairs.tsx create mode 100644 src/s2-homeworks/hw02/HW2.tsx create mode 100644 src/s2-homeworks/hw02/tests/deleteAffair.test.tsx create mode 100644 src/s2-homeworks/hw02/tests/filterAffairs.test.tsx diff --git a/src/s1-main/App.tsx b/src/s1-main/App.tsx index a659908..99560a6 100644 --- a/src/s1-main/App.tsx +++ b/src/s1-main/App.tsx @@ -1,13 +1,14 @@ import React from 'react' import s from './App.module.css' import HW1 from '../s2-homeworks/hw01/HW1' +import HW2 from '../s2-homeworks/hw02/HW2' const App = () => { return (
react homeworks:
- {/**/} + {/**/} {/**/} {/**/} diff --git a/src/s2-homeworks/hw02/Affair.tsx b/src/s2-homeworks/hw02/Affair.tsx new file mode 100644 index 0000000..af39726 --- /dev/null +++ b/src/s2-homeworks/hw02/Affair.tsx @@ -0,0 +1,44 @@ +import React from 'react' +import {AffairType} from './HW2' +import s from './Affairs.module.css' + +type AffairPropsType = { + // key не нужно типизировать + affair: any // AffairType // need to fix any + deleteAffairCallback: any // (id: number) => void // need to fix any +} + +function Affair(props: AffairPropsType) { + const deleteCallback = () => {props.deleteAffairCallback(props.affair._id)} // need to fix // создаёт студент + + const priorityClass = s.item + ' ' + s[props.affair.priority] + + return ( +
+
+ {/*создаёт студент*/} + {props.affair.name} + {/**/} +
+ [ +
+ {/*создаёт студент*/} + {props.affair.priority} + {/**/} +
+ ] + + +
+ ) +} + +export default Affair diff --git a/src/s2-homeworks/hw02/Affairs.module.css b/src/s2-homeworks/hw02/Affairs.module.css new file mode 100644 index 0000000..68eb82b --- /dev/null +++ b/src/s2-homeworks/hw02/Affairs.module.css @@ -0,0 +1,45 @@ +.hw2 { + +} + +.button { + margin: 10px; + width: 60px; + + background: #003300; + color: #99ff99; + outline: none; +} +.button:focus { + outline: #99ff99 solid 1px; +} + +.button:active { + background: #99ff99; +} + +.active { + background: #335533; +} + +.affair { + display: flex; + align-items: center; +} + +.item { + margin: 10px; + width: 100px; +} + +.high { + color: red; +} + +.middle { + color: orange; +} + +.low { + color: lime; +} diff --git a/src/s2-homeworks/hw02/Affairs.tsx b/src/s2-homeworks/hw02/Affairs.tsx new file mode 100644 index 0000000..0577f2e --- /dev/null +++ b/src/s2-homeworks/hw02/Affairs.tsx @@ -0,0 +1,65 @@ +import React, { SetStateAction, Dispatch } from 'react' +import Affair from './Affair' +import {AffairType, FilterType} from './HW2' +import s from './Affairs.module.css' + +type AffairsPropsType = { // need to fix any + data: any // AffairType[] + setFilter: any // (filter: FilterType) => void + // setFilter: Dispatch> + deleteAffairCallback: any // (id: number) => void + filter: any // FilterType +} + +function Affairs(props: AffairsPropsType) { + const mappedAffairs = props.data.map((a: AffairType) => ( + + )) + + const setAll = () => { + props.setFilter('all') // создаёт студент + } // need to fix + const setHigh = () => { + props.setFilter('high') // создаёт студент + } + const setMiddle = () => { + props.setFilter('middle') // создаёт студент + } + const setLow = () => { + props.setFilter('low') // создаёт студент + } + // const set = (e: React.MouseEvent) => { + // props.setFilter(e.currentTarget.value as FilterType) + // } + + const cnAll = s.button + ' ' + (props.filter === 'all' ? s.active : '') + const cnHigh = s.button + ' ' + (props.filter === 'high' ? s.active : '') + const cnMiddle = s.button + ' ' + (props.filter === 'middle' ? s.active : '') + const cnLow = s.button + ' ' + (props.filter === 'low' ? s.active : '') + // const setClass = (filter: FilterType) => { + // return s.button + (props.filter === filter ? ' ' + s.active : '') + // } + + return ( +
+ + {mappedAffairs} + + + + + + + {/**/} + {/**/} + {/**/} + {/**/} +
+ ) +} + +export default Affairs diff --git a/src/s2-homeworks/hw02/AlternativeAffairs.tsx b/src/s2-homeworks/hw02/AlternativeAffairs.tsx new file mode 100644 index 0000000..74c41ec --- /dev/null +++ b/src/s2-homeworks/hw02/AlternativeAffairs.tsx @@ -0,0 +1,11 @@ +import React from 'react' + +function AlternativeAffairs() { + return ( +
+ +
+ ) +} + +export default AlternativeAffairs diff --git a/src/s2-homeworks/hw02/HW2.tsx b/src/s2-homeworks/hw02/HW2.tsx new file mode 100644 index 0000000..32ca749 --- /dev/null +++ b/src/s2-homeworks/hw02/HW2.tsx @@ -0,0 +1,69 @@ +import React, {useState} from 'react' +import Affairs from './Affairs' +import s from './Affairs.module.css' +import s2 from '../hw01/Message.module.css' + +// types +export type AffairPriorityType = any // 'high' | 'low' | 'middle' // need to fix any +export type AffairType = { + _id: any // number // need to fix any + name: any // string // need to fix any + priority: AffairPriorityType +} +export type FilterType = 'all' | AffairPriorityType + +// constants +const defaultAffairs: any = [ // need to fix any // AffairType[] + {_id: 1, name: 'React', priority: 'high'}, // студенты могут изменить содержимое name и количество элементов в массиве, ...priority не менять! + {_id: 2, name: 'anime', priority: 'low'}, + {_id: 3, name: 'games', priority: 'low'}, + {_id: 4, name: 'work', priority: 'high'}, + {_id: 5, name: 'html & css', priority: 'middle'}, +] + +// pure helper functions +export const filterAffairs = (affairs: any, filter: any): any => { // need to fix any // (affairs: AffairType[], filter: FilterType): AffairType[] + if (filter === 'all') return affairs // создаёт студент + // else if (filter === 'low') return affairs.filter(a => a.priority === 'low') + // else if (filter === 'middle') return affairs.filter(a => a.priority === 'middle') + // else if (filter === 'high') return affairs.filter(a => a.priority === 'high') + // else { + // } + // return [] + else return affairs.filter((a: any) => a.priority === filter) // need to fix // создаёт студент +} +export const deleteAffair = (affairs: any, _id: any): any => { // need to fix any // (affairs: AffairType[], _id: number): AffairType[] + return affairs.filter((a: any) => a._id !== _id) // need to fix // создаёт студент +} + +function HW2() { + const [affairs, setAffairs] = useState(defaultAffairs) // need to fix any // AffairType[] + const [filter, setFilter] = useState('all') // need to fix any // FilterType + + const filteredAffairs = filterAffairs(affairs, filter) + const deleteAffairCallback = (_id: any) => setAffairs(deleteAffair(affairs, _id)) // need to fix any // number + + return ( +
+
+ {/*можно убрать этот тег*/} + +
homeworks 2
+ + {/*не менять*/} + + +
+ {/*можно убрать этот тег*/} +
+ {/*можно убрать этот тег*/} +
+ ) +} + +export default HW2 diff --git a/src/s2-homeworks/hw02/tests/deleteAffair.test.tsx b/src/s2-homeworks/hw02/tests/deleteAffair.test.tsx new file mode 100644 index 0000000..87aa204 --- /dev/null +++ b/src/s2-homeworks/hw02/tests/deleteAffair.test.tsx @@ -0,0 +1,36 @@ +import React from 'react' +import {AffairType, deleteAffair} from '../HW2' + +let initialState: AffairType[] + +beforeEach(() => { + initialState = [ + {_id: 1, name: 'React', priority: 'high'}, + {_id: 2, name: 'anime', priority: 'low'}, + {_id: 3, name: 'games', priority: 'low'}, + {_id: 4, name: 'work', priority: 'high'}, + {_id: 5, name: 'html & css', priority: 'middle'}, + {_id: 6, name: 'porn', priority: 'low'}, + ] +}) + +test('delete 0', () => { + const newState = deleteAffair(initialState, 0) + expect(newState.length).toBe(6) +}) +test('delete 1', () => { + const newState = deleteAffair(initialState, 1) + expect(newState.length).toBe(5) +}) +test('delete 3', () => { + const newState = deleteAffair(initialState, 3) + expect(newState.length).toBe(5) +}) +test('delete 6', () => { + const newState = deleteAffair(initialState, 6) + expect(newState.length).toBe(5) +}) +test('delete 7', () => { + const newState = deleteAffair(initialState, 7) + expect(newState.length).toBe(6) +}) diff --git a/src/s2-homeworks/hw02/tests/filterAffairs.test.tsx b/src/s2-homeworks/hw02/tests/filterAffairs.test.tsx new file mode 100644 index 0000000..aac5c04 --- /dev/null +++ b/src/s2-homeworks/hw02/tests/filterAffairs.test.tsx @@ -0,0 +1,32 @@ +import React from 'react' +import {AffairType, filterAffairs} from '../HW2' + +let initialState: AffairType[] + +beforeEach(() => { + initialState = [ + {_id: 1, name: 'React', priority: 'high'}, + {_id: 2, name: 'anime', priority: 'low'}, + {_id: 3, name: 'games', priority: 'low'}, + {_id: 4, name: 'work', priority: 'high'}, + {_id: 5, name: 'html & css', priority: 'middle'}, + {_id: 6, name: 'porn', priority: 'low'}, + ] +}) + +test('filter by all', () => { + const newState = filterAffairs(initialState, 'all') + expect(newState.length).toBe(6) +}) +test('filter by high', () => { + const newState = filterAffairs(initialState, 'high') + expect(newState.length).toBe(2) +}) +test('filter by middle', () => { + const newState = filterAffairs(initialState, 'middle') + expect(newState.length).toBe(1) +}) +test('filter by low', () => { + const newState = filterAffairs(initialState, 'low') + expect(newState.length).toBe(3) +})