diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 0000000..849628f --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,30 @@ +name: Deploy to GitHub Pages + +on: + push: + branches: + - end0 # Replace with your branch name if different + +jobs: + build_and_deploy: + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v2 + + - name: Setup Node.js + uses: actions/setup-node@v2 + with: + node-version: 16 # Use the Node.js version that suits your project + + - name: Install dependencies and build + run: | + npm ci + npm run build:gh-pages + + - name: Deploy to GitHub Pages + uses: peaceiris/actions-gh-pages@v3 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./build # The build output directory for your React app diff --git a/.gitignore b/.gitignore index 4d29575..fa4bbbe 100644 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,7 @@ .env.development.local .env.test.local .env.production.local +/rough.txt npm-debug.log* yarn-debug.log* diff --git a/README.md b/README.md index 58beeac..7ee6952 100644 --- a/README.md +++ b/README.md @@ -1,70 +1,46 @@ -# Getting Started with Create React App +# Group-id: 29 +# Title: Online Learning Platform (udemy) -This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app). +Group Members: +- Karthikeya Bethu, S20200010090 +- Kukutla Gnana Sanjay, S20200010106 +- Devineni Sri Sivani, S20200010057 +- Samyak Bansal, S20200010186 +- Mohammed Aasim, S20200010130 -## Available Scripts +## Website Hosted URLs +frontend (website) - https://learnpedia-frontend.onrender.com/ +backend (for reference) - https://learnpedia-backend-ci.azurewebsites.net/ -In the project directory, you can run: +## Github URLs +frontend (website) - https://github.com/karthikeya-io/learnpedia0/tree/end0 +backend (for reference) - https://github.com/karthikeya-io/learnpedia-backend -### `npm start` -Runs the app in the development mode.\ -Open [http://localhost:3000](http://localhost:3000) to view it in your browser. +## To run the submitted zip file +- The zip contains 2 folder fortend and backend +### Frontend +To run the frontend application you need +1. nodeJs +2. npm +on your system -The page will reload when you make changes.\ -You may also see any lint errors in the console. -### `npm test` +Tor run the application you need to run the following commands +- `npm i` +- `npm start` -Launches the test runner in the interactive watch mode.\ -See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information. +the backend api runs at port 3001 -### `npm run build` +### Backend +To run the Backend application you need +1. nodeJs +2. mongoDB +on your system -Builds the app for production to the `build` folder.\ -It correctly bundles React in production mode and optimizes the build for the best performance. -The build is minified and the filenames include the hashes.\ -Your app is ready to be deployed! +Tor run the application you need to run the following commands +- `npm i` +- `npm start` -See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information. - -### `npm run eject` - -**Note: this is a one-way operation. Once you `eject`, you can't go back!** - -If you aren't satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project. - -Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you're on your own. - -You don't have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn't feel obligated to use this feature. However we understand that this tool wouldn't be useful if you couldn't customize it when you are ready for it. - -## Learn More - -You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started). - -To learn React, check out the [React documentation](https://reactjs.org/). - -### Code Splitting - -This section has moved here: [https://facebook.github.io/create-react-app/docs/code-splitting](https://facebook.github.io/create-react-app/docs/code-splitting) - -### Analyzing the Bundle Size - -This section has moved here: [https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size](https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size) - -### Making a Progressive Web App - -This section has moved here: [https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app](https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app) - -### Advanced Configuration - -This section has moved here: [https://facebook.github.io/create-react-app/docs/advanced-configuration](https://facebook.github.io/create-react-app/docs/advanced-configuration) - -### Deployment - -This section has moved here: [https://facebook.github.io/create-react-app/docs/deployment](https://facebook.github.io/create-react-app/docs/deployment) - -### `npm run build` fails to minify - -This section has moved here: [https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify](https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify) +the backend api runs at port 3001 \ No newline at end of file diff --git a/db.json b/db.json new file mode 100644 index 0000000..dfc5429 --- /dev/null +++ b/db.json @@ -0,0 +1,92 @@ +{ + "users": [ + { + "role": "admin", + "fname": "Karthikeya", + "email": "karthikeya.b20@iiits.in", + "phnumber": "9999999999", + "password": "11111", + "cnfpassword": "11111", + "gender": "male", + "lname": "Bethu", + "id": 1 + }, + { + "role": "student", + "fname": "Sanjay", + "lname": "Gnana", + "email": "test@iiits.in", + "phnumber": "9999999999", + "password": "12345", + "cnfpassword": "12345", + "gender": "male", + "id": 2 + }, + { + "role": "teacher", + "fname": "testf", + "lname": "testl", + "email": "test1@iiits.in", + "phnumber": "9999999999", + "password": "11111", + "cnfpassword": "11111", + "gender": "female", + "id": 3 + }, + { + "role": "student", + "fname": "test", + "lname": "test", + "email": "test@iiits.in", + "phnumber": "9999999999", + "password": "11111", + "cnfpassword": "11111", + "gender": "female", + "id": 4 + }, + { + "role": "student", + "fname": "test3", + "lname": "Bethu", + "email": "tests@iiits.in", + "phnumber": "9999999999", + "password": "11111", + "cnfpassword": "11111", + "gender": "male", + "id": 5 + } + ], + "courses": [ + { + "title": "Information Retrieval", + "price": "2999", + "categorydb": "engineering", + "desc": "The course helps you build search engines, so you can build your own search engine for you application. In this course you will build indexing, evaluation of IR systems", + "id": 1 + }, + { + "title": "Fundamentals of Full Stack", + "price": "999", + "categorydb": "engineering", + "desc": "Introduction to web development. You will learn html, css both frontend and backend javascript, nosql databases like mongodb @just 999 :)", + "id": 2 + }, + { + "title": "Could Computing ", + "price": "1499", + "categorydb": "engineering", + "desc": "Introduction to virtualization, containerization, bigdata and cloud computing", + "id": 3 + }, + { + "title": "Object Oriented programming", + "price": "3999", + "categorydb": "engineering", + "desc": "Object Oriented programming, In this course you will learn object oriented principles using java. ", + "id": 4 + } + ], + "profile": { + "name": "typicode" + } +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 31e394c..6d34331 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,12 +11,19 @@ "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^13.5.0", + "antd": "^5.0.4", + "axios": "^1.3.4", "bootstrap": "^5.2.2", + "json": "^11.0.0", "react": "^18.2.0", "react-bootstrap": "^2.5.0", "react-dom": "^18.2.0", + "react-dropzone": "^14.2.3", + "react-redux": "^8.0.5", "react-router-dom": "^6.4.2", "react-scripts": "5.0.1", + "react-star-ratings": "^2.3.0", + "redux": "^4.2.0", "web-vitals": "^2.1.4" } }, @@ -37,6 +44,71 @@ "node": ">=6.0.0" } }, + "node_modules/@ant-design/colors": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-6.0.0.tgz", + "integrity": "sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==", + "dependencies": { + "@ctrl/tinycolor": "^3.4.0" + } + }, + "node_modules/@ant-design/cssinjs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@ant-design/cssinjs/-/cssinjs-1.1.0.tgz", + "integrity": "sha512-9kfWCnlcWZLMc184HL7zGUU3odKo/5HBMNxDxhSds2DoIzi/ojmmOU1A1butWVDSPcAbLyNQ85vxUI8mkkHrlA==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "@emotion/hash": "^0.8.0", + "@emotion/unitless": "^0.7.5", + "classnames": "^2.3.1", + "csstype": "^3.0.10", + "rc-util": "^5.24.2", + "stylis": "^4.0.13" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/@ant-design/icons": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-4.8.0.tgz", + "integrity": "sha512-T89P2jG2vM7OJ0IfGx2+9FC5sQjtTzRSz+mCHTXkFn/ELZc2YpfStmYHmqzq2Jx55J0F7+O6i5/ZKFSVNWCKNg==", + "dependencies": { + "@ant-design/colors": "^6.0.0", + "@ant-design/icons-svg": "^4.2.1", + "@babel/runtime": "^7.11.2", + "classnames": "^2.2.6", + "rc-util": "^5.9.4" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/@ant-design/icons-svg": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.2.1.tgz", + "integrity": "sha512-EB0iwlKDGpG93hW8f85CTJTs4SvMX7tt5ceupvhALp1IF44SeUFOMhKUOYqpsoYWQKAOuTRDMqn75rEaKDp0Xw==" + }, + "node_modules/@ant-design/react-slick": { + "version": "0.29.2", + "resolved": "https://registry.npmjs.org/@ant-design/react-slick/-/react-slick-0.29.2.tgz", + "integrity": "sha512-kgjtKmkGHa19FW21lHnAfyyH9AAoh35pBdcJ53rHmQ3O+cfFHGHnUbj/HFrRNJ5vIts09FKJVAD8RpaC+RaWfA==", + "dependencies": { + "@babel/runtime": "^7.10.4", + "classnames": "^2.2.5", + "json2mq": "^0.2.0", + "lodash": "^4.17.21", + "resize-observer-polyfill": "^1.5.1" + }, + "peerDependencies": { + "react": ">=16.9.0" + } + }, "node_modules/@babel/code-frame": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", @@ -1794,11 +1866,11 @@ } }, "node_modules/@babel/runtime": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.0.tgz", - "integrity": "sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA==", + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.6.tgz", + "integrity": "sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA==", "dependencies": { - "regenerator-runtime": "^0.13.4" + "regenerator-runtime": "^0.13.11" }, "engines": { "node": ">=6.9.0" @@ -2138,6 +2210,24 @@ "postcss-selector-parser": "^6.0.10" } }, + "node_modules/@ctrl/tinycolor": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.5.0.tgz", + "integrity": "sha512-tlJpwF40DEQcfR/QF+wNMVyGMaO9FQp6Z1Wahj4Gk3CJQYHwA2xVG7iKDFdW6zuxZY9XWOpGcfNCTsX4McOsOg==", + "engines": { + "node": ">=10" + } + }, + "node_modules/@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" + }, + "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==" + }, "node_modules/@eslint/eslintrc": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", @@ -3100,6 +3190,53 @@ "url": "https://opencollective.com/popperjs" } }, + "node_modules/@rc-component/mini-decimal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rc-component/mini-decimal/-/mini-decimal-1.0.1.tgz", + "integrity": "sha512-9N8nRk0oKj1qJzANKl+n9eNSMUGsZtjwNuDCiZ/KA+dt1fE3zq5x2XxclRcAbOIXnZcJ53ozP2Pa60gyELXagA==", + "dependencies": { + "@babel/runtime": "^7.18.0" + }, + "engines": { + "node": ">=8.x" + } + }, + "node_modules/@rc-component/portal": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rc-component/portal/-/portal-1.0.3.tgz", + "integrity": "sha512-rG9j7OMiI9eLFLF6G0B4OcfLac9W8Z7Vjeizbjt/A6R+zzw7vhHbJ4GIkrDpUqXDvFdEEzdxfICpb8/noLwG+w==", + "dependencies": { + "@babel/runtime": "^7.18.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/tour": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rc-component/tour/-/tour-1.0.2.tgz", + "integrity": "sha512-yFTUjqQdlG+S7k9yVM+QwxsW6t/kaJ850EUihbTTGPCv65hJwm+c5TO0uO5qhc/Ro+YhE6nwdfu4Wt5EDJcNFw==", + "dependencies": { + "@babel/runtime": "^7.18.0", + "@rc-component/portal": "^1.0.0-9", + "classnames": "^2.3.2", + "rc-trigger": "^5.3.4", + "rc-util": "^5.24.4" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, "node_modules/@react-aria/ssr": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.3.0.tgz", @@ -3824,6 +3961,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", @@ -4226,6 +4372,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/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/warning": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.0.tgz", @@ -4834,6 +4985,67 @@ "node": ">=4" } }, + "node_modules/antd": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/antd/-/antd-5.0.4.tgz", + "integrity": "sha512-SbMmMTpenY8OfNABJl9/xEGhLP+2mQBbFxelT8ySFb7BR6KwsaVbz6BJOaBWmHBwNq86gXQWJtouQ9Znb6p0RA==", + "dependencies": { + "@ant-design/colors": "^6.0.0", + "@ant-design/cssinjs": "^1.0.0", + "@ant-design/icons": "^4.7.0", + "@ant-design/react-slick": "~0.29.1", + "@babel/runtime": "^7.18.3", + "@ctrl/tinycolor": "^3.4.0", + "@rc-component/tour": "~1.0.1-2", + "classnames": "^2.2.6", + "copy-to-clipboard": "^3.2.0", + "dayjs": "^1.11.1", + "lodash": "^4.17.21", + "rc-cascader": "~3.7.0", + "rc-checkbox": "~2.3.0", + "rc-collapse": "~3.4.2", + "rc-dialog": "~9.0.2", + "rc-drawer": "~6.0.0", + "rc-dropdown": "~4.0.0", + "rc-field-form": "~1.27.0", + "rc-image": "~5.12.0", + "rc-input": "~0.1.4", + "rc-input-number": "~7.4.0", + "rc-mentions": "~1.13.1", + "rc-menu": "~9.8.0", + "rc-motion": "^2.6.1", + "rc-notification": "~5.0.0-alpha.9", + "rc-pagination": "~3.2.0", + "rc-picker": "~3.1.1", + "rc-progress": "~3.4.1", + "rc-rate": "~2.9.0", + "rc-resize-observer": "^1.2.0", + "rc-segmented": "~2.1.0", + "rc-select": "~14.1.13", + "rc-slider": "~10.0.0", + "rc-steps": "~6.0.0-alpha.2", + "rc-switch": "~4.0.0", + "rc-table": "~7.26.0", + "rc-tabs": "~12.4.1", + "rc-textarea": "~0.4.5", + "rc-tooltip": "~5.2.0", + "rc-tree": "~5.7.0", + "rc-tree-select": "~5.5.4", + "rc-trigger": "^5.2.10", + "rc-upload": "~4.3.0", + "rc-util": "^5.25.2", + "scroll-into-view-if-needed": "^2.2.25", + "shallowequal": "^1.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ant-design" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, "node_modules/anymatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", @@ -4894,6 +5106,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array-tree-filter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-tree-filter/-/array-tree-filter-2.1.0.tgz", + "integrity": "sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==" + }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -4969,6 +5186,11 @@ "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" }, + "node_modules/async-validator": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", + "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==" + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -4982,6 +5204,14 @@ "node": ">= 4.0.0" } }, + "node_modules/attr-accept": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.2.tgz", + "integrity": "sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg==", + "engines": { + "node": ">=4" + } + }, "node_modules/autoprefixer": { "version": "10.4.12", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.12.tgz", @@ -5022,6 +5252,29 @@ "node": ">=4" } }, + "node_modules/axios": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.3.4.tgz", + "integrity": "sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axios/node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/axobject-query": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", @@ -5858,6 +6111,11 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/compute-scroll-into-view": { + "version": "1.0.20", + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz", + "integrity": "sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==" + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -5935,6 +6193,14 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, + "node_modules/copy-to-clipboard": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", + "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", + "dependencies": { + "toggle-selection": "^1.0.6" + } + }, "node_modules/core-js": { "version": "3.25.5", "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.25.5.tgz", @@ -6415,6 +6681,11 @@ "node": ">=10" } }, + "node_modules/dayjs": { + "version": "1.11.7", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz", + "integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==" + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -6645,6 +6916,11 @@ "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.14.tgz", "integrity": "sha512-NMt+m9zFMPZe0JcY9gN224Qvk6qLIdqex29clBvc/y75ZBX9YA9wNK3frsYvu2DI1xcCIwxwnX+TlsJ2DSOADg==" }, + "node_modules/dom-align": { + "version": "1.12.4", + "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.12.4.tgz", + "integrity": "sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==" + }, "node_modules/dom-converter": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", @@ -7934,6 +8210,17 @@ "webpack": "^4.0.0 || ^5.0.0" } }, + "node_modules/file-selector": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-0.6.0.tgz", + "integrity": "sha512-QlZ5yJC0VxHxQQsQhXvBaC7VRJ2uaxTf+Tfpu4Z/OcVQJVpZO+DGU0rkoVW5ce2SccxugvpBJoMvUs59iILYdw==", + "dependencies": { + "tslib": "^2.4.0" + }, + "engines": { + "node": ">= 12" + } + }, "node_modules/filelist": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", @@ -8610,6 +8897,19 @@ "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/hoist-non-react-statics/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/hoopy": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", @@ -11425,6 +11725,17 @@ "node": ">=4" } }, + "node_modules/json": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/json/-/json-11.0.0.tgz", + "integrity": "sha512-N/ITv3Yw9Za8cGxuQqSqrq6RHnlaHWZkAFavcfpH/R52522c26EbihMxnY7A1chxfXJ4d+cEFIsyTgfi9GihrA==", + "bin": { + "json": "lib/json.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, "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", @@ -11445,6 +11756,14 @@ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" }, + "node_modules/json2mq": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz", + "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==", + "dependencies": { + "string-convert": "^0.2.0" + } + }, "node_modules/json5": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", @@ -13838,6 +14157,11 @@ "node": ">= 0.10" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "node_modules/psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", @@ -13966,141 +14290,747 @@ "node": ">=0.10.0" } }, - "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "node_modules/rc-align": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/rc-align/-/rc-align-4.0.12.tgz", + "integrity": "sha512-3DuwSJp8iC/dgHzwreOQl52soj40LchlfUHtgACOUtwGuoFIOVh6n/sCpfqCU8kO5+iz6qR0YKvjgB8iPdE3aQ==", "dependencies": { - "loose-envify": "^1.1.0" + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "dom-align": "^1.7.0", + "lodash": "^4.17.21", + "rc-util": "^5.3.0", + "resize-observer-polyfill": "^1.5.1" }, - "engines": { - "node": ">=0.10.0" + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" } }, - "node_modules/react-app-polyfill": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-3.0.0.tgz", - "integrity": "sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w==", + "node_modules/rc-cascader": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/rc-cascader/-/rc-cascader-3.7.0.tgz", + "integrity": "sha512-SFtGpwmYN7RaWEAGTS4Rkc62ZV/qmQGg/tajr/7mfIkleuu8ro9Hlk6J+aA0x1YS4zlaZBtTcSaXM01QMiEV/A==", "dependencies": { - "core-js": "^3.19.2", - "object-assign": "^4.1.1", - "promise": "^8.1.0", - "raf": "^3.4.1", - "regenerator-runtime": "^0.13.9", - "whatwg-fetch": "^3.6.2" + "@babel/runtime": "^7.12.5", + "array-tree-filter": "^2.1.0", + "classnames": "^2.3.1", + "rc-select": "~14.1.0", + "rc-tree": "~5.7.0", + "rc-util": "^5.6.1" }, - "engines": { - "node": ">=14" + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" } }, - "node_modules/react-bootstrap": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-2.5.0.tgz", - "integrity": "sha512-j/aLR+okzbYk61TM3eDOU1NqOqnUdwyVrF+ojoCRUxPdzc2R0xXvqyRsjSoyRoCo7n82Fs/LWjPCin/QJNdwvA==", + "node_modules/rc-checkbox": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/rc-checkbox/-/rc-checkbox-2.3.2.tgz", + "integrity": "sha512-afVi1FYiGv1U0JlpNH/UaEXdh6WUJjcWokj/nUN2TgG80bfG+MDdbfHKlLcNNba94mbjy2/SXJ1HDgrOkXGAjg==", "dependencies": { - "@babel/runtime": "^7.17.2", - "@restart/hooks": "^0.4.6", - "@restart/ui": "^1.3.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" + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1" }, "peerDependencies": { - "@types/react": ">=16.14.8", - "react": ">=16.14.0", - "react-dom": ">=16.14.0" + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-collapse": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/rc-collapse/-/rc-collapse-3.4.2.tgz", + "integrity": "sha512-jpTwLgJzkhAgp2Wpi3xmbTbbYExg6fkptL67Uu5LCRVEj6wqmy0DHTjjeynsjOLsppHGHu41t1ELntZ0lEvS/Q==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.3.4", + "rc-util": "^5.2.1", + "shallowequal": "^1.1.0" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" } }, - "node_modules/react-dev-utils": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", - "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", + "node_modules/rc-dialog": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/rc-dialog/-/rc-dialog-9.0.2.tgz", + "integrity": "sha512-s3U+24xWUuB6Bn2Lk/Qt6rufy+uT+QvWkiFhNBcO9APLxcFFczWamaq7x9h8SCuhfc1nHcW4y8NbMsnAjNnWyg==", "dependencies": { - "@babel/code-frame": "^7.16.0", - "address": "^1.1.2", - "browserslist": "^4.18.1", - "chalk": "^4.1.2", - "cross-spawn": "^7.0.3", - "detect-port-alt": "^1.1.6", - "escape-string-regexp": "^4.0.0", - "filesize": "^8.0.6", - "find-up": "^5.0.0", - "fork-ts-checker-webpack-plugin": "^6.5.0", - "global-modules": "^2.0.0", - "globby": "^11.0.4", - "gzip-size": "^6.0.0", - "immer": "^9.0.7", - "is-root": "^2.1.0", - "loader-utils": "^3.2.0", - "open": "^8.4.0", - "pkg-up": "^3.1.0", - "prompts": "^2.4.2", - "react-error-overlay": "^6.0.11", - "recursive-readdir": "^2.2.2", - "shell-quote": "^1.7.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" + "@babel/runtime": "^7.10.1", + "@rc-component/portal": "^1.0.0-8", + "classnames": "^2.2.6", + "rc-motion": "^2.3.0", + "rc-util": "^5.21.0" }, - "engines": { - "node": ">=14" + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" } }, - "node_modules/react-dev-utils/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/rc-drawer": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/rc-drawer/-/rc-drawer-6.0.1.tgz", + "integrity": "sha512-ibWXGf8I+KRPXE03X4s0/xXzQI37YWXUV+oPy+R29GKxkjr98UTMgwvoQDKlZTm5AiaRuVFqhTKm0kNHqJh+TQ==", "dependencies": { - "color-convert": "^2.0.1" + "@babel/runtime": "^7.10.1", + "@rc-component/portal": "^1.0.0-6", + "classnames": "^2.2.6", + "rc-motion": "^2.6.1", + "rc-util": "^5.21.2" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-dropdown": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-4.0.1.tgz", + "integrity": "sha512-OdpXuOcme1rm45cR0Jzgfl1otzmU4vuBVb+etXM8vcaULGokAKVpKlw8p6xzspG7jGd/XxShvq+N3VNEfk/l5g==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "classnames": "^2.2.6", + "rc-trigger": "^5.3.1", + "rc-util": "^5.17.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependencies": { + "react": ">=16.11.0", + "react-dom": ">=16.11.0" } }, - "node_modules/react-dev-utils/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/rc-field-form": { + "version": "1.27.3", + "resolved": "https://registry.npmjs.org/rc-field-form/-/rc-field-form-1.27.3.tgz", + "integrity": "sha512-HGqxHnmGQgkPApEcikV4qTg3BLPC82uB/cwBDftDt1pYaqitJfSl5TFTTUMKVEJVT5RqJ2Zi68ME1HmIMX2HAw==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@babel/runtime": "^7.18.0", + "async-validator": "^4.1.0", + "rc-util": "^5.8.0" }, "engines": { - "node": ">=10" + "node": ">=8.x" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" } }, - "node_modules/react-dev-utils/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/rc-image": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/rc-image/-/rc-image-5.12.1.tgz", + "integrity": "sha512-FMldR/ODwQmlFlhjR4c6hsOHmnn4s9CxmW7PR/9XCYE1XHlGJ5OkSWOtJruoaLjVwt2tQYDRnLANf/mKZ9ReUg==", "dependencies": { - "color-name": "~1.1.4" + "@babel/runtime": "^7.11.2", + "@rc-component/portal": "^1.0.2", + "classnames": "^2.2.6", + "rc-dialog": "~9.0.0", + "rc-util": "^5.0.6" }, - "engines": { - "node": ">=7.0.0" + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" } }, - "node_modules/react-dev-utils/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, + "node_modules/rc-input": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/rc-input/-/rc-input-0.1.4.tgz", + "integrity": "sha512-FqDdNz+fV2dKNgfXzcSLKvC+jEs1709t7nD+WdfjrdSaOcefpgc7BUJYadc3usaING+b7ediMTfKxuJBsEFbXA==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-util": "^5.18.1" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/rc-input-number": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/rc-input-number/-/rc-input-number-7.4.0.tgz", + "integrity": "sha512-r/Oub/sPYbzqLNUOHnnc9sbCu78a81KX+RCbRwmpvB4W6nptUySbdWS5KHV4Hak5CAE1LAd+wWm5JjvZizG1FA==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/mini-decimal": "^1.0.1", + "classnames": "^2.2.5", + "rc-util": "^5.23.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-mentions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/rc-mentions/-/rc-mentions-1.13.1.tgz", + "integrity": "sha512-FCkaWw6JQygtOz0+Vxz/M/NWqrWHB9LwqlY2RtcuFqWJNFK9njijOOzTSsBGANliGufVUzx/xuPHmZPBV0+Hgw==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.6", + "rc-menu": "~9.8.0", + "rc-textarea": "^0.4.0", + "rc-trigger": "^5.0.4", + "rc-util": "^5.22.5" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-menu": { + "version": "9.8.1", + "resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-9.8.1.tgz", + "integrity": "sha512-179weouypfjWJSRvvoo/vPy+StojsMzK2XC5jRNhL1ryt/N/8wAFESte8K6jZJkNp9DHDLFTe+dCGmikKpiFuA==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.4.3", + "rc-overflow": "^1.2.8", + "rc-trigger": "^5.1.2", + "rc-util": "^5.12.0", + "shallowequal": "^1.1.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-motion": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.6.2.tgz", + "integrity": "sha512-4w1FaX3dtV749P8GwfS4fYnFG4Rb9pxvCYPc/b2fw1cmlHJWNNgOFIz7ysiD+eOrzJSvnLJWlNQQncpNMXwwpg==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-util": "^5.21.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-notification": { + "version": "5.0.0-alpha.9", + "resolved": "https://registry.npmjs.org/rc-notification/-/rc-notification-5.0.0-alpha.9.tgz", + "integrity": "sha512-QPvq8VHe2M0SE5DHJf7ADWlvfWKnTsj5FVxcu39gdjX98kKmi+BHY1eTPAQkkdGqd6ZXv6xXHl8qKHyWhQcFPA==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.6.0", + "rc-util": "^5.20.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-overflow": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc-overflow/-/rc-overflow-1.2.8.tgz", + "integrity": "sha512-QJ0UItckWPQ37ZL1dMEBAdY1dhfTXFL9k6oTTcyydVwoUNMnMqCGqnRNA98axSr/OeDKqR6DVFyi8eA5RQI/uQ==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.19.2" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-pagination": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/rc-pagination/-/rc-pagination-3.2.0.tgz", + "integrity": "sha512-5tIXjB670WwwcAJzAqp2J+cOBS9W3cH/WU1EiYwXljuZ4vtZXKlY2Idq8FZrnYBz8KhN3vwPo9CoV/SJS6SL1w==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-picker": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-3.1.2.tgz", + "integrity": "sha512-PHf4E91JANMBVjovqhRcZw0fDZYWlDW9APhMD8VxBSs2QeKbnf+vE5BdA3YmHq227woSptbkm9rfhR4dgSn4+g==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1", + "rc-trigger": "^5.0.4", + "rc-util": "^5.4.0", + "shallowequal": "^1.1.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "date-fns": ">= 2.x", + "dayjs": ">= 1.x", + "moment": ">= 2.x", + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + }, + "peerDependenciesMeta": { + "date-fns": { + "optional": true + }, + "dayjs": { + "optional": true + }, + "moment": { + "optional": true + } + } + }, + "node_modules/rc-progress": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/rc-progress/-/rc-progress-3.4.1.tgz", + "integrity": "sha512-eAFDHXlk8aWpoXl0llrenPMt9qKHQXphxcVsnKs0FHC6eCSk1ebJtyaVjJUzKe0233ogiLDeEFK1Uihz3s67hw==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.6", + "rc-util": "^5.16.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-rate": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/rc-rate/-/rc-rate-2.9.2.tgz", + "integrity": "sha512-SaiZFyN8pe0Fgphv8t3+kidlej+cq/EALkAJAc3A0w0XcPaH2L1aggM8bhe1u6GAGuQNAoFvTLjw4qLPGRKV5g==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-util": "^5.0.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-resize-observer": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.2.0.tgz", + "integrity": "sha512-6W+UzT3PyDM0wVCEHfoW3qTHPTvbdSgiA43buiy8PzmeMnfgnDeb9NjdimMXMl3/TcrvvWl5RRVdp+NqcR47pQ==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1", + "rc-util": "^5.15.0", + "resize-observer-polyfill": "^1.5.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-segmented": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/rc-segmented/-/rc-segmented-2.1.0.tgz", + "integrity": "sha512-hUlonro+pYoZcwrH6Vm56B2ftLfQh046hrwif/VwLIw1j3zGt52p5mREBwmeVzXnSwgnagpOpfafspzs1asjGw==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-motion": "^2.4.4", + "rc-util": "^5.17.0" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/rc-select": { + "version": "14.1.16", + "resolved": "https://registry.npmjs.org/rc-select/-/rc-select-14.1.16.tgz", + "integrity": "sha512-71XLHleuZmufpdV2vis5oituRkhg2WNvLpVMJBGWRar6WGAVOHXaY9DR5HvwWry3EGTn19BqnL6Xbybje6f8YA==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.0.1", + "rc-overflow": "^1.0.0", + "rc-trigger": "^5.0.4", + "rc-util": "^5.16.1", + "rc-virtual-list": "^3.2.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-slider": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-10.0.1.tgz", + "integrity": "sha512-igTKF3zBet7oS/3yNiIlmU8KnZ45npmrmHlUUio8PNbIhzMcsh+oE/r2UD42Y6YD2D/s+kzCQkzQrPD6RY435Q==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-util": "^5.18.1", + "shallowequal": "^1.1.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-steps": { + "version": "6.0.0-alpha.2", + "resolved": "https://registry.npmjs.org/rc-steps/-/rc-steps-6.0.0-alpha.2.tgz", + "integrity": "sha512-d/GPx7ATlPbtFeOVt5FB19W11OBCmRd7lLknt4aSoCI6ukwJqpEhWu2INN4pDOQqN04y3PDsWl1q9hnw+ZC5AA==", + "dependencies": { + "@babel/runtime": "^7.16.7", + "classnames": "^2.2.3", + "rc-util": "^5.16.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-switch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/rc-switch/-/rc-switch-4.0.0.tgz", + "integrity": "sha512-IfrYC99vN0gKaTyjQdqYuADU0eH00SAFHg3jOp8HrmUpJruhV1SohJzrCbPqPraZeX/6X/QKkdLfkdnUub05WA==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1", + "rc-util": "^5.0.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-table": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/rc-table/-/rc-table-7.26.0.tgz", + "integrity": "sha512-0cD8e6S+DTGAt5nBZQIPFYEaIukn17sfa5uFL98faHlH/whZzD8ii3dbFL4wmUDEL4BLybhYop+QUfZJ4CPvNQ==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-resize-observer": "^1.1.0", + "rc-util": "^5.22.5", + "shallowequal": "^1.1.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tabs": { + "version": "12.4.2", + "resolved": "https://registry.npmjs.org/rc-tabs/-/rc-tabs-12.4.2.tgz", + "integrity": "sha512-FFlGwuTjQUznWzJtyhmHc6KAp5lRQFxKUv9Aj1UtsOYe2e7WGmuzcrd+/LQchuPe0VjhaZPdGkmFGcqGqNO6ow==", + "dependencies": { + "@babel/runtime": "^7.11.2", + "classnames": "2.x", + "rc-dropdown": "~4.0.0", + "rc-menu": "~9.8.0", + "rc-motion": "^2.6.2", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.16.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-textarea": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/rc-textarea/-/rc-textarea-0.4.7.tgz", + "integrity": "sha512-IQPd1CDI3mnMlkFyzt2O4gQ2lxUsnBAeJEoZGJnkkXgORNqyM9qovdrCj9NzcRfpHgLdzaEbU3AmobNFGUznwQ==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.24.4", + "shallowequal": "^1.1.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tooltip": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-5.2.2.tgz", + "integrity": "sha512-jtQzU/18S6EI3lhSGoDYhPqNpWajMtS5VV/ld1LwyfrDByQpYmw/LW6U7oFXXLukjfDHQ7Ju705A82PRNFWYhg==", + "dependencies": { + "@babel/runtime": "^7.11.2", + "classnames": "^2.3.1", + "rc-trigger": "^5.0.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tree": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/rc-tree/-/rc-tree-5.7.2.tgz", + "integrity": "sha512-nmnL6qLnfwVckO5zoqKL2I9UhwDqzyCtjITQCkwhimyz1zfuFkG5ZPIXpzD/Guzso94qQA/QrMsvzic5W6QDjg==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.0.1", + "rc-util": "^5.16.1", + "rc-virtual-list": "^3.4.8" + }, + "engines": { + "node": ">=10.x" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-tree-select": { + "version": "5.5.5", + "resolved": "https://registry.npmjs.org/rc-tree-select/-/rc-tree-select-5.5.5.tgz", + "integrity": "sha512-k2av7jF6tW9bIO4mQhaVdV4kJ1c54oxV3/hHVU+oD251Gb5JN+m1RbJFTMf1o0rAFqkvto33rxMdpafaGKQRJw==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-select": "~14.1.0", + "rc-tree": "~5.7.0", + "rc-util": "^5.16.1" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-trigger": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-5.3.4.tgz", + "integrity": "sha512-mQv+vas0TwKcjAO2izNPkqR4j86OemLRmvL2nOzdP9OWNWA1ivoTt5hzFqYNW9zACwmTezRiN8bttrC7cZzYSw==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "classnames": "^2.2.6", + "rc-align": "^4.0.0", + "rc-motion": "^2.0.0", + "rc-util": "^5.19.2" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-upload": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/rc-upload/-/rc-upload-4.3.4.tgz", + "integrity": "sha512-uVbtHFGNjHG/RyAfm9fluXB6pvArAGyAx8z7XzXXyorEgVIWj6mOlriuDm0XowDHYz4ycNK0nE0oP3cbFnzxiQ==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "classnames": "^2.2.5", + "rc-util": "^5.2.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-util": { + "version": "5.25.2", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.25.2.tgz", + "integrity": "sha512-OyCO675K/rh4zG3e+LYaHw54WQFEYGV9ibkGawQxqCvf0G0PzUrLQjgZ6SfoHORdbEKN7eQMFn3hHQyA/P8Y5Q==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "react-is": "^16.12.0", + "shallowequal": "^1.1.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-util/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/rc-virtual-list": { + "version": "3.4.11", + "resolved": "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.4.11.tgz", + "integrity": "sha512-BvUUH60kkeTBPigN5F89HtGaA5jSP4y2aM6cJ4dk9Y42I9yY+h6i08wF6UKeDcxdfOU8j3I5HxkSS/xA77J3wA==", + "dependencies": { + "@babel/runtime": "^7.20.0", + "classnames": "^2.2.6", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.15.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-app-polyfill": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-3.0.0.tgz", + "integrity": "sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w==", + "dependencies": { + "core-js": "^3.19.2", + "object-assign": "^4.1.1", + "promise": "^8.1.0", + "raf": "^3.4.1", + "regenerator-runtime": "^0.13.9", + "whatwg-fetch": "^3.6.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/react-bootstrap": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-2.5.0.tgz", + "integrity": "sha512-j/aLR+okzbYk61TM3eDOU1NqOqnUdwyVrF+ojoCRUxPdzc2R0xXvqyRsjSoyRoCo7n82Fs/LWjPCin/QJNdwvA==", + "dependencies": { + "@babel/runtime": "^7.17.2", + "@restart/hooks": "^0.4.6", + "@restart/ui": "^1.3.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", + "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", + "dependencies": { + "@babel/code-frame": "^7.16.0", + "address": "^1.1.2", + "browserslist": "^4.18.1", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.3", + "detect-port-alt": "^1.1.6", + "escape-string-regexp": "^4.0.0", + "filesize": "^8.0.6", + "find-up": "^5.0.0", + "fork-ts-checker-webpack-plugin": "^6.5.0", + "global-modules": "^2.0.0", + "globby": "^11.0.4", + "gzip-size": "^6.0.0", + "immer": "^9.0.7", + "is-root": "^2.1.0", + "loader-utils": "^3.2.0", + "open": "^8.4.0", + "pkg-up": "^3.1.0", + "prompts": "^2.4.2", + "react-error-overlay": "^6.0.11", + "recursive-readdir": "^2.2.2", + "shell-quote": "^1.7.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/react-dev-utils/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/react-dev-utils/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/react-dev-utils/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/react-dev-utils/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, "node_modules/react-dev-utils/node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -14151,6 +15081,22 @@ "react": "^18.2.0" } }, + "node_modules/react-dropzone": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.2.3.tgz", + "integrity": "sha512-O3om8I+PkFKbxCukfIR3QAGftYXDZfOE2N1mr/7qebQJHs7U+/RSL/9xomJNpRg9kM5h9soQSdf0Gc7OHF5Fug==", + "dependencies": { + "attr-accept": "^2.2.2", + "file-selector": "^0.6.0", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">= 10.13" + }, + "peerDependencies": { + "react": ">= 16.8 || 18.0.0" + } + }, "node_modules/react-error-overlay": { "version": "6.0.11", "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", @@ -14166,6 +15112,49 @@ "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" }, + "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", @@ -14276,6 +15265,29 @@ } } }, + "node_modules/react-star-ratings": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/react-star-ratings/-/react-star-ratings-2.3.0.tgz", + "integrity": "sha512-34Z/oFNDRRn4ZcX7F3t9ccnpo7SQ32gD/vsusQOBc6B6vlqaGR6tke1/Yx3jTDjemKRSmXqhKgpPTR7/JAXq6A==", + "dependencies": { + "classnames": "^2.2.1", + "prop-types": "^15.6.0", + "react": "^16.1.0" + } + }, + "node_modules/react-star-ratings/node_modules/react": { + "version": "16.14.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", + "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/react-transition-group": { "version": "4.4.5", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", @@ -14357,6 +15369,14 @@ "node": ">=8" } }, + "node_modules/redux": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.0.tgz", + "integrity": "sha512-oSBmcKKIuIR4ME29/AeNUnl5L+hvBq7OaJWzaptTQJAntaPvxIJqfnjbaEiCzzaIz+XmVILfqAM3Ob0aXLPfjA==", + "dependencies": { + "@babel/runtime": "^7.9.2" + } + }, "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -14374,9 +15394,9 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" }, "node_modules/regenerator-transform": { "version": "0.15.0", @@ -14499,6 +15519,11 @@ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + }, "node_modules/resolve": { "version": "1.22.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", @@ -14825,6 +15850,14 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/scroll-into-view-if-needed": { + "version": "2.2.31", + "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz", + "integrity": "sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==", + "dependencies": { + "compute-scroll-into-view": "^1.0.20" + } + }, "node_modules/select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", @@ -14993,6 +16026,11 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, + "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==" + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -15219,6 +16257,11 @@ } ] }, + "node_modules/string-convert": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz", + "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==" + }, "node_modules/string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", @@ -15398,6 +16441,11 @@ "postcss": "^8.2.15" } }, + "node_modules/stylis": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz", + "integrity": "sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==" + }, "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -15751,6 +16799,11 @@ "node": ">=8.0" } }, + "node_modules/toggle-selection": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", + "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" + }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -16061,6 +17114,14 @@ "requires-port": "^1.0.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", @@ -17065,6 +18126,57 @@ "@jridgewell/trace-mapping": "^0.3.9" } }, + "@ant-design/colors": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-6.0.0.tgz", + "integrity": "sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==", + "requires": { + "@ctrl/tinycolor": "^3.4.0" + } + }, + "@ant-design/cssinjs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@ant-design/cssinjs/-/cssinjs-1.1.0.tgz", + "integrity": "sha512-9kfWCnlcWZLMc184HL7zGUU3odKo/5HBMNxDxhSds2DoIzi/ojmmOU1A1butWVDSPcAbLyNQ85vxUI8mkkHrlA==", + "requires": { + "@babel/runtime": "^7.11.1", + "@emotion/hash": "^0.8.0", + "@emotion/unitless": "^0.7.5", + "classnames": "^2.3.1", + "csstype": "^3.0.10", + "rc-util": "^5.24.2", + "stylis": "^4.0.13" + } + }, + "@ant-design/icons": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-4.8.0.tgz", + "integrity": "sha512-T89P2jG2vM7OJ0IfGx2+9FC5sQjtTzRSz+mCHTXkFn/ELZc2YpfStmYHmqzq2Jx55J0F7+O6i5/ZKFSVNWCKNg==", + "requires": { + "@ant-design/colors": "^6.0.0", + "@ant-design/icons-svg": "^4.2.1", + "@babel/runtime": "^7.11.2", + "classnames": "^2.2.6", + "rc-util": "^5.9.4" + } + }, + "@ant-design/icons-svg": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.2.1.tgz", + "integrity": "sha512-EB0iwlKDGpG93hW8f85CTJTs4SvMX7tt5ceupvhALp1IF44SeUFOMhKUOYqpsoYWQKAOuTRDMqn75rEaKDp0Xw==" + }, + "@ant-design/react-slick": { + "version": "0.29.2", + "resolved": "https://registry.npmjs.org/@ant-design/react-slick/-/react-slick-0.29.2.tgz", + "integrity": "sha512-kgjtKmkGHa19FW21lHnAfyyH9AAoh35pBdcJ53rHmQ3O+cfFHGHnUbj/HFrRNJ5vIts09FKJVAD8RpaC+RaWfA==", + "requires": { + "@babel/runtime": "^7.10.4", + "classnames": "^2.2.5", + "json2mq": "^0.2.0", + "lodash": "^4.17.21", + "resize-observer-polyfill": "^1.5.1" + } + }, "@babel/code-frame": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", @@ -18237,11 +19349,11 @@ } }, "@babel/runtime": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.0.tgz", - "integrity": "sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA==", + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.6.tgz", + "integrity": "sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA==", "requires": { - "regenerator-runtime": "^0.13.4" + "regenerator-runtime": "^0.13.11" } }, "@babel/runtime-corejs3": { @@ -18421,6 +19533,21 @@ "integrity": "sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg==", "requires": {} }, + "@ctrl/tinycolor": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.5.0.tgz", + "integrity": "sha512-tlJpwF40DEQcfR/QF+wNMVyGMaO9FQp6Z1Wahj4Gk3CJQYHwA2xVG7iKDFdW6zuxZY9XWOpGcfNCTsX4McOsOg==" + }, + "@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" + }, + "@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" + }, "@eslint/eslintrc": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", @@ -19114,6 +20241,36 @@ "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz", "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==" }, + "@rc-component/mini-decimal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rc-component/mini-decimal/-/mini-decimal-1.0.1.tgz", + "integrity": "sha512-9N8nRk0oKj1qJzANKl+n9eNSMUGsZtjwNuDCiZ/KA+dt1fE3zq5x2XxclRcAbOIXnZcJ53ozP2Pa60gyELXagA==", + "requires": { + "@babel/runtime": "^7.18.0" + } + }, + "@rc-component/portal": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rc-component/portal/-/portal-1.0.3.tgz", + "integrity": "sha512-rG9j7OMiI9eLFLF6G0B4OcfLac9W8Z7Vjeizbjt/A6R+zzw7vhHbJ4GIkrDpUqXDvFdEEzdxfICpb8/noLwG+w==", + "requires": { + "@babel/runtime": "^7.18.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + } + }, + "@rc-component/tour": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rc-component/tour/-/tour-1.0.2.tgz", + "integrity": "sha512-yFTUjqQdlG+S7k9yVM+QwxsW6t/kaJ850EUihbTTGPCv65hJwm+c5TO0uO5qhc/Ro+YhE6nwdfu4Wt5EDJcNFw==", + "requires": { + "@babel/runtime": "^7.18.0", + "@rc-component/portal": "^1.0.0-9", + "classnames": "^2.3.2", + "rc-trigger": "^5.3.4", + "rc-util": "^5.24.4" + } + }, "@react-aria/ssr": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.3.0.tgz", @@ -19632,6 +20789,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", @@ -19981,6 +21147,11 @@ "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.2.tgz", "integrity": "sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg==" }, + "@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/warning": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.0.tgz", @@ -20419,6 +21590,59 @@ "color-convert": "^1.9.0" } }, + "antd": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/antd/-/antd-5.0.4.tgz", + "integrity": "sha512-SbMmMTpenY8OfNABJl9/xEGhLP+2mQBbFxelT8ySFb7BR6KwsaVbz6BJOaBWmHBwNq86gXQWJtouQ9Znb6p0RA==", + "requires": { + "@ant-design/colors": "^6.0.0", + "@ant-design/cssinjs": "^1.0.0", + "@ant-design/icons": "^4.7.0", + "@ant-design/react-slick": "~0.29.1", + "@babel/runtime": "^7.18.3", + "@ctrl/tinycolor": "^3.4.0", + "@rc-component/tour": "~1.0.1-2", + "classnames": "^2.2.6", + "copy-to-clipboard": "^3.2.0", + "dayjs": "^1.11.1", + "lodash": "^4.17.21", + "rc-cascader": "~3.7.0", + "rc-checkbox": "~2.3.0", + "rc-collapse": "~3.4.2", + "rc-dialog": "~9.0.2", + "rc-drawer": "~6.0.0", + "rc-dropdown": "~4.0.0", + "rc-field-form": "~1.27.0", + "rc-image": "~5.12.0", + "rc-input": "~0.1.4", + "rc-input-number": "~7.4.0", + "rc-mentions": "~1.13.1", + "rc-menu": "~9.8.0", + "rc-motion": "^2.6.1", + "rc-notification": "~5.0.0-alpha.9", + "rc-pagination": "~3.2.0", + "rc-picker": "~3.1.1", + "rc-progress": "~3.4.1", + "rc-rate": "~2.9.0", + "rc-resize-observer": "^1.2.0", + "rc-segmented": "~2.1.0", + "rc-select": "~14.1.13", + "rc-slider": "~10.0.0", + "rc-steps": "~6.0.0-alpha.2", + "rc-switch": "~4.0.0", + "rc-table": "~7.26.0", + "rc-tabs": "~12.4.1", + "rc-textarea": "~0.4.5", + "rc-tooltip": "~5.2.0", + "rc-tree": "~5.7.0", + "rc-tree-select": "~5.5.4", + "rc-trigger": "^5.2.10", + "rc-upload": "~4.3.0", + "rc-util": "^5.25.2", + "scroll-into-view-if-needed": "^2.2.25", + "shallowequal": "^1.1.0" + } + }, "anymatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", @@ -20467,6 +21691,11 @@ "is-string": "^1.0.7" } }, + "array-tree-filter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-tree-filter/-/array-tree-filter-2.1.0.tgz", + "integrity": "sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==" + }, "array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -20521,6 +21750,11 @@ "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" }, + "async-validator": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", + "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==" + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -20531,6 +21765,11 @@ "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" }, + "attr-accept": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.2.tgz", + "integrity": "sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg==" + }, "autoprefixer": { "version": "10.4.12", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.12.tgz", @@ -20549,6 +21788,28 @@ "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.3.tgz", "integrity": "sha512-32+ub6kkdhhWick/UjvEwRchgoetXqTK14INLqbGm5U2TzBkBNF3nQtLYm8ovxSkQWArjEQvftCKryjZaATu3w==" }, + "axios": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.3.4.tgz", + "integrity": "sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ==", + "requires": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + }, + "dependencies": { + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + } + } + }, "axobject-query": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", @@ -21187,6 +22448,11 @@ } } }, + "compute-scroll-into-view": { + "version": "1.0.20", + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz", + "integrity": "sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==" + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -21240,6 +22506,14 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, + "copy-to-clipboard": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", + "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", + "requires": { + "toggle-selection": "^1.0.6" + } + }, "core-js": { "version": "3.25.5", "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.25.5.tgz", @@ -21562,6 +22836,11 @@ "whatwg-url": "^8.0.0" } }, + "dayjs": { + "version": "1.11.7", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz", + "integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==" + }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -21730,6 +23009,11 @@ "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.14.tgz", "integrity": "sha512-NMt+m9zFMPZe0JcY9gN224Qvk6qLIdqex29clBvc/y75ZBX9YA9wNK3frsYvu2DI1xcCIwxwnX+TlsJ2DSOADg==" }, + "dom-align": { + "version": "1.12.4", + "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.12.4.tgz", + "integrity": "sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==" + }, "dom-converter": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", @@ -22677,6 +23961,14 @@ "schema-utils": "^3.0.0" } }, + "file-selector": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-0.6.0.tgz", + "integrity": "sha512-QlZ5yJC0VxHxQQsQhXvBaC7VRJ2uaxTf+Tfpu4Z/OcVQJVpZO+DGU0rkoVW5ce2SccxugvpBJoMvUs59iILYdw==", + "requires": { + "tslib": "^2.4.0" + } + }, "filelist": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", @@ -23146,6 +24438,21 @@ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" }, + "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" + }, + "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==" + } + } + }, "hoopy": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", @@ -25179,6 +26486,11 @@ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" }, + "json": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/json/-/json-11.0.0.tgz", + "integrity": "sha512-N/ITv3Yw9Za8cGxuQqSqrq6RHnlaHWZkAFavcfpH/R52522c26EbihMxnY7A1chxfXJ4d+cEFIsyTgfi9GihrA==" + }, "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", @@ -25199,6 +26511,14 @@ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" }, + "json2mq": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz", + "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==", + "requires": { + "string-convert": "^0.2.0" + } + }, "json5": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", @@ -26753,6 +28073,11 @@ } } }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", @@ -26838,6 +28163,420 @@ } } }, + "rc-align": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/rc-align/-/rc-align-4.0.12.tgz", + "integrity": "sha512-3DuwSJp8iC/dgHzwreOQl52soj40LchlfUHtgACOUtwGuoFIOVh6n/sCpfqCU8kO5+iz6qR0YKvjgB8iPdE3aQ==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "dom-align": "^1.7.0", + "lodash": "^4.17.21", + "rc-util": "^5.3.0", + "resize-observer-polyfill": "^1.5.1" + } + }, + "rc-cascader": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/rc-cascader/-/rc-cascader-3.7.0.tgz", + "integrity": "sha512-SFtGpwmYN7RaWEAGTS4Rkc62ZV/qmQGg/tajr/7mfIkleuu8ro9Hlk6J+aA0x1YS4zlaZBtTcSaXM01QMiEV/A==", + "requires": { + "@babel/runtime": "^7.12.5", + "array-tree-filter": "^2.1.0", + "classnames": "^2.3.1", + "rc-select": "~14.1.0", + "rc-tree": "~5.7.0", + "rc-util": "^5.6.1" + } + }, + "rc-checkbox": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/rc-checkbox/-/rc-checkbox-2.3.2.tgz", + "integrity": "sha512-afVi1FYiGv1U0JlpNH/UaEXdh6WUJjcWokj/nUN2TgG80bfG+MDdbfHKlLcNNba94mbjy2/SXJ1HDgrOkXGAjg==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1" + } + }, + "rc-collapse": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/rc-collapse/-/rc-collapse-3.4.2.tgz", + "integrity": "sha512-jpTwLgJzkhAgp2Wpi3xmbTbbYExg6fkptL67Uu5LCRVEj6wqmy0DHTjjeynsjOLsppHGHu41t1ELntZ0lEvS/Q==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.3.4", + "rc-util": "^5.2.1", + "shallowequal": "^1.1.0" + } + }, + "rc-dialog": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/rc-dialog/-/rc-dialog-9.0.2.tgz", + "integrity": "sha512-s3U+24xWUuB6Bn2Lk/Qt6rufy+uT+QvWkiFhNBcO9APLxcFFczWamaq7x9h8SCuhfc1nHcW4y8NbMsnAjNnWyg==", + "requires": { + "@babel/runtime": "^7.10.1", + "@rc-component/portal": "^1.0.0-8", + "classnames": "^2.2.6", + "rc-motion": "^2.3.0", + "rc-util": "^5.21.0" + } + }, + "rc-drawer": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/rc-drawer/-/rc-drawer-6.0.1.tgz", + "integrity": "sha512-ibWXGf8I+KRPXE03X4s0/xXzQI37YWXUV+oPy+R29GKxkjr98UTMgwvoQDKlZTm5AiaRuVFqhTKm0kNHqJh+TQ==", + "requires": { + "@babel/runtime": "^7.10.1", + "@rc-component/portal": "^1.0.0-6", + "classnames": "^2.2.6", + "rc-motion": "^2.6.1", + "rc-util": "^5.21.2" + } + }, + "rc-dropdown": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-4.0.1.tgz", + "integrity": "sha512-OdpXuOcme1rm45cR0Jzgfl1otzmU4vuBVb+etXM8vcaULGokAKVpKlw8p6xzspG7jGd/XxShvq+N3VNEfk/l5g==", + "requires": { + "@babel/runtime": "^7.18.3", + "classnames": "^2.2.6", + "rc-trigger": "^5.3.1", + "rc-util": "^5.17.0" + } + }, + "rc-field-form": { + "version": "1.27.3", + "resolved": "https://registry.npmjs.org/rc-field-form/-/rc-field-form-1.27.3.tgz", + "integrity": "sha512-HGqxHnmGQgkPApEcikV4qTg3BLPC82uB/cwBDftDt1pYaqitJfSl5TFTTUMKVEJVT5RqJ2Zi68ME1HmIMX2HAw==", + "requires": { + "@babel/runtime": "^7.18.0", + "async-validator": "^4.1.0", + "rc-util": "^5.8.0" + } + }, + "rc-image": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/rc-image/-/rc-image-5.12.1.tgz", + "integrity": "sha512-FMldR/ODwQmlFlhjR4c6hsOHmnn4s9CxmW7PR/9XCYE1XHlGJ5OkSWOtJruoaLjVwt2tQYDRnLANf/mKZ9ReUg==", + "requires": { + "@babel/runtime": "^7.11.2", + "@rc-component/portal": "^1.0.2", + "classnames": "^2.2.6", + "rc-dialog": "~9.0.0", + "rc-util": "^5.0.6" + } + }, + "rc-input": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/rc-input/-/rc-input-0.1.4.tgz", + "integrity": "sha512-FqDdNz+fV2dKNgfXzcSLKvC+jEs1709t7nD+WdfjrdSaOcefpgc7BUJYadc3usaING+b7ediMTfKxuJBsEFbXA==", + "requires": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-util": "^5.18.1" + } + }, + "rc-input-number": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/rc-input-number/-/rc-input-number-7.4.0.tgz", + "integrity": "sha512-r/Oub/sPYbzqLNUOHnnc9sbCu78a81KX+RCbRwmpvB4W6nptUySbdWS5KHV4Hak5CAE1LAd+wWm5JjvZizG1FA==", + "requires": { + "@babel/runtime": "^7.10.1", + "@rc-component/mini-decimal": "^1.0.1", + "classnames": "^2.2.5", + "rc-util": "^5.23.0" + } + }, + "rc-mentions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/rc-mentions/-/rc-mentions-1.13.1.tgz", + "integrity": "sha512-FCkaWw6JQygtOz0+Vxz/M/NWqrWHB9LwqlY2RtcuFqWJNFK9njijOOzTSsBGANliGufVUzx/xuPHmZPBV0+Hgw==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.6", + "rc-menu": "~9.8.0", + "rc-textarea": "^0.4.0", + "rc-trigger": "^5.0.4", + "rc-util": "^5.22.5" + } + }, + "rc-menu": { + "version": "9.8.1", + "resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-9.8.1.tgz", + "integrity": "sha512-179weouypfjWJSRvvoo/vPy+StojsMzK2XC5jRNhL1ryt/N/8wAFESte8K6jZJkNp9DHDLFTe+dCGmikKpiFuA==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.4.3", + "rc-overflow": "^1.2.8", + "rc-trigger": "^5.1.2", + "rc-util": "^5.12.0", + "shallowequal": "^1.1.0" + } + }, + "rc-motion": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.6.2.tgz", + "integrity": "sha512-4w1FaX3dtV749P8GwfS4fYnFG4Rb9pxvCYPc/b2fw1cmlHJWNNgOFIz7ysiD+eOrzJSvnLJWlNQQncpNMXwwpg==", + "requires": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-util": "^5.21.0" + } + }, + "rc-notification": { + "version": "5.0.0-alpha.9", + "resolved": "https://registry.npmjs.org/rc-notification/-/rc-notification-5.0.0-alpha.9.tgz", + "integrity": "sha512-QPvq8VHe2M0SE5DHJf7ADWlvfWKnTsj5FVxcu39gdjX98kKmi+BHY1eTPAQkkdGqd6ZXv6xXHl8qKHyWhQcFPA==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.6.0", + "rc-util": "^5.20.1" + } + }, + "rc-overflow": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc-overflow/-/rc-overflow-1.2.8.tgz", + "integrity": "sha512-QJ0UItckWPQ37ZL1dMEBAdY1dhfTXFL9k6oTTcyydVwoUNMnMqCGqnRNA98axSr/OeDKqR6DVFyi8eA5RQI/uQ==", + "requires": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.19.2" + } + }, + "rc-pagination": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/rc-pagination/-/rc-pagination-3.2.0.tgz", + "integrity": "sha512-5tIXjB670WwwcAJzAqp2J+cOBS9W3cH/WU1EiYwXljuZ4vtZXKlY2Idq8FZrnYBz8KhN3vwPo9CoV/SJS6SL1w==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1" + } + }, + "rc-picker": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-3.1.2.tgz", + "integrity": "sha512-PHf4E91JANMBVjovqhRcZw0fDZYWlDW9APhMD8VxBSs2QeKbnf+vE5BdA3YmHq227woSptbkm9rfhR4dgSn4+g==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1", + "rc-trigger": "^5.0.4", + "rc-util": "^5.4.0", + "shallowequal": "^1.1.0" + } + }, + "rc-progress": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/rc-progress/-/rc-progress-3.4.1.tgz", + "integrity": "sha512-eAFDHXlk8aWpoXl0llrenPMt9qKHQXphxcVsnKs0FHC6eCSk1ebJtyaVjJUzKe0233ogiLDeEFK1Uihz3s67hw==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.6", + "rc-util": "^5.16.1" + } + }, + "rc-rate": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/rc-rate/-/rc-rate-2.9.2.tgz", + "integrity": "sha512-SaiZFyN8pe0Fgphv8t3+kidlej+cq/EALkAJAc3A0w0XcPaH2L1aggM8bhe1u6GAGuQNAoFvTLjw4qLPGRKV5g==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-util": "^5.0.1" + } + }, + "rc-resize-observer": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.2.0.tgz", + "integrity": "sha512-6W+UzT3PyDM0wVCEHfoW3qTHPTvbdSgiA43buiy8PzmeMnfgnDeb9NjdimMXMl3/TcrvvWl5RRVdp+NqcR47pQ==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1", + "rc-util": "^5.15.0", + "resize-observer-polyfill": "^1.5.1" + } + }, + "rc-segmented": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/rc-segmented/-/rc-segmented-2.1.0.tgz", + "integrity": "sha512-hUlonro+pYoZcwrH6Vm56B2ftLfQh046hrwif/VwLIw1j3zGt52p5mREBwmeVzXnSwgnagpOpfafspzs1asjGw==", + "requires": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-motion": "^2.4.4", + "rc-util": "^5.17.0" + } + }, + "rc-select": { + "version": "14.1.16", + "resolved": "https://registry.npmjs.org/rc-select/-/rc-select-14.1.16.tgz", + "integrity": "sha512-71XLHleuZmufpdV2vis5oituRkhg2WNvLpVMJBGWRar6WGAVOHXaY9DR5HvwWry3EGTn19BqnL6Xbybje6f8YA==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.0.1", + "rc-overflow": "^1.0.0", + "rc-trigger": "^5.0.4", + "rc-util": "^5.16.1", + "rc-virtual-list": "^3.2.0" + } + }, + "rc-slider": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-10.0.1.tgz", + "integrity": "sha512-igTKF3zBet7oS/3yNiIlmU8KnZ45npmrmHlUUio8PNbIhzMcsh+oE/r2UD42Y6YD2D/s+kzCQkzQrPD6RY435Q==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-util": "^5.18.1", + "shallowequal": "^1.1.0" + } + }, + "rc-steps": { + "version": "6.0.0-alpha.2", + "resolved": "https://registry.npmjs.org/rc-steps/-/rc-steps-6.0.0-alpha.2.tgz", + "integrity": "sha512-d/GPx7ATlPbtFeOVt5FB19W11OBCmRd7lLknt4aSoCI6ukwJqpEhWu2INN4pDOQqN04y3PDsWl1q9hnw+ZC5AA==", + "requires": { + "@babel/runtime": "^7.16.7", + "classnames": "^2.2.3", + "rc-util": "^5.16.1" + } + }, + "rc-switch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/rc-switch/-/rc-switch-4.0.0.tgz", + "integrity": "sha512-IfrYC99vN0gKaTyjQdqYuADU0eH00SAFHg3jOp8HrmUpJruhV1SohJzrCbPqPraZeX/6X/QKkdLfkdnUub05WA==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1", + "rc-util": "^5.0.1" + } + }, + "rc-table": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/rc-table/-/rc-table-7.26.0.tgz", + "integrity": "sha512-0cD8e6S+DTGAt5nBZQIPFYEaIukn17sfa5uFL98faHlH/whZzD8ii3dbFL4wmUDEL4BLybhYop+QUfZJ4CPvNQ==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-resize-observer": "^1.1.0", + "rc-util": "^5.22.5", + "shallowequal": "^1.1.0" + } + }, + "rc-tabs": { + "version": "12.4.2", + "resolved": "https://registry.npmjs.org/rc-tabs/-/rc-tabs-12.4.2.tgz", + "integrity": "sha512-FFlGwuTjQUznWzJtyhmHc6KAp5lRQFxKUv9Aj1UtsOYe2e7WGmuzcrd+/LQchuPe0VjhaZPdGkmFGcqGqNO6ow==", + "requires": { + "@babel/runtime": "^7.11.2", + "classnames": "2.x", + "rc-dropdown": "~4.0.0", + "rc-menu": "~9.8.0", + "rc-motion": "^2.6.2", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.16.0" + } + }, + "rc-textarea": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/rc-textarea/-/rc-textarea-0.4.7.tgz", + "integrity": "sha512-IQPd1CDI3mnMlkFyzt2O4gQ2lxUsnBAeJEoZGJnkkXgORNqyM9qovdrCj9NzcRfpHgLdzaEbU3AmobNFGUznwQ==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.24.4", + "shallowequal": "^1.1.0" + } + }, + "rc-tooltip": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-5.2.2.tgz", + "integrity": "sha512-jtQzU/18S6EI3lhSGoDYhPqNpWajMtS5VV/ld1LwyfrDByQpYmw/LW6U7oFXXLukjfDHQ7Ju705A82PRNFWYhg==", + "requires": { + "@babel/runtime": "^7.11.2", + "classnames": "^2.3.1", + "rc-trigger": "^5.0.0" + } + }, + "rc-tree": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/rc-tree/-/rc-tree-5.7.2.tgz", + "integrity": "sha512-nmnL6qLnfwVckO5zoqKL2I9UhwDqzyCtjITQCkwhimyz1zfuFkG5ZPIXpzD/Guzso94qQA/QrMsvzic5W6QDjg==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.0.1", + "rc-util": "^5.16.1", + "rc-virtual-list": "^3.4.8" + } + }, + "rc-tree-select": { + "version": "5.5.5", + "resolved": "https://registry.npmjs.org/rc-tree-select/-/rc-tree-select-5.5.5.tgz", + "integrity": "sha512-k2av7jF6tW9bIO4mQhaVdV4kJ1c54oxV3/hHVU+oD251Gb5JN+m1RbJFTMf1o0rAFqkvto33rxMdpafaGKQRJw==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-select": "~14.1.0", + "rc-tree": "~5.7.0", + "rc-util": "^5.16.1" + } + }, + "rc-trigger": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-5.3.4.tgz", + "integrity": "sha512-mQv+vas0TwKcjAO2izNPkqR4j86OemLRmvL2nOzdP9OWNWA1ivoTt5hzFqYNW9zACwmTezRiN8bttrC7cZzYSw==", + "requires": { + "@babel/runtime": "^7.18.3", + "classnames": "^2.2.6", + "rc-align": "^4.0.0", + "rc-motion": "^2.0.0", + "rc-util": "^5.19.2" + } + }, + "rc-upload": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/rc-upload/-/rc-upload-4.3.4.tgz", + "integrity": "sha512-uVbtHFGNjHG/RyAfm9fluXB6pvArAGyAx8z7XzXXyorEgVIWj6mOlriuDm0XowDHYz4ycNK0nE0oP3cbFnzxiQ==", + "requires": { + "@babel/runtime": "^7.18.3", + "classnames": "^2.2.5", + "rc-util": "^5.2.0" + } + }, + "rc-util": { + "version": "5.25.2", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.25.2.tgz", + "integrity": "sha512-OyCO675K/rh4zG3e+LYaHw54WQFEYGV9ibkGawQxqCvf0G0PzUrLQjgZ6SfoHORdbEKN7eQMFn3hHQyA/P8Y5Q==", + "requires": { + "@babel/runtime": "^7.18.3", + "react-is": "^16.12.0", + "shallowequal": "^1.1.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==" + } + } + }, + "rc-virtual-list": { + "version": "3.4.11", + "resolved": "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.4.11.tgz", + "integrity": "sha512-BvUUH60kkeTBPigN5F89HtGaA5jSP4y2aM6cJ4dk9Y42I9yY+h6i08wF6UKeDcxdfOU8j3I5HxkSS/xA77J3wA==", + "requires": { + "@babel/runtime": "^7.20.0", + "classnames": "^2.2.6", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.15.0" + } + }, "react": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", @@ -26973,6 +28712,16 @@ "scheduler": "^0.23.0" } }, + "react-dropzone": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.2.3.tgz", + "integrity": "sha512-O3om8I+PkFKbxCukfIR3QAGftYXDZfOE2N1mr/7qebQJHs7U+/RSL/9xomJNpRg9kM5h9soQSdf0Gc7OHF5Fug==", + "requires": { + "attr-accept": "^2.2.2", + "file-selector": "^0.6.0", + "prop-types": "^15.8.1" + } + }, "react-error-overlay": { "version": "6.0.11", "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", @@ -26988,6 +28737,26 @@ "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" }, + "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", @@ -27065,6 +28834,28 @@ "workbox-webpack-plugin": "^6.4.1" } }, + "react-star-ratings": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/react-star-ratings/-/react-star-ratings-2.3.0.tgz", + "integrity": "sha512-34Z/oFNDRRn4ZcX7F3t9ccnpo7SQ32gD/vsusQOBc6B6vlqaGR6tke1/Yx3jTDjemKRSmXqhKgpPTR7/JAXq6A==", + "requires": { + "classnames": "^2.2.1", + "prop-types": "^15.6.0", + "react": "^16.1.0" + }, + "dependencies": { + "react": { + "version": "16.14.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", + "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" + } + } + } + }, "react-transition-group": { "version": "4.4.5", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", @@ -27129,6 +28920,14 @@ "strip-indent": "^3.0.0" } }, + "redux": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.0.tgz", + "integrity": "sha512-oSBmcKKIuIR4ME29/AeNUnl5L+hvBq7OaJWzaptTQJAntaPvxIJqfnjbaEiCzzaIz+XmVILfqAM3Ob0aXLPfjA==", + "requires": { + "@babel/runtime": "^7.9.2" + } + }, "regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -27143,9 +28942,9 @@ } }, "regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" }, "regenerator-transform": { "version": "0.15.0", @@ -27240,6 +29039,11 @@ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" }, + "resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + }, "resolve": { "version": "1.22.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", @@ -27444,6 +29248,14 @@ "ajv-keywords": "^3.5.2" } }, + "scroll-into-view-if-needed": { + "version": "2.2.31", + "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz", + "integrity": "sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==", + "requires": { + "compute-scroll-into-view": "^1.0.20" + } + }, "select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", @@ -27591,6 +29403,11 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, + "shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -27765,6 +29582,11 @@ } } }, + "string-convert": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz", + "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==" + }, "string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", @@ -27892,6 +29714,11 @@ "postcss-selector-parser": "^6.0.4" } }, + "stylis": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz", + "integrity": "sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==" + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -28156,6 +29983,11 @@ "is-number": "^7.0.0" } }, + "toggle-selection": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", + "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" + }, "toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -28379,6 +30211,12 @@ "requires-port": "^1.0.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/package.json b/package.json index 8c3f7cc..0d79fa5 100644 --- a/package.json +++ b/package.json @@ -6,17 +6,25 @@ "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^13.5.0", + "antd": "^5.0.4", + "axios": "^1.3.4", "bootstrap": "^5.2.2", + "json": "^11.0.0", "react": "^18.2.0", "react-bootstrap": "^2.5.0", "react-dom": "^18.2.0", + "react-dropzone": "^14.2.3", + "react-redux": "^8.0.5", "react-router-dom": "^6.4.2", "react-scripts": "5.0.1", + "react-star-ratings": "^2.3.0", + "redux": "^4.2.0", "web-vitals": "^2.1.4" }, "scripts": { "start": "react-scripts start", "build": "react-scripts build", + "build:gh-pages": "PUBLIC_URL=./karthikeya-io react-scripts build", "test": "react-scripts test", "eject": "react-scripts eject" }, diff --git a/public/index.html b/public/index.html index f30fc14..b0207ee 100644 --- a/public/index.html +++ b/public/index.html @@ -4,6 +4,7 @@ + diff --git a/src/action/action-types.js b/src/action/action-types.js new file mode 100644 index 0000000..cdf6404 --- /dev/null +++ b/src/action/action-types.js @@ -0,0 +1,2 @@ +export const SIGNIN = "SIGNIN" +export const SIGNOUT = "SIGNOUT" \ No newline at end of file diff --git a/src/action/learnpedia.js b/src/action/learnpedia.js new file mode 100644 index 0000000..620f944 --- /dev/null +++ b/src/action/learnpedia.js @@ -0,0 +1,22 @@ +import { SIGNIN, SIGNOUT } from './action-types' + +export const signIn = (userDetails) => { + if (typeof window !== "undefined") { + localStorage.setItem("jwt", userDetails.token); + localStorage.setItem("user", JSON.stringify(userDetails.user)); + } + return{ + type: SIGNIN, + payload: userDetails.user, +} +} + +export const signOut = () => { + if (typeof window !== "undefined") { + localStorage.removeItem("jwt"); + localStorage.removeItem("user"); + } + return { + type: SIGNOUT + } +} \ No newline at end of file diff --git a/src/components/Admin.jsx b/src/components/Admin.jsx new file mode 100644 index 0000000..6c026f3 --- /dev/null +++ b/src/components/Admin.jsx @@ -0,0 +1,44 @@ +import React, { useEffect, useState } from 'react' +import Table from './Table' +import classes from "../css/Admin.module.css" +import { Link } from 'react-router-dom' + + +const Admin = () => { + const { body, column, left, right, section } = classes + + const [users, setUsers] = useState([]) + + useEffect(() => { + fetch(`https://learnpedia-backend-ci.azurewebsites.net/api/users/${JSON.parse(localStorage.getItem('user'))._id}`, { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + authorization: `Bearer ${localStorage.getItem('jwt')}`, + accept: 'application/json' + } + }) + .then((response) => response.json()) + .then((data) => { + setUsers(data) + }); + }, []) + + return ( + <> + +
+
+
Users
+
Courses
+ +
+
+
+
+
+ + ) +} + +export default Admin \ No newline at end of file diff --git a/src/components/AdminCourses.jsx b/src/components/AdminCourses.jsx new file mode 100644 index 0000000..c96ef69 --- /dev/null +++ b/src/components/AdminCourses.jsx @@ -0,0 +1,35 @@ +import React, { useEffect, useState } from 'react' +import classes from "../css/Admin.module.css" +import CoursesTable from './CoursesTable' +import { Link } from 'react-router-dom' + +const Admin = () => { + const { body, column, left, right, section } = classes + + const [courses, setCourses] = useState([]) + + useEffect( () => { + fetch('https://learnpedia-backend-ci.azurewebsites.net/api/courses') + .then((response) => response.json()) + .then((data) => { + setCourses(data) + }); +}, []) + + return ( + <> + +
+
+
Users
+
Courses
+
+
+ +
+
+ + ) +} + +export default Admin \ No newline at end of file diff --git a/src/components/App.jsx b/src/components/App.jsx index d296540..868aefa 100644 --- a/src/components/App.jsx +++ b/src/components/App.jsx @@ -1,9 +1,19 @@ import { Outlet } from 'react-router-dom'; import '../css/App.css'; import Nav from './Nav'; +import { connect } from 'react-redux' +import { signIn } from '../action/learnpedia' +import { useEffect } from 'react'; +function App({signIn}) { + useEffect(() => { + const token = localStorage.getItem('jwt') + if (token) { + const user = JSON.parse(localStorage.getItem('user')) + signIn({user, token}) + } + }, []) -function App() { return (
@@ -14,4 +24,18 @@ function App() { ); } -export default App; +const mapStateToProps = state => { + return { + userDetails: state.userDetails + } +} + +const mapDispatchToProps = dispatch => ({ + signIn: (userDetails) => { + dispatch(signIn(userDetails)) + }, +}) + +export default connect(mapStateToProps, mapDispatchToProps)(App); + +// export default App; diff --git a/src/components/Card.jsx b/src/components/Card.jsx index 50d7fed..f7c6940 100644 --- a/src/components/Card.jsx +++ b/src/components/Card.jsx @@ -1,56 +1,120 @@ -import React from 'react' -import Image from '../images/loginimg2.jpg' -import classes from '../css/Card.module.css' - -const Card = () => { - return ( - <> -
-
-
-
-
Description
-

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Cumque consequatur corporis vitae nobis, ut veniam earum expedita eaque at placeat perferendis unde voluptates explicabo rerum distinctio quis, illo, porro et?

-
- - - - - - - - - - -
-
-
$1800.00
-
$1500.00
-
-
-
- -
-
-
-
-
- -
-
-
SONY
-
SONY ALPHA A7 KIT
-
FREE SHIPPING
-
- -
-
-
-
-
-
- +import React, { useState, useEffect } from "react"; +import Image from "../images/pexels-pixabay-276452.jpg"; +import classes from "../css/Card.module.css"; +import { connect } from "react-redux"; + +const Card = (props) => { + const { title, price, categorydb, desc, _id, rating } = props; + const [ratingClass, setClasses] = useState([]); + const courseId = _id; + let fdesc = desc.substr(0, 150); + async function postData(url = "", data = {}) { + // Default options are marked with * + const response = await fetch(url, { + method: "POST", // *GET, POST, PUT, DELETE, etc. + headers: { + Accept: "application/json", + "Content-Type": "application/json", + Authorization: `Bearer ${localStorage.getItem("jwt")}`, + }, + mode: "cors", // no-cors, *cors, same-origin + cache: "no-cache", // *default, no-cache, reload, force-cache, only-if-cached + credentials: "same-origin", // include, *same-origin, omit + redirect: "follow", // manual, *follow, error + referrerPolicy: "no-referrer", // no-referrer, *no-referrer-when-downgrade, origin, origin-when-cross-origin, same-origin, strict-origin, strict-origin-when-cross-origin, unsafe-url + body: JSON.stringify(data), // body data type must match "Content-Type" header + }); + return response.json(); // parses JSON response into native JavaScript objects + } + + const submitHandler = (event) => { + event.preventDefault(); + const userDetails = JSON.parse(localStorage.getItem("user")); + console.log(userDetails); + postData( + `https://learnpedia-backend-ci.azurewebsites.net/api/enroll/${userDetails._id}/${courseId}` ) -} + .then((data) => { + console.log(data); // JSON data parsed by `data.json()` call + // throw error even if response status 500 + + if (data.error) { + alert(data.error); + } else { + alert("Course enrolled successfully"); + } + if (data.error == "Already enrolled") { + alert( + "Already enrolled, go to profile to check your enrolled courses" + ); + } + }) + .catch((error) => { + console.log(error); + }); + }; + + useEffect(() => { + setClasses((prev) => { + let arr = []; + for (let i = 0; i < rating; i++) { + arr.push("fas fa-star"); + } + for (let i = 0; i < 5 - rating; i++) { + arr.push("far fa-star"); + } + return arr; + }); + },[]); + + return ( + <> +
+
+
{title}
+
+ {ratingClass.map((l) => { + return ; + })} +
+
+

{fdesc}

+
+ +
+
+
    +
  • Flexible
  • +
  • Life time access
  • +
  • Taught by professionals
  • +
  • Doubt assistance
  • +
  • @just ₹{price}
  • +
+
+
+ + ); +}; + +const mapStateToProps = (state) => { + return { + userDetails: state.learnpedia, + }; +}; + +const mapDispatchToProps = (dispatch) => ({}); -export default Card \ No newline at end of file +export default connect(mapStateToProps, mapDispatchToProps)(Card); diff --git a/src/components/CoursePage.jsx b/src/components/CoursePage.jsx index 043906d..a7ae3b3 100644 --- a/src/components/CoursePage.jsx +++ b/src/components/CoursePage.jsx @@ -1,6 +1,5 @@ import React from 'react' -import { useParams, useNavigate, Link } from 'react-router-dom' -import Nav from './Nav'; +import { useParams } from 'react-router-dom' import '../css/CoursePage.css' diff --git a/src/components/CourseUploadform.jsx b/src/components/CourseUploadform.jsx index 7b73ca5..f58ff29 100644 --- a/src/components/CourseUploadform.jsx +++ b/src/components/CourseUploadform.jsx @@ -1,8 +1,68 @@ -import React from 'react' +import React, { useState } from 'react' import classes from '../css/CourseUploadform.module.css' import Img1 from '../images/pexels-thisisengineering-3862130.jpg' +import { connect } from 'react-redux' +import { useNavigate } from 'react-router-dom' + + +const CourseUploadform = ({userDetails}) => { + + const navigate = useNavigate(); + const [formDetails, setFormDetails] = useState({}) + const changeHandler = (event) => { + let name = event.target.name; + setFormDetails((prev) => { + return ( + { + ...prev, + [name]: event.target.value + } + ) + }) + } + + + async function postData(url = '', data = {}) { + // Default options are marked with * + const response = await fetch(url, { + method: 'POST', // *GET, POST, PUT, DELETE, etc. + headers: { + Accept: "application/json", + "Content-Type": "application/json", + Authorization: `Bearer ${localStorage.getItem('jwt')}` + }, + mode: 'cors', // no-cors, *cors, same-origin + cache: 'no-cache', // *default, no-cache, reload, force-cache, only-if-cached + credentials: 'same-origin', // include, *same-origin, omit + redirect: 'follow', // manual, *follow, error + referrerPolicy: 'no-referrer', // no-referrer, *no-referrer-when-downgrade, origin, origin-when-cross-origin, same-origin, strict-origin, strict-origin-when-cross-origin, unsafe-url + body: JSON.stringify(data) // body data type must match "Content-Type" header + }); + return response.json(); // parses JSON response into native JavaScript objects + } + + + const submitHandler = (event) => { + event.preventDefault(); + console.log(formDetails); + postData(`https://learnpedia-backend-ci.azurewebsites.net/api/courseupload/${userDetails._id}`, formDetails) + .then((data) => { + console.log(data); // JSON data parsed by `data.json()` call + if (data.error) { + alert(data.error) + }else { + alert("Course uploaded successfully") + navigate("/educator") + } + }) + .catch((error) => { + console.log(error) + }); + setFormDetails({}); + } + + -const CourseUploadform = () => { return ( <>
@@ -14,31 +74,32 @@ const CourseUploadform = () => {
Create a new Course
- +
- +
- - - - + + + +
-
-
- +
@@ -48,4 +109,19 @@ const CourseUploadform = () => { ) } -export default CourseUploadform \ No newline at end of file +const mapStateToProps = state => { + return { + userDetails: state.learnpedia + } +} + + +const mapDispatchToProps = dispatch => ({ + // signOut: (userDetails) => { + // dispatch(signOut()) + // }, +}) + +export default connect(mapStateToProps, mapDispatchToProps)(CourseUploadform) + +// export default CourseUploadform \ No newline at end of file diff --git a/src/components/Courseinfo.js b/src/components/Courseinfo.js index 32c3870..1d1dac1 100644 --- a/src/components/Courseinfo.js +++ b/src/components/Courseinfo.js @@ -1,187 +1,180 @@ -import React from 'react' -import '../css/Courseinfo.css' -// import Nav from './Nav' -import img from '../images/img.PNG' -import courseinfo from '../images/coursesinfo.jpeg' -const Courseinfo = () => { - const styleobj={ - height: "200px", - } - const sty={ - height: "60px", - } - return ( -
-
-
-

Programming with Python : HandsOn - Introduction for Beginners

-
Uploaded/Last updated on: Oct 28th, 2022
- {/*
Image
*/} -

Some text..

-

Star Rating

- - - - - - {/* - - - */} - - -
-
- WHAT YOU WILL LEARN -
-
-
-
-
-
-
Special title treatment
-

With supporting text below as a natural lead-in to additional content.

-
-
-
-
-
-
-
-
-
Special title treatment
-

With supporting text below as a natural lead-in to additional content.

-
-
-
-
-
-
-
-
-
Special title treatment
-

With supporting text below as a natural lead-in to additional content.

-
-
-
-
-
-
-
-
-
Special title treatment
-

With supporting text below as a natural lead-in to additional content.

-
-
-
-
-
-
-
-
-
-
About the course
-
-
Overview
-

Lorem ipsum dolor sit amet consectetur adipisicing elit. Earum doloremque quasi et nemo vel totam. Tempore, ipsam. Repellat tempore blanditiis nihil possimus fugiat aliquam aliquid iure quaerat incidunt reprehenderit quis illum nam saepe, ab laboriosam hic sit quibusdam, magni eveniet? Fugit necessitatibus cum laboriosam delectus maxime aperiam id, perferendis placeat ipsam exercitationem a dolor dolorum magni ipsa aspernatur pariatur fugiat tenetur modi vitae. Reiciendis, ducimus pariatur ipsum ex repudiandae repellat neque nulla rem iste debitis ea consequatur voluptatum nemo possimus cumque ullam, totam, quos veniam quam esse sequi! Quibusdam vero inventore consequuntur autem natus saepe necessitatibus porro nostrum atque quam.

-
-
-

About the course

-

Lorem ipsum dolor, sit amet consectetur adipisicing elit. Culpa nam, iusto itaque reiciendis voluptatem ab, error at quaerat accusamus perferendis similique nisi magni dignissimos dicta asperiores est dolores earum? Unde ea assumenda, ducimus, sapiente, nulla laudantium quam exercitationem soluta voluptatem tenetur possimus aut modi doloremque natus blanditiis iusto! Nesciunt, est?

-
-
- -
-
-
Syllabus
-
-
Module 0
-

-
    -
  1. lesson 0
  2. -
  3. lesson 1
  4. -
  5. lesson 2
  6. -
-

-
Module 1
-

-
    -
  1. lesson 0
  2. -
  3. lesson 1
  4. -
  5. lesson 2
  6. -
-

-
-
-

About the course

-

Lorem ipsum dolor, sit amet consectetur adipisicing elit. Culpa nam, iusto itaque reiciendis voluptatem ab, error at quaerat accusamus perferendis similique nisi magni dignissimos dicta asperiores est dolores earum? Unde ea assumenda, ducimus, sapiente, nulla laudantium quam exercitationem soluta voluptatem tenetur possimus aut modi doloremque natus blanditiis iusto! Nesciunt, est?

-
- -
-
-
-
About the Insturctor
-
-
Overview
-

Lorem ipsum dolor sit amet consectetur adipisicing elit. Earum doloremque quasi et nemo vel totam. Tempore, ipsam. Repellat tempore blanditiis nihil possimus fugiat aliquam aliquid iure quaerat incidunt reprehenderit quis illum nam saepe, ab laboriosam hic sit quibusdam, magni eveniet? Fugit necessitatibus cum laboriosam delectus maxime aperiam id, perferendis placeat ipsam exercitationem a dolor dolorum magni ipsa aspernatur pariatur fugiat tenetur modi vitae. Reiciendis, ducimus pariatur ipsum ex repudiandae repellat neque nulla rem iste debitis ea consequatur voluptatum nemo possimus cumque ullam, totam, quos veniam quam esse sequi! Quibusdam vero inventore consequuntur autem natus saepe necessitatibus porro nostrum atque quam.

-
-
-

About the course

-

Lorem ipsum dolor, sit amet consectetur adipisicing elit. Culpa nam, iusto itaque reiciendis voluptatem ab, error at quaerat accusamus perferendis similique nisi magni dignissimos dicta asperiores est dolores earum? Unde ea assumenda, ducimus, sapiente, nulla laudantium quam exercitationem soluta voluptatem tenetur possimus aut modi doloremque natus blanditiis iusto! Nesciunt, est?

-
- - -

Sunt in culpa qui officia deserunt mollit anim id est laborum consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco.

-

-

TITLE HEADING

-
Title description, Sep 2, 2017
-
Image
-

Some text..

-

Sunt in culpa qui officia deserunt mollit anim id est laborum consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco.

-
-
-

Unlimited access at

-
Rs 999/-
-
-
- -
-
-
This course includes:
-
    -
  • Sharable certificate
  • -
  • 100% online course
  • -
  • Flexible Schedule
  • -
  • Appoximately 4 months to complete
  • -
-
-
- -
-
-
-

Course is offered by:

-
Harvard University
-
-

Some text about me in culpa qui officia deserunt mollit anim..

-

More Text

-

Lorem ipsum dolor sit ame.

-
Image


-
Image


-
Image
-
-
-
-
- - - ) -} - -export default Courseinfo +// import React from 'react' +// import '../css/Courseinfo.css' +// // import Nav from './Nav' +// import img from '../images/img.PNG' +// const Courseinfo = () => { +// const styleobj = { +// height: "200px", +// } +// const sty = { +// height: "60px", +// } +// return ( +// <> +//
+//
+//

Programming with Python : HandsOn +// Introduction for Beginners

+//
Uploaded/Last updated on: Dec 7, 2017
+// {/*
Image
*/} +//

Some text..

+//

Star Rating

+ +// +// +// +// +// {/* +// +// +// */} + + +//
+//
+// WHAT YOU WILL LEARN +//
+//
+// {/*
*/} +//
+//
+//
+//
Special title treatment
+//

With supporting text below as a natural lead-in to additional content.

+//
+//
+//
+// {/*
*/} +//
+//
+//
+//
Special title treatment
+//

With supporting text below as a natural lead-in to additional content.

+//
+//
+//
+// {/*
*/} +//
+//
+//
+//
Special title treatment
+//

With supporting text below as a natural lead-in to additional content.

+//
+//
+//
+//
+// {/*
*/} +//
+//
+//
Special title treatment
+//

With supporting text below as a natural lead-in to additional content.

+//
+//
+//
+//
+//
+ +//
+// {/*
*/} +// {/*
+//
About the course
+//
+//
Overview
+//

Lorem ipsum dolor sit amet consectetur adipisicing elit. Earum doloremque quasi et nemo vel totam. Tempore, ipsam. Repellat tempore blanditiis nihil possimus fugiat aliquam aliquid iure quaerat incidunt reprehenderit quis illum nam saepe, ab laboriosam hic sit quibusdam, magni eveniet? Fugit necessitatibus cum laboriosam delectus maxime aperiam id, perferendis placeat ipsam exercitationem a dolor dolorum magni ipsa aspernatur pariatur fugiat tenetur modi vitae. Reiciendis, ducimus pariatur ipsum ex repudiandae repellat neque nulla rem iste debitis ea consequatur voluptatum nemo possimus cumque ullam, totam, quos veniam quam esse sequi! Quibusdam vero inventore consequuntur autem natus saepe necessitatibus porro nostrum atque quam.

+//
+//
+//

About the course

+//

Lorem ipsum dolor, sit amet consectetur adipisicing elit. Culpa nam, iusto itaque reiciendis voluptatem ab, error at quaerat accusamus perferendis similique nisi magni dignissimos dicta asperiores est dolores earum? Unde ea assumenda, ducimus, sapiente, nulla laudantium quam exercitationem soluta voluptatem tenetur possimus aut modi doloremque natus blanditiis iusto! Nesciunt, est?

*/} +// {/*
*/} +//
+ +//
+//
+//
Syllabus
+//
+//
Module 0
+//

+//
    +//
  1. lesson 0
  2. +//
  3. lesson 1
  4. +//
  5. lesson 2
  6. +//
+//

+//
Module 1
+//

+//
    +//
  1. lesson 0
  2. +//
  3. lesson 1
  4. +//
  5. lesson 2
  6. +//
+//

+//
+//
+//
+ +//
+// {/*
*/} +//
+//
About the Insturctor
+//
+//
Overview
+//

Lorem ipsum dolor sit amet consectetur adipisicing elit. Earum doloremque quasi et nemo vel totam. Tempore, ipsam. Repellat tempore blanditiis nihil possimus fugiat aliquam aliquid iure quaerat incidunt reprehenderit quis illum nam saepe, ab laboriosam hic sit quibusdam, magni eveniet? Fugit necessitatibus cum laboriosam delectus maxime aperiam id, perferendis placeat ipsam exercitationem a dolor dolorum magni ipsa aspernatur pariatur fugiat tenetur modi vitae. Reiciendis, ducimus pariatur ipsum ex repudiandae repellat neque nulla rem iste debitis ea consequatur voluptatum nemo possimus cumque ullam, totam, quos veniam quam esse sequi! Quibusdam vero inventore consequuntur autem natus saepe necessitatibus porro nostrum atque quam.

+//
+//
+//

About the course

+//

Lorem ipsum dolor, sit amet consectetur adipisicing elit. Culpa nam, iusto itaque reiciendis voluptatem ab, error at quaerat accusamus perferendis similique nisi magni dignissimos dicta asperiores est dolores earum? Unde ea assumenda, ducimus, sapiente, nulla laudantium quam exercitationem soluta voluptatem tenetur possimus aut modi doloremque natus blanditiis iusto! Nesciunt, est?

+//
+ + +// {/*

Sunt in culpa qui officia deserunt mollit anim id est laborum consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco.

+//

+//

TITLE HEADING

+//
Title description, Sep 2, 2017
+//
Image
+//

Some text..

+//

Sunt in culpa qui officia deserunt mollit anim id est laborum consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco.

*/} +//
+//
+//

Unlimited access at

+//
Rs 999/-
+//
+//
+// +//
+//
+//
This course includes:
+//
    +//
  • Sharable certificate
  • +//
  • 100% online course
  • +//
  • Flexible Schedule
  • +//
  • Appoximately 4 months to complete
  • +//
+//
+// {/*
+// +//
*/} +//
+//
+//

Course is offered by:

+//
Harvard University
+//
+// {/*

Some text about me in culpa qui officia deserunt mollit anim..

*/} +// {/*

More Text

+//

Lorem ipsum dolor sit ame.

+//
Image


+//
Image


+//
Image
*/} +//
+//
+ + +// +// ) +// } + +// export default Courseinfo diff --git a/src/components/Courses.jsx b/src/components/Courses.jsx index afb7d8f..86ff849 100644 --- a/src/components/Courses.jsx +++ b/src/components/Courses.jsx @@ -1,13 +1,74 @@ -import React from 'react' -import '../css/Courses.css' -import Nav from './Nav' +import React, { useEffect, useState } from 'react' +import Card from './Card' +import classes from '../css/Courses.module.css' +import { connect } from 'react-redux' +import { useParams } from 'react-router-dom' + +const Courses = ({userDetails}) => { + const { query } = useParams(); + const [courses, setCourses] = useState([]) + useEffect( () => { + fetch('https://learnpedia-backend-ci.azurewebsites.net/api/courses') + .then((response) => response.json()) + .then((data) => { + setCourses(data) + }); + }, []) + console.log(courses); + + const searchCourses = (query) => { + fetch(`https://learnpedia-backend-ci.azurewebsites.net/api/search?query=${query}`) + .then((response) => response.json()) + .then((data) => { + console.log(data); + setCourses(data) + }); + } + + useEffect( () => { + if(query){ + fetch(`https://learnpedia-backend-ci.azurewebsites.net/api/search?query=${query}`) + .then((response) => response.json()) + .then((data) => { + console.log(data); + setCourses(data) + }); + } else { + fetch('https://learnpedia-backend-ci.azurewebsites.net/api/courses') + .then((response) => response.json()) + .then((data) => { + setCourses(data) + }); + } + + }, [query]) + + -const Courses = () => { return ( <> -
Courses
+
+
+ {courses.map(course => { + return ( + + ) + })} + +
+
) } -export default Courses \ No newline at end of file +const mapStateToProps = state => { + console.log(state); + return { + userDetails: state.learnpedia +} +} + + +const mapDispatchToProps = dispatch => ({}) + +export default connect(mapStateToProps, mapDispatchToProps)(Courses) \ No newline at end of file diff --git a/src/components/CoursesTable.jsx b/src/components/CoursesTable.jsx new file mode 100644 index 0000000..2263593 --- /dev/null +++ b/src/components/CoursesTable.jsx @@ -0,0 +1,37 @@ +import React from 'react' + +const CoursesTable = ({courses}) => { + + console.log(courses); + return ( + <> + + + + + + + + + + + + {courses.map(course => { + return ( + + + + + + + + ) + })} + + +
IDtitledesccategoryprice
{course._id}{course.title}{course.desc}{course.category}{course.price}
+ + ) +} + +export default CoursesTable \ No newline at end of file diff --git a/src/components/Help.jsx b/src/components/Help.jsx new file mode 100644 index 0000000..a560f90 --- /dev/null +++ b/src/components/Help.jsx @@ -0,0 +1,180 @@ +import { useEffect } from "react"; +import { useState } from "react"; +import classes from "../css/Help.module.css"; +import Faq from '../images/R.png' + + +const Help = (props) => { + + const [vr, setvr] = useState(true); + const [vr1, setvr1] = useState(true); + const [vr2, setvr2] = useState(true); + const [vr3, setvr3] = useState(true); + const [vr4, setvr4] = useState(true); + + const [formDetails, setFormDetails] = useState({}) + const changeHandler = (event) => { + let name = event.target.name; + setFormDetails((prev) => { + return ( + { + ...prev, + [name]: event.target.value + } + ) + }) + } + + async function postData(url = '', data = {}) { + // Default options are marked with * + const response = await fetch(url, { + method: 'POST', // *GET, POST, PUT, DELETE, etc. + headers: { + Accept: "application/json", + "Content-Type": "application/json", + Authorization: `Bearer ${localStorage.getItem('jwt')}` + }, + mode: 'cors', // no-cors, *cors, same-origin + cache: 'no-cache', // *default, no-cache, reload, force-cache, only-if-cached + credentials: 'same-origin', // include, *same-origin, omit + redirect: 'follow', // manual, *follow, error + referrerPolicy: 'no-referrer', // no-referrer, *no-referrer-when-downgrade, origin, origin-when-cross-origin, same-origin, strict-origin, strict-origin-when-cross-origin, unsafe-url + body: JSON.stringify(data) // body data type must match "Content-Type" header + }); + return response.json(); // parses JSON response into native JavaScript objects + } + + const submitHandler = (event) => { + event.preventDefault(); + console.log(formDetails); + if (localStorage.getItem('jwt') === null) { + alert("Please login to ask a question") + return + } + postData(`https://learnpedia-backend-ci.azurewebsites.net/api/question/${JSON.parse(localStorage.getItem('user'))._id}`, formDetails) + .then((data) => { + console.log(data); // JSON data parsed by `data.json()` call + if (data.error) { + alert(data.error) + }else { + alert("We have got your question. We will get back to you soon") + } + }) + .catch((error) => { + console.log(error) + }); + setFormDetails({}); + } + + + + + return ( + <> +
+ +

FAQs

+ +
+

+ Decide what interests you. List the fields of study that interest you, and + come up with a list of courses you would consider studying based on these + interests. Add the topics that you were most interested in. Check online + about the courses you are interested in and find out about the career + prospects and the other information. Check out the course content. To + avoid making mistakes, make sure you review the course outline of the + course(s) you want to apply for. Have a look at the subjects you must + undertake and the types of learning, assignments and examination tasks + involved. +

+
+ + +
+

Yes, You will.

+
+ + +
+

+ No you dont get the refund back. But you need not worry about it because + the course which we provide on our website will definetly worth it. +

+
+ + +
+

yes!

+
+ + +
+

UPIs, debit card, credit card, net banking.

+
+ +
+
+
+
+ + +
+ +
+ + {/* */} + + {/*
+ +
*/} +
+ + + ) +} + +export default Help; diff --git a/src/components/Home.jsx b/src/components/Home.jsx index c1c98d5..ea5bcb2 100644 --- a/src/components/Home.jsx +++ b/src/components/Home.jsx @@ -1,19 +1,19 @@ import React from 'react' import BackImg from "../images/vid.mp4" -import "../css/Home.css" +import classes from "../css/Home.module.css" const Home = () => { return ( <>
-
diff --git a/src/components/InstructorHome.jsx b/src/components/InstructorHome.jsx new file mode 100644 index 0000000..cc6d03f --- /dev/null +++ b/src/components/InstructorHome.jsx @@ -0,0 +1,76 @@ +import React from 'react' +import { useEffect } from 'react' +import { useState } from 'react' +import { connect } from 'react-redux' +import { Link } from 'react-router-dom' +import classes from '../css/StudentHome.module.css' +import Card from './Card' + + +const InstructorHome = ({ userDetails }) => { + const [courses, setCourses] = useState([]) + useEffect( () => { + fetch('https://learnpedia-backend-ci.azurewebsites.net/api/courses') + .then((response) => response.json()) + .then((data) => { + setCourses(data) + }); +}, []) + + return ( +
+ {userDetails ?
+
+

Hi {userDetails.firstname},

+

Welcome to Learnpedia!

+
+
+ +
+
Add Course
+ +
+ + +
+
Add Module
+ +
+ + +
+
Add Lesson
+ +
+ + +
+
+

Courses

+
+
+ {courses.map(course => { + return ( + + ) + })} + +
+
+
+
:
} + +
+ ) +} + +const mapStateToProps = state => { + return { + userDetails: state.learnpedia + } +} + + +const mapDispatchToProps = dispatch => ({}) + +export default connect(mapStateToProps, mapDispatchToProps)(InstructorHome) \ No newline at end of file diff --git a/src/components/LessonUpload.jsx b/src/components/LessonUpload.jsx new file mode 100644 index 0000000..279052f --- /dev/null +++ b/src/components/LessonUpload.jsx @@ -0,0 +1,192 @@ +import axios from 'axios' +import React, { useState } from 'react' +import { useEffect } from 'react' +import { useNavigate } from 'react-router-dom' +import classes from '../css/CourseUploadform.module.css' +import Img1 from '../images/pexels-thisisengineering-3862130.jpg' + + +const LessonUpload = () => { + + const navigate = useNavigate(); + const [formDetails, setFormDetails] = useState({}) + const [courses, setCourses] = useState([]) + const user = JSON.parse(localStorage.getItem('user')) + const [modules, setModules] = useState([]) + const [file, setFile] = useState(null); + + + const changeHandler = (event) => { + let name = event.target.name; + setFormDetails((prev) => { + return ( + { + ...prev, + [name]: event.target.value + } + ) + }) + } + + useEffect(() => { + fetch(`https://learnpedia-backend-ci.azurewebsites.net/api/courses/${user._id}`, { + method: 'GET', + headers: { + Accept: "application/json", + "Content-Type": "application/json", + Authorization: `Bearer ${localStorage.getItem('jwt')}` + } + }) + .then((response) => response.json()) + .then((data) => { + console.log(data) + if (data.error) { + alert(data.error) + } else { + setCourses(data) + } + }) + .catch((error) => { + console.log(error) + }); + }, []) + + const onCourseChange = (event) => { + let courseid = event.target.value; + fetch(`https://learnpedia-backend-ci.azurewebsites.net/api/module/${user._id}/${courseid}`, { + method: 'GET', + headers: { + Accept: "application/json", + "Content-Type": "application/json", + Authorization: `Bearer ${localStorage.getItem('jwt')}` + } + }) + .then((response) => response.json()) + .then((data) => { + setModules(data.modules) + console.log(data.modules); + }).catch((error) => { + console.log(error) + }) + } + + const getModuleList = (event) => { + changeHandler(event); + onCourseChange(event); + } + + const handleFileChange = (e) => { + setFile(e.target.files[0]); + console.log(e.target.files[0]); + }; + + // const handleSubmit = (e) => { + // e.preventDefault(); + // const formData = new FormData(); + // formData.append('video', file); + // axios.post('http://localhost:5000/upload', formData) + // .then(res => console.log(res.data)) + // .catch(err => console.error(err)); + // }; + + + async function postData(url = '', data ) { + // Default options are marked with * + const response = await fetch(url, { + method: 'POST', // *GET, POST, PUT, DELETE, etc. + headers: { + Authorization: `Bearer ${localStorage.getItem('jwt')}`, + }, + body: data // body data type must match "Content-Type" header + }); + return response.json(); // parses JSON response into native JavaScript objects + } + + + const submitHandler = (event) => { + event.preventDefault(); + const fd = new FormData(); + if (!formDetails.title || !formDetails.courseId || !formDetails.moduleId || !file) { + alert("Please fill all the fields") + return + } + fd.append('title', formDetails.title); + fd.append('courseId', formDetails.courseId); + fd.append('moduleId', formDetails.moduleId); + fd.append('video', file); + fd.append('desc', formDetails.desc); + postData(`https://learnpedia-backend-ci.azurewebsites.net/api/lesson/${user._id}/${formDetails.courseId}`, fd) + .then((data) => { + console.log(data); // JSON data parsed by `data.json()` call + if (data.error) { + alert(data.error) + } else { + alert("Lesson uploaded Successfully") + } + }) + .catch((error) => { + console.error(error); + alert(error) + }); + setFormDetails({}); + navigate('/educator') + } + + + + + + return ( + <> +
+
+
+
+ +
+
+
upload a Lesson
+
+ + +
+
+ +
+
+ +
+
+ + +
+
+ +
+
+ +
+
+
+
+
+ + ) +} + +export default LessonUpload \ No newline at end of file diff --git a/src/components/Loginform.jsx b/src/components/Loginform.jsx index ab7e764..3b052f9 100644 --- a/src/components/Loginform.jsx +++ b/src/components/Loginform.jsx @@ -1,11 +1,33 @@ -import React,{useState} from 'react' +import React, { useState } from 'react' import Image from '../images/loginimg2.jpg' import '../css/Loginform.css' +import { connect } from 'react-redux' +import { signIn } from '../action/learnpedia' +import { useNavigate } from 'react-router-dom' -const Loginform = () => { - const [formDetails, setFormDetails] = useState({}) +const Loginform = ({ signIn }) => { + let navigate = useNavigate() + const [formDetails, setFormDetails] = useState({ email: "", password: "" }) + + async function postData(url = '', data = {}) { + // Default options are marked with * + const response = await fetch(url, { + method: 'POST', // *GET, POST, PUT, DELETE, etc. + mode: 'cors', // no-cors, *cors, same-origin + cache: 'no-cache', // *default, no-cache, reload, force-cache, only-if-cached + credentials: 'same-origin', // include, *same-origin, omit + headers: { + 'Content-Type': 'application/json' + // 'Content-Type': 'application/x-www-form-urlencoded', + }, + redirect: 'follow', // manual, *follow, error + referrerPolicy: 'no-referrer', // no-referrer, *no-referrer-when-downgrade, origin, origin-when-cross-origin, same-origin, strict-origin, strict-origin-when-cross-origin, unsafe-url + body: JSON.stringify(data) // body data type must match "Content-Type" header + }); + return response.json(); // parses JSON response into native JavaScript objects + } const changeHandler = (event) => { let name = event.target.name; @@ -19,49 +41,84 @@ const Loginform = () => { }) } - const submitHandler = (event) => { + const submitHandler = async (event) => { event.preventDefault(); - console.log(formDetails); - setFormDetails({}); + if (formDetails.email.length <= 0 || formDetails.password.length <= 0) { + alert("enter email and password") + return + } + postData('https://learnpedia-backend-ci.azurewebsites.net/api/login', formDetails) + .then((data) => { + if (data.user) { + const userData = data.user + signIn(data) + if (userData.role === 'student') { + navigate('/shome') + } else if(userData.role === 'educator') { + navigate('/educator') + }else if(userData.role === 'admin') { + navigate('/admin') + } + }else if(data.error) { + alert(data.error) + } + }); + + + setFormDetails({ email: "", password: "" }); + } return ( -
-
-
-
- -
- Every new course is a
new journey
- Let's get started +
+
+
+
+ +
+ Every new course is a
new journey
+ Let's get started +
+
-
-
-
-
-
-
Login
-
-
-
- -
-
- -
- -
- -
-
Don't have an account?
+
+
+
+
Login
+ +
+
+ +
+
+ +
+ +
+ +
+
Don't have an account?
+
+
- +
+
-
-
-
) } -export default Loginform; \ No newline at end of file +const mapStateToProps = state => { + console.log(state); + return { + userDetails: state.userDetails + } +} + +const mapDispatchToProps = dispatch => ({ + signIn: (userDetails) => { + dispatch(signIn(userDetails)) + }, +}) + +export default connect(mapStateToProps, mapDispatchToProps)(Loginform); \ No newline at end of file diff --git a/src/components/ModuleUpload.jsx b/src/components/ModuleUpload.jsx new file mode 100644 index 0000000..48bd44c --- /dev/null +++ b/src/components/ModuleUpload.jsx @@ -0,0 +1,139 @@ +import React, { useState } from 'react' +import { useEffect } from 'react' +import { useNavigate } from 'react-router-dom' +import classes from '../css/CourseUploadform.module.css' +import Img1 from '../images/pexels-thisisengineering-3862130.jpg' + + +const ModuleUpload = () => { + + const navigate = useNavigate(); + const [formDetails, setFormDetails] = useState({}) + const changeHandler = (event) => { + let name = event.target.name; + setFormDetails((prev) => { + return ( + { + ...prev, + [name]: event.target.value + } + ) + }) + } + + const [courses, setCourses] = useState([]) + const user = JSON.parse(localStorage.getItem('user')) + + useEffect(() => { + console.log(user._id); + fetch(`https://learnpedia-backend-ci.azurewebsites.net/api/courses/${user._id}`, { + method: 'GET', + headers: { + Accept: "application/json", + "Content-Type": "application/json", + Authorization: `Bearer ${localStorage.getItem('jwt')}` + } + }) + .then((response) => response.json()) + .then((data) => { + console.log(data) + if (data.error) { + alert(data.error) + }else { + setCourses(data) + } + }) + .catch((error) => { + console.log(error) + }); + }, []) + + async function postData(url = '', data = {}) { + // Default options are marked with * + const response = await fetch(url, { + method: 'POST', // *GET, POST, PUT, DELETE, etc. + mode: 'cors', // no-cors, *cors, same-origin + cache: 'no-cache', // *default, no-cache, reload, force-cache, only-if-cached + credentials: 'same-origin', // include, *same-origin, omit + headers: { + Accept: "application/json", + "Content-Type": "application/json", + Authorization: `Bearer ${localStorage.getItem('jwt')}` + }, + redirect: 'follow', // manual, *follow, error + referrerPolicy: 'no-referrer', // no-referrer, *no-referrer-when-downgrade, origin, origin-when-cross-origin, same-origin, strict-origin, strict-origin-when-cross-origin, unsafe-url + body: JSON.stringify(data) // body data type must match "Content-Type" header + }); + return response.json(); // parses JSON response into native JavaScript objects + } + + + const submitHandler = (event) => { + event.preventDefault(); + console.log(formDetails); + postData(`https://learnpedia-backend-ci.azurewebsites.net/api/moduleupload/${user._id}`, formDetails) + .then((data) => { + console.log(data); // JSON data parsed by `data.json()` call + if (data.error) { + alert(data.error) + } else { + alert("Module Created Successfully") + } + }) + .catch((error) => { + console.error(error); + alert(error) + }); + setFormDetails({}); + navigate('/educator') + } + + + + + + return ( + <> +
+
+
+
+ +
+
+
Create a Module
+
+ + +
+
+ + +
+ +
+ + +
+
+ +
+
+
+
+
+ + ) +} + +export default ModuleUpload \ No newline at end of file diff --git a/src/components/Nav.jsx b/src/components/Nav.jsx index 443ede2..33cb5cb 100644 --- a/src/components/Nav.jsx +++ b/src/components/Nav.jsx @@ -1,77 +1,178 @@ import React, { useState } from 'react' -import { NavLink } from 'react-router-dom'; +import { Link, NavLink } from 'react-router-dom'; import '../css/Nav.css'; +import { connect } from 'react-redux' +import { signOut, signIn } from '../action/learnpedia' +import { useNavigate } from 'react-router-dom' -const Nav = () => { +const Nav = ({ userDetails, signOut }) => { + let navigate = useNavigate() + const [isSearchActive, setSearchActive] = useState(false) const [isSidebarOpen, setIsSidebarOpen] = useState(false) + + const signoutUser = (event) => { + event.preventDefault(); + signOut() + navigate('/') + } + + const search = (event) => { + if (event.key === 'Enter') { + navigate(`/search/${event.target.value}`) + } + } + + return ( -
- -
+ } + ) } -export default Nav \ No newline at end of file +const mapStateToProps = state => { + return { + userDetails: state.learnpedia + } +} + + +const mapDispatchToProps = dispatch => ({ + signOut: (userDetails) => { + dispatch(signOut()) + }, +}) + +export default connect(mapStateToProps, mapDispatchToProps)(Nav) \ No newline at end of file diff --git a/src/components/PlayListVideo.jsx b/src/components/PlayListVideo.jsx new file mode 100644 index 0000000..22761eb --- /dev/null +++ b/src/components/PlayListVideo.jsx @@ -0,0 +1,211 @@ +import React, { useEffect, useState } from 'react'; +import { Link } from 'react-router-dom'; +import classes from "../css/PlayListVideo.module.css" +import BackImg from "../images/vid-7.mp4" +import Image from "../images/loginimg2.jpg" +import { useParams } from 'react-router-dom' +import StarRatings from 'react-star-ratings'; + +const PlayListVideo = () => { + const { courseid } = useParams(); + const [course, setCourse] = useState({modules: []}) + const [lesson, setLesson] = useState({}) + const [isdropdownactive, setdropdownactive] = useState([]) + const [videoURL, setVideoURL] = useState(null) + const [rating, setRating] = useState(0); + const [originalRating, setOriginalRating] = useState(0); + //get course details + useEffect(() => { + fetch(`https://learnpedia-backend-ci.azurewebsites.net/api/course/${courseid}`, { + method: 'get', + headers: { + Accept: "application/json", + "Content-Type": "application/json", + } + }) + .then((response) => response.json()) + .then((data) => { + if (data == null || data.error) { + console.log(data.error) + setCourse({modules: []}) + } else { + console.log(data); + setCourse(data) + setRating(data.rating); + setOriginalRating(data.rating); + } + }) + }, []) + + useEffect(() => { + const userDetails = JSON.parse(localStorage.getItem('user')) + if (userDetails == null || userDetails == undefined || course._id == undefined || lesson._id == undefined) { + return + } + fetch(`https://learnpedia-backend-ci.azurewebsites.net/api/lesson/${userDetails._id}/${course._id}/${lesson._id}`, { + method: 'get', + headers: { + Accept: "application/json", + "Content-Type": "application/json", + Authorization: `Bearer ${localStorage.getItem('jwt')}` + } + }) + .then((response) => response.json()) + .then((data) => { + if (data == null || data.error) { + console.log(data.error) + } else { + console.log(data); + setVideoURL(data) + // setVideoURL(URL.createObjectURL(data)) + // videoURL = URL.createObjectURL(data); + } + }) + }, [lesson]) + const updateRating = () => { + let updatedRating = Math.floor((rating + originalRating) / 2); + const data = { + rating: updatedRating, + id: course._id, + }; + fetch("http://localhost:3001/api/update-rating", { + method: "POST", // *GET, POST, PUT, DELETE, etc. + mode: "cors", // no-cors, *cors, same-origin + cache: "no-cache", // *default, no-cache, reload, force-cache, only-if-cached + credentials: "same-origin", // include, *same-origin, omit + headers: { + Accept: "application/json", + "Content-Type": "application/json", + Authorization: `Bearer ${localStorage.getItem("jwt")}`, + }, + redirect: "follow", // manual, *follow, error + referrerPolicy: "no-referrer", // no-referrer, *no-referrer-when-downgrade, origin, origin-when-cross-origin, same-origin, strict-origin, strict-origin-when-cross-origin, unsafe-url + body: JSON.stringify(data), + }) + .then((res) => { + console.log(res); + }) + .catch((e) => { + console.log(e); + }); + }; + + const getLesson = (event) => { + console.log(event.target.id); + fetch(`https://learnpedia-backend-ci.azurewebsites.net/api/lesson/${event.target.id}`, { + method: 'get', + headers: { + Accept: "application/json", + "Content-Type": "application/json", + Authorization: `Bearer ${localStorage.getItem('jwt')}` + } + }) + .then((response) => response.json()) + .then((data) => { + if (data == null || data.error) { + console.log(data.error) + } else { + console.log(data); + setLesson(data) + } + }) + } + + + + + let tempArr = [] + useEffect(() => { + course.modules.map((module, index) => { + tempArr.push(true) + }) + setdropdownactive(tempArr) + }, [course]) + + + // const [isdropdownactive1, setdropdownactive1] = useState(false) + // const [isdropdownactive2, setdropdownactive2] = useState(false) + // const [isdropdownactive3, setdropdownactive3] = useState(false) + return ( + <> +
+
+
+
+

Course Content

+ { + course.modules.map((module, index) => { + return ( +
+ +
+ { + module.lessons.map((lesson, index) => { + return ( + {lesson.title} + ) + }) + } +
+
+ ) + }) + } +
+
+ {/*

Section

*/} +
+
+
+
+ +
+ { + lesson &&

{lesson.title}

+ } +
+ { + setRating(newRating); + }} + numberOfStars={5} + starDimension="30px" + /> + +
+
+ +
+ { + course.educator &&

{course.educator.firstname}

+ } + course instructor +
+
+ {/*
*/} + {/* view playlist */} + {/* */} + {/*
*/} + {lesson &&

{lesson.desc}

} +
+
+
+ + ) +} + +export default PlayListVideo \ No newline at end of file diff --git a/src/components/Signupform.js b/src/components/Signupform.js deleted file mode 100644 index 04154ae..0000000 --- a/src/components/Signupform.js +++ /dev/null @@ -1,90 +0,0 @@ -import React, { useState } from 'react' -import Nav from './Nav' -import '../css/Signupform.css' - -const Signupform = () => { - - const [formDetails, setFormDetails] = useState({}) - const changeHandler = (event) => { - let name = event.target.name; - setFormDetails((prev) => { - return ( - { - ...prev, - [name]: event.target.value - } - ) - }) - } - - const submitHandler = (event) => { - event.preventDefault(); - console.log(formDetails); - setFormDetails({}); - } - - return ( - <> -
-
-
Registration
-
-
-
-
- First Name - -
-
- Last name - -
-
- Email - -
-
- Phone Number - -
-
- Password - -
-
- Confirm Password - -
-
-
- - - - Gender -
- - - -
-
-
- -
-
-
-
-
- - ) -} - -export default Signupform \ No newline at end of file diff --git a/src/components/Signupform.jsx b/src/components/Signupform.jsx new file mode 100644 index 0000000..f263b33 --- /dev/null +++ b/src/components/Signupform.jsx @@ -0,0 +1,169 @@ +import React, { useState } from 'react' +import { useNavigate } from 'react-router-dom' +import '../css/Signupform.css' + +const Signupform = () => { + let navigate = useNavigate() + + const [formDetails, setFormDetails] = useState({"role": "student"}) + const changeHandler = (event) => { + let name = event.target.name; + setFormDetails((prev) => { + return ( + { + ...prev, + [name]: event.target.value + } + ) + }) + } + + const formValidation = () => { + formDetails.phnumber = formDetails.phoneno.trim() + if(formDetails.lastname ) { + formDetails.lname = formDetails.lastname.trim() + } + + if (formDetails.firstname && formDetails.email && formDetails.gender && formDetails.password && formDetails.cnfpassword) { + formDetails.fname = formDetails.firstname.trim() + formDetails.email = formDetails.email.trim() + if (formDetails.fname.length < 3) { + alert("First name must of size atleast size 3") + return false; + } + if (!isNaN(formDetails.fname.charAt(0))) { + alert("name must not start with number") + return false; + } + if(formDetails.cnfpassword !== formDetails.password) { + alert("password mush match confirm password") + return false + } + + return true; + } else { + console.log('hello'); + return false; + } + } + + + async function postData(url = '', data = {}) { + // Default options are marked with * + const response = await fetch(url, { + method: 'POST', // *GET, POST, PUT, DELETE, etc. + mode: 'cors', // no-cors, *cors, same-origin + cache: 'no-cache', // *default, no-cache, reload, force-cache, only-if-cached + credentials: 'same-origin', // include, *same-origin, omit + headers: { + 'Content-Type': 'application/json' + // 'Content-Type': 'application/x-www-form-urlencoded', + }, + redirect: 'follow', // manual, *follow, error + referrerPolicy: 'no-referrer', // no-referrer, *no-referrer-when-downgrade, origin, origin-when-cross-origin, same-origin, strict-origin, strict-origin-when-cross-origin, unsafe-url + body: JSON.stringify(data) // body data type must match "Content-Type" header + }); + return response.json(); // parses JSON response into native JavaScript objects + } + + + const submitHandler = (event) => { + event.preventDefault(); + if (!formValidation()) { + return false; + } + alert("Registration Successful!") + console.log(formDetails); + postData('https://learnpedia-backend-ci.azurewebsites.net/api/signup', formDetails) + .then((data) => { + console.log(data); // JSON data parsed by `data.json()` call + }); + setFormDetails({"role": "student"}); + navigate('/login') + } + + return ( + <> +
+
+
Registration
+
+
+
+
+ First Name + +
+
+ Last name + +
+
+ Email + +
+
+ Phone Number + +
+
+ Password + +
+
+ Confirm Password + +
+
+
+ + + + Gender +
+ + + +
+
+
+ + + {/* */} + Select role +
+ + + {/* */} +
+
+
+ +
+
+
+
+
+ + ) +} + +export default Signupform \ No newline at end of file diff --git a/src/components/StudentHome.jsx b/src/components/StudentHome.jsx new file mode 100644 index 0000000..1c8f760 --- /dev/null +++ b/src/components/StudentHome.jsx @@ -0,0 +1,72 @@ +import React from 'react' +import { useEffect } from 'react' +import { useState } from 'react' +import { connect } from 'react-redux' +import { Link } from 'react-router-dom' +import classes from '../css/StudentHome.module.css' +import Image from '../images/pexels-thisisengineering-3862130.jpg' +import Card from './Card' + + +const StudentHome = ({ userDetails }) => { + const [courses, setCourses] = useState([]) + useEffect( () => { + fetch('https://learnpedia-backend-ci.azurewebsites.net/api/courses') + .then((response) => response.json()) + .then((data) => { + setCourses(data) + }); +}, []) + + + return ( +
+ {userDetails ?
+
+

Hi {userDetails.firstname},

+

Welcome to Learnpedia!

+
+
+ Continue Learning + +
+ +
+

Course

+

Fundamentals of Full stack Development

+
+
+
+
+
+ +
+
+

Courses

+
+
+ {courses.map(course => { + return ( + + ) + })} + +
+
+
+
:
} + +
+ ) +} + +const mapStateToProps = state => { + return { + userDetails: state.learnpedia + } +} + + +const mapDispatchToProps = dispatch => ({}) + +export default connect(mapStateToProps, mapDispatchToProps)(StudentHome) \ No newline at end of file diff --git a/src/components/StudentProfile.jsx b/src/components/StudentProfile.jsx new file mode 100644 index 0000000..7c4d4b6 --- /dev/null +++ b/src/components/StudentProfile.jsx @@ -0,0 +1,125 @@ +import React from 'react'; +import { useEffect, useState } from 'react' +import { Link } from 'react-router-dom'; +import classes from '../css/StudentProfile.module.css' +import Image from '../images/loginimg2.jpg' +import { connect } from 'react-redux' + + +const StudentProfile = ({ userDetails })=>{ + const [courses, setCourses] = useState([]) + console.log(userDetails); + useEffect( () => { + fetch(`https://learnpedia-backend-ci.azurewebsites.net/api/enrolled/${JSON.parse(localStorage.getItem('user'))._id}`, { + method: 'get', + headers: { + Accept: "application/json", + "Content-Type": "application/json", + authorization: `Bearer ${localStorage.getItem('jwt')}` + } + }) + .then((response) => response.json()) + .then((data) => { + if (data == null || data.error) { + console.log(data.error) + setCourses([]) + } else { + setCourses(data) + } + }); + }, []) + return ( + <> +
+
+
+

User Profile

+
+
+
+ {userDetails.url ? : } + {/* */} +

{userDetails.firstname}

+

{userDetails.role}

+

{userDetails.email}

+ {/*
+ follow + like +
*/} +
+
+
+
+
+
FIRST NAME
+
{userDetails.firstname}
+
+
+
LAST NAME
+
{userDetails.lastname}
+
+
+
CONTACT DETAILS
+
{userDetails.phoneno}
+
+
+
NUMBER OF COURSES ENROLLED
+
{courses.length}
+
+
+
NUMBER OF ACTIVE LEARNING DAYS
+
24
+
+
+
PLACE OF STUDY
+
IIIT SRICITY
+
+ update profile + {/* +

shaikh anas

+

student

+ update profile */} +
+
+
+
+
+

Your courses

+
+ { + courses.map(course =>
+
+ + {/* 10 videos */} +
+ {course.title} +

{course.categorydb}

+
{course.desc}
+
+
Course
+
Price: {course.price}
+
+
Continue
+ {/* view playlist */} +
) + } + +
+
+
+
+ + ) +} + +const mapStateToProps = state => { + console.log(state); + return { + userDetails: state.learnpedia + } + } + + + const mapDispatchToProps = dispatch => ({}) + + export default connect(mapStateToProps, mapDispatchToProps)(StudentProfile) \ No newline at end of file diff --git a/src/components/Table.jsx b/src/components/Table.jsx new file mode 100644 index 0000000..0edc3f5 --- /dev/null +++ b/src/components/Table.jsx @@ -0,0 +1,41 @@ +import React from 'react' + +const Table = ({users}) => { + + console.log(users); + return ( + <> + + + + + + + {/* */} + + + + + + + {users.map(user => { + return ( + + + + + {/* */} + + + + + ) + })} + + +
IDFirst NameLast NamegenderrolePhone Email
{user._id}{user.firstname}{user.lastname}{user.gender}{user.role}{user.phoneno}{user.email}
+ + ) +} + +export default Table \ No newline at end of file diff --git a/src/components/UpdateStudentProfile.jsx b/src/components/UpdateStudentProfile.jsx new file mode 100644 index 0000000..75cb4ce --- /dev/null +++ b/src/components/UpdateStudentProfile.jsx @@ -0,0 +1,119 @@ +import React from 'react'; +import { useState } from 'react' +import classes from '../css/UpdateStudentProfile.module.css'; +import { useNavigate } from 'react-router-dom' + +const UpdateStudentProfile = () => { + const navigate = useNavigate(); + const [formDetails, setFormDetails] = useState({}) + const [file, setFile] = useState(null); + + const changeHandler = (event) => { + let name = event.target.name; + setFormDetails((prev) => { + return ( + { + ...prev, + [name]: event.target.value + } + ) + }) + } + + const handleFileChange = (e) => { + setFile(e.target.files[0]); + console.log(e.target.files[0]); +}; + +async function postData(url = '', data ) { + // Default options are marked with * + const response = await fetch(url, { + method: 'PUT', // *GET, POST, PUT, DELETE, etc. + headers: { + Authorization: `Bearer ${localStorage.getItem('jwt')}`, + }, + body: data // body data type must match "Content-Type" header + }); + return response.json(); // parses JSON response into native JavaScript objects +} + + + + const submitHandler = (event) => { + event.preventDefault(); + const fd = new FormData(); + if (formDetails.cnfpassword !== formDetails.password) { + alert("password mush match confirm password") + return false + } + console.log(formDetails.firstname); + if (formDetails.firstname !== undefined) { + fd.append('firstname', formDetails.firstname); + } + if (formDetails.lastname) { + fd.append('lastname', formDetails.lastname); + } + if (formDetails.password) { + fd.append('password', formDetails.password); + } + if (formDetails.cnfpassword) { + fd.append('cnfpassword', formDetails.cnfpassword); + } + if (formDetails.email) { + fd.append('email', formDetails.email); + } + if (formDetails.phone) { + fd.append('phone', formDetails.phone); + } + if (file !== null) { + fd.append('profileImage', file); + } + console.log(fd.get('profileImage')); + postData(`https://learnpedia-backend-ci.azurewebsites.net/api/user/${JSON.parse(localStorage.getItem('user'))._id}`, fd) + setFormDetails({}); + navigate('/shome'); +} + + // const submitHandler = (event) => { + // event.preventDefault(); + // console.log(formDetails); + // if (formDetails.cnfpassword !== formDetails.password) { + // alert("password mush match confirm password") + // return false + // } + + // postData(`https://learnpedia-backend-ci.azurewebsites.net/api/user/${JSON.parse(localStorage.getItem('user'))._id}`, formDetails) + // setFormDetails({}); + // } + + return ( + <> +
+
+
+
+

update profile

+

update firstname

+ +

update lastname

+ +

new password

+ +

confirm password

+ +

phone number

+ +

Profile photo

+ + {/*

update pic

+ */} + +
+
+
+
+ + ) +} + +export default UpdateStudentProfile \ No newline at end of file diff --git a/src/components/group29 sem 5.js b/src/components/group29 sem 5.js index 32c3870..48e0af5 100644 --- a/src/components/group29 sem 5.js +++ b/src/components/group29 sem 5.js @@ -1,186 +1,186 @@ -import React from 'react' -import '../css/Courseinfo.css' -// import Nav from './Nav' -import img from '../images/img.PNG' -import courseinfo from '../images/coursesinfo.jpeg' -const Courseinfo = () => { - const styleobj={ - height: "200px", - } - const sty={ - height: "60px", - } - return ( -
-
-
-

Programming with Python : HandsOn - Introduction for Beginners

-
Uploaded/Last updated on: Oct 28th, 2022
- {/*
Image
*/} -

Some text..

-

Star Rating

+// import React from 'react' +// import '../css/Courseinfo.css' +// // import Nav from './Nav' +// import img from '../images/img.PNG' +// import courseinfo from '../images/coursesinfo.jpeg' +// const Courseinfo = () => { +// const styleobj={ +// height: "200px", +// } +// const sty={ +// height: "60px", +// } +// return ( +//
+//
+//
+//

Programming with Python : HandsOn +// Introduction for Beginners

+//
Uploaded/Last updated on: Oct 28th, 2022
+// {/*
Image
*/} +//

Some text..

+//

Star Rating

- - - - - {/* - - - */} +// +// +// +// +// {/* +// +// +// */} -
-
- WHAT YOU WILL LEARN -
-
-
-
-
-
-
Special title treatment
-

With supporting text below as a natural lead-in to additional content.

-
-
-
-
-
-
-
-
-
Special title treatment
-

With supporting text below as a natural lead-in to additional content.

-
-
-
-
-
-
-
-
-
Special title treatment
-

With supporting text below as a natural lead-in to additional content.

-
-
-
-
-
-
-
-
-
Special title treatment
-

With supporting text below as a natural lead-in to additional content.

-
-
-
-
-
-
-
-
-
-
About the course
-
-
Overview
-

Lorem ipsum dolor sit amet consectetur adipisicing elit. Earum doloremque quasi et nemo vel totam. Tempore, ipsam. Repellat tempore blanditiis nihil possimus fugiat aliquam aliquid iure quaerat incidunt reprehenderit quis illum nam saepe, ab laboriosam hic sit quibusdam, magni eveniet? Fugit necessitatibus cum laboriosam delectus maxime aperiam id, perferendis placeat ipsam exercitationem a dolor dolorum magni ipsa aspernatur pariatur fugiat tenetur modi vitae. Reiciendis, ducimus pariatur ipsum ex repudiandae repellat neque nulla rem iste debitis ea consequatur voluptatum nemo possimus cumque ullam, totam, quos veniam quam esse sequi! Quibusdam vero inventore consequuntur autem natus saepe necessitatibus porro nostrum atque quam.

-
-
-

About the course

-

Lorem ipsum dolor, sit amet consectetur adipisicing elit. Culpa nam, iusto itaque reiciendis voluptatem ab, error at quaerat accusamus perferendis similique nisi magni dignissimos dicta asperiores est dolores earum? Unde ea assumenda, ducimus, sapiente, nulla laudantium quam exercitationem soluta voluptatem tenetur possimus aut modi doloremque natus blanditiis iusto! Nesciunt, est?

-
-
+//
+//
+// WHAT YOU WILL LEARN +//
+//
+//
+//
+//
+//
+//
Special title treatment
+//

With supporting text below as a natural lead-in to additional content.

+//
+//
+//
+//
+//
+//
+//
+//
+//
Special title treatment
+//

With supporting text below as a natural lead-in to additional content.

+//
+//
+//
+//
+//
+//
+//
+//
+//
Special title treatment
+//

With supporting text below as a natural lead-in to additional content.

+//
+//
+//
+//
+//
+//
+//
+//
+//
Special title treatment
+//

With supporting text below as a natural lead-in to additional content.

+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
About the course
+//
+//
Overview
+//

Lorem ipsum dolor sit amet consectetur adipisicing elit. Earum doloremque quasi et nemo vel totam. Tempore, ipsam. Repellat tempore blanditiis nihil possimus fugiat aliquam aliquid iure quaerat incidunt reprehenderit quis illum nam saepe, ab laboriosam hic sit quibusdam, magni eveniet? Fugit necessitatibus cum laboriosam delectus maxime aperiam id, perferendis placeat ipsam exercitationem a dolor dolorum magni ipsa aspernatur pariatur fugiat tenetur modi vitae. Reiciendis, ducimus pariatur ipsum ex repudiandae repellat neque nulla rem iste debitis ea consequatur voluptatum nemo possimus cumque ullam, totam, quos veniam quam esse sequi! Quibusdam vero inventore consequuntur autem natus saepe necessitatibus porro nostrum atque quam.

+//
+//
+//

About the course

+//

Lorem ipsum dolor, sit amet consectetur adipisicing elit. Culpa nam, iusto itaque reiciendis voluptatem ab, error at quaerat accusamus perferendis similique nisi magni dignissimos dicta asperiores est dolores earum? Unde ea assumenda, ducimus, sapiente, nulla laudantium quam exercitationem soluta voluptatem tenetur possimus aut modi doloremque natus blanditiis iusto! Nesciunt, est?

+//
+//
-
-
-
Syllabus
-
-
Module 0
-

-
    -
  1. lesson 0
  2. -
  3. lesson 1
  4. -
  5. lesson 2
  6. -
-

-
Module 1
-

-
    -
  1. lesson 0
  2. -
  3. lesson 1
  4. -
  5. lesson 2
  6. -
-

-
-
-

About the course

-

Lorem ipsum dolor, sit amet consectetur adipisicing elit. Culpa nam, iusto itaque reiciendis voluptatem ab, error at quaerat accusamus perferendis similique nisi magni dignissimos dicta asperiores est dolores earum? Unde ea assumenda, ducimus, sapiente, nulla laudantium quam exercitationem soluta voluptatem tenetur possimus aut modi doloremque natus blanditiis iusto! Nesciunt, est?

-
+//
+//
+//
Syllabus
+//
+//
Module 0
+//

+//
    +//
  1. lesson 0
  2. +//
  3. lesson 1
  4. +//
  5. lesson 2
  6. +//
+//

+//
Module 1
+//

+//
    +//
  1. lesson 0
  2. +//
  3. lesson 1
  4. +//
  5. lesson 2
  6. +//
+//

+//
+//
+//

About the course

+//

Lorem ipsum dolor, sit amet consectetur adipisicing elit. Culpa nam, iusto itaque reiciendis voluptatem ab, error at quaerat accusamus perferendis similique nisi magni dignissimos dicta asperiores est dolores earum? Unde ea assumenda, ducimus, sapiente, nulla laudantium quam exercitationem soluta voluptatem tenetur possimus aut modi doloremque natus blanditiis iusto! Nesciunt, est?

+//
-
-
-
-
About the Insturctor
-
-
Overview
-

Lorem ipsum dolor sit amet consectetur adipisicing elit. Earum doloremque quasi et nemo vel totam. Tempore, ipsam. Repellat tempore blanditiis nihil possimus fugiat aliquam aliquid iure quaerat incidunt reprehenderit quis illum nam saepe, ab laboriosam hic sit quibusdam, magni eveniet? Fugit necessitatibus cum laboriosam delectus maxime aperiam id, perferendis placeat ipsam exercitationem a dolor dolorum magni ipsa aspernatur pariatur fugiat tenetur modi vitae. Reiciendis, ducimus pariatur ipsum ex repudiandae repellat neque nulla rem iste debitis ea consequatur voluptatum nemo possimus cumque ullam, totam, quos veniam quam esse sequi! Quibusdam vero inventore consequuntur autem natus saepe necessitatibus porro nostrum atque quam.

-
-
-

About the course

-

Lorem ipsum dolor, sit amet consectetur adipisicing elit. Culpa nam, iusto itaque reiciendis voluptatem ab, error at quaerat accusamus perferendis similique nisi magni dignissimos dicta asperiores est dolores earum? Unde ea assumenda, ducimus, sapiente, nulla laudantium quam exercitationem soluta voluptatem tenetur possimus aut modi doloremque natus blanditiis iusto! Nesciunt, est?

-
+//
+//
+//
+//
About the Insturctor
+//
+//
Overview
+//

Lorem ipsum dolor sit amet consectetur adipisicing elit. Earum doloremque quasi et nemo vel totam. Tempore, ipsam. Repellat tempore blanditiis nihil possimus fugiat aliquam aliquid iure quaerat incidunt reprehenderit quis illum nam saepe, ab laboriosam hic sit quibusdam, magni eveniet? Fugit necessitatibus cum laboriosam delectus maxime aperiam id, perferendis placeat ipsam exercitationem a dolor dolorum magni ipsa aspernatur pariatur fugiat tenetur modi vitae. Reiciendis, ducimus pariatur ipsum ex repudiandae repellat neque nulla rem iste debitis ea consequatur voluptatum nemo possimus cumque ullam, totam, quos veniam quam esse sequi! Quibusdam vero inventore consequuntur autem natus saepe necessitatibus porro nostrum atque quam.

+//
+//
+//

About the course

+//

Lorem ipsum dolor, sit amet consectetur adipisicing elit. Culpa nam, iusto itaque reiciendis voluptatem ab, error at quaerat accusamus perferendis similique nisi magni dignissimos dicta asperiores est dolores earum? Unde ea assumenda, ducimus, sapiente, nulla laudantium quam exercitationem soluta voluptatem tenetur possimus aut modi doloremque natus blanditiis iusto! Nesciunt, est?

+//
-

Sunt in culpa qui officia deserunt mollit anim id est laborum consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco.

-

-

TITLE HEADING

-
Title description, Sep 2, 2017
-
Image
-

Some text..

-

Sunt in culpa qui officia deserunt mollit anim id est laborum consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco.

-
-
-

Unlimited access at

-
Rs 999/-
-
-
- -
-
-
This course includes:
-
    -
  • Sharable certificate
  • -
  • 100% online course
  • -
  • Flexible Schedule
  • -
  • Appoximately 4 months to complete
  • -
-
-
- -
-
-
-

Course is offered by:

-
Harvard University
-
-

Some text about me in culpa qui officia deserunt mollit anim..

-

More Text

-

Lorem ipsum dolor sit ame.

-
Image


-
Image


-
Image
-
-
-
-
+//

Sunt in culpa qui officia deserunt mollit anim id est laborum consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco.

+//

+//

TITLE HEADING

+//
Title description, Sep 2, 2017
+//
Image
+//

Some text..

+//

Sunt in culpa qui officia deserunt mollit anim id est laborum consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco.

+//
+//
+//

Unlimited access at

+//
Rs 999/-
+//
+//
+// +//
+//
+//
This course includes:
+//
    +//
  • Sharable certificate
  • +//
  • 100% online course
  • +//
  • Flexible Schedule
  • +//
  • Appoximately 4 months to complete
  • +//
+//
+//
+// +//
+//
+//
+//

Course is offered by:

+//
Harvard University
+//
+//

Some text about me in culpa qui officia deserunt mollit anim..

+//

More Text

+//

Lorem ipsum dolor sit ame.

+//
Image


+//
Image


+//
Image
+//
+//
+//
+//
- ) -} +// ) +// } -export default Courseinfo +// export default Courseinfo diff --git a/src/config/firebaseConfig.js b/src/config/firebaseConfig.js new file mode 100644 index 0000000..45ec80a --- /dev/null +++ b/src/config/firebaseConfig.js @@ -0,0 +1,9 @@ +// export default { +// apiKey: "AIzaSyBmWgBmueFNK__yYwv17iy7TEcv6Xj2Gtk", +// authDomain: "fsd-react.firebaseapp.com", +// projectId: "fsd-react", +// storageBucket: "fsd-react.appspot.com", +// messagingSenderId: "791146250024", +// appId: "1:791146250024:web:0f64eb26f13c5674f99a1d", +// measurementId: "G-5TQ263S8Q1" +// }; diff --git a/src/css/Admin.module.css b/src/css/Admin.module.css new file mode 100644 index 0000000..9e460e0 --- /dev/null +++ b/src/css/Admin.module.css @@ -0,0 +1,84 @@ + + +/*table styling*/ +.body{ + margin: 70px 0 0 0 ; + /* padding: 35px 20px; */ +} +/* h1, main { + text-align: center; +} */ +table { + border-collapse: collapse; + display: inline-block; + text-align: left; + border-top: 1px solid #888; +} +table thead { + background: #bbb; +} +table tr:nth-child(even) { + background: #dfdfdf; +} +table th, table td { + padding: 10px 20px; + border: 1px solid #888; + border-width: 0 1px 1px; +} +/*responsive table*/ +@media screen and (max-width: 1000px) { + /*put each field on its own line and align text to the right + *border is added for further readability + */ + table td { + display: block; + text-align: right; + } + /*put data-label content before each field floated to the left*/ + table td:before { + content: attr(data-label); + float: left; + font-weight: bold; + margin-right: 10px; + } + /*remove thead*/ + table thead { + display: none; + } +} + +.column { + float: left; + padding: 10px; + } + + .left { + width: 20%; + /* background-color: rgb(85, 185, 216); */ + background-color: var(--nav-color); + height: 100vh; + padding: 0; + } + + .right { + width: 80%; + + } + + .section { + width: 100%; + margin: 0%; + padding: 5px; + height: 50px; + font-size: 25px; + /* background-color: #888; */ + border: 1px solid #888; + border-width: 0 1px 1px; + color: white; + } + + .section:hover { + background: linear-gradient(to left, white 50%, var(--nav-color) 50%) right; + background-size: 200% 100%; + color: #3d5adb; + } \ No newline at end of file diff --git a/src/css/App.css b/src/css/App.css index 006f30d..804c8da 100644 --- a/src/css/App.css +++ b/src/css/App.css @@ -10,9 +10,10 @@ /* ===== Colours ===== */ +/* #3d6ef3 */ :root{ --body-color: #E4E9F7; - --nav-color: #3d6ef3; + --nav-color: #242B2E; --side-nav: #010718; --text-color: #FFF; --search-bar: #F2F2F2; @@ -26,7 +27,7 @@ body{ .body.dark{ --body-color: #18191A; - --nav-color: #242526; + --nav-color: #0D0D0D; --side-nav: #242526; --text-color: #CCC; --search-bar: #242526; diff --git a/src/css/Card.module.css b/src/css/Card.module.css index a43baa3..0482a26 100644 --- a/src/css/Card.module.css +++ b/src/css/Card.module.css @@ -1,131 +1,113 @@ -.body { - margin: 150px 0 0 0; +.wrapper { + display: flex; + height: 350px; + width: 600px; + align-items: center; + justify-content: center; + box-shadow: 0px 10px 15px rgba(0, 0, 0, 0.1); +} +.logo { + height: 100px; + overflow: hidden; +} + +.wrapper .right { + background: #fff; + height: 100%; + width: 50%; + text-align: center; + border-radius: 5px 0 0 5px; + z-index: 12; +} + +.wrapper .right .logo { + font-size: 30px; + font-weight: bold; + margin-top: 18px; +} + +.right .stars { + font-size: 18px; + color: var(--nav-color); + margin-top: 8px; } -.container{ - display: flex; - max-width: 750px; - background: #fff; - border-radius: 12px; - justify-content: space-between; - box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.15); - position: relative; - } - .container::before{ - content: ''; - position: absolute; - left: 0; - top: 0; - height: 100%; - width: 100%; - border-radius: 12px; - clip-path: circle(65% at right 35%); - background-image: linear-gradient( 135deg, #fd9bb0 10%, #F6416C 100%); - } - .container .box.one{ - padding: 35px 5px 0px 35px; - } - .box.one .details .topic{ - font-size: 30px; - font-weight: 500; - } - .box.one .details p{ - color: #737373; - font-size: 13px; - font-weight: 500; - } - .box.one .rating{ - color: #fd9bb0; - font-size: 14px; - margin-top: 10px; - } - .box.one .priceBox{ - margin-top: 16px; - } - .box.one .discount{ - font-size: 20px; - margin: 10px 0 0 12px; - position: relative; - color: #737373; - } - .box.one .discount:before{ - content: ''; - position: absolute; - height: 1px; - width: 100px; - background: #737373; - top: 50%; - left: -8px; - } - .box.one .price{ - color: #fc6989; - font-size: 30px; - } - .box.one .button1{ - margin-top: 55px; - } - .box.one .button1 button{ - outline: none; - border:none; - padding: 8px 16px; - border-radius: 6px; - font-size: 18px; - font-weight: 500; - color: #fff; - background: #00e6e6; - cursor: pointer; - transition: all 0.3s ease; - } - .button1 button:hover{ - transform: scale(0.98); - } - .container .box.two .image{ - position: relative; - right: 0; - top: 0; - height: 340px; - width: 430px; - } - .image img{ - height: 100%; - width: 100%; - object-fit: cover; - } - .container .box.two .imageBox{ - position: relative; - text-align: right; - right: 0; - bottom: 27px; - } - .box.two .image-box .info{ - margin: 0 35px 0 0; - } - .box.two .info .brand{ - font-size: 17px; - font-weight: 600; - color: #c9032e; - } - .box.two .info .name{ - font-size: 20px; - font-weight: 500; - color: #fff; - } - .box.two .info .shipping{ - font-size: 14px; - font-weight: 400; - color: #000; - } - .box.two .button2{ - margin: 17px 0; - } - .button2 button{ - outline: none; - color: #fff; - border: 1px solid #fff; - border-radius: 12px; - padding: 8px 17px; - background: transparent; - font-size: 15px; - font-weight: 400; - cursor: pointer; - } \ No newline at end of file +.right .about p { + color: #8d8d8d; + font-size: 17px; +} + +.about { + width: 100%; + height: 100px; + overflow: hidden; +} + +.right button { + background: var(--nav-color); + outline: none; + border: none; + padding: 10px 15px; + display: inline-flex; + align-items: center; + justify-content: center; + border-radius: 8px; + margin: 16px; + cursor: pointer; + transition: all 0.3s linear; +} + + +.right h2 { + font-weight: 500; + font-size: 18px; + color: #fff; + margin-left: 12px; +} + +.button:hover { + background: linear-gradient(to left, var(--body-color) 50%, var(--nav-color) 50%) right; + background-size: 200% 100%; + /* transform: scale(0.98); */ +} + +.button:hover h2 { + color: #242B2E; +} + + + +.left { + background-size: contain; + background-position: center; + height: 100%; + width: 50%; + border-radius: 0 5px 5px 0; + cursor: pointer; +} + +.left ul { + height: 100%; + width: 100%; + background: rgba(0, 0, 0, 0.8); + border-radius: 5px; + display: inline-flex; + flex-direction: column; + justify-content: space-between; + text-align: left; + padding: 10px 26px; + margin-left: -300px; + transition: 0.4s +} + +ul li { + font-size: 15px; + color: #fff; +} + +.left:hover ul { + margin-left: 0px; +} +.link { + text-decoration: none; +} \ No newline at end of file diff --git a/src/css/CourseUploadform.module.css b/src/css/CourseUploadform.module.css index 7f89cb3..d37d299 100644 --- a/src/css/CourseUploadform.module.css +++ b/src/css/CourseUploadform.module.css @@ -1,3 +1,4 @@ + /* color: #486db6; */ .body{ height: 100vh; width: 100%; @@ -42,8 +43,9 @@ .content .topic{ font-size: 22px; font-weight: 500; - color: #486db6; + color: #242B2E; } + .content form{ width: 40%; margin-right: 30px; @@ -62,13 +64,14 @@ font-size: 16px; outline: none; padding-left: 16px; - background: #e9f0fb; + background: #CAD5E2; border: 2px solid transparent; transition: all 0.3s ease; } + /* #e9f0fb */ .content .inputBox input:focus, .content .inputBox input:valid{ - border-color: #486db6; + border-color: #242B2E; background-color: #fff; } .content .inputBox label{ @@ -86,7 +89,7 @@ top: 0; left: 12px; display: 14px; - color: #486db6; + color: #242B2E; background: #fff; } .content .messageBox{ @@ -98,14 +101,15 @@ height: 100%; width: 100%; resize: none; - background: #e9f0fb; + background: #CAD5E2; border: 2px solid transparent; border-radius: 6px; outline: none; transition: all 0.3s ease; + padding: 12px; } .content .messageBox textarea:focus{ - border-color: #486db6; + border-color: #242B2E; background-color: #fff; } .content .messageBox label{ @@ -117,16 +121,17 @@ pointer-events: none; transition: all 0.3s ease; } + .content .messageBox textarea:focus ~ label{ left: 12px; top: -10px; - color: #486db6; + color: #242B2E; font-size: 14px; background: #fff; } .content .inputBox input[type="submit"]{ color: #fff; - background: #486db6; + background: #242B2E; padding-left: 0; font-size: 18px; font-weight: 500; @@ -137,7 +142,7 @@ .content .inputBox input[type="submit"]:hover{ background: linear-gradient(to left, white 50%, var(--nav-color) 50%) right; background-size: 200% 100%; - color: #3d5adb; + color: #242B2E; } @media (max-width:1000px) { .content .imageBox{ diff --git a/src/css/Courseinfo.css b/src/css/Courseinfo.css index 6179125..6ab1782 100644 --- a/src/css/Courseinfo.css +++ b/src/css/Courseinfo.css @@ -1,150 +1,155 @@ /* Fake image, just for this example */ .fakeimg { - background-color: #aaa; - width: 100%; - padding: 20px; - } + background-color: #aaa; + width: 100%; + padding: 20px; +} - .row-courseinfo { - flex-direction: column; - } - .row-courseinfo { - display: flex; - flex-wrap: wrap; - } - - /* Main column */ + +.row-courseinfo { + display: flex; + flex-wrap: wrap; +} +.side-courseinfo { + margin-top: 50px; + flex: 30%; + background-color: rgb(199, 225, 233); + /* background-color: #f1f1f1; */ + padding: 20px; +} + +/* Main column */ .main-courseinfo { - margin-top: 50px; - flex: 70%; - padding: 20px; - } - .stars { - width: 15px; - height: 15px; - } + margin-top: 50px; + flex: 70%; + padding: 20px; +} +.stars { + width: 15px; + height: 15px; +} - .card-grid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); - gap: 1rem; - align-items: flex-start; - margin-top: 75px; - } +.card-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); + gap: 1rem; + align-items: flex-start; + margin-top: 75px; +} - .card { - --padding: 1rem; - background: rgba(204, 204, 204, 0.5); - border: 1px solid #777; - border-radius: 20px; - overflow: hidden; - margin: 20px; - } - - .course-card { - height: 370px; - } - - .card.card-shadow { - border: none; - box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.2); - } - - .card-header { - font-size: 1.5rem; - padding: var(--padding); - padding-bottom: 0; - margin-bottom: 0.5rem; - } - - .card-header.card-image.card-title{ - padding: 10px; - overflow: hidden; - } - .card-header.card-image { - padding: 0px; - overflow: hidden; - } - - .card-header.card-image > img { - display: block; - width: 100%; - max-height: 200px; - aspect-ratio: 16 / 9; - object-fit: cover; - object-position: center; - transition: 200ms transform ease-in-out; - } - - .card:hover > .card-header.card-image > img { - transform: scale(1.025); - } - - .card-body { - font-size: 0.9rem; +.card { + --padding: 1rem; + background: rgba(204, 204, 204, 0.5); + border: 1px solid #777; + border-radius: 20px; + overflow: hidden; + margin: 20px; +} + +.course-card { + height: 370px; +} + +.card.card-shadow { + border: none; + box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.2); +} + +.card-header { + font-size: 1.5rem; + padding: var(--padding); + padding-bottom: 0; + margin-bottom: 0.5rem; +} + +.card-header.card-image.card-title{ + padding: 10px; + overflow: hidden; +} +.card-header.card-image { + padding: 0px; + overflow: hidden; +} + +.card-header.card-image > img { + display: block; + width: 100%; + max-height: 200px; + aspect-ratio: 16 / 9; + object-fit: cover; + object-position: center; + transition: 200ms transform ease-in-out; +} + +.card:hover > .card-header.card-image > img { + transform: scale(1.025); +} + +.card-body { + font-size: 0.9rem; + padding: 0 25px; +} + +.card-body-business { + + font-size: .9rem; padding: 0 var(--padding); + margin-top: 3%; } - .card-body-business { - - font-size: .9rem; - padding: 0 var(--padding); - margin-top: 3%; - } - - - .card-footer { - margin-top: 1rem; - padding: var(--padding); - padding-top: 0; - } - - .card-footer > button { - margin: 5px; - } - - .card-student { - background: rgb( - 204, - 204, - 204 - ); /* Fallback for older browsers without RGBA-support */ - background: rgba(204, 204, 204, 0.5); - - margin: 50px auto; - width: 90%; - height: 500px; - } - .card-head-std { - min-height: 200px; - } - .profile-card-body { - padding-bottom: 20px; - } - - .container.card { - margin-left: 100px; - width: 800px; - height: 40px; - } +.card-footer { + margin-top: 1rem; + padding: var(--padding); + padding-top: 0; +} - .card-recent { - background: rgba(204, 204, 204, 0.5); - cursor: pointer; - margin: 0px 50px 15px 50px; - } +.card-footer > button { + margin: 5px; +} - .clist-card { - background-color: coral; - color: white; - } - /* Create two unequal columns that sits next to each other */ +.card-student { + background: rgb( + 204, + 204, + 204 + ); /* Fallback for older browsers without RGBA-support */ + background: rgba(204, 204, 204, 0.5); + + margin: 50px auto; + width: 90%; + height: 500px; +} + +.card-head-std { + min-height: 200px; +} +.profile-card-body { + padding-bottom: 20px; +} + +.container.card { + margin-left: 100px; + width: 800px; + height: 40px; +} + +.card-recent { + background: rgba(204, 204, 204, 0.5); + cursor: pointer; + margin: 0px 50px 15px 50px; +} + +.clist-card { + background-color: coral; + color: white; +} +/* Create two unequal columns that sits next to each other */ /* Sidebar/left column */ .side-courseinfo { - margin-top: 50px; - flex: 30%; - background-color: rgb(199, 225, 233); - /* background-color: #f1f1f1; */ - padding: 20px; - } + margin-top: 50px; + flex: 30%; + background-color: rgb(199, 225, 233); + /* background-color: #f1f1f1; */ + padding: 20px; +} diff --git a/src/css/Courses.css b/src/css/Courses.css deleted file mode 100644 index bfe12bf..0000000 --- a/src/css/Courses.css +++ /dev/null @@ -1,3 +0,0 @@ -.courses-body { - margin: 75px 0 0 25px; -} \ No newline at end of file diff --git a/src/css/Courses.module.css b/src/css/Courses.module.css new file mode 100644 index 0000000..a6a734d --- /dev/null +++ b/src/css/Courses.module.css @@ -0,0 +1,12 @@ +.coursesBody { + margin: 95px 0 0 25px; +} + +.cardGrid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(600px, 1fr)); + gap: 1rem; + align-items: flex-start; + margin-top: 75px; + } + \ No newline at end of file diff --git a/src/css/Help.module.css b/src/css/Help.module.css new file mode 100644 index 0000000..47bcdb4 --- /dev/null +++ b/src/css/Help.module.css @@ -0,0 +1,59 @@ +.helpbody { + /* background-color: black; + background-image: url(../images/R.png); */ + background-repeat: no-repeat; + background-size: cover; + background-attachment: fixed; + margin-left: 100px; + margin-right: 800px; + } + + .helpheading { + margin-top: 100px; + font-size: xx-large; + } + + .accordion { + background-color: #eee; + color: #444; + cursor: pointer; + min-width: -200px; + padding: 18px; + width: 100%; + border: none; + text-align: left; + outline: none; + font-size: 15px; + transition: 1s; + } + + .helpactive, + .accordion:hover { + background-color: #758283; + } + /* rgb(13, 110, 253) */ + + .panel { + padding: 0 18px; + background-color: white; + overflow: hidden; + min-width: 182px; + } + .none { + display: none; + } + + .block { + display: block; + } + + .imgright{ + margin-top: -500px; + margin-left: 1000px; + } + .img { + width: -1000px; + height: -1000px; + } + + \ No newline at end of file diff --git a/src/css/Home.css b/src/css/Home.module.css similarity index 87% rename from src/css/Home.css rename to src/css/Home.module.css index 7ea6b64..1d50cfb 100644 --- a/src/css/Home.css +++ b/src/css/Home.module.css @@ -1,5 +1,5 @@ -#myVideo { +.myVideo { position: absolute; width: 100%; height: 100%; @@ -17,15 +17,17 @@ overflow: hidden; } -.home-btn { +.homeBtn { width: 300px; height: 50px; border-radius: 20px; background-color: var(--nav-color) ; border-width: 0; margin: 5px 10px 5px 0; + color: white; } -.home-btn:hover { +.homeBtn:hover { background: linear-gradient(to left, white 50%, var(--nav-color) 50%) right; background-size: 200% 100%; + color: black; } \ No newline at end of file diff --git a/src/css/InstructorHome.css b/src/css/InstructorHome.css new file mode 100644 index 0000000..14f951c --- /dev/null +++ b/src/css/InstructorHome.css @@ -0,0 +1,73 @@ +.ibody { + /* background-image: url(../images/instructorbg.png); */ + background-repeat: no-repeat; + background-size: cover; + background-attachment: scroll; + } + + .btn { + border-radius: 20px; + } + + .showall .btn { + margin: 10px; + float: right; + padding: 5px; + } + + .upload .btn { + color: black; + border-width: 2px; + width: 100%; + margin: 2px; + padding: 10px; + } + + .card { + --padding: 1rem; + background: rgba(204, 204, 204, 0.5); + border: 1px solid #777; + border-radius: 20px; + overflow: hidden; + margin: 20px; + } + + .sphead { + margin: 100px 50px 0px 50px; + height: 45px; + padding-top: 10px; + } + + .card-body { + font-size: 0.9rem; + padding: 0 var(--padding); + } + + .card-recent { + background: rgba(204, 204, 204, 0.5); + cursor: pointer; + margin: 0px 50px 15px 50px; + } + + .card-header { + font-size: 1.5rem; + padding: var(--padding); + padding-bottom: 0; + margin-bottom: 0.5rem; + } + + .profile-card-body { + padding-bottom: 20px; + } + + .showall { + background: rgba(204, 204, 204, 0.5); + margin: -15px 50px 20px 50px; + } + + .upload { + background: rgba(204, 204, 204, 0.1); + border: 0px; + margin: 100px 50px 20px 50px; + } + \ No newline at end of file diff --git a/src/css/Nav.css b/src/css/Nav.css index 961bfac..882162f 100644 --- a/src/css/Nav.css +++ b/src/css/Nav.css @@ -14,6 +14,7 @@ body.dark nav{ } + nav .nav-bar{ position: relative; height: 100%; @@ -35,6 +36,8 @@ nav .nav-bar .sidebarOpen{ display: none; } + + nav .nav-bar .logo a{ font-size: 25px; font-weight: 500; @@ -164,6 +167,49 @@ nav .nav-bar .logo a{ pointer-events: auto; } +.userIcon { + color: white; + padding: 16px; + font-size: 16px; + border: none; + cursor: pointer; + } + +.dropdown-usericon{ + position: relative; + display: inline-block; + } + + /* Dropdown Content (Hidden by Default) */ + .dropdown-content { + display: none; + position: absolute; + background-color: #f9f9f9; + min-width: 160px; + box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2); + z-index: 1; + margin-top:50px; + } + + /* Links inside the dropdown */ + .dropdown-content a { + color: black; + padding: 12px 16px; + text-decoration: none; + display: block; + } + + /* Change color of dropdown links on hover */ + .dropdown-content a:hover {background-color: #f1f1f1} + + /* Show the dropdown menu on hover */ + .dropdown-usericon:hover .dropdown-content { + display: block; + } + + .dropdown:hover .userIcon { + background-color: #3e8e41; + } .search-field::before{ content: ''; position: absolute; @@ -215,6 +261,11 @@ body.dark .search-field i{ padding: 10px; } +.userIcon{ + font-size: 32px; + float: right; +} + @media (max-width: 790px) { nav .nav-bar .sidebarOpen{ display: block; diff --git a/src/css/PlayListVideo.module.css b/src/css/PlayListVideo.module.css new file mode 100644 index 0000000..ce76619 --- /dev/null +++ b/src/css/PlayListVideo.module.css @@ -0,0 +1,391 @@ +:root{ + --main-color:#8e44ad; + --red:#e74c3c; + --orange:#f39c12; + --light-color:#888; + --light-bg:#eee; + --black:#2c3e50; + --white:#fff; + --border:.1rem solid rgba(0,0,0,.2); +} + +/* *{ + font-family: 'Nunito', sans-serif; + margin:0; padding:0; + box-sizing: border-box; + outline: none; border:none; + text-decoration: none; +} + +*::selection{ + background-color: var(--main-color); + color:#fff; +} */ + +/* html{ + font-size: 62.5%; + overflow-x: hidden; +} + */ +/* html::-webkit-scrollbar{ + width: 1rem; + height: .5rem; +} + +html::-webkit-scrollbar-track{ + background-color: transparent; +} + +html::-webkit-scrollbar-thumb{ + background-color: var(--main-color); +} */ + +/* .studentprofile-body{ + background-color: var(--light-bg); + padding-left: 8rem; +} */ +/* .playlistvideobody{ + padding-left: .5rem; + background-color: var(--light-bg); +} */ +/* section{ + padding:2rem; + margin: 0 auto; + max-width: 1200px; +} */ + +/* .heading{ + font-size: 2.5rem; + color:var(--black); + margin-bottom: .5rem; + border-bottom: var(--border); + padding-bottom: .5rem; + text-transform: capitalize; +} */ + +/* .inlinebtn, +.inline-option-btn, +.inline-delete-btn, +.btn, +.delete-btn, +.option-btn{ + border-radius: .5rem; + color:#fff; + font-size: 1.8rem; + cursor: pointer; + text-transform: capitalize; + padding:1rem 3rem; + text-align: center; + margin-top: 1rem; +} + +.btn, +.delete-btn, +.option-btn{ + display: block; + width: 100%; +} + +.inlinebtn, +.inline-option-btn, +.inline-delete-btn{ + display: inline-block; +} + +.btn, +.inlinebtn{ + background-color: var(--main-color); +} + +.option-btn, +.inline-option-btn{ + background-color:var(--orange); +} + +.delete-btn, +.inline-delete-btn{ + background-color: var(--red); +} + +.inline-btn:hover, +.inline-option-btn:hover, +.inline-delete-btn:hover, +.btn:hover, +.delete-btn:hover, +.option-btn:hover{ + background-color: var(--black); + color: var(--white); +} + +.flexbtn{ + display: flex; + gap: 1rem; +} */ + +.inlinebtn{ + background-color: var(--main-color); + border-radius: .5rem; + color:#fff; + font-size: 1rem; + cursor: pointer; + text-transform: capitalize; + padding:1rem 3rem; + text-align: center; + margin-top: 2rem; +} +.inline-btn:hover{ + background-color: var(--black); + color: var(--white); +} + +.sidebar{ + position:sticky; + /* top: 10; left: 0; */ + width: 20rem; + /* background-color: var(--white); */ + background-color: #000; + /* height: 100vh; */ + border-right: var(--border); + /* padding-bottom: 10rem; */ + z-index: 600; +} + +.sidebar .sidebarheader{ + display: relative; +align-items: left; +justify-content: space-between; +/* border: 1px solid #d1d7dc; */ +padding-bottom: 1rem; +background-color: #fff; + +} + .sidebar .sidebarheading{ + font-weight: 600; + line-height: 1.2; + /* letter-spacing: .02rem; */ + font-size: 2rem; + text-align: center; + margin-top: .2rem; + margin-left:.2rem; +} + + .sidenav { + margin: 5rem 0rem .1rem .2rem; + padding:1rem .2rem .5rem .2rem; + height: 100%; /* Full-height: remove this if you want "auto" height */ + width: 340px; /* Set the width of the sidebar */ + position: fixed; /* Fixed Sidebar (stay in place on scroll) */ + /* z-index: 1; Stay on top */ + top: 0; /*Stay at the top */ + left: 0; + background-color: white; + overflow-x: hidden; /* Disable horizontal scroll */ + /* padding-top: 20px; + padding-bottom: 40px; */ + } + + /* The navigation menu links */ +.sidebardropdownbtn { + padding: .2rem .9rem .8rem .5rem; + /* text-decoration: none; */ + border-radius: .4rem; + font-family:'Times New Roman', Times, serif; + font-size: 20px; + display: block; + width: 100%; + text-align: centre; + cursor: pointer; + outline: none; + border: .5px solid; + /* background-color: light rgb(243, 235, 235); */ + background-color: #ffffff; + margin: .5rem 0rem 0rem 0rem; + white-space: normal; + /* border-top: 0.8rem white solid; + border-right: 1.4rem white solid; + border-bottom: 1.4rem white solid; + border-left: 0.8rem white solid; */ + } + + .sidenav a{ + text-decoration: none; + font-size: 18px; + display: block; + width: 100%; + text-align: left; + cursor: pointer; + outline: none; + background-color: light rgb(116, 71, 71); + white-space: normal; + border-width: 0.8rem 0.8rem 1.5rem 1.5rem; + padding: 6px 8px 6px 16px; + } + /* .sidenav .span-sidebar{ + padding-bottom: 2rem; + font-size: 14px; + border-bottom: 2.5rem white solid; + border-left: 1.5rem white solid; + + } */ + + .activelesson { + background-color: rgb(126, 128, 131); + color: white; + } + + .dropdowncontainer { + display: none; + background-color: rgb(142, 144, 148); + margin:1rem 0.5rem 0.5rem 0.5rem; + /* padding-left: 8px; */ + } + + .fa-caret-down { + float: right; + padding-right: 8px; + } + + /* When you mouse over the navigation links, change their color */ + .sidenav a:hover { + color: rgb(0, 2, 0); + background-color: rgb(190, 193, 199); + } + +.watchvideo{ + padding:2rem; + margin: 0rem .5rem 0rem 2rem; + /* max-width: 1300px; */ + width: 80%; + z-index: inherit; +} + +.watchvideo .videocontainer{ + background-color: var(--white); + border-radius: .5rem; + margin: 3rem .1rem 2rem 18rem; + padding: 2rem 2rem 2rem 2rem ; + /* top: 200rem; */ + width: 100%; + z-index: 300; +} + +.watchvideo .videocontainer .video{ + position: relative; + margin-bottom: 1.5rem; +} + +.watchvideo .videocontainer .video video{ + border-radius: .5rem; + width: 100%; + object-fit: contain; + background-color: #000; +} + +.watchvideo .videocontainer .title{ + font-size: 2rem; + color: var(--black); +} + +.watchvideo .videocontainer .info{ + display: flex; + margin-top: 1.5rem; + margin-bottom: 2rem; + border-bottom: var(--border); + padding-bottom: 1.5rem; + gap: 2.5rem; + align-items: center; +} + +.watchvideo .videocontainer .info p{ + font-size: 1.6rem; +} + +.watchvideo .videocontainer .info p span{ + color: var(--light-color); +} + +.watchvideo .videocontainer .info i{ + margin-right: 1rem; + color: var(--main-color); +} + +.watchvideo .videocontainer .tutor{ + display: flex; + align-items: center; + gap: 2rem; + margin: 1rem 2rem 3rem 0rem; +} + +.watchvideo .videocontainer .tutor img{ + border-radius: 50%; + height: 5rem; + width: 5rem; + object-fit: cover; +} + +.watchvideo .videocontainer .tutor h3{ + font-size: 2rem; + color: var(--black); + margin-bottom: .2rem; +} + +.watchvideo .videocontainer .tutor span{ + font-size: 1.5rem; + color: var(--light-color); +} + +.watchvideo .videocontainer .flex{ + display: flex; + align-items: center; + justify-content: space-between; + gap: 1.5rem; +} + +.watchvideo .videocontainer .flex button{ + border-radius: .5rem; + padding: 1rem 1.5rem; + font-size: 1.8rem; + cursor: pointer; + background-color: var(--light-bg); +} + +.watchvideo .videocontainer .flex button i{ + margin-right: 1rem; + color: var(--black); +} + +.watchvideo .videocontainer .flex button span{ + color: var(--light-color); +} + +.watchvideo .videocontainer .flex button:hover{ + background-color: var(--black); +} + +.watchvideo .videocontainer .flex button:hover i{ + color: var(--white); +} + +.watchvideo .videocontainer .flex button:hover span{ + color: var(--white); +} + +.watchvideo .videocontainer .description{ + line-height: 1.5; + font-size: 1.2rem; + color: var(--light-color); + margin-top: 2rem; +} +.rating{ + display: flex; + flex-direction: column; + align-items: flex-end; +} +.rating button{ + border-radius: .5rem; + margin: 5px 0; + padding: 0.5rem; + font-size: 1rem; + cursor: pointer; + background-color: var(--light-color); +} \ No newline at end of file diff --git a/src/css/Signupform.css b/src/css/Signupform.css index 03d7057..3d39f11 100644 --- a/src/css/Signupform.css +++ b/src/css/Signupform.css @@ -1,5 +1,5 @@ .signuppage-body { - margin: 35px 0 0 0; + margin: 70px 0 0 0; height: 100vh; display: flex; justify-content: center; @@ -100,7 +100,9 @@ form .category label .dot { #dot-1:checked~.category label .one, #dot-2:checked~.category label .two, -#dot-3:checked~.category label .three { +#dot-3:checked~.category label .three, +#dot-4:checked~.category label .four, +#dot-5:checked~.category label .five{ background: #9b59b6; border-color: #d9d9d9; } diff --git a/src/css/StudentHome.module.css b/src/css/StudentHome.module.css new file mode 100644 index 0000000..3adb94e --- /dev/null +++ b/src/css/StudentHome.module.css @@ -0,0 +1,182 @@ +.welcome { + color: #fff; + width: 100%; + height: 100px; + margin-top: 72px; + background-color: #010718; + background: rgb(238, 174, 202); + background: #242B2E; + /* radial-gradient(circle, rgba(238, 174, 202, 1) 0%, rgba(148, 187, 233, 1) 100%); */ + padding: 10px; + +} + +.typewriter h1 { + float: left; + font-family: monospace; + overflow: hidden; + /* Ensures the content is not revealed until the animation */ + border-right: .15em solid orange; + /* The typwriter cursor */ + white-space: nowrap; + /* Keeps the content on a single line */ + margin: 0 auto; + /* Gives that scrolling effect as the typing happens */ + letter-spacing: .15em; + /* Adjust as needed */ + animation: + typing 3.5s steps(30, end), + blink-caret .5s step-end infinite; +} + +/* The typing effect */ +@keyframes typing { + from { + width: 0 + } + + to { + width: 27% + } +} + +/* The typewriter cursor effect */ +@keyframes blink-caret { + + from, + to { + border-color: transparent + } + + 50% { + border-color: orange + } +} + +.continueLearning { + width: 100%; + height: 300px; + background-color: #242B2E; + margin-top: 10px; + padding: 10px; + color: #fff; +} +/* #afbbdc */ +.left { + float: left; + font-size: larger; +} + +.right { + padding: 10px; + float: right; +} + +.right .btnShome { + font-size:larger; + background: rgb(238, 174, 202); +} + +.right .btnShome:hover { + background: rgb(238, 174, 202); + background: radial-gradient(circle, rgba(238, 174, 202, 1) 0%, rgba(148, 187, 233, 1) 100%); + +} + +.btnShome { + width: auto; + padding: 10px; + height: 50px; + color: #fff; + border-radius: 20px; + background-color: var(--nav-color); + border-width: 0; + margin: 5px 10px 5px 0; +} + +.recentCourse { + margin: 45px 0px 0px 25px; + height: 200px; + width: 80%; + background-color: white; + color: #0D0D0D; +} + +.recentCourse img { + float: left; + margin: 20px 20px 0px 25px; + height: 150px; + width: 175px; +} + + .recentDetails { + padding: 20px 0px 20px 0px ; +} + +.progressBar { + height: 25px; + width: 75%; + margin-left: 220px; + background-color: #CAD5E2; +} + +.progressBar div { + background-color: #242B2E; + height: 25px; + width: 60%; +} + +.coursesBody { + margin: 35px 0 0 25px; +} + +.cardGrid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(600px, 1fr)); + gap: 1rem; + align-items: flex-start; + margin-top: 20px; + } + +.addGrid { + overflow-x: scroll; +} +.add { + margin: 50px 65px 0px 55px; + height: 150px; + width: 300px; + background-color: white; + color: #0D0D0D; + display: inline-block; + border-radius: 10px; +} + +.add:hover { + box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.5); + transform: translateY(-5px); + background-color: #758283; +} + +/* center the icon in that div */ +.add i { + border-color: #758283; + border-width: 5px; + border-style: dashed; + font-size: 50px; + margin: 45px 0 0 120px; +} + +.add:hover i { + border-color: #0D0D0D; +} + +.addBtn { + position: absolute; + z-index: 1; + margin: 110px 0 0 100px;; + background-color: white; + color: #0D0D0D; + display: inline-block; + border-radius: 10px; + padding: 2px; +} \ No newline at end of file diff --git a/src/css/StudentProfile.module.css b/src/css/StudentProfile.module.css new file mode 100644 index 0000000..6012466 --- /dev/null +++ b/src/css/StudentProfile.module.css @@ -0,0 +1,307 @@ + + /* .body{ + font-family: 'Nunito', sans-serif; + margin:0; padding:0; + box-sizing: border-box; + outline: none; border:none; + text-decoration: none; + } + */ + + +/* .body > *{ + font-size: 63%; + overflow-x: hidden; + } */ + + + .studentprofilebody{ + padding-top: 100px; +} +.courses{ + padding:2rem; + margin: 0rem 5rem 0rem 4rem; + /* max-width: 160px; */ + width: 90%; +} + +.heading{ + font-size: 2.5rem; + color:#2c3e50; + margin-bottom: 2.5rem; + border-bottom: .1rem solid rgba(0,0,0,.2); + padding-bottom: .5rem; + text-transform: capitalize; + text-align: center; +} + +/* .inlinebtn, +.inline-option-btn, +.inline-delete-btn, +.btn, +.delete-btn, +.option-btn{ + border-radius: .2rem; + color:#fff; + font-size: 1rem; + cursor: pointer; + text-transform: capitalize; + padding:.2rem .6rem; + text-align: center; + margin-top: .2rem; +} + +.btn, +.delete-btn, +.option-btn{ + display: block; + width: 100%; +} + +.inlinebtn, +.inline-option-btn, +.inline-delete-btn{ + display: inline-block; +} + +.btn, +.inlinebtn{ + background-color: #8e44ad; +} + +.option-btn, +.inline-option-btn{ + background-color:#f39c12; +} + +.delete-btn, +.inline-delete-btn{ + background-color: #e74c3c; +} + +.inline-btn:hover, +.inline-option-btn:hover, +.inline-delete-btn:hover, +.btn:hover, +.delete-btn:hover, +.option-btn:hover{ + background-color: #2c3e50; + color: #fff; +} + */ +.flexbtn{ + display: flex; + gap: 1rem; +} +.inlinebtn{ + background-color: #8e44ad; + /* display: inline-block; */ + border-radius: .2rem; + color:#fff; + font-size: 1rem; + cursor: pointer; + /* text-transform: capitalize; */ + padding:.4rem .6rem; + text-align: center; + /* margin : .8rem 3rem 0rem 2rem; */ + text-decoration: none; +} +.userprofile .userprofilecontainer{ + display: flex; +} +.userprofile .userdetails{ + float: left; + height: 50 rem; + text-align: center; + background-color: rgb(194, 187, 187); + border-radius: .5rem; + margin: 0rem .1rem 0rem 1rem; + padding: 1rem 1rem 1rem 1rem; + flex: 10%; +} + +.userprofile .info{ + background-color: #fff; + border-radius: .5rem; + margin: 0rem 2rem 0rem 2rem; + padding: 2rem 2rem 1rem 2rem; + flex: 60%; +} + +.userprofile .info .user, +.userprofile .userdetails .user { + text-align: center; + margin-bottom: .5rem; + padding: .25rem; +} + +.userprofile .info .user img, +.userprofile .userdetails .user img{ + height: 10rem; + width: 10rem; + border-radius: 50%; + object-fit: cover; + margin-bottom: 1rem; +} + +.userprofile .info .user .rowdetails{ + display: flex; + margin-bottom: .8rem; + /* border-color: rgb(30, 141, 141); */ + border-width: 2px; + border-bottom-style:inset; +} +.userprofile .info .user h6{ + flex:50%; + font-size: 1.2rem; + color: #2c3e50; + text-align: left; +} + +.userprofile .info .user p, +.userprofile .userdetails .user p{ + font-size: 1.2rem; + color: #888; + padding: .3rem 0 .4rem ; +} + +/* .userprofile .info .user .userbuttons{ + display: flex; + margin-top: 5rem; +} +.userprofile .userdetails .user .userbuttons .userinlinebtn{ + flex: 50%; + background-color: #8e44ad; + border-radius: .2rem; + color:#fff; + font-size: 1rem; + cursor: pointer; + margin : 0rem .5rem 0rem .5rem; + padding:.2rem .6rem; + text-transform: capitalize; + padding:.2rem .6rem; + text-align: center; + margin-top: .2rem; + margin : 0rem 3rem 0rem 12rem; + +} */ + + + + +.courses .boxcontainer{ + font-size: 6px; + display: grid; + border:0rem 8rem 0rem 8rem; + grid-template-columns: repeat(auto-fit, minmax(18rem, 3fr)); + gap:1rem; + /* justify-content: center; */ + /* align-items: flex-start; */ +} + +.courses .boxcontainer .box{ + font-size: 10px; + /* border-radius: 1.5rem; */ + background-color: #fff; + border:0rem 1rem 0rem 1rem; + padding:0rem .2rem .2rem .2rem ; + /* padding: .2rem; */ +} + +.courses .boxcontainer .box .tutor{ + display: flex; + align-items: center; + gap: 1.5rem; + margin: 1.5rem 0rem 1rem 3rem ; +} + +.courses .boxcontainer .box .tutor img{ + height: 2.5rem; + width: 2.5rem; + border-radius: 50%; + object-fit: cover; +} + +.courses .boxcontainer .box .tutor h3{ + font-size: 1.2rem; + color: #2c3e50; + margin-bottom: .2rem; +} + +.courses .boxcontainer .box .tutor span{ + font-size: 1.0rem; + color:#888; +} + +.courses .boxcontainer .box .thumb{ + position: relative; + padding: .1rem; +} + +.courses .boxcontainer .box .thumb span{ + position: absolute; + top:1rem; left: 1rem; + border-radius: .5rem; + padding: .5rem 1.5rem; + background-color: rgba(0,0,0,.3); + color: #fff; + font-size: 1.5rem; +} + +.courses .boxcontainer .box .thumb img{ + width: 100%; + height: 12rem; + object-fit: cover; + border: 0rem 0rem 0rem 0rem; + /* border-radius: .5rem; */ +} + +.courses .boxcontainer .box .title{ + /* font-size: 1.5rem; + color: #2c3e50; + padding-bottom: .5rem; + padding-top: 1rem; + text-align: center; */ + padding: 6px 20px 6px 16px; + /* text-decoration: none; */ + font-size: 17px; + display: block; + width: 100%; + text-align: centre; + cursor: pointer; + outline: none; + /* background-color: light rgb(243, 235, 235); */ + margin: 0rem 3rem 1rem 0rem; + white-space: normal; +} +.courses .boxcontainer .box .universityname{ + font-size: 1rem; + font-style: oblique; + color:#2c3e50; + padding-left: 1rem; +} +.courses .boxcontainer .box .description{ + font-size: .8rem; + font-weight:400; + font-style:italic; + color:#2c3e50; + padding: 1rem; +} +.courses .boxcontainer .box .coursetype h5{ + font-size: 1rem; + font-style: oblique; + color:#2c3e50; + margin: .3rem .4rem .4rem .8rem; +} +.courses .boxcontainer .box .enroll{ + font-size: .8rem; + font-style: oblique; + color:#2c3e50; + margin: 1rem .4rem 1.2rem 5rem; + /* margin:10px auto; */ +} + +.courses .morebtn{ + text-align: center; + margin-top: 2rem; +} \ No newline at end of file diff --git a/src/css/UpdateStudentProfile.module.css b/src/css/UpdateStudentProfile.module.css new file mode 100644 index 0000000..9b4f8f5 --- /dev/null +++ b/src/css/UpdateStudentProfile.module.css @@ -0,0 +1,149 @@ + .body{ + --main-color:#8e44ad; + --red:#e74c3c; + --orange:#f39c12; + --light-color:#888; + --light-bg:#eee; + --black:#2c3e50; + --white:#fff; + --border:.1rem solid rgba(0,0,0,.2); + } + + .body{ + font-family: 'Nunito', sans-serif; + margin:0; padding:0; + box-sizing: border-box; + outline: none; border:none; + text-decoration: none; + } + + .body::selection{ + background-color: var(--main-color); + color:#fff; + } + + .body{ + font-size: 62.5%; + overflow-x: hidden; + } + .studentprofilebody{ + padding-top: 100px; + } + .section{ + padding:2rem; + margin: 0 auto; + max-width: 600px; +} + +.heading{ + font-size: 2.5rem; + color:#2c3e50; + margin-bottom: 2.5rem; + border-bottom: .1rem solid rgba(0,0,0,.2); + padding-bottom: .5rem; + text-transform: capitalize; + text-align: center; +} + +.inlinebtn, +.inline-option-btn, +.inline-delete-btn, +.btn, +.delete-btn, +.option-btn{ + border-radius: .2rem; + color:#fff; + font-size: 1rem; + cursor: pointer; + text-transform: capitalize; + padding:.2rem .6rem; + text-align: center; + margin-top: .2rem; +} + +.btn, +.delete-btn, +.option-btn{ + display: block; + width: 100%; +} + +.inlinebtn, +.inline-option-btn, +.inline-delete-btn{ + display: inline-block; +} + +.btn, +.inlinebtn{ + background-color: #8e44ad; +} + +.option-btn, +.inline-option-btn{ + background-color:#f39c12; +} + +.delete-btn, +.inline-delete-btn{ + background-color: #e74c3c; +} + +.inline-btn:hover, +.inline-option-btn:hover, +.inline-delete-btn:hover, +.btn:hover, +.delete-btn:hover, +.option-btn:hover{ + background-color: #2c3e50; + color: #fff; +} + +.flexbtn{ + display: flex; + gap: 1rem; +} + + .formcontainer{ + font-size: 62.5%; + min-height: calc(100vh - 20rem); + display: flex; + align-items: center; + justify-content: center; + } + + .formcontainer form{ + background-color: #fff; + border-radius: .5rem; + padding: 2rem; + width: 35rem; + height:50%; + } + + .formcontainer form h3{ + font-size: 1.5rem; + text-transform: capitalize; + color: #2c3e50; + text-align: center; + } + + .formcontainer form p{ + font-size: 1rem; + color: #888; + padding-top: .5rem; + } + + .formcontainer form p span{ + color: #e74c3c; + } + + .formcontainer form .box{ + font-size: 1rem; + color: #2c3e50; + border-radius: .2rem; + padding: .8rem; + background-color: #eee; + width: 100%; + margin: .5rem 0; + } + \ No newline at end of file diff --git a/src/images/R.png b/src/images/R.png new file mode 100644 index 0000000..c24b1c0 Binary files /dev/null and b/src/images/R.png differ diff --git a/src/images/pexels-pixabay-276452.jpg b/src/images/pexels-pixabay-276452.jpg new file mode 100644 index 0000000..37e41fa Binary files /dev/null and b/src/images/pexels-pixabay-276452.jpg differ diff --git a/src/images/vid-7.mp4 b/src/images/vid-7.mp4 new file mode 100644 index 0000000..0f3c618 Binary files /dev/null and b/src/images/vid-7.mp4 differ diff --git a/src/index.js b/src/index.js index 3c3738c..07fd2b3 100644 --- a/src/index.js +++ b/src/index.js @@ -2,7 +2,7 @@ import React from 'react'; import ReactDOM from 'react-dom/client'; import './index.css'; import App from './components/App'; -import { BrowserRouter as Router, Routes, Route, Navigate, useLocation } from 'react-router-dom'; +import { BrowserRouter as Router, Routes, Route } from 'react-router-dom'; import Courses from './components/Courses'; import CoursePage from './components/CoursePage'; import Signupform from './components/Signupform'; @@ -11,38 +11,68 @@ import Home from './components/Home'; import Card from './components/Card'; import CourseUploadform from './components/CourseUploadform'; import Courseinfo from './components/Courseinfo'; +import Admin from './components/Admin'; +import AdminCourses from './components/AdminCourses'; +import StudentProfile from './components/StudentProfile'; +import UpdateStudentProfile from './components/UpdateStudentProfile'; +import StudentHome from './components/StudentHome'; +import Help from "./components/Help"; +// import firebaseConfig from './config/firebaseConfig'; + +//init firebase +// const app = initializeApp(firebaseConfig); + +//redux +import {Provider} from 'react-redux' +import store from './store'; +import LessonUpload from './components/LessonUpload'; +import PlayListVideo from './components/PlayListVideo'; +import InstructorHome from './components/InstructorHome'; +import ModuleUpload from './components/ModuleUpload'; const root = ReactDOM.createRoot(document.getElementById('root')); root.render( + } > }> - + + }> }> + }> + }> }/> - - - - - - }> - + }> + + + }/> + }> + + + }/> }> }> }> }> + + }> + }> + + }> + }> + }> - + ); diff --git a/src/reducer/learnpedia.js b/src/reducer/learnpedia.js new file mode 100644 index 0000000..2e3dba8 --- /dev/null +++ b/src/reducer/learnpedia.js @@ -0,0 +1,14 @@ +import {SIGNIN, SIGNOUT} from '../action/action-types' + +const initialState = {} + +export default (state = initialState, action) => { + switch(action.type) { + case SIGNIN: + return action.payload + case SIGNOUT: + return {} + default: + return state + } +} \ No newline at end of file diff --git a/src/store.js b/src/store.js new file mode 100644 index 0000000..d215677 --- /dev/null +++ b/src/store.js @@ -0,0 +1,13 @@ +import { createStore, combineReducers } from "redux"; + + import learnpedia from "./reducer/learnpedia"; + + const rootReducer = combineReducers({ + learnpedia, + }) + + const store = createStore( + rootReducer + ) + + export default store; \ No newline at end of file