From 3091043e08bce7676610058c0be25e566200d9bc Mon Sep 17 00:00:00 2001 From: Ylva Karlsson <121539816+YlvaKarlsson@users.noreply.github.com> Date: Tue, 18 Apr 2023 10:29:19 +0200 Subject: [PATCH 01/28] Initial commit --- code/.eslintrc.json | 4 + code/package-lock.json | 263 +++++++++++++++++++++++++++++++++++++++-- code/package.json | 4 +- 3 files changed, 261 insertions(+), 10 deletions(-) diff --git a/code/.eslintrc.json b/code/.eslintrc.json index c9c0675c3..81138c66f 100644 --- a/code/.eslintrc.json +++ b/code/.eslintrc.json @@ -42,6 +42,10 @@ "allowSingleLine": true } ], + "linebreak-style":[ + "off", + "unix" + ], "comma-dangle": [ "error", "never" diff --git a/code/package-lock.json b/code/package-lock.json index bb51e893e..292180b53 100644 --- a/code/package-lock.json +++ b/code/package-lock.json @@ -9,6 +9,7 @@ "version": "1.0.0", "dependencies": { "@babel/eslint-parser": "^7.18.9", + "@reduxjs/toolkit": "^1.9.5", "eslint": "^8.21.0", "eslint-config-airbnb": "^19.0.4", "eslint-plugin-import": "^2.26.0", @@ -16,7 +17,8 @@ "eslint-plugin-react": "^7.30.1", "eslint-plugin-react-hooks": "^4.6.0", "react": "^18.2.0", - "react-dom": "^18.2.0" + "react-dom": "^18.2.0", + "react-redux": "^8.0.5" }, "devDependencies": { "react-scripts": "5.0.1" @@ -3124,6 +3126,29 @@ } } }, + "node_modules/@reduxjs/toolkit": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.5.tgz", + "integrity": "sha512-Rt97jHmfTeaxL4swLRNPD/zV4OxTes4la07Xc4hetpUW/vc75t5m1ANyxG6ymnEQ2FsLQsoMlYB2vV1sO3m8tQ==", + "dependencies": { + "immer": "^9.0.21", + "redux": "^4.2.1", + "redux-thunk": "^2.4.2", + "reselect": "^4.1.8" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18", + "react-redux": "^7.2.1 || ^8.0.2" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-redux": { + "optional": true + } + } + }, "node_modules/@rollup/plugin-babel": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", @@ -3621,6 +3646,15 @@ "@types/node": "*" } }, + "node_modules/@types/hoist-non-react-statics": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", + "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", + "dependencies": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, "node_modules/@types/html-minifier-terser": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", @@ -3695,6 +3729,11 @@ "integrity": "sha512-fOwvpvQYStpb/zHMx0Cauwywu9yLDmzWiiQBC7gJyq5tYLUXFZvDG7VK1B7WBxxjBJNKFOZ0zLoOQn8vmATbhw==", "dev": true }, + "node_modules/@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" + }, "node_modules/@types/q": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz", @@ -3713,6 +3752,16 @@ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", "dev": true }, + "node_modules/@types/react": { + "version": "18.0.37", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.37.tgz", + "integrity": "sha512-4yaZZtkRN3ZIQD3KSEwkfcik8s0SWV+82dlJot1AbGYHCzJkWP3ENBY6wYeDRmKZ6HkrgoGAmR2HqdwYGp6OEw==", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, "node_modules/@types/resolve": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", @@ -3728,6 +3777,11 @@ "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", "dev": true }, + "node_modules/@types/scheduler": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", + "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==" + }, "node_modules/@types/serve-index": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", @@ -3768,6 +3822,11 @@ "integrity": "sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg==", "dev": true }, + "node_modules/@types/use-sync-external-store": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz", + "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==" + }, "node_modules/@types/ws": { "version": "8.5.3", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", @@ -6095,6 +6154,11 @@ "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", "dev": true }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + }, "node_modules/damerau-levenshtein": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", @@ -8515,6 +8579,14 @@ "he": "bin/he" } }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dependencies": { + "react-is": "^16.7.0" + } + }, "node_modules/hoopy": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", @@ -8800,10 +8872,9 @@ } }, "node_modules/immer": { - "version": "9.0.15", - "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.15.tgz", - "integrity": "sha512-2eB/sswms9AEUSkOm4SbV5Y7Vmt/bKRwByd52jfLkW4OLYeaTP3EEiJ9agqU0O/tq6Dk62Zfj+TJSqfm1rLVGQ==", - "dev": true, + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", "funding": { "type": "opencollective", "url": "https://opencollective.com/immer" @@ -14375,6 +14446,49 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, + "node_modules/react-redux": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.0.5.tgz", + "integrity": "sha512-Q2f6fCKxPFpkXt1qNRZdEDLlScsDWyrgSj0mliK59qU6W5gvBiKkdMEG2lJzhd1rCctf0hb6EtePPLZ2e0m1uw==", + "dependencies": { + "@babel/runtime": "^7.12.1", + "@types/hoist-non-react-statics": "^3.3.1", + "@types/use-sync-external-store": "^0.0.3", + "hoist-non-react-statics": "^3.3.2", + "react-is": "^18.0.0", + "use-sync-external-store": "^1.0.0" + }, + "peerDependencies": { + "@types/react": "^16.8 || ^17.0 || ^18.0", + "@types/react-dom": "^16.8 || ^17.0 || ^18.0", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0", + "react-native": ">=0.59", + "redux": "^4" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + }, + "redux": { + "optional": true + } + } + }, + "node_modules/react-redux/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, "node_modules/react-refresh": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", @@ -14531,6 +14645,22 @@ "node": "*" } }, + "node_modules/redux": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", + "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", + "dependencies": { + "@babel/runtime": "^7.9.2" + } + }, + "node_modules/redux-thunk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz", + "integrity": "sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==", + "peerDependencies": { + "redux": "^4" + } + }, "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -14686,6 +14816,11 @@ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "dev": true }, + "node_modules/reselect": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz", + "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==" + }, "node_modules/resolve": { "version": "1.22.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", @@ -16340,6 +16475,14 @@ "punycode": "^2.1.0" } }, + "node_modules/use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -19509,6 +19652,17 @@ "source-map": "^0.7.3" } }, + "@reduxjs/toolkit": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.5.tgz", + "integrity": "sha512-Rt97jHmfTeaxL4swLRNPD/zV4OxTes4la07Xc4hetpUW/vc75t5m1ANyxG6ymnEQ2FsLQsoMlYB2vV1sO3m8tQ==", + "requires": { + "immer": "^9.0.21", + "redux": "^4.2.1", + "redux-thunk": "^2.4.2", + "reselect": "^4.1.8" + } + }, "@rollup/plugin-babel": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", @@ -19876,6 +20030,15 @@ "@types/node": "*" } }, + "@types/hoist-non-react-statics": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", + "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", + "requires": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, "@types/html-minifier-terser": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", @@ -19950,6 +20113,11 @@ "integrity": "sha512-fOwvpvQYStpb/zHMx0Cauwywu9yLDmzWiiQBC7gJyq5tYLUXFZvDG7VK1B7WBxxjBJNKFOZ0zLoOQn8vmATbhw==", "dev": true }, + "@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" + }, "@types/q": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz", @@ -19968,6 +20136,16 @@ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", "dev": true }, + "@types/react": { + "version": "18.0.37", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.37.tgz", + "integrity": "sha512-4yaZZtkRN3ZIQD3KSEwkfcik8s0SWV+82dlJot1AbGYHCzJkWP3ENBY6wYeDRmKZ6HkrgoGAmR2HqdwYGp6OEw==", + "requires": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, "@types/resolve": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", @@ -19983,6 +20161,11 @@ "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", "dev": true }, + "@types/scheduler": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", + "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==" + }, "@types/serve-index": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", @@ -20023,6 +20206,11 @@ "integrity": "sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg==", "dev": true }, + "@types/use-sync-external-store": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz", + "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==" + }, "@types/ws": { "version": "8.5.3", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", @@ -21748,6 +21936,11 @@ } } }, + "csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + }, "damerau-levenshtein": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", @@ -23521,6 +23714,14 @@ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, + "hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "requires": { + "react-is": "^16.7.0" + } + }, "hoopy": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", @@ -23739,10 +23940,9 @@ "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==" }, "immer": { - "version": "9.0.15", - "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.15.tgz", - "integrity": "sha512-2eB/sswms9AEUSkOm4SbV5Y7Vmt/bKRwByd52jfLkW4OLYeaTP3EEiJ9agqU0O/tq6Dk62Zfj+TJSqfm1rLVGQ==", - "dev": true + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==" }, "import-fresh": { "version": "3.3.0", @@ -27678,6 +27878,26 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, + "react-redux": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.0.5.tgz", + "integrity": "sha512-Q2f6fCKxPFpkXt1qNRZdEDLlScsDWyrgSj0mliK59qU6W5gvBiKkdMEG2lJzhd1rCctf0hb6EtePPLZ2e0m1uw==", + "requires": { + "@babel/runtime": "^7.12.1", + "@types/hoist-non-react-statics": "^3.3.1", + "@types/use-sync-external-store": "^0.0.3", + "hoist-non-react-statics": "^3.3.2", + "react-is": "^18.0.0", + "use-sync-external-store": "^1.0.0" + }, + "dependencies": { + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + } + } + }, "react-refresh": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", @@ -27800,6 +28020,20 @@ } } }, + "redux": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", + "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", + "requires": { + "@babel/runtime": "^7.9.2" + } + }, + "redux-thunk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz", + "integrity": "sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==", + "requires": {} + }, "regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -27924,6 +28158,11 @@ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "dev": true }, + "reselect": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz", + "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==" + }, "resolve": { "version": "1.22.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", @@ -29163,6 +29402,12 @@ "punycode": "^2.1.0" } }, + "use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "requires": {} + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", diff --git a/code/package.json b/code/package.json index 7aad26ebc..f971764b9 100644 --- a/code/package.json +++ b/code/package.json @@ -4,6 +4,7 @@ "private": true, "dependencies": { "@babel/eslint-parser": "^7.18.9", + "@reduxjs/toolkit": "^1.9.5", "eslint": "^8.21.0", "eslint-config-airbnb": "^19.0.4", "eslint-plugin-import": "^2.26.0", @@ -11,7 +12,8 @@ "eslint-plugin-react": "^7.30.1", "eslint-plugin-react-hooks": "^4.6.0", "react": "^18.2.0", - "react-dom": "^18.2.0" + "react-dom": "^18.2.0", + "react-redux": "^8.0.5" }, "scripts": { "start": "react-scripts start", From 6e14c67ac047336cd4db3dd5295b80434b4f0e6d Mon Sep 17 00:00:00 2001 From: Ylva Karlsson <121539816+YlvaKarlsson@users.noreply.github.com> Date: Tue, 18 Apr 2023 12:08:31 +0200 Subject: [PATCH 02/28] Some kind of a working to do list - yey --- code/.gitignore | 23 --------- code/package-lock.json | 84 ++++++++++++++++++++++++++++++-- code/package.json | 2 + code/src/App.js | 20 ++++++-- code/src/components/AddToDo.js | 32 ++++++++++++ code/src/components/ToDoItem.js | 0 code/src/components/ToDoList.js | 17 +++++++ code/src/redux/reducers/todos.js | 36 ++++++++++++++ code/src/redux/store.js | 0 9 files changed, 183 insertions(+), 31 deletions(-) delete mode 100644 code/.gitignore create mode 100644 code/src/components/AddToDo.js create mode 100644 code/src/components/ToDoItem.js create mode 100644 code/src/components/ToDoList.js create mode 100644 code/src/redux/reducers/todos.js create mode 100644 code/src/redux/store.js diff --git a/code/.gitignore b/code/.gitignore deleted file mode 100644 index 4d29575de..000000000 --- a/code/.gitignore +++ /dev/null @@ -1,23 +0,0 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# dependencies -/node_modules -/.pnp -.pnp.js - -# testing -/coverage - -# production -/build - -# misc -.DS_Store -.env.local -.env.development.local -.env.test.local -.env.production.local - -npm-debug.log* -yarn-debug.log* -yarn-error.log* diff --git a/code/package-lock.json b/code/package-lock.json index 292180b53..6c941cd81 100644 --- a/code/package-lock.json +++ b/code/package-lock.json @@ -16,8 +16,10 @@ "eslint-plugin-jsx-a11y": "^6.6.1", "eslint-plugin-react": "^7.30.1", "eslint-plugin-react-hooks": "^4.6.0", + "framer-motion": "^10.12.3", "react": "^18.2.0", "react-dom": "^18.2.0", + "react-icons": "^4.8.0", "react-redux": "^8.0.5" }, "devDependencies": { @@ -2155,6 +2157,21 @@ "postcss-selector-parser": "^6.0.10" } }, + "node_modules/@emotion/is-prop-valid": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", + "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", + "optional": true, + "dependencies": { + "@emotion/memoize": "0.7.4" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==", + "optional": true + }, "node_modules/@eslint/eslintrc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", @@ -8213,6 +8230,29 @@ "url": "https://www.patreon.com/infusion" } }, + "node_modules/framer-motion": { + "version": "10.12.3", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-10.12.3.tgz", + "integrity": "sha512-OQrfIMJrWrcnyQ+K3VkDboQHigCk8pqFjXLedbpl/V7P7X8d1DX/dK1/lefLx5hIcdnsmT1DQDpZBQGnYZGh1Q==", + "dependencies": { + "tslib": "^2.4.0" + }, + "optionalDependencies": { + "@emotion/is-prop-valid": "^0.8.2" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", @@ -14441,6 +14481,14 @@ "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==", "dev": true }, + "node_modules/react-icons": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.8.0.tgz", + "integrity": "sha512-N6+kOLcihDiAnj5Czu637waJqSnwlMNROzVZMhfX68V/9bu9qHaMIJC4UdozWoOk57gahFCNHwVvWzm0MTzRjg==", + "peerDependencies": { + "react": "*" + } + }, "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", @@ -16250,8 +16298,7 @@ "node_modules/tslib": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "node_modules/tsutils": { "version": "3.21.0", @@ -18935,6 +18982,21 @@ "dev": true, "requires": {} }, + "@emotion/is-prop-valid": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", + "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", + "optional": true, + "requires": { + "@emotion/memoize": "0.7.4" + } + }, + "@emotion/memoize": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==", + "optional": true + }, "@eslint/eslintrc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", @@ -23452,6 +23514,15 @@ "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", "dev": true }, + "framer-motion": { + "version": "10.12.3", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-10.12.3.tgz", + "integrity": "sha512-OQrfIMJrWrcnyQ+K3VkDboQHigCk8pqFjXLedbpl/V7P7X8d1DX/dK1/lefLx5hIcdnsmT1DQDpZBQGnYZGh1Q==", + "requires": { + "@emotion/is-prop-valid": "^0.8.2", + "tslib": "^2.4.0" + } + }, "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", @@ -27873,6 +27944,12 @@ "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==", "dev": true }, + "react-icons": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.8.0.tgz", + "integrity": "sha512-N6+kOLcihDiAnj5Czu637waJqSnwlMNROzVZMhfX68V/9bu9qHaMIJC4UdozWoOk57gahFCNHwVvWzm0MTzRjg==", + "requires": {} + }, "react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", @@ -29247,8 +29324,7 @@ "tslib": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "tsutils": { "version": "3.21.0", diff --git a/code/package.json b/code/package.json index f971764b9..78fb8e423 100644 --- a/code/package.json +++ b/code/package.json @@ -11,8 +11,10 @@ "eslint-plugin-jsx-a11y": "^6.6.1", "eslint-plugin-react": "^7.30.1", "eslint-plugin-react-hooks": "^4.6.0", + "framer-motion": "^10.12.3", "react": "^18.2.0", "react-dom": "^18.2.0", + "react-icons": "^4.8.0", "react-redux": "^8.0.5" }, "scripts": { diff --git a/code/src/App.js b/code/src/App.js index f2007d229..f032cb804 100644 --- a/code/src/App.js +++ b/code/src/App.js @@ -1,9 +1,21 @@ import React from 'react'; +import { Provider } from 'react-redux'; +import { configureStore, combineReducers } from '@reduxjs/toolkit'; +import AddToDo from 'components/AddToDo'; +import ToDoList from 'components/ToDoList'; +import todos from 'redux/reducers/todos' export const App = () => { + const reducer = combineReducers({ + todos: todos.reducer + }); + const store = configureStore({ reducer }); return ( -
- Find me in src/app.js! -
- ); + + + + + ) } + +// ctrl + c inside the terminal to stop the liveServer \ No newline at end of file diff --git a/code/src/components/AddToDo.js b/code/src/components/AddToDo.js new file mode 100644 index 000000000..e98299848 --- /dev/null +++ b/code/src/components/AddToDo.js @@ -0,0 +1,32 @@ +import React, { useState } from 'react'; +import { useDispatch } from 'react-redux'; +import todos from 'redux/reducers/todos'; + +const AddToDo = () => { + const [inputValue, setInputValue] = useState(''); + const dispatch = useDispatch(); + const onFormSubmit = (event) => { + event.preventDefault(); + const newToDo = { + id: Date.now().toString(), + name: inputValue.charAt(0).toUpperCase() + inputValue.slice(1), + isNew: false + }; + dispatch(todos.actions.addToDo(newToDo)); + setInputValue(''); + // https://www.random.org + } + return ( +
+
+ + +
+
+ ) +} + +export default AddToDo; \ No newline at end of file diff --git a/code/src/components/ToDoItem.js b/code/src/components/ToDoItem.js new file mode 100644 index 000000000..e69de29bb diff --git a/code/src/components/ToDoList.js b/code/src/components/ToDoList.js new file mode 100644 index 000000000..b588cc593 --- /dev/null +++ b/code/src/components/ToDoList.js @@ -0,0 +1,17 @@ +import React from 'react'; +import { useSelector } from 'react-redux'; + +const ToDoList = () => { + const todoList = useSelector((store) => store.todos.items) + return ( +
+ +
+ ) +} + +export default ToDoList; \ No newline at end of file diff --git a/code/src/redux/reducers/todos.js b/code/src/redux/reducers/todos.js new file mode 100644 index 000000000..bcc64a0d7 --- /dev/null +++ b/code/src/redux/reducers/todos.js @@ -0,0 +1,36 @@ +import { createSlice } from '@reduxjs/toolkit'; + +const initialState = { + items: [ + { + id: '189438fdjhrjejioe9845', + name: 'ToDo1', + isNew: false + }, + { + id: '189438fdjhrjejioe9846', + name: 'ToDo2', + isNew: false + }, + { + id: '189438fdjhrjejioe9847', + name: 'ToDo3', + isNew: false + } + ] +} + +const todos = createSlice({ + name: 'todos', + initialState, + reducers: { + addToDo: (store, action) => { + // Mutable + // store.items.push(action.payload); + // Immutable + store.items = [...store.items, action.payload]; + } + } +}); + +export default todos; \ No newline at end of file diff --git a/code/src/redux/store.js b/code/src/redux/store.js new file mode 100644 index 000000000..e69de29bb From e4d1c0a0d0553f1048aeb299f200e1e761460083 Mon Sep 17 00:00:00 2001 From: Ylva Karlsson <121539816+YlvaKarlsson@users.noreply.github.com> Date: Thu, 20 Apr 2023 12:29:10 +0200 Subject: [PATCH 03/28] Some more things are working and some are still in progress --- code/package-lock.json | 461 ++++++++++++++++++++++++++--- code/package.json | 5 +- code/public/favicon.ico | Bin 0 -> 1383 bytes code/public/index.html | 4 +- code/src/App.js | 22 +- code/src/components/AddToDo.js | 68 ++++- code/src/components/GlobalStyle.js | 50 ++++ code/src/components/ToDoItem.js | 42 +++ code/src/components/ToDoList.js | 77 ++++- code/src/index.css | 2 + code/src/redux/reducers/todos.js | 81 +++-- 11 files changed, 712 insertions(+), 100 deletions(-) create mode 100644 code/public/favicon.ico create mode 100644 code/src/components/GlobalStyle.js diff --git a/code/package-lock.json b/code/package-lock.json index 6c941cd81..88ee3d540 100644 --- a/code/package-lock.json +++ b/code/package-lock.json @@ -17,10 +17,13 @@ "eslint-plugin-react": "^7.30.1", "eslint-plugin-react-hooks": "^4.6.0", "framer-motion": "^10.12.3", + "moment": "^2.29.4", "react": "^18.2.0", + "react-datepicker": "^4.11.0", "react-dom": "^18.2.0", "react-icons": "^4.8.0", - "react-redux": "^8.0.5" + "react-redux": "^8.0.5", + "styled-components.macro": "^1.0.0" }, "devDependencies": { "react-scripts": "5.0.1" @@ -133,7 +136,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", - "dev": true, "dependencies": { "@babel/types": "^7.18.6" }, @@ -2172,6 +2174,18 @@ "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==", "optional": true }, + "node_modules/@emotion/stylis": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", + "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==", + "peer": true + }, + "node_modules/@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==", + "peer": true + }, "node_modules/@eslint/eslintrc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", @@ -3143,6 +3157,15 @@ } } }, + "node_modules/@popperjs/core": { + "version": "2.11.7", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.7.tgz", + "integrity": "sha512-Cr4OjIkipTtcXKjAsm8agyleBuDHvxzeBoa1v543lbv1YaIwQjESsVcmjiWiPEbC1FIeHOG/Op9kdCmAmiS3Kw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, "node_modules/@reduxjs/toolkit": { "version": "1.9.5", "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.5.tgz", @@ -3737,8 +3760,7 @@ "node_modules/@types/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" }, "node_modules/@types/prettier": { "version": "2.6.4", @@ -4884,7 +4906,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", - "dev": true, "dependencies": { "@babel/runtime": "^7.12.5", "cosmiconfig": "^7.0.0", @@ -4943,6 +4964,27 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/babel-plugin-styled-components": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-2.1.1.tgz", + "integrity": "sha512-c8lJlszObVQPguHkI+akXv8+Jgb9Ccujx0EetL7oIvwU100LxO6XAGe45qry37wUL40a5U9f23SYrivro2XKhA==", + "peer": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.0", + "@babel/helper-module-imports": "^7.16.0", + "babel-plugin-syntax-jsx": "^6.18.0", + "lodash": "^4.17.21", + "picomatch": "^2.3.0" + }, + "peerDependencies": { + "styled-components": ">= 2" + } + }, + "node_modules/babel-plugin-syntax-jsx": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "integrity": "sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw==" + }, "node_modules/babel-plugin-transform-react-remove-prop-types": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", @@ -5280,6 +5322,15 @@ "node": ">= 6" } }, + "node_modules/camelize": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", + "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", + "peer": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/caniuse-api": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", @@ -5404,6 +5455,11 @@ "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", "dev": true }, + "node_modules/classnames": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", + "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" + }, "node_modules/clean-css": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.1.tgz", @@ -5715,7 +5771,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", - "dev": true, "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", @@ -5767,6 +5822,15 @@ "postcss": "^8.4" } }, + "node_modules/css-color-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", + "peer": true, + "engines": { + "node": ">=4" + } + }, "node_modules/css-declaration-sorter": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.0.tgz", @@ -5975,6 +6039,17 @@ "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", "dev": true }, + "node_modules/css-to-react-native": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", + "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", + "peer": true, + "dependencies": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" + } + }, "node_modules/css-tree": { "version": "1.0.0-alpha.37", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", @@ -6195,6 +6270,18 @@ "node": ">=10" } }, + "node_modules/date-fns": { + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", + "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==", + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -6635,7 +6722,6 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, "dependencies": { "is-arrayish": "^0.2.1" } @@ -9007,8 +9093,7 @@ "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, "node_modules/is-bigint": { "version": "1.0.4", @@ -11627,8 +11712,7 @@ "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "node_modules/json-schema": { "version": "0.4.0", @@ -11763,8 +11847,7 @@ "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "node_modules/loader-runner": { "version": "4.3.0", @@ -11806,8 +11889,7 @@ "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "node_modules/lodash.debounce": { "version": "4.0.8", @@ -12119,6 +12201,14 @@ "mkdirp": "bin/cmd.js" } }, + "node_modules/moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "engines": { + "node": "*" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -12542,7 +12632,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -14051,8 +14140,7 @@ "node_modules/postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, "node_modules/prelude-ls": { "version": "1.2.1", @@ -14337,6 +14425,23 @@ "node": ">=14" } }, + "node_modules/react-datepicker": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/react-datepicker/-/react-datepicker-4.11.0.tgz", + "integrity": "sha512-50n93o7mQwBEhg05tbopjFKgs8qgi8VBCAOMC4VqrKut72eAjESc/wXS/k5hRtnP0oe2FCGw7MJuIwh37wuXOw==", + "dependencies": { + "@popperjs/core": "^2.9.2", + "classnames": "^2.2.6", + "date-fns": "^2.24.0", + "prop-types": "^15.7.2", + "react-onclickoutside": "^6.12.2", + "react-popper": "^2.3.0" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17 || ^18", + "react-dom": "^16.9.0 || ^17 || ^18" + } + }, "node_modules/react-dev-utils": { "version": "12.0.1", "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", @@ -14481,6 +14586,11 @@ "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==", "dev": true }, + "node_modules/react-fast-compare": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.1.tgz", + "integrity": "sha512-xTYf9zFim2pEif/Fw16dBiXpe0hoy5PxcD8+OwBnTtNLfIm3g6WxhKNurY+6OmdH1u6Ta/W/Vl6vjbYP1MFnDg==" + }, "node_modules/react-icons": { "version": "4.8.0", "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.8.0.tgz", @@ -14494,6 +14604,33 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, + "node_modules/react-onclickoutside": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/react-onclickoutside/-/react-onclickoutside-6.13.0.tgz", + "integrity": "sha512-ty8So6tcUpIb+ZE+1HAhbLROvAIJYyJe/1vRrrcmW+jLsaM+/powDRqxzo6hSh9CuRZGSL1Q8mvcF5WRD93a0A==", + "funding": { + "type": "individual", + "url": "https://github.com/Pomax/react-onclickoutside/blob/master/FUNDING.md" + }, + "peerDependencies": { + "react": "^15.5.x || ^16.x || ^17.x || ^18.x", + "react-dom": "^15.5.x || ^16.x || ^17.x || ^18.x" + } + }, + "node_modules/react-popper": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-2.3.0.tgz", + "integrity": "sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q==", + "dependencies": { + "react-fast-compare": "^3.0.1", + "warning": "^4.0.2" + }, + "peerDependencies": { + "@popperjs/core": "^2.0.0", + "react": "^16.8.0 || ^17 || ^18", + "react-dom": "^16.8.0 || ^17 || ^18" + } + }, "node_modules/react-redux": { "version": "8.0.5", "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.0.5.tgz", @@ -15389,6 +15526,12 @@ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "dev": true }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", + "peer": true + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -15798,6 +15941,77 @@ "webpack": "^5.0.0" } }, + "node_modules/styled-components": { + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.3.9.tgz", + "integrity": "sha512-Aj3kb13B75DQBo2oRwRa/APdB5rSmwUfN5exyarpX+x/tlM/rwZA2vVk2vQgVSP6WKaZJHWwiFrzgHt+CLtB4A==", + "peer": true, + "dependencies": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/traverse": "^7.4.5", + "@emotion/is-prop-valid": "^1.1.0", + "@emotion/stylis": "^0.8.4", + "@emotion/unitless": "^0.7.4", + "babel-plugin-styled-components": ">= 1.12.0", + "css-to-react-native": "^3.0.0", + "hoist-non-react-statics": "^3.0.0", + "shallowequal": "^1.1.0", + "supports-color": "^5.5.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/styled-components" + }, + "peerDependencies": { + "react": ">= 16.8.0", + "react-dom": ">= 16.8.0", + "react-is": ">= 16.8.0" + } + }, + "node_modules/styled-components.macro": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/styled-components.macro/-/styled-components.macro-1.0.0.tgz", + "integrity": "sha512-MrGQOP3VhXk3iwJIEM/Qx55u5TZ9x3H5fOyVMH+oLqf3b8nbozsMY1eYghPChwOALh99qrDGpaEXzhhOU583jg==", + "dependencies": { + "babel-plugin-styled-components": "^1.8.0" + }, + "peerDependencies": { + "babel-plugin-macros": ">=2", + "styled-components": ">=2" + } + }, + "node_modules/styled-components.macro/node_modules/babel-plugin-styled-components": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-1.13.3.tgz", + "integrity": "sha512-meGStRGv+VuKA/q0/jXxrPNWEm4LPfYIqxooDTdmh8kFsP/Ph7jJG5rUPwUPX3QHUvggwdbgdGpo88P/rRYsVw==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-module-imports": "^7.15.4", + "babel-plugin-syntax-jsx": "^6.18.0", + "lodash": "^4.17.11" + }, + "peerDependencies": { + "styled-components": ">= 2" + } + }, + "node_modules/styled-components/node_modules/@emotion/is-prop-valid": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz", + "integrity": "sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg==", + "peer": true, + "dependencies": { + "@emotion/memoize": "^0.8.0" + } + }, + "node_modules/styled-components/node_modules/@emotion/memoize": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.0.tgz", + "integrity": "sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==", + "peer": true + }, "node_modules/stylehacks": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz", @@ -16633,6 +16847,14 @@ "makeerror": "1.0.12" } }, + "node_modules/warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, "node_modules/watchpack": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", @@ -17525,7 +17747,6 @@ "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, "engines": { "node": ">= 6" } @@ -17650,7 +17871,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", - "dev": true, "requires": { "@babel/types": "^7.18.6" } @@ -18997,6 +19217,18 @@ "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==", "optional": true }, + "@emotion/stylis": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", + "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==", + "peer": true + }, + "@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==", + "peer": true + }, "@eslint/eslintrc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", @@ -19714,6 +19946,11 @@ "source-map": "^0.7.3" } }, + "@popperjs/core": { + "version": "2.11.7", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.7.tgz", + "integrity": "sha512-Cr4OjIkipTtcXKjAsm8agyleBuDHvxzeBoa1v543lbv1YaIwQjESsVcmjiWiPEbC1FIeHOG/Op9kdCmAmiS3Kw==" + }, "@reduxjs/toolkit": { "version": "1.9.5", "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.5.tgz", @@ -20166,8 +20403,7 @@ "@types/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" }, "@types/prettier": { "version": "2.6.4", @@ -21037,7 +21273,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", - "dev": true, "requires": { "@babel/runtime": "^7.12.5", "cosmiconfig": "^7.0.0", @@ -21081,6 +21316,24 @@ "@babel/helper-define-polyfill-provider": "^0.3.2" } }, + "babel-plugin-styled-components": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-2.1.1.tgz", + "integrity": "sha512-c8lJlszObVQPguHkI+akXv8+Jgb9Ccujx0EetL7oIvwU100LxO6XAGe45qry37wUL40a5U9f23SYrivro2XKhA==", + "peer": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.0", + "@babel/helper-module-imports": "^7.16.0", + "babel-plugin-syntax-jsx": "^6.18.0", + "lodash": "^4.17.21", + "picomatch": "^2.3.0" + } + }, + "babel-plugin-syntax-jsx": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "integrity": "sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw==" + }, "babel-plugin-transform-react-remove-prop-types": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", @@ -21349,6 +21602,12 @@ "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", "dev": true }, + "camelize": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", + "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", + "peer": true + }, "caniuse-api": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", @@ -21439,6 +21698,11 @@ "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", "dev": true }, + "classnames": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", + "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" + }, "clean-css": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.1.tgz", @@ -21687,7 +21951,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", - "dev": true, "requires": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", @@ -21721,6 +21984,12 @@ "postcss-selector-parser": "^6.0.9" } }, + "css-color-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", + "peer": true + }, "css-declaration-sorter": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.0.tgz", @@ -21851,6 +22120,17 @@ "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", "dev": true }, + "css-to-react-native": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", + "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", + "peer": true, + "requires": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" + } + }, "css-tree": { "version": "1.0.0-alpha.37", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", @@ -22019,6 +22299,11 @@ "whatwg-url": "^8.0.0" } }, + "date-fns": { + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", + "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==" + }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -22351,7 +22636,6 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, "requires": { "is-arrayish": "^0.2.1" } @@ -24078,8 +24362,7 @@ "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, "is-bigint": { "version": "1.0.4", @@ -26010,8 +26293,7 @@ "json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "json-schema": { "version": "0.4.0", @@ -26114,8 +26396,7 @@ "lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "loader-runner": { "version": "4.3.0", @@ -26145,8 +26426,7 @@ "lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "lodash.debounce": { "version": "4.0.8", @@ -26388,6 +26668,11 @@ "minimist": "^1.2.6" } }, + "moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -26694,7 +26979,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, "requires": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -27620,8 +27904,7 @@ "postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, "prelude-ls": { "version": "1.2.1", @@ -27834,6 +28117,19 @@ "whatwg-fetch": "^3.6.2" } }, + "react-datepicker": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/react-datepicker/-/react-datepicker-4.11.0.tgz", + "integrity": "sha512-50n93o7mQwBEhg05tbopjFKgs8qgi8VBCAOMC4VqrKut72eAjESc/wXS/k5hRtnP0oe2FCGw7MJuIwh37wuXOw==", + "requires": { + "@popperjs/core": "^2.9.2", + "classnames": "^2.2.6", + "date-fns": "^2.24.0", + "prop-types": "^15.7.2", + "react-onclickoutside": "^6.12.2", + "react-popper": "^2.3.0" + } + }, "react-dev-utils": { "version": "12.0.1", "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", @@ -27944,6 +28240,11 @@ "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==", "dev": true }, + "react-fast-compare": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.1.tgz", + "integrity": "sha512-xTYf9zFim2pEif/Fw16dBiXpe0hoy5PxcD8+OwBnTtNLfIm3g6WxhKNurY+6OmdH1u6Ta/W/Vl6vjbYP1MFnDg==" + }, "react-icons": { "version": "4.8.0", "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.8.0.tgz", @@ -27955,6 +28256,21 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, + "react-onclickoutside": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/react-onclickoutside/-/react-onclickoutside-6.13.0.tgz", + "integrity": "sha512-ty8So6tcUpIb+ZE+1HAhbLROvAIJYyJe/1vRrrcmW+jLsaM+/powDRqxzo6hSh9CuRZGSL1Q8mvcF5WRD93a0A==", + "requires": {} + }, + "react-popper": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-2.3.0.tgz", + "integrity": "sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q==", + "requires": { + "react-fast-compare": "^3.0.1", + "warning": "^4.0.2" + } + }, "react-redux": { "version": "8.0.5", "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.0.5.tgz", @@ -28622,6 +28938,12 @@ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "dev": true }, + "shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", + "peer": true + }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -28936,6 +29258,62 @@ "dev": true, "requires": {} }, + "styled-components": { + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.3.9.tgz", + "integrity": "sha512-Aj3kb13B75DQBo2oRwRa/APdB5rSmwUfN5exyarpX+x/tlM/rwZA2vVk2vQgVSP6WKaZJHWwiFrzgHt+CLtB4A==", + "peer": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/traverse": "^7.4.5", + "@emotion/is-prop-valid": "^1.1.0", + "@emotion/stylis": "^0.8.4", + "@emotion/unitless": "^0.7.4", + "babel-plugin-styled-components": ">= 1.12.0", + "css-to-react-native": "^3.0.0", + "hoist-non-react-statics": "^3.0.0", + "shallowequal": "^1.1.0", + "supports-color": "^5.5.0" + }, + "dependencies": { + "@emotion/is-prop-valid": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz", + "integrity": "sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg==", + "peer": true, + "requires": { + "@emotion/memoize": "^0.8.0" + } + }, + "@emotion/memoize": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.0.tgz", + "integrity": "sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==", + "peer": true + } + } + }, + "styled-components.macro": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/styled-components.macro/-/styled-components.macro-1.0.0.tgz", + "integrity": "sha512-MrGQOP3VhXk3iwJIEM/Qx55u5TZ9x3H5fOyVMH+oLqf3b8nbozsMY1eYghPChwOALh99qrDGpaEXzhhOU583jg==", + "requires": { + "babel-plugin-styled-components": "^1.8.0" + }, + "dependencies": { + "babel-plugin-styled-components": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-1.13.3.tgz", + "integrity": "sha512-meGStRGv+VuKA/q0/jXxrPNWEm4LPfYIqxooDTdmh8kFsP/Ph7jJG5rUPwUPX3QHUvggwdbgdGpo88P/rRYsVw==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-module-imports": "^7.15.4", + "babel-plugin-syntax-jsx": "^6.18.0", + "lodash": "^4.17.11" + } + } + } + }, "stylehacks": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz", @@ -29569,6 +29947,14 @@ "makeerror": "1.0.12" } }, + "warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "requires": { + "loose-envify": "^1.0.0" + } + }, "watchpack": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", @@ -30283,8 +30669,7 @@ "yaml": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" }, "yargs": { "version": "16.2.0", diff --git a/code/package.json b/code/package.json index 78fb8e423..143931ed9 100644 --- a/code/package.json +++ b/code/package.json @@ -12,10 +12,13 @@ "eslint-plugin-react": "^7.30.1", "eslint-plugin-react-hooks": "^4.6.0", "framer-motion": "^10.12.3", + "moment": "^2.29.4", "react": "^18.2.0", + "react-datepicker": "^4.11.0", "react-dom": "^18.2.0", "react-icons": "^4.8.0", - "react-redux": "^8.0.5" + "react-redux": "^8.0.5", + "styled-components.macro": "^1.0.0" }, "scripts": { "start": "react-scripts start", diff --git a/code/public/favicon.ico b/code/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..d2a41f06e475ddcfaf3a4cffcf616929503e8c9d GIT binary patch literal 1383 zcmV-t1(^DYP)yiPR53<8w2C$qnb2FCnI`-J#%uq8d75v-mSNnd zwKrRC_M1Fe>s#x4$9G|dxK<2>0tE^bC{Un4fdVa8WRQ}wlZ=#|IiUO&U{p9Cws`rjgHUh?buU|k=dD4SQnzY<#8Ph2uc7G?7XUxQ%# zhx8KOaDqO!e!t~9N973+ta_roge!ZZ z?}kEEU6e+<$!dMw%temzj+I}pRnh%dra%R!=P*@uHwbzi>!wfs#$_(!rfzbwFQdM0 z<@c(wC!m7o99z0Tkoo50^lSBTay3V(lu@tik_(3~>^G{t>cJyW!E=tf;~;4BB;nd) z zc7jZH0vs}9mcy~OCqXD&Yf2JsOma&`yM818YRGktokz&;Is&^65x48zafEuU_b~Hr z{C>$Omt*ZYNIG!{6iIpX`^D>Aj@8~yN%KL{%^l?T9RwTZ_jQmGk4wK_ypbzVActyi zr=+8ekppeK=x75Yy!!p-KpXi3UohFe&T)1(2r`#Lp50AO>N8EeTHJem_~L%6+77cklYf8;W;q<|ToVX- z{au36b4_Gr?b}_jVL|4yCVO`N!deyGe<8!{#SA#%!pzcp zK=J1|)>t(NGM597Z6c?w$yhL#Jv)D4t%~md@o!MUEQe#=tO7x=$Ezs)y^5^9e)D7I z#%q>eh^+ixb?q-u!E=t=Q4k7$0Jo!L_4V;6b9Z9AYt~;}d)3{?pn~TdcQ=9{^E*+( zcRwPht;tw0m%ZYCtJ)5;Jkt+B1+yHE^`H_2nLpe}?0$ro_bV3;EXZ8eWUsj2sRkdU`$iXXRkYdgiCslM;_B pzh4;S3KS?%pg@5F1qu{e(Er%=$?!Y0QrrLl002ovPDHLkV1g0Nw+8?K literal 0 HcmV?d00001 diff --git a/code/public/index.html b/code/public/index.html index e6730aa66..9f84e31ff 100644 --- a/code/public/index.html +++ b/code/public/index.html @@ -5,6 +5,8 @@ - Technigo React App + W11 - To-Do-App by Ylva diff --git a/code/src/App.js b/code/src/App.js index f032cb804..d2511b8c3 100644 --- a/code/src/App.js +++ b/code/src/App.js @@ -1,18 +1,24 @@ import React from 'react'; import { Provider } from 'react-redux'; import { configureStore, combineReducers } from '@reduxjs/toolkit'; -import AddToDo from 'components/AddToDo'; -import ToDoList from 'components/ToDoList'; -import todos from 'redux/reducers/todos' +import { ToDoList } from 'components/ToDoList'; +import { todos } from 'redux/reducers/todos' +import { GlobalStyle } from 'components/GlobalStyle'; + +const reducer = combineReducers({ + todos: todos.reducer +}); + +const store = configureStore({ reducer }); export const App = () => { - const reducer = combineReducers({ - todos: todos.reducer - }); - const store = configureStore({ reducer }); + // const reducer = combineReducers({ + // todos: todos.reducer + // }); + // const store = configureStore({ reducer }); return ( - + ) diff --git a/code/src/components/AddToDo.js b/code/src/components/AddToDo.js index e98299848..2f11c1dc5 100644 --- a/code/src/components/AddToDo.js +++ b/code/src/components/AddToDo.js @@ -1,32 +1,68 @@ +/* eslint-disable jsx-a11y/label-has-associated-control */ +/* eslint-disable no-undef */ import React, { useState } from 'react'; import { useDispatch } from 'react-redux'; -import todos from 'redux/reducers/todos'; +import { todos } from 'redux/reducers/todos'; +import styled from 'styled-components'; -const AddToDo = () => { +const NewToDo = styled.form` + line-height: 0.5rem; + padding-bottom: 0.8rem; +`; + +const Input = styled.input` + background: #a83256; + border: none; + padding: 8px; + font-size: 18px; + font-family: 'Baloo 2', cursive; + border-bottom: 2px dashed; + :focus { + outline: none; + } +`; + +const AddButton = styled.button` + font-family: 'Baloo 2', cursive; + font-size: 18px; + border: none; + background: transparent; + cursor: pointer; +`; + +export const AddToDo = () => { const [inputValue, setInputValue] = useState(''); const dispatch = useDispatch(); const onFormSubmit = (event) => { event.preventDefault(); + const newToDo = { id: Date.now().toString(), - name: inputValue.charAt(0).toUpperCase() + inputValue.slice(1), - isNew: false + createdAt: new Date(), + text: inputValue.charAt(0).toUpperCase() + inputValue.slice(1), + isDone: false }; - dispatch(todos.actions.addToDo(newToDo)); + dispatch(todos.actions.addItem(newToDo)); setInputValue(''); // https://www.random.org - } + }; + return (
-
-
- ) -} - -export default AddToDo; \ No newline at end of file + ); +}; \ No newline at end of file diff --git a/code/src/components/GlobalStyle.js b/code/src/components/GlobalStyle.js new file mode 100644 index 000000000..4ee51c755 --- /dev/null +++ b/code/src/components/GlobalStyle.js @@ -0,0 +1,50 @@ +import { createGlobalStyle } from 'styled-components/macro'; +import styled from 'styled-components'; + +export const GlobalStyle = createGlobalStyle` +body { + background-color: linear-gradient(to bottom, #3366ff 0%, #ff00ff 100%); + /* opacity: 50%; */ + font-family: 'DynaPuff', cursive; + font-size: 20px; + display: flex; + justify-content: center; + } +`; + +export const Wrapper = styled.div` + background: #3483eb; + width: 80vw; + text-align: center; + padding: 10px; + margin: 20px auto; + margin-bottom: 40px; + border-radius: 25px; + box-shadow: 4px 4px 4px rgba(0, 0, 0, 0.2); + + @media (min-width: 668px) { + width: 55vw; + } +`; + +export const SingleTodo = styled.div` + margin: 10px; + border-bottom: 1px solid black; + padding-bottom: 15px; + line-height: 1em; +`; + +export const Button = styled.button` + font-size: 18px; + padding: 4px 13px; + margin: 8px; + font-family: 'Baloo 2', cursive; + background: #edca7f; + color: #fff; + border: solid 2px red; + border-radius: 30px; + cursor: pointer; + /* :hover { + opacity: 70%; + } */ +`; diff --git a/code/src/components/ToDoItem.js b/code/src/components/ToDoItem.js index e69de29bb..5c7397119 100644 --- a/code/src/components/ToDoItem.js +++ b/code/src/components/ToDoItem.js @@ -0,0 +1,42 @@ +import React from 'react'; +import moment from 'moment'; +import styled from 'styled-components'; +import { SingleTodo } from './GlobalStyle'; + +const ToDoText = styled.div` +cursor: pointer; +text-decoration: ${(props) => (props.isDone ? 'line-through' : 'none')}; +font-size: 24px; +`; + +const DateText = styled.div` + font-style: italic; + font-size: 14px; + margin: 7px; + opacity: 50%; +`; + +const DeleteButton = styled.button` + background: #a83256; + border: none; + font-family: 'DynaPuff', cursive; + font-size: 18px; + cursor: pointer; + border-radius: 50%; + padding: 0px 9px; +`; + +export const ToDoItem = ({ todo, index, onDelete, onDone }) => { + return ( + + onDone(todo.id)} key={todo.id} isDone={todo.isDone}> +

{todo.text}

+ Added {moment(todo.createdAt).format('HH:mm on MMM D, YYYY')} +
+ onDelete(index)} type="button" title="Delete task"> + {' '} + X + +
+ ); +}; \ No newline at end of file diff --git a/code/src/components/ToDoList.js b/code/src/components/ToDoList.js index b588cc593..aca5365b6 100644 --- a/code/src/components/ToDoList.js +++ b/code/src/components/ToDoList.js @@ -1,17 +1,76 @@ +/* eslint-disable no-undef */ +/* eslint-disable import/named */ +/* eslint-disable no-unused-vars */ import React from 'react'; -import { useSelector } from 'react-redux'; +import { useSelector, useDispatch } from 'react-redux'; +import { todos } from 'redux/reducers/todos'; +import { ToDoItem } from './ToDoItem'; +import { AddToDo } from './AddToDo'; + +export const ToDoList = () => { + const dispatch = useDispatch(); + const allTodos = useSelector((store) => store.todos.items); + + const onDone = (id) => { + dispatch(todos.actions.deleteItem(todoIndex)); + }; + + const onDelete = (todoIndex) => { + dispatch(todos.actions.deleteItem(todoIndex)); + }; + + const onCompleteAll = () => { + allTodos.forEach((todo) => { + if (!todo.isDone) { + dispatch(todos.actions.toggleItem(todo.id)); + } + }); + }; + + const onClearAll = () => { + if (window.confirm('Do you really want to delete all to-dos?')) { + dispatch(todos.actions.clearAll()); + } + }; + + const todosTodo = allTodos.filter((todo) => !todo.isDone); + const doneTodos = allTodos.filter((todo) => todo.isDone); -const ToDoList = () => { - const todoList = useSelector((store) => store.todos.items) return (
-
    + {/*
      + {allTodos.map((singleToDo) => { + return
    • {singleToDo.name}
    • + })} +
    */} +

    To-do ({todosTodo.length})

    + + {todosTodo.lenghth === 0 &&

    All done - great job! ✨

    } + + {todosTodo.map((todo, index) => ( + + ))} + + + +

    Done ({doneTodos.lenght})

    + + + + + + {doneTodos.map((todo, index) => ( + + ))} + {/*
      {todoList.map((singleToDo) => { return
    • {singleToDo.name}
    • })} -
    +
*/}
- ) -} - -export default ToDoList; \ No newline at end of file + ); +}; diff --git a/code/src/index.css b/code/src/index.css index 4a1df4db7..6f7c99e66 100644 --- a/code/src/index.css +++ b/code/src/index.css @@ -1,3 +1,5 @@ +@import url('https://fonts.googleapis.com/css2?family=DynaPuff:wght@400;600&display=swap'); + body { margin: 0; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", diff --git a/code/src/redux/reducers/todos.js b/code/src/redux/reducers/todos.js index bcc64a0d7..86f8cacc7 100644 --- a/code/src/redux/reducers/todos.js +++ b/code/src/redux/reducers/todos.js @@ -1,36 +1,63 @@ +/* eslint-disable max-len */ import { createSlice } from '@reduxjs/toolkit'; -const initialState = { - items: [ - { - id: '189438fdjhrjejioe9845', - name: 'ToDo1', - isNew: false - }, - { - id: '189438fdjhrjejioe9846', - name: 'ToDo2', - isNew: false - }, - { - id: '189438fdjhrjejioe9847', - name: 'ToDo3', - isNew: false - } - ] -} +// The slice for todo has the initial state with an array for each of the single todo-items +// Every todo item has an id, text and isDone property. -const todos = createSlice({ +export const todos = createSlice({ name: 'todos', - initialState, + initialState: { + items: [ + { id: '1', text: 'Click this to-do to mark it as done ✅✔', isDone: false }, + { id: '2', text: 'Your first to-do is: Sing like no one is hearing ‼', isDone: false } + ] + }, + // The reducers field contains functions to modify the state of the slice (todo made with createSlice) reducers: { - addToDo: (store, action) => { - // Mutable - // store.items.push(action.payload); - // Immutable - store.items = [...store.items, action.payload]; + toggleItem: (store, action) => { + store.items.forEach((item) => { + if (item.id === action.payload) { + item.isDone = !item.isDone; + } + }); + }, + deleteItem: (store, action) => { + store.items.splice(action.payload, 1); + }, + addItem: (store, action) => { + store.items.push(action.payload); + }, + completeAll: (store) => { + store.items.forEach((item) => { + item.isDone = true; + }); + }, + clearAll: (store) => { + store.items = []; } } }); +// Mutable +// store.items.push(action.payload); +// Immutable +// store.items = [...store.items, action.payload]; -export default todos; \ No newline at end of file +// const initialState = { +// items: [ +// { +// id: '189438fdjhrjejioe9845', +// name: 'ToDo1', +// isNew: false +// }, +// { +// id: '189438fdjhrjejioe9846', +// name: 'ToDo2', +// isNew: false +// }, +// { +// id: '189438fdjhrjejioe9847', +// name: 'ToDo3', +// isNew: false +// } +// ] +// } \ No newline at end of file From 34edb37c3dee73aa0cf185499fdf8024f040ae6d Mon Sep 17 00:00:00 2001 From: Ylva Karlsson <121539816+YlvaKarlsson@users.noreply.github.com> Date: Thu, 20 Apr 2023 14:37:10 +0200 Subject: [PATCH 04/28] Changes and some styling --- code/package-lock.json | 16 +++++++++++ code/package.json | 2 ++ code/src/App.js | 20 ++++--------- code/src/components/AddToDo.js | 2 +- code/src/components/GlobalStyle.js | 9 ++++-- code/src/components/ToDoItem.js | 2 +- code/src/components/ToDoList.js | 45 ++++++++++++++++-------------- code/src/redux/reducers/todos.js | 4 +-- code/src/redux/store.js | 23 +++++++++++++++ 9 files changed, 81 insertions(+), 42 deletions(-) diff --git a/code/package-lock.json b/code/package-lock.json index 88ee3d540..2cfb60a18 100644 --- a/code/package-lock.json +++ b/code/package-lock.json @@ -23,6 +23,8 @@ "react-dom": "^18.2.0", "react-icons": "^4.8.0", "react-redux": "^8.0.5", + "redux-persist": "^6.0.0", + "redux-thunk": "^2.4.2", "styled-components.macro": "^1.0.0" }, "devDependencies": { @@ -14838,6 +14840,14 @@ "@babel/runtime": "^7.9.2" } }, + "node_modules/redux-persist": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/redux-persist/-/redux-persist-6.0.0.tgz", + "integrity": "sha512-71LLMbUq2r02ng2We9S215LtPu3fY0KgaGE0k8WRgl6RkqxtGfl7HUozz1Dftwsb0D/5mZ8dwAaPbtnzfvbEwQ==", + "peerDependencies": { + "redux": ">4.0.0" + } + }, "node_modules/redux-thunk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz", @@ -28421,6 +28431,12 @@ "@babel/runtime": "^7.9.2" } }, + "redux-persist": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/redux-persist/-/redux-persist-6.0.0.tgz", + "integrity": "sha512-71LLMbUq2r02ng2We9S215LtPu3fY0KgaGE0k8WRgl6RkqxtGfl7HUozz1Dftwsb0D/5mZ8dwAaPbtnzfvbEwQ==", + "requires": {} + }, "redux-thunk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz", diff --git a/code/package.json b/code/package.json index 143931ed9..2fa4ff73a 100644 --- a/code/package.json +++ b/code/package.json @@ -18,6 +18,8 @@ "react-dom": "^18.2.0", "react-icons": "^4.8.0", "react-redux": "^8.0.5", + "redux-persist": "^6.0.0", + "redux-thunk": "^2.4.2", "styled-components.macro": "^1.0.0" }, "scripts": { diff --git a/code/src/App.js b/code/src/App.js index d2511b8c3..a96eec704 100644 --- a/code/src/App.js +++ b/code/src/App.js @@ -1,25 +1,17 @@ import React from 'react'; import { Provider } from 'react-redux'; -import { configureStore, combineReducers } from '@reduxjs/toolkit'; +import { persistor, store } from 'redux/store' +import { PersistGate } from 'redux-persist/integration/react'; import { ToDoList } from 'components/ToDoList'; -import { todos } from 'redux/reducers/todos' import { GlobalStyle } from 'components/GlobalStyle'; -const reducer = combineReducers({ - todos: todos.reducer -}); - -const store = configureStore({ reducer }); - export const App = () => { - // const reducer = combineReducers({ - // todos: todos.reducer - // }); - // const store = configureStore({ reducer }); return ( - - + + + + ) } diff --git a/code/src/components/AddToDo.js b/code/src/components/AddToDo.js index 2f11c1dc5..532c70024 100644 --- a/code/src/components/AddToDo.js +++ b/code/src/components/AddToDo.js @@ -11,7 +11,7 @@ const NewToDo = styled.form` `; const Input = styled.input` - background: #a83256; + background: pink; border: none; padding: 8px; font-size: 18px; diff --git a/code/src/components/GlobalStyle.js b/code/src/components/GlobalStyle.js index 4ee51c755..7a8f4840f 100644 --- a/code/src/components/GlobalStyle.js +++ b/code/src/components/GlobalStyle.js @@ -3,8 +3,9 @@ import styled from 'styled-components'; export const GlobalStyle = createGlobalStyle` body { - background-color: linear-gradient(to bottom, #3366ff 0%, #ff00ff 100%); - /* opacity: 50%; */ + background: rgb(51,102,255); + background: linear-gradient(180deg, rgba(51,102,255,1) 0%, rgba(255,0,255,1) 100%); +// background-color: linear-gradient(to bottom, #3366ff 0%, #ff00ff 100%); font-family: 'DynaPuff', cursive; font-size: 20px; display: flex; @@ -13,7 +14,7 @@ body { `; export const Wrapper = styled.div` - background: #3483eb; + background: white; width: 80vw; text-align: center; padding: 10px; @@ -28,8 +29,10 @@ export const Wrapper = styled.div` `; export const SingleTodo = styled.div` + background: lightpink; margin: 10px; border-bottom: 1px solid black; + padding-top: 10px; padding-bottom: 15px; line-height: 1em; `; diff --git a/code/src/components/ToDoItem.js b/code/src/components/ToDoItem.js index 5c7397119..93a49ca48 100644 --- a/code/src/components/ToDoItem.js +++ b/code/src/components/ToDoItem.js @@ -17,7 +17,7 @@ const DateText = styled.div` `; const DeleteButton = styled.button` - background: #a83256; + background: pink; border: none; font-family: 'DynaPuff', cursive; font-size: 18px; diff --git a/code/src/components/ToDoList.js b/code/src/components/ToDoList.js index aca5365b6..59bc4c657 100644 --- a/code/src/components/ToDoList.js +++ b/code/src/components/ToDoList.js @@ -6,13 +6,14 @@ import { useSelector, useDispatch } from 'react-redux'; import { todos } from 'redux/reducers/todos'; import { ToDoItem } from './ToDoItem'; import { AddToDo } from './AddToDo'; +import { Wrapper } from './GlobalStyle'; export const ToDoList = () => { const dispatch = useDispatch(); const allTodos = useSelector((store) => store.todos.items); - - const onDone = (id) => { - dispatch(todos.actions.deleteItem(todoIndex)); + // onDone calls the redux-reducer called toggleItem which toggles the items status + const onDone = (todoIndex) => { + dispatch(todos.actions.toggleItem(todoIndex)); }; const onDelete = (todoIndex) => { @@ -37,40 +38,42 @@ export const ToDoList = () => { const doneTodos = allTodos.filter((todo) => todo.isDone); return ( -
- {/*
    + +
    + {/*
      {allTodos.map((singleToDo) => { return
    • {singleToDo.name}
    • })}
    */} -

    To-do ({todosTodo.length})

    +

    To-do ({todosTodo.length})

    - {todosTodo.lenghth === 0 &&

    All done - great job! ✨

    } + {todosTodo.length === 0 &&

    All done - great job! ✨

    } - {todosTodo.map((todo, index) => ( - - ))} + {todosTodo.map((todo, index) => ( + + ))} - + -

    Done ({doneTodos.lenght})

    +

    Done ({doneTodos.length})

    - + - + - {doneTodos.map((todo, index) => ( - - ))} - {/*
      + {doneTodos.map((todo, index) => ( + + ))} + {/*
        {todoList.map((singleToDo) => { return
      • {singleToDo.name}
      • })}
      */} -
    +
+ ); }; diff --git a/code/src/redux/reducers/todos.js b/code/src/redux/reducers/todos.js index 86f8cacc7..9808cde29 100644 --- a/code/src/redux/reducers/todos.js +++ b/code/src/redux/reducers/todos.js @@ -8,8 +8,8 @@ export const todos = createSlice({ name: 'todos', initialState: { items: [ - { id: '1', text: 'Click this to-do to mark it as done ✅✔', isDone: false }, - { id: '2', text: 'Your first to-do is: Sing like no one is hearing ‼', isDone: false } + { id: '1', text: 'Click this to-do to mark it as done ✅', isDone: false }, + { id: '2', text: 'Your first to-do is: Sing like no one is hearing!', isDone: false } ] }, // The reducers field contains functions to modify the state of the slice (todo made with createSlice) diff --git a/code/src/redux/store.js b/code/src/redux/store.js index e69de29bb..fe54791bc 100644 --- a/code/src/redux/store.js +++ b/code/src/redux/store.js @@ -0,0 +1,23 @@ +import { configureStore, combineReducers } from '@reduxjs/toolkit' +import { todos } from 'redux/reducers/todos'; +import storage from 'redux-persist/lib/storage'; +import { persistReducer, persistStore } from 'redux-persist'; +import thunk from 'redux-thunk'; + +const persistConfig = { + key: 'todo-list', + storage +} + +const reducer = combineReducers({ + todos: todos.reducer +}); + +const persistedReducer = persistReducer(persistConfig, reducer) + +export const store = configureStore({ + reducer: persistedReducer, + middleware: [thunk] +}) + +export const persistor = persistStore(store) \ No newline at end of file From 120290c06112635b4b23a700e5126a6cbc0f7b78 Mon Sep 17 00:00:00 2001 From: Ylva Karlsson <121539816+YlvaKarlsson@users.noreply.github.com> Date: Thu, 20 Apr 2023 14:42:51 +0200 Subject: [PATCH 05/28] Changes in styling, updating font etc --- code/src/components/AddToDo.js | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/code/src/components/AddToDo.js b/code/src/components/AddToDo.js index 532c70024..3c80e8ad8 100644 --- a/code/src/components/AddToDo.js +++ b/code/src/components/AddToDo.js @@ -6,7 +6,7 @@ import { todos } from 'redux/reducers/todos'; import styled from 'styled-components'; const NewToDo = styled.form` - line-height: 0.5rem; + line-height: 0.8rem; padding-bottom: 0.8rem; `; @@ -15,7 +15,7 @@ const Input = styled.input` border: none; padding: 8px; font-size: 18px; - font-family: 'Baloo 2', cursive; + font-family: 'DynaPuff', cursive; border-bottom: 2px dashed; :focus { outline: none; @@ -23,10 +23,10 @@ const Input = styled.input` `; const AddButton = styled.button` - font-family: 'Baloo 2', cursive; - font-size: 18px; + background: pink; border: none; - background: transparent; + font-family: 'DynaPuff', cursive; + font-size: 18px; cursor: pointer; `; @@ -52,15 +52,18 @@ export const AddToDo = () => { - - Add new To Do now + + Add From 85f805cd52adc8c6ced6e268c0792a51384a31e6 Mon Sep 17 00:00:00 2001 From: Ylva Karlsson <121539816+YlvaKarlsson@users.noreply.github.com> Date: Thu, 20 Apr 2023 16:20:02 +0200 Subject: [PATCH 06/28] Trying some more --- code/src/components/AddToDo.js | 9 ++++ code/src/components/Button.js | 11 ++++ code/src/components/GlobalStyle.js | 6 ++- code/src/components/TagsInput.js | 83 ++++++++++++++++++++++++++++++ code/src/index.css | 5 ++ code/src/redux/reducers/todos.js | 1 + 6 files changed, 113 insertions(+), 2 deletions(-) create mode 100644 code/src/components/Button.js create mode 100644 code/src/components/TagsInput.js diff --git a/code/src/components/AddToDo.js b/code/src/components/AddToDo.js index 3c80e8ad8..b656d233a 100644 --- a/code/src/components/AddToDo.js +++ b/code/src/components/AddToDo.js @@ -4,6 +4,8 @@ import React, { useState } from 'react'; import { useDispatch } from 'react-redux'; import { todos } from 'redux/reducers/todos'; import styled from 'styled-components'; +import { DefaultButton } from 'components/Button'; +import { TagsInput } from 'components/TagsInput'; const NewToDo = styled.form` line-height: 0.8rem; @@ -59,12 +61,19 @@ export const AddToDo = () => { onChange={(event) => setInputValue(event.target.value)} /> {/* id={`new-todo-input${newToDo.id}`} /> */} + Add + + Add + ); diff --git a/code/src/components/Button.js b/code/src/components/Button.js new file mode 100644 index 000000000..988c6819a --- /dev/null +++ b/code/src/components/Button.js @@ -0,0 +1,11 @@ +import styled from 'styled-components'; + +export const DefaultButton = styled.button` +background-color: red; +border-radius: 8px 8px; +font-size: 25px; +&:hover { + box-shadow: 0 12px 16px 0 rgba(0, 0, 0, 0.24), 0 17px 50px 0 rgba(0, 0, 0, 0.19); + transform: scale(1.1); + } +`; \ No newline at end of file diff --git a/code/src/components/GlobalStyle.js b/code/src/components/GlobalStyle.js index 7a8f4840f..f493c6228 100644 --- a/code/src/components/GlobalStyle.js +++ b/code/src/components/GlobalStyle.js @@ -3,9 +3,11 @@ import styled from 'styled-components'; export const GlobalStyle = createGlobalStyle` body { - background: rgb(51,102,255); + /* background: rgb(51,102,255); background: linear-gradient(180deg, rgba(51,102,255,1) 0%, rgba(255,0,255,1) 100%); // background-color: linear-gradient(to bottom, #3366ff 0%, #ff00ff 100%); + // background-repeat: no-repeat; + background-size: 100%; */ font-family: 'DynaPuff', cursive; font-size: 20px; display: flex; @@ -41,7 +43,7 @@ export const Button = styled.button` font-size: 18px; padding: 4px 13px; margin: 8px; - font-family: 'Baloo 2', cursive; + font-family: 'Dynapuff', cursive; background: #edca7f; color: #fff; border: solid 2px red; diff --git a/code/src/components/TagsInput.js b/code/src/components/TagsInput.js new file mode 100644 index 000000000..0a134a17b --- /dev/null +++ b/code/src/components/TagsInput.js @@ -0,0 +1,83 @@ +import React, { useState } from 'react'; +import { useSelector, useDispatch } from 'react-redux'; +import styled from 'styled-components'; + +export const TagsInputContainer = styled.div` + border: 2px solid #000; + padding: .5em; + border-radius: 3px; + width: min(80vw, 600px); + margin-top: 1em; + display: flex; + align-items: center; + flex-wrap: wrap; + gap: .5em; +`; + +export const TagItem = styled.div` + background-color: rgb(218, 216, 216); + display: inline-block; + padding: .5em .75em; + border-radius: 20px; +` +// .tag-item .close +// height: 20px; +// width: 20px; +// background-color: rgb(48, 48, 48); +// color: #fff; +// border-radius: 50%; +// display: inline-flex; +// justify-content: center; +// align-items: center; +// margin-left: .5em; +// font-size: 18px; +// cursor: pointer; + +export const TagsInputField = styled.input` +flex-grow: 1; + padding: .5em 0; + border: none; + outline: none; +`; + +export const TagsInput = () => { +// const [tags, setTags] = useState(''); + const tags = useSelector(state => state.tags); + const dispatch = useDispatch(); + const handleInputKeyDown = event => { + if (event.key === 'Enter') { + event.preventDefault(); + const tag = event.target.value.trim(); + if (tag) { + dispatch({ type: 'ADD_TAG', payload: tag }); + setTagInput(''); + } + } else if (event.key === 'Backspace' && !TagsInput) { + dispatch({ type: 'REMOVE_TAG', payload: tags[tags.length - 1]}); + } + }; + + return ( +
+ + {tags.map(tag) => ( + + {tag} + dispatch({ type: 'REMOVE_TAG', payload: tag })} + > + × + + setTagInput(event.target.value)} + placeholder="Type something" + /> + + +
+ ); +}; \ No newline at end of file diff --git a/code/src/index.css b/code/src/index.css index 6f7c99e66..daec5549d 100644 --- a/code/src/index.css +++ b/code/src/index.css @@ -1,7 +1,12 @@ @import url('https://fonts.googleapis.com/css2?family=DynaPuff:wght@400;600&display=swap'); body { + background: rgb(51,102,255); + background: linear-gradient(180deg, rgba(51,102,255,1) 0%, rgba(255,0,255,1) 100%); +/* background-repeat: no-repeat; */ + background-size: cover; margin: 0; + height: 100%; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; diff --git a/code/src/redux/reducers/todos.js b/code/src/redux/reducers/todos.js index 9808cde29..f9854a86b 100644 --- a/code/src/redux/reducers/todos.js +++ b/code/src/redux/reducers/todos.js @@ -11,6 +11,7 @@ export const todos = createSlice({ { id: '1', text: 'Click this to-do to mark it as done ✅', isDone: false }, { id: '2', text: 'Your first to-do is: Sing like no one is hearing!', isDone: false } ] + // }, // The reducers field contains functions to modify the state of the slice (todo made with createSlice) reducers: { From d6cad3540698b3b218bc74930663021879fdf501 Mon Sep 17 00:00:00 2001 From: Ylva Karlsson <121539816+YlvaKarlsson@users.noreply.github.com> Date: Thu, 20 Apr 2023 22:16:37 +0200 Subject: [PATCH 07/28] Not working anymore --- code/src/components/TagsInput.js | 119 +++++++++++++++---------------- code/src/redux/reducers/tags.js | 19 +++++ code/src/redux/reducers/todos.js | 22 +----- 3 files changed, 77 insertions(+), 83 deletions(-) create mode 100644 code/src/redux/reducers/tags.js diff --git a/code/src/components/TagsInput.js b/code/src/components/TagsInput.js index 0a134a17b..dfc135bf5 100644 --- a/code/src/components/TagsInput.js +++ b/code/src/components/TagsInput.js @@ -1,83 +1,78 @@ +/* eslint-disable jsx-a11y/click-events-have-key-events */ +/* eslint-disable no-shadow */ +/* eslint-no-unused-vars */ +/* eslint-disable jsx-a11y/no-static-element-interactions */ import React, { useState } from 'react'; -import { useSelector, useDispatch } from 'react-redux'; +import { useDispatch, useSelector } from 'react-redux'; +import { tags } from 'redux/reducers/tags'; import styled from 'styled-components'; export const TagsInputContainer = styled.div` - border: 2px solid #000; - padding: .5em; - border-radius: 3px; - width: min(80vw, 600px); - margin-top: 1em; - display: flex; - align-items: center; - flex-wrap: wrap; - gap: .5em; + border: 2px solid #000; + padding: .5em; + border-radius: 3px; + width: min(80vw, 600px); + margin-top: 1em; + display: flex; + align-items: center; + flex-wrap: wrap; + gap: .5em; `; export const TagItem = styled.div` - background-color: rgb(218, 216, 216); - display: inline-block; - padding: .5em .75em; - border-radius: 20px; -` -// .tag-item .close -// height: 20px; -// width: 20px; -// background-color: rgb(48, 48, 48); -// color: #fff; -// border-radius: 50%; -// display: inline-flex; -// justify-content: center; -// align-items: center; -// margin-left: .5em; -// font-size: 18px; -// cursor: pointer; + background-color: rgb(218, 216, 216); + display: inline-block; + padding: .5em .75em; + border-radius: 20px; +`; export const TagsInputField = styled.input` -flex-grow: 1; - padding: .5em 0; - border: none; - outline: none; + flex-grow: 1; + padding: .5em 0; + border: none; + outline: none; `; export const TagsInput = () => { -// const [tags, setTags] = useState(''); - const tags = useSelector(state => state.tags); + const [tagInput, setTagInput] = useState(''); + // const allTags = useSelector((state) => state.tags); + const allTags = useSelector((state) => state.tags.items); const dispatch = useDispatch(); - const handleInputKeyDown = event => { - if (event.key === 'Enter') { - event.preventDefault(); - const tag = event.target.value.trim(); - if (tag) { - dispatch({ type: 'ADD_TAG', payload: tag }); - setTagInput(''); - } - } else if (event.key === 'Backspace' && !TagsInput) { - dispatch({ type: 'REMOVE_TAG', payload: tags[tags.length - 1]}); + + const handleFormSubmit = (event) => { + event.preventDefault(); + const newTag = tagInput.trim(); + if (newTag) { + dispatch(tags.actions.addTag(newTag)); + setTagInput(''); } }; + const handleTagCloseClick = (tag) => { + dispatch(tags.actions.removeTag(tag)); + }; + return (
- - {tags.map(tag) => ( - - {tag} - dispatch({ type: 'REMOVE_TAG', payload: tag })} - > - × + + {allTags.map((tag) => ( + + {tag} + handleTagCloseClick(tag)}> + × - setTagInput(event.target.value)} - placeholder="Type something" - /> - - + + ))} +
+ setTagInput(event.target.value)} + placeholder="Type something" /> + +
- ); + ); }; \ No newline at end of file diff --git a/code/src/redux/reducers/tags.js b/code/src/redux/reducers/tags.js new file mode 100644 index 000000000..f365e51fc --- /dev/null +++ b/code/src/redux/reducers/tags.js @@ -0,0 +1,19 @@ +import { createSlice } from '@reduxjs/toolkit'; + +export const tags = createSlice({ + name: 'tags', + initialState: { + items: [ + { id: '1', text: 'Click' }, + { id: '2', text: 'Your' } + ] + }, + reducers: { + addTag: (state, action) => { + state.push(action.payload); + }, + removeTag: (state, action) => { + return state.filter((tag) => tag.id !== action.payload.id); + } + } +}); diff --git a/code/src/redux/reducers/todos.js b/code/src/redux/reducers/todos.js index f9854a86b..58a67409d 100644 --- a/code/src/redux/reducers/todos.js +++ b/code/src/redux/reducers/todos.js @@ -41,24 +41,4 @@ export const todos = createSlice({ // Mutable // store.items.push(action.payload); // Immutable -// store.items = [...store.items, action.payload]; - -// const initialState = { -// items: [ -// { -// id: '189438fdjhrjejioe9845', -// name: 'ToDo1', -// isNew: false -// }, -// { -// id: '189438fdjhrjejioe9846', -// name: 'ToDo2', -// isNew: false -// }, -// { -// id: '189438fdjhrjejioe9847', -// name: 'ToDo3', -// isNew: false -// } -// ] -// } \ No newline at end of file +// store.items = [...store.items, action.payload]; \ No newline at end of file From aa1d9ea405122858d7bd4c32281f7ad154ea5313 Mon Sep 17 00:00:00 2001 From: Ylva Karlsson <121539816+YlvaKarlsson@users.noreply.github.com> Date: Thu, 20 Apr 2023 22:39:34 +0200 Subject: [PATCH 08/28] Not working! --- code/src/components/TagsInput.js | 5 +++-- code/src/redux/reducers/tags.js | 6 +++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/code/src/components/TagsInput.js b/code/src/components/TagsInput.js index dfc135bf5..e4aa92c66 100644 --- a/code/src/components/TagsInput.js +++ b/code/src/components/TagsInput.js @@ -34,10 +34,11 @@ export const TagsInputField = styled.input` `; export const TagsInput = () => { + const dispatch = useDispatch(); const [tagInput, setTagInput] = useState(''); // const allTags = useSelector((state) => state.tags); const allTags = useSelector((state) => state.tags.items); - const dispatch = useDispatch(); + // const dispatch = useDispatch(); const handleFormSubmit = (event) => { event.preventDefault(); @@ -55,7 +56,7 @@ export const TagsInput = () => { return (
- {allTags.map((tag) => ( + {allTags.items.map((tag) => ( {tag} { - state.push(action.payload); + state.items.push({ id: Math.random().toString(), text: action.payload }); }, removeTag: (state, action) => { - return state.filter((tag) => tag.id !== action.payload.id); + state.items = state.items.filter((tag) => tag.id !== action.payload); } } -}); +}); \ No newline at end of file From cab2f177d3fd1534a89ad2fbee69b3621a4b281d Mon Sep 17 00:00:00 2001 From: Ylva Karlsson <121539816+YlvaKarlsson@users.noreply.github.com> Date: Thu, 20 Apr 2023 22:51:22 +0200 Subject: [PATCH 09/28] Fixed a border --- code/src/components/ToDoItem.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/src/components/ToDoItem.js b/code/src/components/ToDoItem.js index 93a49ca48..fbaf1b9f1 100644 --- a/code/src/components/ToDoItem.js +++ b/code/src/components/ToDoItem.js @@ -18,7 +18,7 @@ const DateText = styled.div` const DeleteButton = styled.button` background: pink; - border: none; + border: solid 1px black; font-family: 'DynaPuff', cursive; font-size: 18px; cursor: pointer; From eda39f5cc567fb6705c9771e6aeaafbd4aab88d4 Mon Sep 17 00:00:00 2001 From: Ylva Karlsson <121539816+YlvaKarlsson@users.noreply.github.com> Date: Fri, 21 Apr 2023 15:12:03 +0200 Subject: [PATCH 10/28] All working - some styling left --- code/src/App.js | 4 +- code/src/components/ToDoItem.js | 42 --------------- code/src/components/{ => addtodo}/AddToDo.js | 35 +++--------- code/src/components/addtodo/AddToDo.style.js | 26 +++++++++ .../components/{ => tagsinput}/TagsInput.js | 53 ++++++------------- .../components/tagsinput/TagsInput.style.js | 27 ++++++++++ code/src/components/todoitem/ToDoItem.js | 25 +++++++++ .../src/components/todoitem/ToDoItem.style.js | 43 +++++++++++++++ .../src/components/{ => todolist}/ToDoList.js | 20 +++---- .../src/components/todolist/ToDoList.style.js | 1 + code/src/index.css | 5 -- code/src/redux/reducers/tags.js | 5 +- code/src/redux/store.js | 4 +- code/src/{components => styles}/Button.js | 5 +- .../src/{components => styles}/GlobalStyle.js | 45 +++++++--------- 15 files changed, 186 insertions(+), 154 deletions(-) delete mode 100644 code/src/components/ToDoItem.js rename code/src/components/{ => addtodo}/AddToDo.js (71%) create mode 100644 code/src/components/addtodo/AddToDo.style.js rename code/src/components/{ => tagsinput}/TagsInput.js (59%) create mode 100644 code/src/components/tagsinput/TagsInput.style.js create mode 100644 code/src/components/todoitem/ToDoItem.js create mode 100644 code/src/components/todoitem/ToDoItem.style.js rename code/src/components/{ => todolist}/ToDoList.js (82%) create mode 100644 code/src/components/todolist/ToDoList.style.js rename code/src/{components => styles}/Button.js (72%) rename code/src/{components => styles}/GlobalStyle.js (50%) diff --git a/code/src/App.js b/code/src/App.js index a96eec704..043156f71 100644 --- a/code/src/App.js +++ b/code/src/App.js @@ -2,8 +2,8 @@ import React from 'react'; import { Provider } from 'react-redux'; import { persistor, store } from 'redux/store' import { PersistGate } from 'redux-persist/integration/react'; -import { ToDoList } from 'components/ToDoList'; -import { GlobalStyle } from 'components/GlobalStyle'; +import { ToDoList } from 'components/todolist/ToDoList'; +import { GlobalStyle } from 'styles/GlobalStyle'; export const App = () => { return ( diff --git a/code/src/components/ToDoItem.js b/code/src/components/ToDoItem.js deleted file mode 100644 index fbaf1b9f1..000000000 --- a/code/src/components/ToDoItem.js +++ /dev/null @@ -1,42 +0,0 @@ -import React from 'react'; -import moment from 'moment'; -import styled from 'styled-components'; -import { SingleTodo } from './GlobalStyle'; - -const ToDoText = styled.div` -cursor: pointer; -text-decoration: ${(props) => (props.isDone ? 'line-through' : 'none')}; -font-size: 24px; -`; - -const DateText = styled.div` - font-style: italic; - font-size: 14px; - margin: 7px; - opacity: 50%; -`; - -const DeleteButton = styled.button` - background: pink; - border: solid 1px black; - font-family: 'DynaPuff', cursive; - font-size: 18px; - cursor: pointer; - border-radius: 50%; - padding: 0px 9px; -`; - -export const ToDoItem = ({ todo, index, onDelete, onDone }) => { - return ( - - onDone(todo.id)} key={todo.id} isDone={todo.isDone}> -

{todo.text}

- Added {moment(todo.createdAt).format('HH:mm on MMM D, YYYY')} -
- onDelete(index)} type="button" title="Delete task"> - {' '} - X - -
- ); -}; \ No newline at end of file diff --git a/code/src/components/AddToDo.js b/code/src/components/addtodo/AddToDo.js similarity index 71% rename from code/src/components/AddToDo.js rename to code/src/components/addtodo/AddToDo.js index b656d233a..44ed309e1 100644 --- a/code/src/components/AddToDo.js +++ b/code/src/components/addtodo/AddToDo.js @@ -3,34 +3,13 @@ import React, { useState } from 'react'; import { useDispatch } from 'react-redux'; import { todos } from 'redux/reducers/todos'; -import styled from 'styled-components'; -import { DefaultButton } from 'components/Button'; -import { TagsInput } from 'components/TagsInput'; - -const NewToDo = styled.form` - line-height: 0.8rem; - padding-bottom: 0.8rem; -`; - -const Input = styled.input` - background: pink; - border: none; - padding: 8px; - font-size: 18px; - font-family: 'DynaPuff', cursive; - border-bottom: 2px dashed; - :focus { - outline: none; - } -`; - -const AddButton = styled.button` - background: pink; - border: none; - font-family: 'DynaPuff', cursive; - font-size: 18px; - cursor: pointer; -`; +import { DefaultButton } from 'styles/Button'; +import { TagsInput } from 'components/tagsinput/TagsInput'; +import { + NewToDo, + Input, + AddButton +} from 'components/addtodo/AddToDo.style' export const AddToDo = () => { const [inputValue, setInputValue] = useState(''); diff --git a/code/src/components/addtodo/AddToDo.style.js b/code/src/components/addtodo/AddToDo.style.js new file mode 100644 index 000000000..801cd7652 --- /dev/null +++ b/code/src/components/addtodo/AddToDo.style.js @@ -0,0 +1,26 @@ +import styled from 'styled-components'; + +export const NewToDo = styled.form` + line-height: 0.8rem; + padding-bottom: 0.8rem; +`; + +export const Input = styled.input` + background: pink; + border: none; + padding: 8px; + font-size: 18px; + font-family: 'DynaPuff', cursive; + border-bottom: 2px dashed; + :focus { + outline: none; + } +`; + +export const AddButton = styled.button` + background: pink; + border: none; + font-family: 'DynaPuff', cursive; + font-size: 18px; + cursor: pointer; +`; diff --git a/code/src/components/TagsInput.js b/code/src/components/tagsinput/TagsInput.js similarity index 59% rename from code/src/components/TagsInput.js rename to code/src/components/tagsinput/TagsInput.js index e4aa92c66..aa6a3f85d 100644 --- a/code/src/components/TagsInput.js +++ b/code/src/components/tagsinput/TagsInput.js @@ -5,39 +5,18 @@ import React, { useState } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import { tags } from 'redux/reducers/tags'; -import styled from 'styled-components'; - -export const TagsInputContainer = styled.div` - border: 2px solid #000; - padding: .5em; - border-radius: 3px; - width: min(80vw, 600px); - margin-top: 1em; - display: flex; - align-items: center; - flex-wrap: wrap; - gap: .5em; -`; - -export const TagItem = styled.div` - background-color: rgb(218, 216, 216); - display: inline-block; - padding: .5em .75em; - border-radius: 20px; -`; - -export const TagsInputField = styled.input` - flex-grow: 1; - padding: .5em 0; - border: none; - outline: none; -`; +import { + TagsInputContainer, + TagsInputField, + TagItem +} from 'components/tagsinput/TagsInput.style.js'; export const TagsInput = () => { const dispatch = useDispatch(); const [tagInput, setTagInput] = useState(''); // const allTags = useSelector((state) => state.tags); const allTags = useSelector((state) => state.tags.items); + console.log('allTaaaaaags', allTags); // const dispatch = useDispatch(); const handleFormSubmit = (event) => { @@ -49,29 +28,29 @@ export const TagsInput = () => { } }; - const handleTagCloseClick = (tag) => { - dispatch(tags.actions.removeTag(tag)); - }; + // const handleTagCloseClick = (tag) => { + // dispatch(tags.actions.removeTag(tag)); + // }; return (
- {allTags.items.map((tag) => ( - - {tag} - ( + + {tag.text} + {/* handleTagCloseClick(tag)}> × - + */} ))}
setTagInput(event.target.value)} - placeholder="Type something" /> + onChange={(event) => setTagInput(event.target.value)} /> + {/* placeholder="Type something" */}
diff --git a/code/src/components/tagsinput/TagsInput.style.js b/code/src/components/tagsinput/TagsInput.style.js new file mode 100644 index 000000000..3d6f27848 --- /dev/null +++ b/code/src/components/tagsinput/TagsInput.style.js @@ -0,0 +1,27 @@ +import styled from 'styled-components'; + +export const TagsInputContainer = styled.div` + border: 2px dotted #000; + padding: 0.3rem 1.5rem; + border-radius: 2rem; + max-width: 70%; + margin-top: 1.5rem; + display: flex; + align-items: center; + flex-wrap: wrap; + gap: 0.8rem; +`; + +export const TagItem = styled.div` + background-color: rgb(218, 216, 216); + display: inline-block; + padding: .5em .75em; + border-radius: 20px; +`; + +export const TagsInputField = styled.input` + flex-grow: 1; + padding: .5em 0; + border: none; + outline: none; +`; \ No newline at end of file diff --git a/code/src/components/todoitem/ToDoItem.js b/code/src/components/todoitem/ToDoItem.js new file mode 100644 index 000000000..d1ab817ae --- /dev/null +++ b/code/src/components/todoitem/ToDoItem.js @@ -0,0 +1,25 @@ +import React from 'react'; +import moment from 'moment'; +import { + SingleTodo, + DateAndDelete, + DeleteButton, + ToDoText, + DateText +} from 'components/todoitem/ToDoItem.style'; + +export const ToDoItem = ({ todo, index, onDelete, onDone }) => { + return ( + + onDone(todo.id)} key={todo.id} isDone={todo.isDone}> +

{todo.text}

+
+ + onDelete(index)} type="button" title="Delete task"> + X + + Added {moment(todo.createdAt).format('HH:mm on MMM D, YYYY')} + +
+ ); +}; \ No newline at end of file diff --git a/code/src/components/todoitem/ToDoItem.style.js b/code/src/components/todoitem/ToDoItem.style.js new file mode 100644 index 000000000..ce3016c7b --- /dev/null +++ b/code/src/components/todoitem/ToDoItem.style.js @@ -0,0 +1,43 @@ +import styled from 'styled-components'; + +export const SingleTodo = styled.div` + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; + background: lightpink; + margin: 10px; + border-bottom: 1px solid black; + padding: 1rem 2rem; +`; + +export const ToDoText = styled.div` +cursor: pointer; +text-decoration: ${(props) => (props.isDone ? 'line-through' : 'none')}; +font-size: 24px; +`; + +export const DateAndDelete = styled.div` + display: flex; + flex-direction: column; + align-items: center; + gap: 0.5rem; +`; + +export const DateText = styled.div` + font-style: italic; + font-size: 14px; + margin: 7px; + opacity: 50%; +`; + +export const DeleteButton = styled.button` + background: #e47588; + border: solid 1px black; + font-family: 'DynaPuff', cursive; + font-size: 18px; + cursor: pointer; + border-radius: 50%; + padding: 0px 9px; + max-width: 2.5rem; +`; \ No newline at end of file diff --git a/code/src/components/ToDoList.js b/code/src/components/todolist/ToDoList.js similarity index 82% rename from code/src/components/ToDoList.js rename to code/src/components/todolist/ToDoList.js index 59bc4c657..5bbc26721 100644 --- a/code/src/components/ToDoList.js +++ b/code/src/components/todolist/ToDoList.js @@ -4,9 +4,11 @@ import React from 'react'; import { useSelector, useDispatch } from 'react-redux'; import { todos } from 'redux/reducers/todos'; -import { ToDoItem } from './ToDoItem'; -import { AddToDo } from './AddToDo'; -import { Wrapper } from './GlobalStyle'; +import { AddToDo } from 'components/addtodo/AddToDo'; +// import { ToDoItem } from './ToDoItem'; +import { ToDoItem } from 'components/todoitem/ToDoItem'; +import { Wrapper } from 'styles/GlobalStyle'; +import { DefaultButton } from 'styles/Button'; export const ToDoList = () => { const dispatch = useDispatch(); @@ -47,23 +49,23 @@ export const ToDoList = () => { */}

To-do ({todosTodo.length})

+ + {todosTodo.length === 0 &&

All done - great job! ✨

} {todosTodo.map((todo, index) => ( ))} - -

Done ({doneTodos.length})

- + - + {doneTodos.map((todo, index) => ( diff --git a/code/src/components/todolist/ToDoList.style.js b/code/src/components/todolist/ToDoList.style.js new file mode 100644 index 000000000..4daa90b41 --- /dev/null +++ b/code/src/components/todolist/ToDoList.style.js @@ -0,0 +1 @@ +// import styled from 'styled-components'; diff --git a/code/src/index.css b/code/src/index.css index daec5549d..6f7c99e66 100644 --- a/code/src/index.css +++ b/code/src/index.css @@ -1,12 +1,7 @@ @import url('https://fonts.googleapis.com/css2?family=DynaPuff:wght@400;600&display=swap'); body { - background: rgb(51,102,255); - background: linear-gradient(180deg, rgba(51,102,255,1) 0%, rgba(255,0,255,1) 100%); -/* background-repeat: no-repeat; */ - background-size: cover; margin: 0; - height: 100%; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; diff --git a/code/src/redux/reducers/tags.js b/code/src/redux/reducers/tags.js index c107d3ff1..f1d8159c1 100644 --- a/code/src/redux/reducers/tags.js +++ b/code/src/redux/reducers/tags.js @@ -4,8 +4,9 @@ export const tags = createSlice({ name: 'tags', initialState: { items: [ - { id: '1', text: 'Click' }, - { id: '2', text: 'Your' } + { id: '1', text: 'Work' }, + { id: '2', text: 'Home' }, + { id: '3', text: 'Other' } ] }, reducers: { diff --git a/code/src/redux/store.js b/code/src/redux/store.js index fe54791bc..07d6f1e05 100644 --- a/code/src/redux/store.js +++ b/code/src/redux/store.js @@ -1,5 +1,6 @@ import { configureStore, combineReducers } from '@reduxjs/toolkit' import { todos } from 'redux/reducers/todos'; +import { tags } from 'redux/reducers/tags'; import storage from 'redux-persist/lib/storage'; import { persistReducer, persistStore } from 'redux-persist'; import thunk from 'redux-thunk'; @@ -10,7 +11,8 @@ const persistConfig = { } const reducer = combineReducers({ - todos: todos.reducer + todos: todos.reducer, + tags: tags.reducer }); const persistedReducer = persistReducer(persistConfig, reducer) diff --git a/code/src/components/Button.js b/code/src/styles/Button.js similarity index 72% rename from code/src/components/Button.js rename to code/src/styles/Button.js index 988c6819a..5f4885ab6 100644 --- a/code/src/components/Button.js +++ b/code/src/styles/Button.js @@ -1,9 +1,12 @@ import styled from 'styled-components'; export const DefaultButton = styled.button` -background-color: red; +background-color: pink; +border: solid black 2px; border-radius: 8px 8px; font-size: 25px; +font-family: 'Dynapuff', cursive; +color: #6c6969; &:hover { box-shadow: 0 12px 16px 0 rgba(0, 0, 0, 0.24), 0 17px 50px 0 rgba(0, 0, 0, 0.19); transform: scale(1.1); diff --git a/code/src/components/GlobalStyle.js b/code/src/styles/GlobalStyle.js similarity index 50% rename from code/src/components/GlobalStyle.js rename to code/src/styles/GlobalStyle.js index f493c6228..36a50ad9a 100644 --- a/code/src/components/GlobalStyle.js +++ b/code/src/styles/GlobalStyle.js @@ -3,11 +3,11 @@ import styled from 'styled-components'; export const GlobalStyle = createGlobalStyle` body { - /* background: rgb(51,102,255); + background: rgb(51,102,255); background: linear-gradient(180deg, rgba(51,102,255,1) 0%, rgba(255,0,255,1) 100%); -// background-color: linear-gradient(to bottom, #3366ff 0%, #ff00ff 100%); - // background-repeat: no-repeat; - background-size: 100%; */ + background-repeat: no-repeat; + min-height: 100vh; + background-size: cover; font-family: 'DynaPuff', cursive; font-size: 20px; display: flex; @@ -30,26 +30,17 @@ export const Wrapper = styled.div` } `; -export const SingleTodo = styled.div` - background: lightpink; - margin: 10px; - border-bottom: 1px solid black; - padding-top: 10px; - padding-bottom: 15px; - line-height: 1em; -`; - -export const Button = styled.button` - font-size: 18px; - padding: 4px 13px; - margin: 8px; - font-family: 'Dynapuff', cursive; - background: #edca7f; - color: #fff; - border: solid 2px red; - border-radius: 30px; - cursor: pointer; - /* :hover { - opacity: 70%; - } */ -`; +// export const Button = styled.button` +// font-size: 18px; +// padding: 4px 13px; +// margin: 8px; +// font-family: 'Dynapuff', cursive; +// background: tomato; +// color: #fff; +// border: solid 2px red; +// border-radius: 30px; +// cursor: pointer; +// /* :hover { +// opacity: 70%; +// } */ +// `; From ae0753a3d0ad2c2bb9c20459d8fff8c5ee049ac1 Mon Sep 17 00:00:00 2001 From: Ylva Karlsson <121539816+YlvaKarlsson@users.noreply.github.com> Date: Fri, 21 Apr 2023 15:25:35 +0200 Subject: [PATCH 11/28] Fixed some bugs --- code/src/components/addtodo/AddToDo.js | 22 ++++++++----------- code/src/components/addtodo/AddToDo.style.js | 7 ++++++ code/src/components/todolist/ToDoList.js | 13 ++++++----- .../src/components/todolist/ToDoList.style.js | 9 +++++++- 4 files changed, 31 insertions(+), 20 deletions(-) diff --git a/code/src/components/addtodo/AddToDo.js b/code/src/components/addtodo/AddToDo.js index 44ed309e1..7d1b21d33 100644 --- a/code/src/components/addtodo/AddToDo.js +++ b/code/src/components/addtodo/AddToDo.js @@ -8,7 +8,7 @@ import { TagsInput } from 'components/tagsinput/TagsInput'; import { NewToDo, Input, - AddButton + AddContainer } from 'components/addtodo/AddToDo.style' export const AddToDo = () => { @@ -40,19 +40,15 @@ export const AddToDo = () => { onChange={(event) => setInputValue(event.target.value)} /> {/* id={`new-todo-input${newToDo.id}`} /> */} - - + + + Add - - - Add - + +
); diff --git a/code/src/components/addtodo/AddToDo.style.js b/code/src/components/addtodo/AddToDo.style.js index 801cd7652..e3cd523f5 100644 --- a/code/src/components/addtodo/AddToDo.style.js +++ b/code/src/components/addtodo/AddToDo.style.js @@ -6,6 +6,7 @@ export const NewToDo = styled.form` `; export const Input = styled.input` + min-height: 3rem; background: pink; border: none; padding: 8px; @@ -24,3 +25,9 @@ export const AddButton = styled.button` font-size: 18px; cursor: pointer; `; + +export const AddContainer = styled.div` + display: flex; + flex-direction: row; + align-items: center; +`; diff --git a/code/src/components/todolist/ToDoList.js b/code/src/components/todolist/ToDoList.js index 5bbc26721..3275150da 100644 --- a/code/src/components/todolist/ToDoList.js +++ b/code/src/components/todolist/ToDoList.js @@ -9,6 +9,7 @@ import { AddToDo } from 'components/addtodo/AddToDo'; import { ToDoItem } from 'components/todoitem/ToDoItem'; import { Wrapper } from 'styles/GlobalStyle'; import { DefaultButton } from 'styles/Button'; +import { ButtonContainer } from './ToDoList.style'; export const ToDoList = () => { const dispatch = useDispatch(); @@ -58,15 +59,15 @@ export const ToDoList = () => { ))}

Done ({doneTodos.length})

- - + + Complete all to-dos - + - + Clear all to-dos - - + + {doneTodos.map((todo, index) => ( ))} diff --git a/code/src/components/todolist/ToDoList.style.js b/code/src/components/todolist/ToDoList.style.js index 4daa90b41..84369193d 100644 --- a/code/src/components/todolist/ToDoList.style.js +++ b/code/src/components/todolist/ToDoList.style.js @@ -1 +1,8 @@ -// import styled from 'styled-components'; +import styled from 'styled-components'; + +export const ButtonContainer = styled.div` +display: flex; +flex-direction: row; +justify-content: center; +gap: 1rem; +`; From cc5bf0b0967f617d77fbca370a139c82ebedbefe Mon Sep 17 00:00:00 2001 From: Ylva Karlsson <121539816+YlvaKarlsson@users.noreply.github.com> Date: Sun, 23 Apr 2023 19:40:11 +0200 Subject: [PATCH 12/28] Added OG-tags and updated readme --- code/public/index.html | 2 ++ code/src/App.js | 2 +- code/src/components/addtodo/AddToDo.js | 4 ++-- code/src/components/addtodo/AddToDo.style.js | 1 + code/src/components/tagsinput/TagsInput.js | 2 +- code/src/components/todoitem/ToDoItem.js | 2 +- code/src/components/todolist/ToDoList.js | 4 ++-- 7 files changed, 10 insertions(+), 7 deletions(-) diff --git a/code/public/index.html b/code/public/index.html index 9f84e31ff..1ab5c89bd 100644 --- a/code/public/index.html +++ b/code/public/index.html @@ -4,6 +4,8 @@ + + + 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

lg+EA1kTFP}+q^R_k17;Hs8l}`C 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 literal 0 HcmV?d00001 From c6539f0493f5e54cc929a4f1c39e59af8ef7fa9c Mon Sep 17 00:00:00 2001 From: Ylva Karlsson <121539816+YlvaKarlsson@users.noreply.github.com> Date: Sun, 23 Apr 2023 22:46:06 +0200 Subject: [PATCH 15/28] Fixes in the styling --- code/package-lock.json | 98 +++++++++++++++++++ code/package.json | 4 + code/src/App.js | 2 + code/src/components/Footer/Footer.js | 36 +++++++ code/src/components/Footer/Footer.style.js | 28 ++++++ code/src/components/Header/Header.js | 3 - code/src/components/Header/Header.style.js | 2 + code/src/components/addtodo/AddToDo.js | 22 +++-- code/src/components/addtodo/AddToDo.style.js | 21 +++- .../src/components/todoitem/ToDoItem.style.js | 4 +- code/src/styles/Button.js | 1 + code/src/styles/GlobalStyle.js | 1 + 12 files changed, 205 insertions(+), 17 deletions(-) create mode 100644 code/src/components/Footer/Footer.js create mode 100644 code/src/components/Footer/Footer.style.js diff --git a/code/package-lock.json b/code/package-lock.json index 2cfb60a18..7bdcca43f 100644 --- a/code/package-lock.json +++ b/code/package-lock.json @@ -9,6 +9,10 @@ "version": "1.0.0", "dependencies": { "@babel/eslint-parser": "^7.18.9", + "@fortawesome/fontawesome-svg-core": "^6.4.0", + "@fortawesome/free-brands-svg-icons": "^6.4.0", + "@fortawesome/free-solid-svg-icons": "^6.4.0", + "@fortawesome/react-fontawesome": "^0.2.0", "@reduxjs/toolkit": "^1.9.5", "eslint": "^8.21.0", "eslint-config-airbnb": "^19.0.4", @@ -2232,6 +2236,63 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@fortawesome/fontawesome-common-types": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.4.0.tgz", + "integrity": "sha512-HNii132xfomg5QVZw0HwXXpN22s7VBHQBv9CeOu9tfJnhsWQNd2lmTNi8CSrnw5B+5YOmzu1UoPAyxaXsJ6RgQ==", + "hasInstallScript": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/fontawesome-svg-core": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.4.0.tgz", + "integrity": "sha512-Bertv8xOiVELz5raB2FlXDPKt+m94MQ3JgDfsVbrqNpLU9+UE2E18GKjLKw+d3XbeYPqg1pzyQKGsrzbw+pPaw==", + "hasInstallScript": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "6.4.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/free-brands-svg-icons": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.4.0.tgz", + "integrity": "sha512-qvxTCo0FQ5k2N+VCXb/PZQ+QMhqRVM4OORiO6MXdG6bKolIojGU/srQ1ptvKk0JTbRgaJOfL2qMqGvBEZG7Z6g==", + "hasInstallScript": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "6.4.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/free-solid-svg-icons": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.4.0.tgz", + "integrity": "sha512-kutPeRGWm8V5dltFP1zGjQOEAzaLZj4StdQhWVZnfGFCvAPVvHh8qk5bRrU4KXnRRRNni5tKQI9PBAdI6MP8nQ==", + "hasInstallScript": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "6.4.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/react-fontawesome": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.0.tgz", + "integrity": "sha512-uHg75Rb/XORTtVt7OS9WoK8uM276Ufi7gCzshVWkUJbHhh3svsUUeqXerrM96Wm7fRiDzfKRwSoahhMIkGAYHw==", + "dependencies": { + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "@fortawesome/fontawesome-svg-core": "~1 || ~6", + "react": ">=16.3" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.10.4", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz", @@ -19270,6 +19331,43 @@ } } }, + "@fortawesome/fontawesome-common-types": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.4.0.tgz", + "integrity": "sha512-HNii132xfomg5QVZw0HwXXpN22s7VBHQBv9CeOu9tfJnhsWQNd2lmTNi8CSrnw5B+5YOmzu1UoPAyxaXsJ6RgQ==" + }, + "@fortawesome/fontawesome-svg-core": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.4.0.tgz", + "integrity": "sha512-Bertv8xOiVELz5raB2FlXDPKt+m94MQ3JgDfsVbrqNpLU9+UE2E18GKjLKw+d3XbeYPqg1pzyQKGsrzbw+pPaw==", + "requires": { + "@fortawesome/fontawesome-common-types": "6.4.0" + } + }, + "@fortawesome/free-brands-svg-icons": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.4.0.tgz", + "integrity": "sha512-qvxTCo0FQ5k2N+VCXb/PZQ+QMhqRVM4OORiO6MXdG6bKolIojGU/srQ1ptvKk0JTbRgaJOfL2qMqGvBEZG7Z6g==", + "requires": { + "@fortawesome/fontawesome-common-types": "6.4.0" + } + }, + "@fortawesome/free-solid-svg-icons": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.4.0.tgz", + "integrity": "sha512-kutPeRGWm8V5dltFP1zGjQOEAzaLZj4StdQhWVZnfGFCvAPVvHh8qk5bRrU4KXnRRRNni5tKQI9PBAdI6MP8nQ==", + "requires": { + "@fortawesome/fontawesome-common-types": "6.4.0" + } + }, + "@fortawesome/react-fontawesome": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.0.tgz", + "integrity": "sha512-uHg75Rb/XORTtVt7OS9WoK8uM276Ufi7gCzshVWkUJbHhh3svsUUeqXerrM96Wm7fRiDzfKRwSoahhMIkGAYHw==", + "requires": { + "prop-types": "^15.8.1" + } + }, "@humanwhocodes/config-array": { "version": "0.10.4", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz", diff --git a/code/package.json b/code/package.json index 2fa4ff73a..f628a97c5 100644 --- a/code/package.json +++ b/code/package.json @@ -4,6 +4,10 @@ "private": true, "dependencies": { "@babel/eslint-parser": "^7.18.9", + "@fortawesome/fontawesome-svg-core": "^6.4.0", + "@fortawesome/free-brands-svg-icons": "^6.4.0", + "@fortawesome/free-solid-svg-icons": "^6.4.0", + "@fortawesome/react-fontawesome": "^0.2.0", "@reduxjs/toolkit": "^1.9.5", "eslint": "^8.21.0", "eslint-config-airbnb": "^19.0.4", diff --git a/code/src/App.js b/code/src/App.js index a77aca3b3..f572086cb 100644 --- a/code/src/App.js +++ b/code/src/App.js @@ -5,6 +5,7 @@ import { PersistGate } from 'redux-persist/integration/react'; import { ToDoList } from 'components/ToDoList/ToDoList'; import { GlobalStyle } from 'styles/GlobalStyle'; import { Header } from 'components/Header/Header'; +import { Footer } from 'components/Footer/Footer'; export const App = () => { return ( @@ -13,6 +14,7 @@ export const App = () => {

+