From 41ad2ecd610c806336ab63198d660c857e73a260 Mon Sep 17 00:00:00 2001 From: Affat25 Date: Thu, 24 Nov 2022 15:49:05 -0500 Subject: [PATCH 01/34] add transaction modal skeleton added --- client/package-lock.json | 405 ++++++++++++++++++++++++ client/package.json | 2 + client/src/components/AddTransaction.js | 34 ++ client/src/pages/PostsListPage.js | 4 + client/src/pages/ShowPostPage.js | 7 +- 5 files changed, 451 insertions(+), 1 deletion(-) create mode 100644 client/src/components/AddTransaction.js diff --git a/client/package-lock.json b/client/package-lock.json index 46e48a4b..d44a6e2d 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -8,7 +8,9 @@ "name": "client", "version": "0.1.0", "dependencies": { + "bootstrap": "^5.2.3", "react": "^17.0.2", + "react-bootstrap": "^2.6.0", "react-dom": "^17.0.2", "react-router-dom": "^6.4.2", "react-scripts": "5.0.1" @@ -3061,6 +3063,26 @@ } } }, + "node_modules/@popperjs/core": { + "version": "2.11.6", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz", + "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@react-aria/ssr": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.4.0.tgz", + "integrity": "sha512-qzuGk14/fUyUAoW/EBwgFcuMkVNXJVGlezTgZ1HovpCZ+p9844E7MUFHE7CuzFzPEIkVeqhBNIoIu+VJJ8YCOA==", + "dependencies": { + "@babel/runtime": "^7.6.2" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + } + }, "node_modules/@remix-run/router": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.0.2.tgz", @@ -3069,6 +3091,37 @@ "node": ">=14" } }, + "node_modules/@restart/hooks": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.7.tgz", + "integrity": "sha512-ZbjlEHcG+FQtpDPHd7i4FzNNvJf2enAwZfJbpM8CW7BhmOAbsHpZe3tsHwfQUrBuyrxWqPYp2x5UMnilWcY22A==", + "dependencies": { + "dequal": "^2.0.2" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@restart/ui": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@restart/ui/-/ui-1.4.1.tgz", + "integrity": "sha512-J7wFOx2DcmkBqCqiZgDsggLO7faiNh4Nv1/v80FmbRgP+MYpwaVDKKXLC69DA4+ejgNIsBP5ORtC74EZqO1j8A==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@popperjs/core": "^2.11.5", + "@react-aria/ssr": "^3.2.0", + "@restart/hooks": "^0.4.7", + "@types/warning": "^3.0.0", + "dequal": "^2.0.2", + "dom-helpers": "^5.2.0", + "uncontrollable": "^7.2.1", + "warning": "^4.0.3" + }, + "peerDependencies": { + "react": ">=16.14.0", + "react-dom": ">=16.14.0" + } + }, "node_modules/@rollup/plugin-babel": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", @@ -3590,6 +3643,11 @@ "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz", "integrity": "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==" }, + "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", @@ -3605,6 +3663,24 @@ "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, + "node_modules/@types/react": { + "version": "18.0.25", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.25.tgz", + "integrity": "sha512-xD6c0KDT4m7n9uD4ZHi02lzskaiqcBxf4zi+tXZY98a04wvc0hi/TcCPC2FOESZi51Nd7tlUeOJY8RofL799/g==", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA==", + "dependencies": { + "@types/react": "*" + } + }, "node_modules/@types/resolve": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", @@ -3618,6 +3694,11 @@ "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" }, + "node_modules/@types/scheduler": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" + }, "node_modules/@types/semver": { "version": "7.3.12", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.12.tgz", @@ -3658,6 +3739,11 @@ "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.2.tgz", "integrity": "sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg==" }, + "node_modules/@types/warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.0.tgz", + "integrity": "sha512-t/Tvs5qR47OLOr+4E9ckN8AmP2Tf16gWq+/qA4iUGS/OOyHVO8wv2vjJuX8SNOUTJyWb+2t7wJm6cXILFnOROA==" + }, "node_modules/@types/ws": { "version": "8.5.3", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", @@ -4860,6 +4946,24 @@ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, + "node_modules/bootstrap": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.2.3.tgz", + "integrity": "sha512-cEKPM+fwb3cT8NzQZYEu4HilJ3anCrWqh3CHAok1p9jXqMPsPTBhU25fBckEJHJ/p+tTxTFTsFQGM+gaHpi3QQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/twbs" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + } + ], + "peerDependencies": { + "@popperjs/core": "^2.11.6" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -5107,6 +5211,11 @@ "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==" }, + "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", @@ -5776,6 +5885,11 @@ "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" }, + "node_modules/csstype": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", + "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" + }, "node_modules/damerau-levenshtein": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", @@ -5891,6 +6005,14 @@ "node": ">= 0.8" } }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "engines": { + "node": ">=6" + } + }, "node_modules/destroy": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", @@ -6022,6 +6144,15 @@ "utila": "~0.4" } }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, "node_modules/dom-serializer": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", @@ -8308,6 +8439,14 @@ "node": ">= 0.4" } }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, "node_modules/ipaddr.js": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", @@ -13113,6 +13252,23 @@ "react-is": "^16.13.1" } }, + "node_modules/prop-types-extra": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.1.tgz", + "integrity": "sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew==", + "dependencies": { + "react-is": "^16.3.2", + "warning": "^4.0.0" + }, + "peerDependencies": { + "react": ">=0.14.0" + } + }, + "node_modules/prop-types-extra/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, "node_modules/prop-types/node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", @@ -13294,6 +13450,35 @@ "node": ">=14" } }, + "node_modules/react-bootstrap": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-2.6.0.tgz", + "integrity": "sha512-WnDgN6PR8WZKo2Og5J8EafFi4BsABjc96lNuMNfksrgiPDCw18/woWQCNhAeHFZQWTQ/PijkOrQ9ncTWwO//AA==", + "dependencies": { + "@babel/runtime": "^7.17.2", + "@restart/hooks": "^0.4.6", + "@restart/ui": "^1.4.1", + "@types/react-transition-group": "^4.4.4", + "classnames": "^2.3.1", + "dom-helpers": "^5.2.1", + "invariant": "^2.2.4", + "prop-types": "^15.8.1", + "prop-types-extra": "^1.1.0", + "react-transition-group": "^4.4.2", + "uncontrollable": "^7.2.1", + "warning": "^4.0.3" + }, + "peerDependencies": { + "@types/react": ">=16.14.8", + "react": ">=16.14.0", + "react-dom": ">=16.14.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/react-dev-utils": { "version": "12.0.1", "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", @@ -13434,6 +13619,11 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" }, + "node_modules/react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + }, "node_modules/react-refresh": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", @@ -13544,6 +13734,21 @@ } } }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -15157,6 +15362,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/uncontrollable": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.2.1.tgz", + "integrity": "sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ==", + "dependencies": { + "@babel/runtime": "^7.6.3", + "@types/react": ">=16.9.11", + "invariant": "^2.2.4", + "react-lifecycles-compat": "^3.0.4" + }, + "peerDependencies": { + "react": ">=15.0.0" + } + }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -15365,6 +15584,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", @@ -18292,11 +18519,48 @@ "source-map": "^0.7.3" } }, + "@popperjs/core": { + "version": "2.11.6", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz", + "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==" + }, + "@react-aria/ssr": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.4.0.tgz", + "integrity": "sha512-qzuGk14/fUyUAoW/EBwgFcuMkVNXJVGlezTgZ1HovpCZ+p9844E7MUFHE7CuzFzPEIkVeqhBNIoIu+VJJ8YCOA==", + "requires": { + "@babel/runtime": "^7.6.2" + } + }, "@remix-run/router": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.0.2.tgz", "integrity": "sha512-GRSOFhJzjGN+d4sKHTMSvNeUPoZiDHWmRnXfzaxrqe7dE/Nzlc8BiMSJdLDESZlndM7jIUrZ/F4yWqVYlI0rwQ==" }, + "@restart/hooks": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.7.tgz", + "integrity": "sha512-ZbjlEHcG+FQtpDPHd7i4FzNNvJf2enAwZfJbpM8CW7BhmOAbsHpZe3tsHwfQUrBuyrxWqPYp2x5UMnilWcY22A==", + "requires": { + "dequal": "^2.0.2" + } + }, + "@restart/ui": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@restart/ui/-/ui-1.4.1.tgz", + "integrity": "sha512-J7wFOx2DcmkBqCqiZgDsggLO7faiNh4Nv1/v80FmbRgP+MYpwaVDKKXLC69DA4+ejgNIsBP5ORtC74EZqO1j8A==", + "requires": { + "@babel/runtime": "^7.18.3", + "@popperjs/core": "^2.11.5", + "@react-aria/ssr": "^3.2.0", + "@restart/hooks": "^0.4.7", + "@types/warning": "^3.0.0", + "dequal": "^2.0.2", + "dom-helpers": "^5.2.0", + "uncontrollable": "^7.2.1", + "warning": "^4.0.3" + } + }, "@rollup/plugin-babel": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", @@ -18688,6 +18952,11 @@ "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz", "integrity": "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==" }, + "@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", @@ -18703,6 +18972,24 @@ "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, + "@types/react": { + "version": "18.0.25", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.25.tgz", + "integrity": "sha512-xD6c0KDT4m7n9uD4ZHi02lzskaiqcBxf4zi+tXZY98a04wvc0hi/TcCPC2FOESZi51Nd7tlUeOJY8RofL799/g==", + "requires": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "@types/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA==", + "requires": { + "@types/react": "*" + } + }, "@types/resolve": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", @@ -18716,6 +19003,11 @@ "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" }, + "@types/scheduler": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" + }, "@types/semver": { "version": "7.3.12", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.12.tgz", @@ -18756,6 +19048,11 @@ "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.2.tgz", "integrity": "sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg==" }, + "@types/warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.0.tgz", + "integrity": "sha512-t/Tvs5qR47OLOr+4E9ckN8AmP2Tf16gWq+/qA4iUGS/OOyHVO8wv2vjJuX8SNOUTJyWb+2t7wJm6cXILFnOROA==" + }, "@types/ws": { "version": "8.5.3", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", @@ -19645,6 +19942,12 @@ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, + "bootstrap": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.2.3.tgz", + "integrity": "sha512-cEKPM+fwb3cT8NzQZYEu4HilJ3anCrWqh3CHAok1p9jXqMPsPTBhU25fBckEJHJ/p+tTxTFTsFQGM+gaHpi3QQ==", + "requires": {} + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -19815,6 +20118,11 @@ "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==" }, + "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", @@ -20293,6 +20601,11 @@ } } }, + "csstype": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", + "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" + }, "damerau-levenshtein": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", @@ -20373,6 +20686,11 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" }, + "dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==" + }, "destroy": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", @@ -20474,6 +20792,15 @@ "utila": "~0.4" } }, + "dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "requires": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, "dom-serializer": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", @@ -22132,6 +22459,14 @@ "side-channel": "^1.0.4" } }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "requires": { + "loose-envify": "^1.0.0" + } + }, "ipaddr.js": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", @@ -25425,6 +25760,22 @@ } } }, + "prop-types-extra": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.1.tgz", + "integrity": "sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew==", + "requires": { + "react-is": "^16.3.2", + "warning": "^4.0.0" + }, + "dependencies": { + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + } + } + }, "proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -25548,6 +25899,25 @@ "whatwg-fetch": "^3.6.2" } }, + "react-bootstrap": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-2.6.0.tgz", + "integrity": "sha512-WnDgN6PR8WZKo2Og5J8EafFi4BsABjc96lNuMNfksrgiPDCw18/woWQCNhAeHFZQWTQ/PijkOrQ9ncTWwO//AA==", + "requires": { + "@babel/runtime": "^7.17.2", + "@restart/hooks": "^0.4.6", + "@restart/ui": "^1.4.1", + "@types/react-transition-group": "^4.4.4", + "classnames": "^2.3.1", + "dom-helpers": "^5.2.1", + "invariant": "^2.2.4", + "prop-types": "^15.8.1", + "prop-types-extra": "^1.1.0", + "react-transition-group": "^4.4.2", + "uncontrollable": "^7.2.1", + "warning": "^4.0.3" + } + }, "react-dev-utils": { "version": "12.0.1", "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", @@ -25654,6 +26024,11 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" }, + "react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + }, "react-refresh": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", @@ -25731,6 +26106,17 @@ "workbox-webpack-plugin": "^6.4.1" } }, + "react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "requires": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + } + }, "read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -26922,6 +27308,17 @@ "which-boxed-primitive": "^1.0.2" } }, + "uncontrollable": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.2.1.tgz", + "integrity": "sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ==", + "requires": { + "@babel/runtime": "^7.6.3", + "@types/react": ">=16.9.11", + "invariant": "^2.2.4", + "react-lifecycles-compat": "^3.0.4" + } + }, "unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -27070,6 +27467,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", diff --git a/client/package.json b/client/package.json index c37921de..fd7c0b3e 100644 --- a/client/package.json +++ b/client/package.json @@ -3,7 +3,9 @@ "version": "0.1.0", "private": true, "dependencies": { + "bootstrap": "^5.2.3", "react": "^17.0.2", + "react-bootstrap": "^2.6.0", "react-dom": "^17.0.2", "react-router-dom": "^6.4.2", "react-scripts": "5.0.1" diff --git a/client/src/components/AddTransaction.js b/client/src/components/AddTransaction.js new file mode 100644 index 00000000..778c16da --- /dev/null +++ b/client/src/components/AddTransaction.js @@ -0,0 +1,34 @@ +import React from "react"; +import {Modal, Button, ModalBody, ModalTitle, ModalHeader, Form, ModalFooter} from "react-bootstrap"; + +function AddTransaction() { + const [isShow,invokeModal]= React.useState(false) + const initModal=()=>{ + return invokeModal(!isShow) + } + return( +
+ + + + React Modal + + + Add your transaction here + + + + + + +
+ ); +} + +export default AddTransaction; \ No newline at end of file diff --git a/client/src/pages/PostsListPage.js b/client/src/pages/PostsListPage.js index eb2c27ee..5b49b2ca 100644 --- a/client/src/pages/PostsListPage.js +++ b/client/src/pages/PostsListPage.js @@ -1,5 +1,6 @@ import React, { useState, useEffect } from "react"; import MicroPostCard from "../components/MicroPostCard"; +import AddTransaction from "../components/AddTransaction"; import LoadingSpinner from "../components/LoadingSpinner"; import ErrorAlert from "../components/ErrorAlert"; @@ -39,6 +40,9 @@ function PostsListPage() { ))} +
+ +
); } diff --git a/client/src/pages/ShowPostPage.js b/client/src/pages/ShowPostPage.js index 39b195e0..613e3e8c 100644 --- a/client/src/pages/ShowPostPage.js +++ b/client/src/pages/ShowPostPage.js @@ -1,5 +1,6 @@ import React, { useState, useEffect } from "react"; import MicroPostCard from "../components/MicroPostCard"; +import AddTransaction from "../components/AddTransaction"; import LoadingSpinner from "../components/LoadingSpinner"; import ErrorAlert from "../components/ErrorAlert"; import { useParams } from "react-router-dom"; @@ -37,7 +38,11 @@ function ShowPostPage() { ); if (loading) return ; - return ; + return ( +
+ +
+ ); } export default ShowPostPage; From 3227834c73841fd29b3977ebf5d8190279ba84d6 Mon Sep 17 00:00:00 2001 From: Affat25 Date: Fri, 25 Nov 2022 01:45:50 -0500 Subject: [PATCH 02/34] Add Transaction complete,CSS left --- client/src/components/AddTransaction.js | 35 ++++++++++++++++++++----- client/src/pages/ShowPostPage.js | 1 - 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/client/src/components/AddTransaction.js b/client/src/components/AddTransaction.js index 778c16da..35e76387 100644 --- a/client/src/components/AddTransaction.js +++ b/client/src/components/AddTransaction.js @@ -1,5 +1,5 @@ import React from "react"; -import {Modal, Button, ModalBody, ModalTitle, ModalHeader, Form, ModalFooter} from "react-bootstrap"; +import {Modal, Button, ModalBody, ModalTitle, ModalHeader, Form, ModalFooter, FormCheck, FormGroup, FormControl, Row, Col} from "react-bootstrap"; function AddTransaction() { const [isShow,invokeModal]= React.useState(false) @@ -9,20 +9,43 @@ function AddTransaction() { return(
- React Modal + Enter Transaction Details - Add your transaction here +
+ + + + + + + + + + + + + + +
- - diff --git a/client/src/pages/ShowPostPage.js b/client/src/pages/ShowPostPage.js index 613e3e8c..ad73bcf7 100644 --- a/client/src/pages/ShowPostPage.js +++ b/client/src/pages/ShowPostPage.js @@ -1,6 +1,5 @@ import React, { useState, useEffect } from "react"; import MicroPostCard from "../components/MicroPostCard"; -import AddTransaction from "../components/AddTransaction"; import LoadingSpinner from "../components/LoadingSpinner"; import ErrorAlert from "../components/ErrorAlert"; import { useParams } from "react-router-dom"; From cab4492afdebe0b09198a6a8a5ac35bb6a4cb091 Mon Sep 17 00:00:00 2001 From: Affat25 Date: Fri, 25 Nov 2022 02:05:08 -0500 Subject: [PATCH 03/34] minor changes --- client/src/components/AddTransaction.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/src/components/AddTransaction.js b/client/src/components/AddTransaction.js index 35e76387..3e40f40a 100644 --- a/client/src/components/AddTransaction.js +++ b/client/src/components/AddTransaction.js @@ -28,14 +28,14 @@ function AddTransaction() { From 5a4a64bd64cd0e80dcef71dcf562095479d7a299 Mon Sep 17 00:00:00 2001 From: Affat25 Date: Tue, 29 Nov 2022 18:22:44 -0500 Subject: [PATCH 04/34] two columns of T account added --- client/src/pages/PostsListPage.js | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/client/src/pages/PostsListPage.js b/client/src/pages/PostsListPage.js index 5b49b2ca..de6f7d7b 100644 --- a/client/src/pages/PostsListPage.js +++ b/client/src/pages/PostsListPage.js @@ -34,16 +34,24 @@ function PostsListPage() { if (loading) return ; return ( -
-
+ <> +
+
+ {posts.map((entryData) => ( + + ))} +
+
{posts.map((entryData) => ( ))}
- + +
-
+ + ); } From 26220400fbfc27474d63683bdfd7b094d6f1007f Mon Sep 17 00:00:00 2001 From: Anthony Duran <87147191+Code1Here@users.noreply.github.com> Date: Wed, 30 Nov 2022 09:55:11 -0500 Subject: [PATCH 05/34] Add files via upload --- api/models/Goal.js | 39 ++++++++++++++++++++++++ api/models/Login.js | 38 +++++++++++++++++++++++ api/models/Profile.js | 63 +++++++++++++++++++++++++++++++++++++++ api/models/Transaction.js | 47 +++++++++++++++++++++++++++++ 4 files changed, 187 insertions(+) create mode 100644 api/models/Goal.js create mode 100644 api/models/Login.js create mode 100644 api/models/Profile.js create mode 100644 api/models/Transaction.js diff --git a/api/models/Goal.js b/api/models/Goal.js new file mode 100644 index 00000000..fd722719 --- /dev/null +++ b/api/models/Goal.js @@ -0,0 +1,39 @@ +"use strict"; +const { Model } = require("sequelize"); + +module.exports = (sequelize, DataTypes) => { + class Goal extends Model {} + + Goal.init( + { + targetDate: { + type: DataTypes.DATEONLY, + validate: { + isDate: true, + }, + }, + targetFund: { + type: DataTypes.FLOAT, + validate: { + isNumeric: true, + }, + }, + monthlyPerformance: { + type: DataTypes.FLOAT, + validate: { + isNumeric: true, + }, + }, + }, + { + sequelize, + modelName: "Goal", + } + ); + + Goal.associate = (models) => { + // associations can be defined here + }; + + return Goal; +}; diff --git a/api/models/Login.js b/api/models/Login.js new file mode 100644 index 00000000..89a8c96d --- /dev/null +++ b/api/models/Login.js @@ -0,0 +1,38 @@ +"use strict"; +const { Model } = require("sequelize"); + +module.exports = (sequelize, DataTypes) => { + class Login extends Model {} + + Login.init( + { + username: { + type: DataTypes.STRING, + validate: { + len: [3, 250], + notEmpty: true, + unique: true, + }, + }, + // For UI: Provide flag for the minimum length required of user + password: { + type: DataTypes.STRING, + validate: { + len: [8, 250], + notEmpty: true, + // isUUID: 4, // Use after implementing password encryption + }, + }, + }, + { + sequelize, + modelName: "Login", + } + ); + + Login.associate = (models) => { + // associations can be defined here + }; + + return Login; +}; diff --git a/api/models/Profile.js b/api/models/Profile.js new file mode 100644 index 00000000..1369c61a --- /dev/null +++ b/api/models/Profile.js @@ -0,0 +1,63 @@ +"use strict"; +const { Model } = require("sequelize"); + +module.exports = (sequelize, DataTypes) => { + class Profile extends Model {} + + Profile.init( + { + firstName: { + type: DataTypes.STRING, + validate: { + len: [3, 250], + notEmpty: true, + }, + }, + lastName: { + type: DataTypes.STRING, + validate: { + len: [3, 250], + notEmpty: true, + }, + }, + email: { + type: DataTypes.STRING, + validate: { + isEmail: true, + len: [10, 250], + notEmpty: true, + }, + }, + dob: { + type: DataTypes.DATEONLY, + validate: { + isDate: true, + }, + }, + sex: { + type: DataTypes.STRING, + validate: { + len: [1, 50], + notEmpty: true, + }, + }, + + monthlyIncome: { + type: DataTypes.FLOAT, + validate: { + isNumeric: true, + }, + }, + }, + { + sequelize, + modelName: "Profile", + } + ); + + Profile.associate = (models) => { + // associations can be defined here + }; + + return Profile; +}; diff --git a/api/models/Transaction.js b/api/models/Transaction.js new file mode 100644 index 00000000..edd7e579 --- /dev/null +++ b/api/models/Transaction.js @@ -0,0 +1,47 @@ +"use strict"; +const { Model } = require("sequelize"); + +module.exports = (sequelize, DataTypes) => { + class Transaction extends Model {} + + Transaction.init( + { + itemName: { + type: DataTypes.STRING, + validate: { + len: [1, 250], + notEmpty: true, + }, + }, + price: { + type: DataTypes.FLOAT, + validate: { + isNumeric: true, + }, + }, + date: { + type: DataTypes.DATEONLY, + validate: { + isDate: true, + }, + }, + + total: { + type: DataTypes.FLOAT, + validate: { + isNumeric: true, + }, + }, + }, + { + sequelize, + modelName: "Transaction", + } + ); + + Transaction.associate = (models) => { + // associations can be defined here + }; + + return Transaction; +}; From ce744666c84ec023af0a43674471fd1f3025e585 Mon Sep 17 00:00:00 2001 From: Anthony Duran <87147191+Code1Here@users.noreply.github.com> Date: Wed, 30 Nov 2022 10:05:48 -0500 Subject: [PATCH 06/34] App UI overview --- Contador.drawio | 1 + 1 file changed, 1 insertion(+) create mode 100644 Contador.drawio diff --git a/Contador.drawio b/Contador.drawio new file mode 100644 index 00000000..3f7a7c98 --- /dev/null +++ b/Contador.drawio @@ -0,0 +1 @@ +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 \ No newline at end of file From 53184cbc43571287c71f7598d258d46a0b54fc20 Mon Sep 17 00:00:00 2001 From: Anthony Duran <87147191+Code1Here@users.noreply.github.com> Date: Wed, 30 Nov 2022 10:09:20 -0500 Subject: [PATCH 07/34] Delete Contador.drawio --- Contador.drawio | 1 - 1 file changed, 1 deletion(-) delete mode 100644 Contador.drawio diff --git a/Contador.drawio b/Contador.drawio deleted file mode 100644 index 3f7a7c98..00000000 --- a/Contador.drawio +++ /dev/null @@ -1 +0,0 @@ -5Zzdc5s4EMD/Gs89JQOILz8mtkl6uXZyTeb68XIjG9mmB4gKubb711cyAhtJTZwLBpLkwYNWIMRPq9XuIjIAo2RzRWC2fI9DFA8sI9wMwHhgWZ5vsV8u2BYCB4BCsCBRWIjMveAu+omE0BDSVRSivHYixTimUVYXznCaohmtySAheF0/bY7j+l0zuECK4G4GY1X6KQrpspD6jrGXX6NosSzvbBqiJoHlyUKQL2GI1wciMBmAEcGYFkfJZoRizq7kUlwX/Ka26hhBKT3mgu9XFx+TzfvFn/fDFSYxTMJv+Ey08gPGK/HAorN0WxJYLyOK7jI44+U1G+QBuFzSJGYlkx3CPCu4z6MNCrkgjhYpK8dozsSXajfLeyJC0eZAJLp9hXCCKNmyU0QtEASFCtmiuN6Ph+UL2fJgLCohFDqwqFreY2IHgtQTqAGFWrDaXfUBJkgBSPAqDTmascF4PIKzAVxeHZer4jItHa5T0bIVWpMERnHfOFUztzNQjgLqHm0of0z2TDBKo3SxM3/s5wrD7gGa0sTUzUwtQdAAwZvs+w0O7tKvV07wL/ocjOfr1ZmlELwleB7F6qSknGzdkAm7NWNAEGECDiJiK8GFqEiiMOSXXxKURz/hdNcUJ53hKKW7R3EuB86Yt7WiOC/WMt50Tgn+D41wjFm74xSnvBXWrVgSNTEmtqzVypC4bY6IaiqfvcA0saJ41rlTX1QcdVHxHM3kL4WNk1Jn/wMT3GxlgtvWESZSu/SeSp3cFwAJdA3JewGQdF5Jq5D8FwBp2DWkYf8hVQ/fGSTLVqCgkAWRoogJXeIFTmE82Usv677a/py/MM4ErG+I0q2IiLlDUUfJCJLt58PCF94YW9ZEcbwRjRelrSgVvkgZy1oPDUqOV2SGHnjy0rmgkCwQfehEsbhxLg8OMkExpNGPevDd+IiV/e61Xjtd67WpetMXu6u2TC/4qBOY5nBGI5zmCr7X6l/bkn/tqH5j5QC0E/J4XVifRq2I3bRxEJfecr05jPfrQyenhworJi6SRqXqxTOmk5oHuQjDB+zOEUH8oY4PLBA6yA9tZUKwGt+aAtdtZgo4UuLEUw2V3aqdOiJy6iLG9OUYE+gyl+0GmWYfAygpjQSGGpva7srXxwhKzoJbnVPqYwglU9Ktz+1S6mMMJVPyu6Zk9dEjlyg5ZueUjnhd1zklTSa1ZUpq3HId5RTveo3n/IdFAyx+2WaolLzNWMaU/BNNyGkZbQYzoJtUyiaiPJMikies9OWgZp9H4YUyjfK79IvXZv6ldAEezb8If6Yn6Rernw67HB9qvHWdHWtil4Eek+pf9WN/gSlZfNXg614xns7eqx7WLYlm/QOl8bJaBQV0886N+do2ZQcLfvABrdkZn6KU71USlexmVf2bWRxd//HF0Wx3cVRjd8YaplzTjQCTNSTh83ReSifN53NrNtOlk0J36joNpZPUPImlee819M51iZKTsVZt732xyDYK2J8hPeCpz/xoo6F8nQ/OTVAn7KuE7XYJ20dEfB04AZbv10i5Gl1sOWdn9zDqA8CRJq3Xedxnq3FfHzl5nXM6Yk9W95x8o3NO6gubPnICnXPq4c41DSe3c049fPei4dT52xdbffuizd8lOKXLP/LBG83eAVNZWjTbM6sNwE2HKO8WQYydr39P83zl3F6bNyPfPcXnJA2QMr3hOai7daah2aVpO+a5pXHtDuWNI3uS03JEiKGEEsbuT8k8gob8ZSnHYZqaHedgqFHCJvJmWqJPcm+OJnrITWEcBIJxE0TlXaCmZoejdoeFeyqimg9T9ha3zBLlGUxrlN3vK/5tW4H3LC/4XnA8pDCB5Qn73BJbIcGwOCozT0Wz1QlFtopU6apdQrT1DrRyqxPrLNfYIGhIZ4GssxrzqjMC9qlUVudrvUY1aSDTfYSujEbDYVO6UiVSe6Mrut0+r1FXxpCeXlWCwG9sKbR9T3Jxu1cWU+fjSi9RSsEc7/afqmPKK86KsIGPqAWyjXZIx+/+YYcw4cOQTvNsV2XIovuPk8nBkBd3rffkTb7CAcq3kJqtqtrd2v8jtmXF/bf8xZ7h/T9EAJNf \ No newline at end of file From d5a9ebc18aed8cc71df0570913cf87af472b8cd8 Mon Sep 17 00:00:00 2001 From: Anthony Duran <87147191+Code1Here@users.noreply.github.com> Date: Wed, 30 Nov 2022 10:09:45 -0500 Subject: [PATCH 08/34] App UI Overview --- Contador.drawio | 1 + 1 file changed, 1 insertion(+) create mode 100644 Contador.drawio diff --git a/Contador.drawio b/Contador.drawio new file mode 100644 index 00000000..10008809 --- /dev/null +++ b/Contador.drawio @@ -0,0 +1 @@ +5ZvbctsoGICfxtOrZizQyZdxHLuzPUymyUzbvdnBEpbpSsJFuLb79AUL2ZagjneiCGVz44gfgdAH/CeUAbzJtjOGVsuPNMbpAAzj7QBOBgA4nu+KP1KyUxLHC0tJwkisZEfBPfmFlXCopGsS46J2I6c05WRVF0Y0z3HEazLEGN3Ub1vQtP7UFUqwJriPUKpLv5CYL0tp6A2P8neYJMvqyc5Q1WSoulkJiiWK6eZEBG8H8IZRysurbHuDU0mv4lK2m/6h9jAwhnN+SYMfs+vP2fZj8tfDaE1ZirL4O32revmJ0rV6YTVYvqsIbJaE4/sVimR5I6Z5AMdLnqWi5IhLVKxK7guyxbEUpCTJRTnFCyEe68OsnokZx9sTkRr2DNMMc7YTt6haqAiqNeSq4uY4HyBUsuXJXByESK2B5NDzEZO4UKT+AzWoUZuu960+oQxrABld57FEMxkKHo/gbAFXUMfl67gcYML1XLRcjdZthkjaN06HnWsNlKeBesBbLl9TvBMiOcmTvfoTPzOK7AN0GhvTtDONBGELBN+vfryn0/v875k3/Qd/nU4Wm/VboBG8Y3RBUn1Tckm2rsiU3ooEEMyEQIIgwhJcq4qMxLFsPma4IL/QfN+VJL2iJOf7V/HGA28i+1pzWpS2THZdcEb/xTc0paLfSU5z2YsYVtoQtTEnbnNVa1Pidzkjuqp8soFpw6IE4MqrGxVPNyqBZ9j8lbB1UvruP7PBnU42uAsuUJFG0/tcy8l/AZCgbUjBC4Bk8ko6hRS+AEgj25BG/Yd0eHlrkICrQcGxCCJVkTK+pAnNUXp7lI7rvtrxng+UrhSs75jznYqIpUNRRykIst3X08I32Zkwa6o42arOy9JOlUpfpIplwblJKeiaRfjMm1fOBUcswfzcjcq4SS5nJ5nhFHHysx58tz5j1bh7va492+va0b3p632rnVgXctYZygsUcULzQsP3f/Wv3YZ/7el+48EB6CbkCWxon1a1iNu2clBN7+S6OY3361PXTA+VWkw1aszKYRRP2E56HuQ6js/onQuC+NM1PgAw9nAYu9qGEDUhmEPfb2cLeI3ESaArKrdTPXVB5GQjxgybMSY0ZS67DTKdPgZQjTQSHBl0areWr48RVDMLDqxT6mMI1aRkss/dUupjDNWkFNqmBProkTcoeY51Shcc11mnZMikdkxJj1vekYLT/ajpQv6IaEDEL7sVriSvM5ZxGv6JIeQEwy6DGWgnlbIlXGZSVPJElL6d1BzzKLJQpVH+lH4Jusy/VC7Ao/kX5c/0JP0C+umwN+NDg7du0mNtfGVgxqT7V/34vsBpaHxd4ZuOGJ9P3+se1h0jUf9AGbysTkFB077zU2nb5uIikRef8Ebc8YXk8lslVSkedqh/NcbRDx83jk63xlGP3QVrlMuVPpxStkEsftqab6STFosFiCJTOin2577XUjpJz5MAw7nXKLgyJUqejbWuex9KI9sq4DDCZsDzUPjRw5bydSG8cmCdcKgTdrsl7F4Q8VlwAkAY1kj5hrXYcc7O7WHUB6HX2LSB9bjP1eO+PnIKrHO64Jss+5zCoXVO+oFNHzlB65x6+OWagZNvnVMPz14MnKyfvrj66Ysxf5fRnC/fFINXmr2DjmZaDJ9nHj4AfmKIIorHf1Upj8SP//EDb38D \ No newline at end of file From 721edf5f0640f3eb3bb9b234f377af8cee85302c Mon Sep 17 00:00:00 2001 From: Anthony Duran <87147191+Code1Here@users.noreply.github.com> Date: Wed, 30 Nov 2022 10:10:27 -0500 Subject: [PATCH 09/34] Next feature to add --- Next Commit.drawio | 1 + 1 file changed, 1 insertion(+) create mode 100644 Next Commit.drawio diff --git a/Next Commit.drawio b/Next Commit.drawio new file mode 100644 index 00000000..62f9d7af --- /dev/null +++ b/Next Commit.drawio @@ -0,0 +1 @@ +7Vldk5owFP01PLoDCUR5XFG2nXa7ne52+xwlSlogNMRV++sbIChfdvaDrN1OfTGeJDfJuefeXMGAXry74jgNr1lAIgOYwc6AMwMAgMyx/MqRfYlMoFkCa06DErKOwC39RRRYDdvQgGSNgYKxSNC0CS5ZkpClaGCYc7ZtDluxqLlqitekA9wucdRFv9FAhOoUjnnE3xG6DquVLVP1xLgarIAsxAHb1iA4N6DHGRNlK955JMrJq3gp5/kneg8b4yQRj5lA7+cCpDPmwP304TpbfZhd+SNl5QFHG3VgA6BI2psuZGOdNypgxeQ68hhir7hBPzes6hhlhecu5QCA0l05TfVXhm5SQVkiR9xtWWVUbre021xLwrX1QWNZIMgux0MRRxKwZBNHdJ3I9lJSQbgEHggXVDrxUnXENAjy6VNO5EbxojBlyt8po4koJOJMDWeW29oIVh6mMJ0Jzn4Qj0VM2p0lLMmtrGgUtSF5CqVeAA+7rnunolpujexqkPLWFWExEXwvh6heWIWKCh0L2QrYHpVoIYWFNRVWE7ES//pg+6gP2VASeYJcQI9cWt7hbJMEJFD8bkMqyG2Kl3nvVqaIpuNKdqvAGoi3Q+6oeBtbXd5ss4c3CzmaiIMDE9eWW1OmBoC+PzFNUxvFbWmOAbwYOx2WodPDMtKlTvtkMstSnPTmroLmUVbynGevlJPe5CW/JatuM0eVZpup6/9Sf/9SMyyIjvirR1knIhHyfYR0xZ8LLs4dfs7Tw69dOsATpUNIKT0pm5dfQC0v+b62vInafoN9fuu70+3DwMEdh/Q5LuVUMv8qnvN9z5sjXZ5zzAP/f/ad4+jyXRLsghFDy8xyP967fHv79ea7poqsRqtZfLQFBGgFBBx3azXo9sTDZIA01svo0KXaI64G31cc67ga4KTLKLA1XQy9jHbrsjuOkwwvy/+Dr15hLHiFfMIxOcMGXmUpzZrNFVtclENo1m5r1u1qti8J2Lok+4xa5k3K5HN5P2vWiue57lBage0S6uxaeUb59Ca18vJ/TY+6CieDXYW2O27XbGcXy/ikWJ7/wPVU8T17fy+bOM69kCyytOgy29Ddl/n8n3scO0SicdqJBna1Y8Ee8YCni0f+PL4JKPpq71Pg/Dc= \ No newline at end of file From 7a430fec818fbe7ba5e3dea74fe74716bb3ee4d3 Mon Sep 17 00:00:00 2001 From: Anthony Duran <87147191+Code1Here@users.noreply.github.com> Date: Wed, 30 Nov 2022 10:13:26 -0500 Subject: [PATCH 10/34] Database tables or schema --- Contador schema.png | Bin 0 -> 111445 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Contador schema.png diff --git a/Contador schema.png b/Contador schema.png new file mode 100644 index 0000000000000000000000000000000000000000..3c183f279679a390ec2a915aa9426f9f8a00d3f2 GIT binary patch literal 111445 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 +1L@YNKYpl#lLeA|Q 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ÚvG@u#Yg&rt3cS!x8F+49PfV=M* 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 literal 0 HcmV?d00001 From 46e00bdcdbff01436f6f1876445133c91760f8bf Mon Sep 17 00:00:00 2001 From: Anthony Duran <87147191+Code1Here@users.noreply.github.com> Date: Wed, 30 Nov 2022 10:28:35 -0500 Subject: [PATCH 11/34] Transaction name, price and date --- client/src/components/MicroPostCard.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/client/src/components/MicroPostCard.js b/client/src/components/MicroPostCard.js index 943f576c..ded09d26 100644 --- a/client/src/components/MicroPostCard.js +++ b/client/src/components/MicroPostCard.js @@ -2,13 +2,17 @@ import React from "react"; import { Link } from "react-router-dom"; function MicroPostCard({ content, createdAt, id }) { + const total = 10; return (
-
-
+
+
{content}
-
{createdAt}
+
{total}
+
+ {createdAt.slice(0, -14)} +
); From 683c69b33ab3aabfcf95d443d80300dc02655c54 Mon Sep 17 00:00:00 2001 From: Anthony Duran <87147191+Code1Here@users.noreply.github.com> Date: Wed, 30 Nov 2022 15:30:57 -0500 Subject: [PATCH 12/34] Delete AboutUsPage.js --- client/src/pages/AboutUsPage.js | 49 --------------------------------- 1 file changed, 49 deletions(-) delete mode 100644 client/src/pages/AboutUsPage.js diff --git a/client/src/pages/AboutUsPage.js b/client/src/pages/AboutUsPage.js deleted file mode 100644 index 732a8dc4..00000000 --- a/client/src/pages/AboutUsPage.js +++ /dev/null @@ -1,49 +0,0 @@ -import React from "react"; - -function AboutUsPage(props) { - return ( - <> -
-

About our project

-

- Lorem ipsum dolor sit amet consectetur adipisicing elit. Nostrum - quidem adipisci nobis quia eum quaerat quos ducimus, deleniti - exercitationem animi itaque iste illo reiciendis vitae atque - necessitatibus voluptatum repellendus quisquam? -

-

About our Team

-
-
-

Firstname Lastname

-

- Lorem ipsum dolor sit, amet consectetur adipisicing elit. - Dignissimos in itaque nihil consectetur qui natus similique - nostrum molestias, ipsa explicabo hic impedit aspernatur. Ipsa - provident neque culpa alias incidunt amet. -

-
-
-

Firstname Lastname

-

- Lorem ipsum dolor sit, amet consectetur adipisicing elit. - Dignissimos in itaque nihil consectetur qui natus similique - nostrum molestias, ipsa explicabo hic impedit aspernatur. Ipsa - provident neque culpa alias incidunt amet. -

-
-
-

Firstname Lastname

-

- Lorem ipsum dolor sit, amet consectetur adipisicing elit. - Dignissimos in itaque nihil consectetur qui natus similique - nostrum molestias, ipsa explicabo hic impedit aspernatur. Ipsa - provident neque culpa alias incidunt amet. -

-
-
-
- - ); -} - -export default AboutUsPage; From 7cd3a4c28c365310fbbac047aebb4aec26b03ef6 Mon Sep 17 00:00:00 2001 From: Anthony Duran <87147191+Code1Here@users.noreply.github.com> Date: Wed, 30 Nov 2022 15:31:39 -0500 Subject: [PATCH 13/34] About Us 1st draft --- client/src/pages/AboutUsPage.js | 52 +++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 client/src/pages/AboutUsPage.js diff --git a/client/src/pages/AboutUsPage.js b/client/src/pages/AboutUsPage.js new file mode 100644 index 00000000..90bfb8ac --- /dev/null +++ b/client/src/pages/AboutUsPage.js @@ -0,0 +1,52 @@ +import React from "react"; + +function AboutUsPage(props) { + return ( + <> +
+

About our project

+

+ Contador is a finance management application that will allow users to + track each and every buy they make. Contador allows users to record + their monthly income, expenses and target goals to achieve. That may + be their short-term or long-term goals. Their goals can be anything + from saving for a downpayment on a house or going for a road trip to + the poconos. +

+

About our Team

+
+
+

Anthony Duran

+

+ GitHub:{" "} + + Code1Here + + , Full Stack Developer +

+
+
+

Affat Asir

+

+ GitHub:{" "} + + affat25 + + , Front-end Developer +

+
+
+
+ + ); +} + +export default AboutUsPage; From b830bf8ff504d15c3f34bfff7f7011c17965f28e Mon Sep 17 00:00:00 2001 From: Affat25 Date: Sat, 3 Dec 2022 12:12:44 -0500 Subject: [PATCH 14/34] pushed edits --- client/src/components/AddTransaction.js | 12 ++---------- client/src/components/MicroPostCard.js | 3 ++- client/src/pages/PostsListPage.js | 20 +++++++++----------- 3 files changed, 13 insertions(+), 22 deletions(-) diff --git a/client/src/components/AddTransaction.js b/client/src/components/AddTransaction.js index 3e40f40a..448bbe02 100644 --- a/client/src/components/AddTransaction.js +++ b/client/src/components/AddTransaction.js @@ -1,5 +1,5 @@ import React from "react"; -import {Modal, Button, ModalBody, ModalTitle, ModalHeader, Form, ModalFooter, FormCheck, FormGroup, FormControl, Row, Col} from "react-bootstrap"; +import {Modal, Button, ModalBody, ModalTitle, ModalHeader, Form, ModalFooter, FormCheck, FormGroup, FormControl, Row} from "react-bootstrap"; function AddTransaction() { const [isShow,invokeModal]= React.useState(false) @@ -24,15 +24,7 @@ function AddTransaction() { - - - - +
{content} + {/*
{amount}
*/}
{createdAt}
diff --git a/client/src/pages/PostsListPage.js b/client/src/pages/PostsListPage.js index de6f7d7b..a2c7a484 100644 --- a/client/src/pages/PostsListPage.js +++ b/client/src/pages/PostsListPage.js @@ -35,21 +35,19 @@ function PostsListPage() { return ( <> -
-
- {posts.map((entryData) => ( - - ))} -
-
+
+
+ +
+
{posts.map((entryData) => ( ))}
-
- -
-
+
+
+

Balance Forward

Target

+
); From 9119234dcd82b32c08f7bea874a445b5c7faa894 Mon Sep 17 00:00:00 2001 From: Affat25 Date: Sat, 3 Dec 2022 12:26:51 -0500 Subject: [PATCH 15/34] small changes --- client/src/pages/PostsListPage.js | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/client/src/pages/PostsListPage.js b/client/src/pages/PostsListPage.js index de6f7d7b..3b8f848b 100644 --- a/client/src/pages/PostsListPage.js +++ b/client/src/pages/PostsListPage.js @@ -36,12 +36,7 @@ function PostsListPage() { return ( <>
-
- {posts.map((entryData) => ( - - ))} -
-
+
{posts.map((entryData) => ( ))} From 8996855ca0ca6d77ce7f5c1eca98b487b8e98b2b Mon Sep 17 00:00:00 2001 From: Affat25 Date: Sat, 3 Dec 2022 12:28:12 -0500 Subject: [PATCH 16/34] fixed positions --- client/src/pages/PostsListPage.js | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/client/src/pages/PostsListPage.js b/client/src/pages/PostsListPage.js index 3b8f848b..0b547ddd 100644 --- a/client/src/pages/PostsListPage.js +++ b/client/src/pages/PostsListPage.js @@ -35,17 +35,20 @@ function PostsListPage() { return ( <> -
-
+
+
+ +
+
{posts.map((entryData) => ( ))}
-
- -
-
- +
+
+

Balance Forward

Target

+
+ ); } From 5e3bbb8c9054a5ce0c24d66c9fdf199466d6023a Mon Sep 17 00:00:00 2001 From: Affat25 Date: Sat, 3 Dec 2022 13:40:37 -0500 Subject: [PATCH 17/34] aligned components properly --- client/src/components/MicroPostCard.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/client/src/components/MicroPostCard.js b/client/src/components/MicroPostCard.js index ded09d26..920f683f 100644 --- a/client/src/components/MicroPostCard.js +++ b/client/src/components/MicroPostCard.js @@ -5,12 +5,12 @@ function MicroPostCard({ content, createdAt, id }) { const total = 10; return (
-
-
+
+
{content} +
{total}
-
{total}
-
+
{createdAt.slice(0, -14)}
From f0ecd99d21f4496e40663498892e1d9f66f586fa Mon Sep 17 00:00:00 2001 From: Affat25 Date: Sat, 3 Dec 2022 18:29:45 -0500 Subject: [PATCH 18/34] balance and Target updated --- client/src/pages/PostsListPage.js | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/client/src/pages/PostsListPage.js b/client/src/pages/PostsListPage.js index 0b547ddd..da9999db 100644 --- a/client/src/pages/PostsListPage.js +++ b/client/src/pages/PostsListPage.js @@ -37,17 +37,18 @@ function PostsListPage() { <>
- -
-
+ +
+
{posts.map((entryData) => ( ))} +
+

Target

+

Balance Forward

+
-
-

Balance Forward

Target

-
); From 7a3fef0a348df632f74ab1d62aa80b7112b045fc Mon Sep 17 00:00:00 2001 From: Anthony Duran Date: Sat, 3 Dec 2022 22:38:08 -0500 Subject: [PATCH 19/34] Models, About Usc, Sign up, Posts --- api/models/Goal.js | 39 +++++++++++ api/models/Login.js | 38 +++++++++++ api/models/Profile.js | 63 ++++++++++++++++++ api/models/Transaction.js | 47 +++++++++++++ client/package-lock.json | 1 - client/src/App.js | 15 ++++- client/src/components/MicroPostCard.js | 10 ++- client/src/pages/AboutUsPage.js | 53 ++++++++------- client/src/pages/SignUpPage.js | 92 ++++++++++++++++++++++++++ 9 files changed, 327 insertions(+), 31 deletions(-) create mode 100644 api/models/Goal.js create mode 100644 api/models/Login.js create mode 100644 api/models/Profile.js create mode 100644 api/models/Transaction.js create mode 100644 client/src/pages/SignUpPage.js diff --git a/api/models/Goal.js b/api/models/Goal.js new file mode 100644 index 00000000..51c80272 --- /dev/null +++ b/api/models/Goal.js @@ -0,0 +1,39 @@ +"use strict"; +const { Model } = require("sequelize"); + +module.exports = (sequelize, DataTypes) => { + class Goal extends Model {} + + Goal.init( + { + targetDate: { + type: DataTypes.DATEONLY, + validate: { + isDate: true, + }, + }, + targetFund: { + type: DataTypes.FLOAT, + validate: { + isNumeric: true, + }, + }, + monthlyPerformance: { + type: DataTypes.FLOAT, + validate: { + isNumeric: true, + }, + }, + }, + { + sequelize, + modelName: "Goal", + } + ); + + Goal.associate = (models) => { + // associations can be defined here + }; + + return Goal; +}; diff --git a/api/models/Login.js b/api/models/Login.js new file mode 100644 index 00000000..40c6f4ad --- /dev/null +++ b/api/models/Login.js @@ -0,0 +1,38 @@ +"use strict"; +const { Model } = require("sequelize"); + +module.exports = (sequelize, DataTypes) => { + class Login extends Model {} + + Login.init( + { + username: { + type: DataTypes.STRING, + validate: { + len: [3, 250], + notEmpty: true, + unique: true, + }, + }, + // For UI: Provide flag for the minimum length required of user + password: { + type: DataTypes.STRING, + validate: { + len: [8, 250], + notEmpty: true, + // isUUID: 4, // Use after implementing password encryption + }, + }, + }, + { + sequelize, + modelName: "Login", + } + ); + + Login.associate = (models) => { + // associations can be defined here + }; + + return Login; +}; diff --git a/api/models/Profile.js b/api/models/Profile.js new file mode 100644 index 00000000..404e5cf3 --- /dev/null +++ b/api/models/Profile.js @@ -0,0 +1,63 @@ +"use strict"; +const { Model } = require("sequelize"); + +module.exports = (sequelize, DataTypes) => { + class Profile extends Model {} + + Profile.init( + { + firstName: { + type: DataTypes.STRING, + validate: { + len: [3, 250], + notEmpty: true, + }, + }, + lastName: { + type: DataTypes.STRING, + validate: { + len: [3, 250], + notEmpty: true, + }, + }, + email: { + type: DataTypes.STRING, + validate: { + isEmail: true, + len: [10, 250], + notEmpty: true, + }, + }, + dob: { + type: DataTypes.DATEONLY, + validate: { + isDate: true, + }, + }, + sex: { + type: DataTypes.STRING, + validate: { + len: [1, 50], + notEmpty: true, + }, + }, + + monthlyIncome: { + type: DataTypes.FLOAT, + validate: { + isNumeric: true, + }, + }, + }, + { + sequelize, + modelName: "Profile", + } + ); + + Profile.associate = (models) => { + // associations can be defined here + }; + + return Profile; +}; diff --git a/api/models/Transaction.js b/api/models/Transaction.js new file mode 100644 index 00000000..db72ff29 --- /dev/null +++ b/api/models/Transaction.js @@ -0,0 +1,47 @@ +"use strict"; +const { Model } = require("sequelize"); + +module.exports = (sequelize, DataTypes) => { + class Transaction extends Model {} + + Transaction.init( + { + itemName: { + type: DataTypes.STRING, + validate: { + len: [1, 250], + notEmpty: true, + }, + }, + price: { + type: DataTypes.FLOAT, + validate: { + isNumeric: true, + }, + }, + date: { + type: DataTypes.DATEONLY, + validate: { + isDate: true, + }, + }, + + total: { + type: DataTypes.FLOAT, + validate: { + isNumeric: true, + }, + }, + }, + { + sequelize, + modelName: "Transaction", + } + ); + + Transaction.associate = (models) => { + // associations can be defined here + }; + + return Transaction; +}; diff --git a/client/package-lock.json b/client/package-lock.json index 46e48a4b..c840b6ce 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -5,7 +5,6 @@ "requires": true, "packages": { "": { - "name": "client", "version": "0.1.0", "dependencies": { "react": "^17.0.2", diff --git a/client/src/App.js b/client/src/App.js index 73166990..d55d642d 100644 --- a/client/src/App.js +++ b/client/src/App.js @@ -4,6 +4,7 @@ import PostsListPage from "./pages/PostsListPage"; import PostFormPage from "./pages/PostFormPage"; import ShowPostPage from "./pages/ShowPostPage"; import AboutUsPage from "./pages/AboutUsPage"; +import SignUpPage from "./pages/SignUpPage"; import "./App.css"; @@ -25,6 +26,11 @@ function Navigation(props) { About Us +
  • + + Fill-out Form + +
  • @@ -35,13 +41,18 @@ function App() { return ( -
    -
    +
    + {" "} + {/*text-center*/} +
    + {" "} + {/*justify-content-center*/} } /> } /> } /> } /> + } />
    diff --git a/client/src/components/MicroPostCard.js b/client/src/components/MicroPostCard.js index 943f576c..ded09d26 100644 --- a/client/src/components/MicroPostCard.js +++ b/client/src/components/MicroPostCard.js @@ -2,13 +2,17 @@ import React from "react"; import { Link } from "react-router-dom"; function MicroPostCard({ content, createdAt, id }) { + const total = 10; return (
    -
    -
    +
    +
    {content}
    -
    {createdAt}
    +
    {total}
    +
    + {createdAt.slice(0, -14)} +
    ); diff --git a/client/src/pages/AboutUsPage.js b/client/src/pages/AboutUsPage.js index 732a8dc4..d3a804db 100644 --- a/client/src/pages/AboutUsPage.js +++ b/client/src/pages/AboutUsPage.js @@ -6,38 +6,41 @@ function AboutUsPage(props) {

    About our project

    - Lorem ipsum dolor sit amet consectetur adipisicing elit. Nostrum - quidem adipisci nobis quia eum quaerat quos ducimus, deleniti - exercitationem animi itaque iste illo reiciendis vitae atque - necessitatibus voluptatum repellendus quisquam? + Contador is a finance management application that will allow users to + track each and every buy they make. Contador allows users to record + their monthly income, expenses and target goals to achieve. That may + be their short-term or long-term goals. Their goals can be anything + from saving for a downpayment on a house or going for a road trip to + the poconos.

    About our Team

    -
    -

    Firstname Lastname

    +
    +

    Anthony Duran

    - Lorem ipsum dolor sit, amet consectetur adipisicing elit. - Dignissimos in itaque nihil consectetur qui natus similique - nostrum molestias, ipsa explicabo hic impedit aspernatur. Ipsa - provident neque culpa alias incidunt amet. + GitHub:{" "} + + Code1Here + + , Full Stack Developer

    -
    -

    Firstname Lastname

    +
    +

    Affat Asir

    - Lorem ipsum dolor sit, amet consectetur adipisicing elit. - Dignissimos in itaque nihil consectetur qui natus similique - nostrum molestias, ipsa explicabo hic impedit aspernatur. Ipsa - provident neque culpa alias incidunt amet. -

    -
    -
    -

    Firstname Lastname

    -

    - Lorem ipsum dolor sit, amet consectetur adipisicing elit. - Dignissimos in itaque nihil consectetur qui natus similique - nostrum molestias, ipsa explicabo hic impedit aspernatur. Ipsa - provident neque culpa alias incidunt amet. + GitHub:{" "} + + affat25 + + , Front-end Developer

    diff --git a/client/src/pages/SignUpPage.js b/client/src/pages/SignUpPage.js new file mode 100644 index 00000000..8110de03 --- /dev/null +++ b/client/src/pages/SignUpPage.js @@ -0,0 +1,92 @@ +import React, { useState } from "react"; + +function SignUpPage(props) { + const [userInfo, setUserInfo] = useState([]); + + return ( + <> +
    +

    Sign up

    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    + + {/* vvvvvvvvv */} + +
    + + + + +
    + + {/* ^^^^^^^^^ */} + +
    + + +
    +
    + + +
    +
    + +
    +
    +
    + + ); +} + +export default SignUpPage; From 9fc3edaa29753b4fdcc90671ff9f043d70830597 Mon Sep 17 00:00:00 2001 From: Anthony Duran Date: Sun, 4 Dec 2022 13:33:14 -0500 Subject: [PATCH 20/34] Controller set up --- api/controllers/goals.js | 77 +++++++++++++++++++++++++++++++ api/controllers/index.js | 22 +++++++-- api/controllers/logins.js | 77 +++++++++++++++++++++++++++++++ api/controllers/profiles.js | 77 +++++++++++++++++++++++++++++++ api/controllers/transactions.js | 77 +++++++++++++++++++++++++++++++ api/models/Goal.js | 2 +- api/models/Profile.js | 9 +++- api/models/Transaction.js | 16 ++----- client/src/pages/PostsListPage.js | 34 +++++++++++--- client/src/pages/ShowPostPage.js | 12 +++-- client/src/pages/SignUpPage.js | 4 +- 11 files changed, 375 insertions(+), 32 deletions(-) create mode 100644 api/controllers/goals.js create mode 100644 api/controllers/logins.js create mode 100644 api/controllers/profiles.js create mode 100644 api/controllers/transactions.js diff --git a/api/controllers/goals.js b/api/controllers/goals.js new file mode 100644 index 00000000..00f65434 --- /dev/null +++ b/api/controllers/goals.js @@ -0,0 +1,77 @@ +const express = require("express"); +const router = express.Router(); +const db = require("../models"); +const { Goal } = db; + +// This is a simple example for providing basic CRUD routes for +// a resource/model. It provides the following: +// GET /api/goal +// POST /api/goal +// GET /api/goal/:id +// PUT /api/goal/:id +// DELETE /api/goal/:id +// +// The full URL's for these routes are composed by combining the +// prefixes used to load the controller files. +// /api comes from the file ../app.js +// /goal comes from the file ./goals.js + +router.get("/", (req, res) => { + Goal.findAll({}).then((allPosts) => res.json(allPosts)); +}); + +router.post("/", (req, res) => { + let { content } = req.body; + + Goal.create({ content }) + .then((newPost) => { + res.status(201).json(newPost); + }) + .catch((err) => { + res.status(400).json(err); + }); +}); + +router.get("/:id", (req, res) => { + const { id } = req.params; + Goal.findByPk(id).then((mpost) => { + if (!mpost) { + return res.sendStatus(404); + } + + res.json(mpost); + }); +}); + +router.put("/:id", (req, res) => { + const { id } = req.params; + Goal.findByPk(id).then((mpost) => { + if (!mpost) { + return res.sendStatus(404); + } + + mpost.content = req.body.content; + mpost + .save() + .then((updatedPost) => { + res.json(updatedPost); + }) + .catch((err) => { + res.status(400).json(err); + }); + }); +}); + +router.delete("/:id", (req, res) => { + const { id } = req.params; + Goal.findByPk(id).then((mpost) => { + if (!mpost) { + return res.sendStatus(404); + } + + mpost.destroy(); + res.sendStatus(204); + }); +}); + +module.exports = router; diff --git a/api/controllers/index.js b/api/controllers/index.js index d6cda965..14f89dd2 100644 --- a/api/controllers/index.js +++ b/api/controllers/index.js @@ -1,11 +1,25 @@ const express = require("express"); const router = express.Router(); -// Load each controller +// Mount each controller under a specific route. These will be prefixes to all routes defined inside the controller +// This'll be at api/micro_posts const microPostsController = require("./microPosts.js"); - -// Mount each controller under a specific route. These -// will be prefixes to all routes defined inside the controller router.use("/micro_posts", microPostsController); +// This'll be at api/profile +// const profileController = require("./profiles.js") +// router.use("/profile", profileController); + +// This'll be at api/transaction +const transactionController = require("./transactions.js"); +router.use("/transaction", transactionController); + +// This'll be at api/login +const loginController = require("./logins.js"); +router.use("/login", loginController); + +// This'll be at api/goal +const goalController = require("./goals.js"); +router.use("/goal", goalController); + module.exports = router; diff --git a/api/controllers/logins.js b/api/controllers/logins.js new file mode 100644 index 00000000..4ad0574d --- /dev/null +++ b/api/controllers/logins.js @@ -0,0 +1,77 @@ +const express = require("express"); +const router = express.Router(); +const db = require("../models"); +const { Login } = db; + +// This is a simple example for providing basic CRUD routes for +// a resource/model. It provides the following: +// GET /api/login +// POST /api/login +// GET /api/login/:id +// PUT /api/login/:id +// DELETE /api/login/:id +// +// The full URL's for these routes are composed by combining the +// prefixes used to load the controller files. +// /api comes from the file ../app.js +// /login comes from the file ./logins.js + +router.get("/", (req, res) => { + Login.findAll({}).then((allPosts) => res.json(allPosts)); +}); + +router.post("/", (req, res) => { + let { content } = req.body; + + Login.create({ content }) + .then((newPost) => { + res.status(201).json(newPost); + }) + .catch((err) => { + res.status(400).json(err); + }); +}); + +router.get("/:id", (req, res) => { + const { id } = req.params; + Login.findByPk(id).then((mpost) => { + if (!mpost) { + return res.sendStatus(404); + } + + res.json(mpost); + }); +}); + +router.put("/:id", (req, res) => { + const { id } = req.params; + Login.findByPk(id).then((mpost) => { + if (!mpost) { + return res.sendStatus(404); + } + + mpost.content = req.body.content; + mpost + .save() + .then((updatedPost) => { + res.json(updatedPost); + }) + .catch((err) => { + res.status(400).json(err); + }); + }); +}); + +router.delete("/:id", (req, res) => { + const { id } = req.params; + Login.findByPk(id).then((mpost) => { + if (!mpost) { + return res.sendStatus(404); + } + + mpost.destroy(); + res.sendStatus(204); + }); +}); + +module.exports = router; diff --git a/api/controllers/profiles.js b/api/controllers/profiles.js new file mode 100644 index 00000000..08f48f15 --- /dev/null +++ b/api/controllers/profiles.js @@ -0,0 +1,77 @@ +const express = require("express"); +const router = express.Router(); +const db = require("../models"); +const { Profile } = db; + +// This is a simple example for providing basic CRUD routes for +// a resource/model. It provides the following: +// GET /api/profile +// POST /api/profile +// GET /api/profile/:id +// PUT /api/profile/:id +// DELETE /api/profile/:id +// +// The full URL's for these routes are composed by combining the +// prefixes used to load the controller files. +// /api comes from the file ../app.js +// /profile comes from the file ./profiles.js + +router.get("/", (req, res) => { + Profile.findAll({}).then((allPosts) => res.json(allPosts)); +}); + +router.post("/", (req, res) => { + let { content } = req.body; + + Profile.create({ content }) + .then((newPost) => { + res.status(201).json(newPost); + }) + .catch((err) => { + res.status(400).json(err); + }); +}); + +router.get("/:id", (req, res) => { + const { id } = req.params; + Profile.findByPk(id).then((mpost) => { + if (!mpost) { + return res.sendStatus(404); + } + + res.json(mpost); + }); +}); + +router.put("/:id", (req, res) => { + const { id } = req.params; + Profile.findByPk(id).then((mpost) => { + if (!mpost) { + return res.sendStatus(404); + } + + mpost.content = req.body.content; + mpost + .save() + .then((updatedPost) => { + res.json(updatedPost); + }) + .catch((err) => { + res.status(400).json(err); + }); + }); +}); + +router.delete("/:id", (req, res) => { + const { id } = req.params; + Profile.findByPk(id).then((mpost) => { + if (!mpost) { + return res.sendStatus(404); + } + + mpost.destroy(); + res.sendStatus(204); + }); +}); + +module.exports = router; diff --git a/api/controllers/transactions.js b/api/controllers/transactions.js new file mode 100644 index 00000000..229fff11 --- /dev/null +++ b/api/controllers/transactions.js @@ -0,0 +1,77 @@ +const express = require("express"); +const router = express.Router(); +const db = require("../models"); +const { Transaction } = db; + +// This is a simple example for providing basic CRUD routes for +// a resource/model. It provides the following: +// GET /api/transaction +// POST /api/transaction +// GET /api/transaction/:id +// PUT /api/transaction/:id +// DELETE /api/transaction/:id +// +// The full URL's for these routes are composed by combining the +// prefixes used to load the controller files. +// /api comes from the file ../app.js +// /transaction comes from the file ./transactions.js + +router.get("/", (req, res) => { + Transaction.findAll({}).then((allPosts) => res.json(allPosts)); +}); + +router.post("/", (req, res) => { + let { content } = req.body; + + Transaction.create({ content }) + .then((newPost) => { + res.status(201).json(newPost); + }) + .catch((err) => { + res.status(400).json(err); + }); +}); + +router.get("/:id", (req, res) => { + const { id } = req.params; + Transaction.findByPk(id).then((mpost) => { + if (!mpost) { + return res.sendStatus(404); + } + + res.json(mpost); + }); +}); + +router.put("/:id", (req, res) => { + const { id } = req.params; + Transaction.findByPk(id).then((mpost) => { + if (!mpost) { + return res.sendStatus(404); + } + + mpost.content = req.body.content; + mpost + .save() + .then((updatedPost) => { + res.json(updatedPost); + }) + .catch((err) => { + res.status(400).json(err); + }); + }); +}); + +router.delete("/:id", (req, res) => { + const { id } = req.params; + Transaction.findByPk(id).then((mpost) => { + if (!mpost) { + return res.sendStatus(404); + } + + mpost.destroy(); + res.sendStatus(204); + }); +}); + +module.exports = router; diff --git a/api/models/Goal.js b/api/models/Goal.js index 51c80272..a470837c 100644 --- a/api/models/Goal.js +++ b/api/models/Goal.js @@ -18,7 +18,7 @@ module.exports = (sequelize, DataTypes) => { isNumeric: true, }, }, - monthlyPerformance: { + totalMinusIncome: { type: DataTypes.FLOAT, validate: { isNumeric: true, diff --git a/api/models/Profile.js b/api/models/Profile.js index 404e5cf3..4e1cb10e 100644 --- a/api/models/Profile.js +++ b/api/models/Profile.js @@ -34,7 +34,7 @@ module.exports = (sequelize, DataTypes) => { isDate: true, }, }, - sex: { + gender: { type: DataTypes.STRING, validate: { len: [1, 50], @@ -48,6 +48,13 @@ module.exports = (sequelize, DataTypes) => { isNumeric: true, }, }, + aboutMe: { + type: DataTypes.STRING, + validate: { + len: [3, 250], + notEmpty: true, + }, + }, }, { sequelize, diff --git a/api/models/Transaction.js b/api/models/Transaction.js index db72ff29..d1db7a2b 100644 --- a/api/models/Transaction.js +++ b/api/models/Transaction.js @@ -6,6 +6,8 @@ module.exports = (sequelize, DataTypes) => { Transaction.init( { + // Get this data from MicroPost + /* itemName: { type: DataTypes.STRING, validate: { @@ -13,25 +15,13 @@ module.exports = (sequelize, DataTypes) => { notEmpty: true, }, }, + */ price: { type: DataTypes.FLOAT, validate: { isNumeric: true, }, }, - date: { - type: DataTypes.DATEONLY, - validate: { - isDate: true, - }, - }, - - total: { - type: DataTypes.FLOAT, - validate: { - isNumeric: true, - }, - }, }, { sequelize, diff --git a/client/src/pages/PostsListPage.js b/client/src/pages/PostsListPage.js index eb2c27ee..8addb507 100644 --- a/client/src/pages/PostsListPage.js +++ b/client/src/pages/PostsListPage.js @@ -33,14 +33,36 @@ function PostsListPage() { if (loading) return ; return ( -
    -
    - {posts.map((entryData) => ( - - ))} + <> + {/*
    + +
    */} + +
    +
    + {posts.map((entryData) => ( + + ))} +
    -
    + ); } export default PostsListPage; + +/** From Affat + * <> +
    +
    + +
    + +
    + {posts.map((entryData) => ( + + ))} +
    +
    + + */ diff --git a/client/src/pages/ShowPostPage.js b/client/src/pages/ShowPostPage.js index 39b195e0..8d532591 100644 --- a/client/src/pages/ShowPostPage.js +++ b/client/src/pages/ShowPostPage.js @@ -31,13 +31,15 @@ function ShowPostPage() { }; }, [params.id]); - if (error) - return ( - - ); + if (error) return ; if (loading) return ; - return ; + return ( + <> +

    HI

    + + + ); } export default ShowPostPage; diff --git a/client/src/pages/SignUpPage.js b/client/src/pages/SignUpPage.js index 8110de03..49617136 100644 --- a/client/src/pages/SignUpPage.js +++ b/client/src/pages/SignUpPage.js @@ -5,9 +5,9 @@ function SignUpPage(props) { return ( <> -
    +

    Sign up

    -
    +