diff --git a/.editorconfig b/.editorconfig old mode 100644 new mode 100755 diff --git a/.eslintignore b/.eslintignore old mode 100644 new mode 100755 diff --git a/.eslintrc.json b/.eslintrc.json old mode 100644 new mode 100755 index 79e04fe..1784f6d --- a/.eslintrc.json +++ b/.eslintrc.json @@ -24,6 +24,7 @@ "react-hooks/rules-of-hooks": "error", "react-hooks/exhaustive-deps": "warn", "react/prop-types": "off", + "react/jsx-props-no-spreading": "off", "react/jsx-filename-extension": [1, { "extensions": [".tsx"] }], "import/prefer-default-export": "off", "import/extensions": [ diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 diff --git a/README.md b/README.md old mode 100644 new mode 100755 diff --git a/mock/db.json b/mock/db.json new file mode 100755 index 0000000..e69de29 diff --git a/package.json b/package.json old mode 100644 new mode 100755 index e9b276d..494ecff --- a/package.json +++ b/package.json @@ -3,9 +3,12 @@ "version": "0.1.0", "private": true, "dependencies": { + "@types/react-beautiful-dnd": "^13.0.0", "@types/recharts": "^1.8.18", + "faker": "^5.1.0", "node-sass": "^4.14.1", "react": "^17.0.1", + "react-beautiful-dnd": "^13.0.0", "react-dom": "^17.0.1", "react-icons": "^3.11.0", "react-router-dom": "^5.2.0", @@ -35,6 +38,7 @@ "@testing-library/jest-dom": "^5.11.5", "@testing-library/react": "^11.1.1", "@testing-library/user-event": "^12.2.0", + "@types/faker": "^5.1.5", "@types/jest": "^26.0.15", "@types/node": "^14.14.6", "@types/node-sass": "^4.11.1", diff --git a/prettier.config.js b/prettier.config.js old mode 100644 new mode 100755 diff --git a/public/index.html b/public/index.html old mode 100644 new mode 100755 diff --git a/public/robots.txt b/public/robots.txt old mode 100644 new mode 100755 diff --git a/src/App.tsx b/src/App.tsx old mode 100644 new mode 100755 diff --git a/src/Router.tsx b/src/Router.tsx old mode 100644 new mode 100755 diff --git a/src/assets/EVLAV.svg b/src/assets/EVLAV.svg old mode 100644 new mode 100755 diff --git a/src/assets/default-avatar.jpg b/src/assets/default-avatar.jpg old mode 100644 new mode 100755 diff --git a/src/assets/scss/_variables.scss b/src/assets/scss/_variables.scss new file mode 100755 index 0000000..a5139f4 --- /dev/null +++ b/src/assets/scss/_variables.scss @@ -0,0 +1,9 @@ +/* Responsive breakpoints */ +$width-mobile-s: 320px; +$width-mobile-m: 375px; +$width-mobile-l: 425px; +$width-tablet: 768px; +$width-laptop: 1024px; + +/* Main colors*/ +$main-text-color: #6d6d6d; \ No newline at end of file diff --git a/src/assets/space-cube.svg b/src/assets/space-cube.svg old mode 100644 new mode 100755 diff --git a/src/components/CardUser/CardUser.module.scss b/src/components/CardUser/CardUser.module.scss old mode 100644 new mode 100755 diff --git a/src/components/CardUser/index.tsx b/src/components/CardUser/index.tsx old mode 100644 new mode 100755 diff --git a/src/components/Header/Header.module.scss b/src/components/Header/Header.module.scss old mode 100644 new mode 100755 index 4dbab3e..b943f98 --- a/src/components/Header/Header.module.scss +++ b/src/components/Header/Header.module.scss @@ -1,4 +1,4 @@ -$main-text-color: #6d6d6d; +@import '../../assets/scss/variables'; @mixin defaultHover { &:hover { @@ -106,7 +106,7 @@ $main-text-color: #6d6d6d; @include defaultHover(); } -@media(max-width: 690px) { +@media(max-width: $width-tablet) { .sidebar_icon{ display: inline; } diff --git a/src/components/Header/index.tsx b/src/components/Header/index.tsx old mode 100644 new mode 100755 diff --git a/src/components/MainCard/MainCard.module.scss b/src/components/MainCard/MainCard.module.scss old mode 100644 new mode 100755 diff --git a/src/components/MainCard/index.tsx b/src/components/MainCard/index.tsx old mode 100644 new mode 100755 diff --git a/src/components/MainLayout/MainLayout.module.scss b/src/components/MainLayout/MainLayout.module.scss old mode 100644 new mode 100755 index 98a1829..81856ff --- a/src/components/MainLayout/MainLayout.module.scss +++ b/src/components/MainLayout/MainLayout.module.scss @@ -1,9 +1,4 @@ -@mixin sideBarProperties { - background-color: #fefefe; - height: 100vh; - width: 100%; - max-width: 260px; -} +@import '../../assets/scss/variables'; .container { display: flex; @@ -13,25 +8,32 @@ } .sidebar { - @include sideBarProperties(); + background-color: #fefefe; + min-height: 100%; + width: 260px; } main { flex: 1; } -@media (max-width: 690px) { +@media (max-width: $width-tablet) { .sidebar { position: fixed; + visibility: hidden; top: 0; left: -100%; + opacity: 0; transition: 500ms; + z-index: 99; } .sidebar.active { position: fixed; + visibility: visible; top: 0; left: 0; + opacity: 1; transition: 500ms; z-index: 99; } diff --git a/src/components/MainLayout/index.tsx b/src/components/MainLayout/index.tsx old mode 100644 new mode 100755 diff --git a/src/components/ProjectBoard/ProjectBoard.module.scss b/src/components/ProjectBoard/ProjectBoard.module.scss new file mode 100755 index 0000000..b96cd53 --- /dev/null +++ b/src/components/ProjectBoard/ProjectBoard.module.scss @@ -0,0 +1,23 @@ +.container { + background-color: #e2e2e2; + display: flex; + justify-content: space-around; + width: 100%; + overflow: hidden; + height: 100%; +} + +.boxTask { + margin: 10px; + padding: 10px; + .boxContainer { + height: 100%; + overflow-y: auto; + } +} + +.border { + border: 1px solid #c2c2c2; + height: 18em; + align-self: center; +} diff --git a/src/components/ProjectBoard/index.tsx b/src/components/ProjectBoard/index.tsx new file mode 100755 index 0000000..34c0369 --- /dev/null +++ b/src/components/ProjectBoard/index.tsx @@ -0,0 +1,201 @@ +import React, { useState } from 'react'; +import { + DragDropContext, + Droppable, + DropResult, + DraggableLocation, +} from 'react-beautiful-dnd'; +import faker from 'faker'; + +import { TaskModel } from 'models/Task'; +import TaskCard from 'components/TaskCard'; + +import styles from './ProjectBoard.module.scss'; + +// @TODO Move this to a util folder or something like that +/** + * Change the position of a element from a list. + * + * @param list: [] + * @param startIndex: number + * @param endIndex: number + * + * Return a new list with the element index changed . + */ +const reorder = (list: any[], startIndex: number, endIndex: number) => { + const result = Array.from(list); + const [removed] = result.splice(startIndex, 1); + result.splice(endIndex, 0, removed); + + return result; +}; + +// @TODO Move this to a util folder or something like that +/** + * Move a Draggable from a Droppable from another + * + * @param sourceList: any[] + * @param destinationList: any[] + * @param source: DraggableLocation + * @param destination: DraggableLocation + * + * Return a new list with the element index changed . + */ +const move = ( + sourceList: any[], + destinationList: any[], + source: DraggableLocation, + destination: DraggableLocation, +) => { + const sourceClone = Array.from(sourceList); + const destClone = Array.from(destinationList); + const [removed] = sourceClone.splice(source.index, 1); + + destClone.splice(destination.index, 0, removed); + + const result: any = {}; + result[source.droppableId] = sourceClone; + result[destination.droppableId] = destClone; + + return result; +}; + +/** + * Temporary function to generate fake TaskModel. IT WILL BE DELETED. + * + * Return a fake TaskModel. + */ +const generateTask = (): TaskModel => { + return { + id: faker.random.alphaNumeric(5), + name: faker.lorem.words(2), + description: faker.lorem.paragraph(1), + clientId: faker.random.number(), + startDate: faker.date.recent(), + endDate: faker.date.future(), + projectName: `Projeto ${faker.name.firstName()}`, + responsible: faker.name.findName(), + }; +}; + +const ProjectBoard: React.FC = () => { + const [tasksTodo, setTasksTodo] = useState([ + generateTask(), + generateTask(), + ]); + const [tasksDoing, setTasksDoing] = useState([ + generateTask(), + generateTask(), + ]); + const [tasksDone, setTasksDone] = useState([generateTask(), generateTask()]); + + const boxSetList: { + [droppableId: string]: { + tasks: TaskModel[]; + setTasks: React.Dispatch>; + }; + } = { + todo: { tasks: tasksTodo, setTasks: setTasksTodo }, + doing: { tasks: tasksDoing, setTasks: setTasksDoing }, + done: { tasks: tasksDone, setTasks: setTasksDone }, + }; + + /** + * Function that will be executed when the drag event is over. + * + * @param result: DropResult + * + * Reorder the order or Droppable of the taskCards, if necessary. + */ + const onDragEnd = (result: DropResult) => { + const { source, destination } = result; + if (!destination) { + return; + } + + if (source.droppableId === destination.droppableId) { + const { tasks, setTasks } = boxSetList[destination.droppableId]; + + const newItems = reorder(tasks, source.index, destination.index); + + setTasks(newItems); + } else { + const { tasks: tasksSource, setTasks: setTasksSource } = boxSetList[ + source.droppableId + ]; + const { + tasks: tasksDestination, + setTasks: setTasksDestination, + } = boxSetList[destination.droppableId]; + + const resultObject = move( + tasksSource, + tasksDestination, + source, + destination, + ); + + setTasksSource(resultObject[source.droppableId]); + setTasksDestination(resultObject[destination.droppableId]); + } + }; + + return ( +
+ + + {(provided, snapshot) => ( +
+ A fazer +
+ {tasksTodo.map((task, index) => ( + + ))} +
+
+ )} +
+
+ + {(provided, snapshot) => ( +
+ Em execução +
+ {tasksDoing.map((task, index) => ( + + ))} +
+
+ )} +
+
+ + {(provided, snapshot) => ( +
+ Feito +
+ {tasksDone.map((task, index) => ( + + ))} +
+
+ )} +
+
+
+ ); +}; + +export default ProjectBoard; diff --git a/src/components/Sidebar/SideBar.module.scss b/src/components/Sidebar/SideBar.module.scss old mode 100644 new mode 100755 index 9268716..ef2b3fb --- a/src/components/Sidebar/SideBar.module.scss +++ b/src/components/Sidebar/SideBar.module.scss @@ -1,5 +1,7 @@ +@import '../../assets/scss/variables'; + .container { - height: 100vh; + height: 100%; width: 100%; display: flex; flex-direction: column; @@ -14,8 +16,9 @@ .logo { width: 90%; - margin-top: 30px; - margin-bottom: 80px; + min-width: 230px; + max-width: 550px; + margin: 30px 10px 80px 10px; align-self: center; } @@ -45,7 +48,7 @@ color: black; } -@media (max-width: 690px) { +@media (max-width: $width-tablet) { .closeSidebar { display: inline; align-self: flex-end; diff --git a/src/components/Sidebar/index.tsx b/src/components/Sidebar/index.tsx old mode 100644 new mode 100755 diff --git a/src/components/TaskCard/TaskCard.module.scss b/src/components/TaskCard/TaskCard.module.scss new file mode 100644 index 0000000..37d7488 --- /dev/null +++ b/src/components/TaskCard/TaskCard.module.scss @@ -0,0 +1,49 @@ +@mixin boxWithIcon { + display: flex; + align-items: center; + margin: 7px 0; +} + +.container { + background-color: #ffffff; + border-radius: 15px; + height: 140px; + width: 225px; + margin: 10px 0; + padding: 15px; + font-size: 14px; + font-weight: 300; + + .title { + font-size: 16px; + font-weight: 500; + padding-bottom: 5px; + border-bottom: 1px solid #dddddd; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + } + + .details { + padding: 3px 0; + border-bottom: 1px solid #dddddd; + .clientName { + @include boxWithIcon(); + } + .date { + @include boxWithIcon(); + } + } + + .footer { + .people { + @include boxWithIcon(); + } + } +} + +.icon { + color: #6d6d6d; + font-size: 16px; + margin-right: 5px; +} diff --git a/src/components/TaskCard/index.tsx b/src/components/TaskCard/index.tsx new file mode 100644 index 0000000..191abe2 --- /dev/null +++ b/src/components/TaskCard/index.tsx @@ -0,0 +1,51 @@ +import React from 'react'; +import { Draggable } from 'react-beautiful-dnd'; +import { AiFillFolder, AiFillCalendar, AiOutlineUser } from 'react-icons/ai'; + +import { TaskModel } from 'models/Task'; + +import styles from './TaskCard.module.scss'; + +interface TaskCardProps { + task: TaskModel; + index: number; +} + +const TaskCard: React.FC = ({ task, index }) => { + return ( + + {(itemProvided) => ( +
+
{task.name}
+
+
+ + {task.projectName} +
+
+ + + {task.endDate.toLocaleDateString('pt-BR', { + formatMatcher: 'basic', + })} + +
+
+
+
+ + {task.responsible} +
+
+
+ )} +
+ ); +}; + +export default TaskCard; diff --git a/src/global.scss b/src/global.scss old mode 100644 new mode 100755 index bd085af..4226278 --- a/src/global.scss +++ b/src/global.scss @@ -1,13 +1,26 @@ -@import url('https://fonts.googleapis.com/css2?family=Montserrat:wght@500&display=swap'); -*{ - font-family: 'Montserrat', sans-serif; - margin: 0; - padding: 0; - box-sizing: border-box; +@import url('https://fonts.googleapis.com/css2?family=Montserrat:wght@300;500;700&display=swap'); +* { + font-family: 'Montserrat', sans-serif; + margin: 0; + padding: 0; + box-sizing: border-box; } body { - height: 100vh; - width: 100vw; + height: 100vh; + width: 100vw; } +*::-webkit-scrollbar { + width: 2px; +} + +*::-webkit-scrollbar-track { + background: transparent; +} + +*::-webkit-scrollbar-thumb { + background-color: #c2c2c2; + margin: 5px 0; + border-radius: 20px; +} diff --git a/src/index.tsx b/src/index.tsx old mode 100644 new mode 100755 diff --git a/src/models/Project.ts b/src/models/Project.ts new file mode 100755 index 0000000..af47f94 --- /dev/null +++ b/src/models/Project.ts @@ -0,0 +1,7 @@ +export interface ModelProject { + name: string; + description: string; + clientId: number; + startDate: Date; + endDate: Date; +} diff --git a/src/models/Task.ts b/src/models/Task.ts new file mode 100755 index 0000000..b7c6820 --- /dev/null +++ b/src/models/Task.ts @@ -0,0 +1,11 @@ +export interface TaskModel { + id: string; + name: string; + description: string; + clientId: number; + startDate: Date; + endDate: Date; + // Somente para mockup + projectName: string; + responsible: string; +} diff --git a/src/pages/Finances/Finances.module.scss b/src/pages/Finances/Finances.module.scss old mode 100644 new mode 100755 diff --git a/src/pages/Finances/index.tsx b/src/pages/Finances/index.tsx old mode 100644 new mode 100755 diff --git a/src/pages/Home/Home.module.scss b/src/pages/Home/Home.module.scss old mode 100644 new mode 100755 index e69de29..82095c3 --- a/src/pages/Home/Home.module.scss +++ b/src/pages/Home/Home.module.scss @@ -0,0 +1,8 @@ +.container { + display: flex; + height: max-content; + max-height: 60vh; + flex-direction: column; + align-items: center; + padding: 10px; +} diff --git a/src/pages/Home/index.tsx b/src/pages/Home/index.tsx old mode 100644 new mode 100755 index 29c67aa..8c418ca --- a/src/pages/Home/index.tsx +++ b/src/pages/Home/index.tsx @@ -1,13 +1,25 @@ import React from 'react'; +import { RiAddBoxFill } from 'react-icons/ri'; import MainLayout from 'components/MainLayout'; +import ProjectBoard from 'components/ProjectBoard'; +import MainCard from 'components/MainCard'; +import { FaFilter } from 'react-icons/fa'; import styles from './Home.module.scss'; const Home: React.FC = () => { return ( -

Home

+ ]} + secondaryButtons={[]} + > +
+ +
+
); }; diff --git a/src/pages/Login/index.tsx b/src/pages/Login/index.tsx old mode 100644 new mode 100755 diff --git a/src/pages/Login/style.scss b/src/pages/Login/style.scss old mode 100644 new mode 100755 diff --git a/src/pages/Team/Team.module.scss b/src/pages/Team/Team.module.scss old mode 100644 new mode 100755 diff --git a/src/pages/Team/index.tsx b/src/pages/Team/index.tsx old mode 100644 new mode 100755 diff --git a/src/react-app-env.d.ts b/src/react-app-env.d.ts old mode 100644 new mode 100755 diff --git a/src/reportWebVitals.ts b/src/reportWebVitals.ts old mode 100644 new mode 100755 diff --git a/src/setupTests.ts b/src/setupTests.ts old mode 100644 new mode 100755 diff --git a/src/utils/index.tsx b/src/utils/index.tsx old mode 100644 new mode 100755 diff --git a/tsconfig.json b/tsconfig.json old mode 100644 new mode 100755 diff --git a/yarn.lock b/yarn.lock old mode 100644 new mode 100755 index 9055c36..5b95952 --- a/yarn.lock +++ b/yarn.lock @@ -1610,6 +1610,11 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== +"@types/faker@^5.1.5": + version "5.1.5" + resolved "https://registry.yarnpkg.com/@types/faker/-/faker-5.1.5.tgz#f14b015e0100232bb00c6dd7611505efb08709a0" + integrity sha512-2uEQFb7bsx68rqD4F8q95wZq6LTLOyexjv6BnvJogCO4jStkyc6IDEkODPQcWfovI6g6M3uPQ2/uD/oedJKkNw== + "@types/glob@^7.1.1": version "7.1.3" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183" @@ -1714,6 +1719,13 @@ resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.4.tgz#15925414e0ad2cd765bfef58842f7e26a7accb24" integrity sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug== +"@types/react-beautiful-dnd@^13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@types/react-beautiful-dnd/-/react-beautiful-dnd-13.0.0.tgz#e60d3d965312fcf1516894af92dc3e9249587db4" + integrity sha512-by80tJ8aTTDXT256Gl+RfLRtFjYbUWOnZuEigJgNsJrSEGxvFe5eY6k3g4VIvf0M/6+xoLgfYWoWonlOo6Wqdg== + dependencies: + "@types/react" "*" + "@types/react-dom@^16.9.9": version "16.9.9" resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.9.9.tgz#d2d0a6f720a0206369ccbefff752ba37b9583136" @@ -3776,6 +3788,13 @@ css-blank-pseudo@^0.1.4: dependencies: postcss "^7.0.5" +css-box-model@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/css-box-model/-/css-box-model-1.2.1.tgz#59951d3b81fd6b2074a62d49444415b0d2b4d7c1" + integrity sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw== + dependencies: + tiny-invariant "^1.0.6" + css-color-names@0.0.4, css-color-names@^0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" @@ -5215,6 +5234,11 @@ extsprintf@^1.2.0: resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= +faker@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/faker/-/faker-5.1.0.tgz#e10fa1dec4502551aee0eb771617a7e7b94692e8" + integrity sha512-RrWKFSSA/aNLP0g3o2WW1Zez7/MnMr7xkiZmoCfAGZmdkDQZ6l2KtuXHN5XjdvpRjDl8+3vf+Rrtl06Z352+Mw== + fast-deep-equal@^3.1.1: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -5935,7 +5959,7 @@ hmac-drbg@^1.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -hoist-non-react-statics@^3.1.0: +hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== @@ -7799,6 +7823,11 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= +memoize-one@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.1.1.tgz#047b6e3199b508eaec03504de71229b8eb1d75c0" + integrity sha512-HKeeBpWvqiVJD57ZUAsJNm71eHTykffzcLZVYWiVfQeI1rJtuEaS7hQiEpWfVVk18donPwJEcFKIkCmPJNOhHA== + memory-fs@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" @@ -9879,6 +9908,11 @@ querystringify@^2.1.1: resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== +raf-schd@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/raf-schd/-/raf-schd-4.0.2.tgz#bd44c708188f2e84c810bf55fcea9231bcaed8a0" + integrity sha512-VhlMZmGy6A6hrkJWHLNTGl5gtgMUm+xfGza6wbwnE914yeQ5Ybm18vgM734RZhMgfw4tacUrWseGZlpUrrakEQ== + raf@^3.4.0, raf@^3.4.1: version "3.4.1" resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" @@ -9938,6 +9972,19 @@ react-app-polyfill@^2.0.0: regenerator-runtime "^0.13.7" whatwg-fetch "^3.4.1" +react-beautiful-dnd@^13.0.0: + version "13.0.0" + resolved "https://registry.yarnpkg.com/react-beautiful-dnd/-/react-beautiful-dnd-13.0.0.tgz#f70cc8ff82b84bc718f8af157c9f95757a6c3b40" + integrity sha512-87It8sN0ineoC3nBW0SbQuTFXM6bUqM62uJGY4BtTf0yzPl8/3+bHMWkgIe0Z6m8e+gJgjWxefGRVfpE3VcdEg== + dependencies: + "@babel/runtime" "^7.8.4" + css-box-model "^1.2.0" + memoize-one "^5.1.1" + raf-schd "^4.0.2" + react-redux "^7.1.1" + redux "^4.0.4" + use-memo-one "^1.1.1" + react-dev-utils@^11.0.0: version "11.0.0" resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-11.0.0.tgz#9fdb1b173f4ffc1f23fcf98465d93b16a860b73e" @@ -9989,7 +10036,7 @@ react-icons@^3.11.0: dependencies: camelcase "^5.0.0" -react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1: +react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== @@ -10004,6 +10051,17 @@ react-lifecycles-compat@^3.0.4: resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== +react-redux@^7.1.1: + version "7.2.2" + resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.2.tgz#03862e803a30b6b9ef8582dadcc810947f74b736" + integrity sha512-8+CQ1EvIVFkYL/vu6Olo7JFLWop1qRUeb46sGtIMDCSpgwPQq8fPLpirIB0iTqFe9XYEFPHssdX8/UwN6pAkEA== + dependencies: + "@babel/runtime" "^7.12.1" + hoist-non-react-statics "^3.3.2" + loose-envify "^1.4.0" + prop-types "^15.7.2" + react-is "^16.13.1" + react-refresh@^0.8.3: version "0.8.3" resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.8.3.tgz#721d4657672d400c5e3c75d063c4a85fb2d5d68f" @@ -10295,6 +10353,14 @@ reduce-function-call@^1.0.1: dependencies: balanced-match "^1.0.0" +redux@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/redux/-/redux-4.0.5.tgz#4db5de5816e17891de8a80c424232d06f051d93f" + integrity sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w== + dependencies: + loose-envify "^1.4.0" + symbol-observable "^1.2.0" + regenerate-unicode-properties@^8.2.0: version "8.2.0" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" @@ -11612,6 +11678,11 @@ svgo@^1.0.0, svgo@^1.2.2: unquote "~1.1.1" util.promisify "~1.0.0" +symbol-observable@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" + integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== + symbol-tree@^3.2.4: version "3.2.4" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" @@ -11777,7 +11848,7 @@ timsort@^0.3.0: resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= -tiny-invariant@^1.0.2: +tiny-invariant@^1.0.2, tiny-invariant@^1.0.6: version "1.1.0" resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.1.0.tgz#634c5f8efdc27714b7f386c35e6760991d230875" integrity sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw== @@ -12183,6 +12254,11 @@ url@^0.11.0: punycode "1.3.2" querystring "0.2.0" +use-memo-one@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/use-memo-one/-/use-memo-one-1.1.1.tgz#39e6f08fe27e422a7d7b234b5f9056af313bd22c" + integrity sha512-oFfsyun+bP7RX8X2AskHNTxu+R3QdE/RC5IefMbqptmACAA/gfol1KDD5KRzPsGMa62sWxGZw+Ui43u6x4ddoQ== + use@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"