From 8bca85754f109dd2ab4ea4c79a640c5727a7ad7c Mon Sep 17 00:00:00 2001
From: PrkharMishra <136120437+Prkhar05@users.noreply.github.com>
Date: Wed, 27 Mar 2024 15:43:33 +0530
Subject: [PATCH 1/9] Added Calendar View according to Issue#22
---
package-lock.json | 143 ++++++++++--------
package.json | 5 +-
src/app/events/page.tsx | 17 +++
src/components/Calendar/Calendar.tsx | 33 ++++
.../CalenderComponent/CalendarHeader.tsx | 54 +++++++
.../Calendar/CalenderComponent/Day.tsx | 63 ++++++++
.../Calendar/CalenderComponent/EventModal.tsx | 121 +++++++++++++++
.../Calendar/CalenderComponent/Labels.tsx | 25 +++
.../Calendar/CalenderComponent/Month.tsx | 17 +++
.../CalenderComponent/SidebarCalendar.tsx | 28 ++++
.../Calendar/CalenderComponent/util.tsx | 15 ++
.../Calendar/context/ContextWrapper.tsx | 94 ++++++++++++
.../Calendar/context/GlobalContext.tsx | 32 ++++
tailwind.config.js | 3 +-
tsconfig.json | 2 +-
15 files changed, 582 insertions(+), 70 deletions(-)
create mode 100644 src/app/events/page.tsx
create mode 100644 src/components/Calendar/Calendar.tsx
create mode 100644 src/components/Calendar/CalenderComponent/CalendarHeader.tsx
create mode 100644 src/components/Calendar/CalenderComponent/Day.tsx
create mode 100644 src/components/Calendar/CalenderComponent/EventModal.tsx
create mode 100644 src/components/Calendar/CalenderComponent/Labels.tsx
create mode 100644 src/components/Calendar/CalenderComponent/Month.tsx
create mode 100644 src/components/Calendar/CalenderComponent/SidebarCalendar.tsx
create mode 100644 src/components/Calendar/CalenderComponent/util.tsx
create mode 100644 src/components/Calendar/context/ContextWrapper.tsx
create mode 100644 src/components/Calendar/context/GlobalContext.tsx
diff --git a/package-lock.json b/package-lock.json
index c6c84e00..54f2684c 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -21,6 +21,7 @@
"@radix-ui/react-slot": "^1.0.2",
"@radix-ui/react-toast": "^1.1.5",
"@reduxjs/toolkit": "^2.0.1",
+ "@tailwindcss/forms": "^0.5.7",
"@tanstack/react-table": "^8.11.2",
"antd": "^5.13.1",
"axios": "^1.6.3",
@@ -28,6 +29,7 @@
"clsx": "^2.0.0",
"cmdk": "^0.2.0",
"csv-parser": "^3.0.0",
+ "dayjs": "^1.11.10",
"embla-carousel-react": "^8.0.0-rc19",
"formik": "^2.4.5",
"formik-wizard-form": "^2.1.0",
@@ -35,7 +37,8 @@
"js-cookie": "^3.0.5",
"jwt-decode": "^4.0.0",
"lucide-react": "^0.302.0",
- "next": "latest",
+ "material-icons": "^1.13.12",
+ "next": "^14.1.4",
"next-auth": "^4.23.2",
"papaparse": "^5.4.1",
"pdf-lib": "^1.17.1",
@@ -409,9 +412,9 @@
}
},
"node_modules/@next/env": {
- "version": "14.0.4",
- "resolved": "https://registry.npmjs.org/@next/env/-/env-14.0.4.tgz",
- "integrity": "sha512-irQnbMLbUNQpP1wcE5NstJtbuA/69kRfzBrpAD7Gsn8zm/CY6YQYc3HQBz8QPxwISG26tIm5afvvVbu508oBeQ=="
+ "version": "14.1.4",
+ "resolved": "https://registry.npmjs.org/@next/env/-/env-14.1.4.tgz",
+ "integrity": "sha512-e7X7bbn3Z6DWnDi75UWn+REgAbLEqxI8Tq2pkFOFAMpWAWApz/YCUhtWMWn410h8Q2fYiYL7Yg5OlxMOCfFjJQ=="
},
"node_modules/@next/eslint-plugin-next": {
"version": "14.0.4",
@@ -423,9 +426,9 @@
}
},
"node_modules/@next/swc-darwin-arm64": {
- "version": "14.0.4",
- "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.0.4.tgz",
- "integrity": "sha512-mF05E/5uPthWzyYDyptcwHptucf/jj09i2SXBPwNzbgBNc+XnwzrL0U6BmPjQeOL+FiB+iG1gwBeq7mlDjSRPg==",
+ "version": "14.1.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.1.4.tgz",
+ "integrity": "sha512-ubmUkbmW65nIAOmoxT1IROZdmmJMmdYvXIe8211send9ZYJu+SqxSnJM4TrPj9wmL6g9Atvj0S/2cFmMSS99jg==",
"cpu": [
"arm64"
],
@@ -438,9 +441,9 @@
}
},
"node_modules/@next/swc-darwin-x64": {
- "version": "14.0.4",
- "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.0.4.tgz",
- "integrity": "sha512-IZQ3C7Bx0k2rYtrZZxKKiusMTM9WWcK5ajyhOZkYYTCc8xytmwSzR1skU7qLgVT/EY9xtXDG0WhY6fyujnI3rw==",
+ "version": "14.1.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.1.4.tgz",
+ "integrity": "sha512-b0Xo1ELj3u7IkZWAKcJPJEhBop117U78l70nfoQGo4xUSvv0PJSTaV4U9xQBLvZlnjsYkc8RwQN1HoH/oQmLlQ==",
"cpu": [
"x64"
],
@@ -453,9 +456,9 @@
}
},
"node_modules/@next/swc-linux-arm64-gnu": {
- "version": "14.0.4",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.0.4.tgz",
- "integrity": "sha512-VwwZKrBQo/MGb1VOrxJ6LrKvbpo7UbROuyMRvQKTFKhNaXjUmKTu7wxVkIuCARAfiI8JpaWAnKR+D6tzpCcM4w==",
+ "version": "14.1.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.1.4.tgz",
+ "integrity": "sha512-457G0hcLrdYA/u1O2XkRMsDKId5VKe3uKPvrKVOyuARa6nXrdhJOOYU9hkKKyQTMru1B8qEP78IAhf/1XnVqKA==",
"cpu": [
"arm64"
],
@@ -468,9 +471,9 @@
}
},
"node_modules/@next/swc-linux-arm64-musl": {
- "version": "14.0.4",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.0.4.tgz",
- "integrity": "sha512-8QftwPEW37XxXoAwsn+nXlodKWHfpMaSvt81W43Wh8dv0gkheD+30ezWMcFGHLI71KiWmHK5PSQbTQGUiidvLQ==",
+ "version": "14.1.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.1.4.tgz",
+ "integrity": "sha512-l/kMG+z6MB+fKA9KdtyprkTQ1ihlJcBh66cf0HvqGP+rXBbOXX0dpJatjZbHeunvEHoBBS69GYQG5ry78JMy3g==",
"cpu": [
"arm64"
],
@@ -483,9 +486,9 @@
}
},
"node_modules/@next/swc-linux-x64-gnu": {
- "version": "14.0.4",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.0.4.tgz",
- "integrity": "sha512-/s/Pme3VKfZAfISlYVq2hzFS8AcAIOTnoKupc/j4WlvF6GQ0VouS2Q2KEgPuO1eMBwakWPB1aYFIA4VNVh667A==",
+ "version": "14.1.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.1.4.tgz",
+ "integrity": "sha512-BapIFZ3ZRnvQ1uWbmqEGJuPT9cgLwvKtxhK/L2t4QYO7l+/DxXuIGjvp1x8rvfa/x1FFSsipERZK70pewbtJtw==",
"cpu": [
"x64"
],
@@ -498,9 +501,9 @@
}
},
"node_modules/@next/swc-linux-x64-musl": {
- "version": "14.0.4",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.0.4.tgz",
- "integrity": "sha512-m8z/6Fyal4L9Bnlxde5g2Mfa1Z7dasMQyhEhskDATpqr+Y0mjOBZcXQ7G5U+vgL22cI4T7MfvgtrM2jdopqWaw==",
+ "version": "14.1.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.1.4.tgz",
+ "integrity": "sha512-mqVxTwk4XuBl49qn2A5UmzFImoL1iLm0KQQwtdRJRKl21ylQwwGCxJtIYo2rbfkZHoSKlh/YgztY0qH3wG1xIg==",
"cpu": [
"x64"
],
@@ -513,9 +516,9 @@
}
},
"node_modules/@next/swc-win32-arm64-msvc": {
- "version": "14.0.4",
- "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.0.4.tgz",
- "integrity": "sha512-7Wv4PRiWIAWbm5XrGz3D8HUkCVDMMz9igffZG4NB1p4u1KoItwx9qjATHz88kwCEal/HXmbShucaslXCQXUM5w==",
+ "version": "14.1.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.1.4.tgz",
+ "integrity": "sha512-xzxF4ErcumXjO2Pvg/wVGrtr9QQJLk3IyQX1ddAC/fi6/5jZCZ9xpuL9Tzc4KPWMFq8GGWFVDMshZOdHGdkvag==",
"cpu": [
"arm64"
],
@@ -528,9 +531,9 @@
}
},
"node_modules/@next/swc-win32-ia32-msvc": {
- "version": "14.0.4",
- "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.0.4.tgz",
- "integrity": "sha512-zLeNEAPULsl0phfGb4kdzF/cAVIfaC7hY+kt0/d+y9mzcZHsMS3hAS829WbJ31DkSlVKQeHEjZHIdhN+Pg7Gyg==",
+ "version": "14.1.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.1.4.tgz",
+ "integrity": "sha512-WZiz8OdbkpRw6/IU/lredZWKKZopUMhcI2F+XiMAcPja0uZYdMTZQRoQ0WZcvinn9xZAidimE7tN9W5v9Yyfyw==",
"cpu": [
"ia32"
],
@@ -543,9 +546,9 @@
}
},
"node_modules/@next/swc-win32-x64-msvc": {
- "version": "14.0.4",
- "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.0.4.tgz",
- "integrity": "sha512-yEh2+R8qDlDCjxVpzOTEpBLQTEFAcP2A8fUFLaWNap9GitYKkKv1//y2S6XY6zsR4rCOPRpU7plYDR+az2n30A==",
+ "version": "14.1.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.1.4.tgz",
+ "integrity": "sha512-4Rto21sPfw555sZ/XNLqfxDUNeLhNYGO2dlPqsnuCg8N8a2a9u1ltqBOPQ4vj1Gf7eJC0W2hHG2eYUHuiXgY2w==",
"cpu": [
"x64"
],
@@ -1618,6 +1621,17 @@
"tslib": "^2.4.0"
}
},
+ "node_modules/@tailwindcss/forms": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.7.tgz",
+ "integrity": "sha512-QE7X69iQI+ZXwldE+rzasvbJiyV/ju1FGHH0Qn2W3FKbuYtqp8LKcy6iSw79fVUT5/Vvf+0XgLCeYVG+UV6hOw==",
+ "dependencies": {
+ "mini-svg-data-uri": "^1.2.3"
+ },
+ "peerDependencies": {
+ "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1"
+ }
+ },
"node_modules/@tanstack/react-table": {
"version": "8.11.3",
"resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.11.3.tgz",
@@ -2400,9 +2414,9 @@
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001574",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001574.tgz",
- "integrity": "sha512-BtYEK4r/iHt/txm81KBudCUcTy7t+s9emrIaHqjYurQ10x71zJ5VQ9x1dYPcz/b+pKSp4y/v1xSI67A+LzpNyg==",
+ "version": "1.0.30001600",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001600.tgz",
+ "integrity": "sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ==",
"funding": [
{
"type": "opencollective",
@@ -4028,11 +4042,6 @@
"node": ">=10.13.0"
}
},
- "node_modules/glob-to-regexp": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
- "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="
- },
"node_modules/globals": {
"version": "13.24.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
@@ -4869,6 +4878,11 @@
"react": "^16.5.1 || ^17.0.0 || ^18.0.0"
}
},
+ "node_modules/material-icons": {
+ "version": "1.13.12",
+ "resolved": "https://registry.npmjs.org/material-icons/-/material-icons-1.13.12.tgz",
+ "integrity": "sha512-/2YoaB79IjUK2B2JB+vIXXYGtBfHb/XG66LvoKVM5ykHW7yfrV5SP6d7KLX6iijY6/G9GqwgtPQ/sbhFnOURVA=="
+ },
"node_modules/merge2": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
@@ -4908,6 +4922,14 @@
"node": ">= 0.6"
}
},
+ "node_modules/mini-svg-data-uri": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz",
+ "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==",
+ "bin": {
+ "mini-svg-data-uri": "cli.js"
+ }
+ },
"node_modules/minimatch": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
@@ -4976,18 +4998,17 @@
"dev": true
},
"node_modules/next": {
- "version": "14.0.4",
- "resolved": "https://registry.npmjs.org/next/-/next-14.0.4.tgz",
- "integrity": "sha512-qbwypnM7327SadwFtxXnQdGiKpkuhaRLE2uq62/nRul9cj9KhQ5LhHmlziTNqUidZotw/Q1I9OjirBROdUJNgA==",
+ "version": "14.1.4",
+ "resolved": "https://registry.npmjs.org/next/-/next-14.1.4.tgz",
+ "integrity": "sha512-1WTaXeSrUwlz/XcnhGTY7+8eiaFvdet5z9u3V2jb+Ek1vFo0VhHKSAIJvDWfQpttWjnyw14kBeq28TPq7bTeEQ==",
"dependencies": {
- "@next/env": "14.0.4",
+ "@next/env": "14.1.4",
"@swc/helpers": "0.5.2",
"busboy": "1.6.0",
- "caniuse-lite": "^1.0.30001406",
+ "caniuse-lite": "^1.0.30001579",
"graceful-fs": "^4.2.11",
"postcss": "8.4.31",
- "styled-jsx": "5.1.1",
- "watchpack": "2.4.0"
+ "styled-jsx": "5.1.1"
},
"bin": {
"next": "dist/bin/next"
@@ -4996,15 +5017,15 @@
"node": ">=18.17.0"
},
"optionalDependencies": {
- "@next/swc-darwin-arm64": "14.0.4",
- "@next/swc-darwin-x64": "14.0.4",
- "@next/swc-linux-arm64-gnu": "14.0.4",
- "@next/swc-linux-arm64-musl": "14.0.4",
- "@next/swc-linux-x64-gnu": "14.0.4",
- "@next/swc-linux-x64-musl": "14.0.4",
- "@next/swc-win32-arm64-msvc": "14.0.4",
- "@next/swc-win32-ia32-msvc": "14.0.4",
- "@next/swc-win32-x64-msvc": "14.0.4"
+ "@next/swc-darwin-arm64": "14.1.4",
+ "@next/swc-darwin-x64": "14.1.4",
+ "@next/swc-linux-arm64-gnu": "14.1.4",
+ "@next/swc-linux-arm64-musl": "14.1.4",
+ "@next/swc-linux-x64-gnu": "14.1.4",
+ "@next/swc-linux-x64-musl": "14.1.4",
+ "@next/swc-win32-arm64-msvc": "14.1.4",
+ "@next/swc-win32-ia32-msvc": "14.1.4",
+ "@next/swc-win32-x64-msvc": "14.1.4"
},
"peerDependencies": {
"@opentelemetry/api": "^1.1.0",
@@ -7565,18 +7586,6 @@
"loose-envify": "^1.0.0"
}
},
- "node_modules/watchpack": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz",
- "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==",
- "dependencies": {
- "glob-to-regexp": "^0.4.1",
- "graceful-fs": "^4.1.2"
- },
- "engines": {
- "node": ">=10.13.0"
- }
- },
"node_modules/which": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
diff --git a/package.json b/package.json
index 50dcc968..51cbfe25 100644
--- a/package.json
+++ b/package.json
@@ -22,6 +22,7 @@
"@radix-ui/react-slot": "^1.0.2",
"@radix-ui/react-toast": "^1.1.5",
"@reduxjs/toolkit": "^2.0.1",
+ "@tailwindcss/forms": "^0.5.7",
"@tanstack/react-table": "^8.11.2",
"antd": "^5.13.1",
"axios": "^1.6.3",
@@ -29,6 +30,7 @@
"clsx": "^2.0.0",
"cmdk": "^0.2.0",
"csv-parser": "^3.0.0",
+ "dayjs": "^1.11.10",
"embla-carousel-react": "^8.0.0-rc19",
"formik": "^2.4.5",
"formik-wizard-form": "^2.1.0",
@@ -36,7 +38,8 @@
"js-cookie": "^3.0.5",
"jwt-decode": "^4.0.0",
"lucide-react": "^0.302.0",
- "next": "latest",
+ "material-icons": "^1.13.12",
+ "next": "^14.1.4",
"next-auth": "^4.23.2",
"papaparse": "^5.4.1",
"pdf-lib": "^1.17.1",
diff --git a/src/app/events/page.tsx b/src/app/events/page.tsx
new file mode 100644
index 00000000..b5661a89
--- /dev/null
+++ b/src/app/events/page.tsx
@@ -0,0 +1,17 @@
+"use client";
+import Calendar from "@/components/Calendar/Calendar";
+import ContextWrapper from "@/components/Calendar/context/ContextWrapper";
+import 'material-icons/iconfont/material-icons.css'
+
+export default function CalendarView(){
+ return(
+
+
+
+
+ );
+}
+
+
+
+
diff --git a/src/components/Calendar/Calendar.tsx b/src/components/Calendar/Calendar.tsx
new file mode 100644
index 00000000..61eb0019
--- /dev/null
+++ b/src/components/Calendar/Calendar.tsx
@@ -0,0 +1,33 @@
+import React,{ useState , useContext ,useEffect } from "react";
+import { getMonth } from "./CalenderComponent/util";
+import Month from "./CalenderComponent/Month";
+import GlobalContext from "./context/GlobalContext";
+import CalendarHeader from "./CalenderComponent/CalendarHeader";
+import calenderSidebar from "./CalenderComponent/calenderSidebar";
+import EventModal from "./CalenderComponent/EventModal";
+import SidebarCalendar from "./CalenderComponent/SidebarCalendar";
+
+export default function Calendar(){
+ const [currentMonth,setCurrentMonth]= useState(getMonth());
+ const{ monthIndex , showEventModal } = useContext(GlobalContext);
+ useEffect(() => {
+ setCurrentMonth(getMonth(monthIndex));
+ },[monthIndex]);
+
+ return(
+
+ { showEventModal &&
}
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/src/components/Calendar/CalenderComponent/CalendarHeader.tsx b/src/components/Calendar/CalenderComponent/CalendarHeader.tsx
new file mode 100644
index 00000000..365ffd65
--- /dev/null
+++ b/src/components/Calendar/CalenderComponent/CalendarHeader.tsx
@@ -0,0 +1,54 @@
+import React,{ useContext } from 'react'
+import dayjs from 'dayjs'
+import GlobalContext from '../context/GlobalContext'
+
+export default function CalendarHeader() {
+ const { monthIndex, setMonthIndex } = useContext(GlobalContext);
+ function handlePrevMonth() {
+ setMonthIndex(monthIndex - 1);
+ }
+ function handleNextMonth() {
+ setMonthIndex(monthIndex + 1);
+ }
+ function handleReset() {
+ setMonthIndex(
+ monthIndex === dayjs().month()
+ ? monthIndex + Math.random()
+ : dayjs().month()
+ );
+ }
+
+ return (
+
+ {/*
+ Calendar
+
*/}
+
+
+
+
+
+ {dayjs(new Date(dayjs().year(), monthIndex)).format(
+ "MMMM YYYY"
+ )}
+
+
+
+
+
+
+ )
+}
diff --git a/src/components/Calendar/CalenderComponent/Day.tsx b/src/components/Calendar/CalenderComponent/Day.tsx
new file mode 100644
index 00000000..9e035508
--- /dev/null
+++ b/src/components/Calendar/CalenderComponent/Day.tsx
@@ -0,0 +1,63 @@
+import React,{useContext, useEffect, useState} from 'react'
+import dayjs from 'dayjs';
+import GlobalContext from '../context/GlobalContext';
+
+
+let colours = "bg-green-300 bg-red-300 bg-indigo-300 bg-gray-300 bg-blue-300 bg-purple-300 hover:bg-green-400 hover:bg-red-400 hover:bg-indigo-400 hover:bg-gray-400 hover:bg-blue-400 hover:bg-purple-400"
+
+
+
+export default function Day({day,rowIdx}:{day:any,rowIdx:any}) {
+ const [dayEvents,setDayEvents] = useState([])
+ const{ setShowEventModal , setDaySelected , filteredEvents , setSelectedEvent ,monthIndex }=
+ useContext(GlobalContext)
+
+ useEffect(() => {
+ const events = filteredEvents.filter((evt) => dayjs(evt.day).format("DD-MM-YY") === day.format("DD-MM-YY"));
+ setDayEvents(events)
+ },[filteredEvents,day]);
+
+ function getCurrentDay(){
+ return day.format("DD-MM-YY") === dayjs().format("DD-MM-YY")
+ ? 'bg-blue-700 text-white rounded-full w-7'
+ :'';
+ }
+ function getCurrentMonth(){
+ return parseInt(day.format("MM"),10) === monthIndex+1
+ ? ''
+ :'opacity-50';
+ }
+
+ useEffect(() => {
+ getCurrentMonth()
+ console.log(day.format("MM"))
+ },[monthIndex]);
+
+
+ return (
+
+
+ {rowIdx ===0 && ({day.format('ddd').toUpperCase()}
)}
+
+
+ {parseInt(day.format('DD'),10) === 1 ? day.format('MMM DD') :day.format('DD') }
+
+
+
{
+ setShowEventModal(true);
+ setDaySelected(day);
+ }}
+ className='flex-1 cursor-pointer'>
+ {dayEvents.map((evt,idx) => (
+
setSelectedEvent(evt)}
+ key={idx}
+ className={`bg-${evt.label}-300 hover:bg-${evt.label}-400 cursor-pointer p-1 mx-2 text-gray-600 text-sm rounded mb-1 truncate`}>
+ {evt.title}
+
+ ))}
+ {/*
+
*/}
+
+
+ );
+}
diff --git a/src/components/Calendar/CalenderComponent/EventModal.tsx b/src/components/Calendar/CalenderComponent/EventModal.tsx
new file mode 100644
index 00000000..989a1043
--- /dev/null
+++ b/src/components/Calendar/CalenderComponent/EventModal.tsx
@@ -0,0 +1,121 @@
+import React,{useContext, useState} from 'react'
+import GlobalContext from '../context/GlobalContext';
+
+const labelsClasses = ["green","red","indigo","gray","blue","purple"]
+let colours = "bg-green-500 bg-red-500 bg-indigo-500 bg-gray-500 bg-blue-500 bg-purple-500"
+
+
+
+
+export default function EventModal() {
+ const{setShowEventModal,daySelected,dispatchCallEvents,selectedEvent}=
+ useContext(GlobalContext);
+
+ const[title,setTitle] = useState(selectedEvent ? selectedEvent.title :"");
+ const[description,setDescription] = useState(selectedEvent ? selectedEvent.description :"");
+ const[selectedLabel,setselectedLabel] = useState(selectedEvent ? labelsClasses.find((lbl) => lbl === selectedEvent.label) :labelsClasses[0]);
+
+ function handleSubmit(e){
+ e.preventDefault()
+ const calendarEvent ={
+ title:title,
+ description:description,
+ label: selectedLabel,
+ day: daySelected.valueOf(),
+ id: selectedEvent ? selectedEvent.id : Date.now(),
+ }
+ if(selectedEvent){
+ dispatchCallEvents({type:'update' , payload:calendarEvent});
+
+ }
+ else{
+ dispatchCallEvents({type:'push' , payload:calendarEvent});
+
+ }
+ setShowEventModal(false);
+ }
+
+ return (
+
+ );
+}
diff --git a/src/components/Calendar/CalenderComponent/Labels.tsx b/src/components/Calendar/CalenderComponent/Labels.tsx
new file mode 100644
index 00000000..6380bc23
--- /dev/null
+++ b/src/components/Calendar/CalenderComponent/Labels.tsx
@@ -0,0 +1,25 @@
+import React, { useContext } from 'react'
+import GlobalContext from '../context/GlobalContext'
+
+let txtColours = "text-green-400 text-red-400 text-indigo-400 text-gray-400 text-blue-400 text-purple-400"
+
+
+export default function Labels() {
+ const { labels ,updateLabel} = useContext(GlobalContext);
+
+ return (
+
+ Label
+ {labels.map(({label: lbl,checked},idx) =>
+
+ )}
+
+ )
+}
diff --git a/src/components/Calendar/CalenderComponent/Month.tsx b/src/components/Calendar/CalenderComponent/Month.tsx
new file mode 100644
index 00000000..5aa35848
--- /dev/null
+++ b/src/components/Calendar/CalenderComponent/Month.tsx
@@ -0,0 +1,17 @@
+import React from 'react'
+import Day from './Day'
+
+
+export default function Month({month}:{month:any}) {
+ return (
+
+ {month.map((row: any[],i: any) => (
+
+ {row.map((day,idx)=>(
+
+ ))}
+
+ ))}
+
+ )
+}
diff --git a/src/components/Calendar/CalenderComponent/SidebarCalendar.tsx b/src/components/Calendar/CalenderComponent/SidebarCalendar.tsx
new file mode 100644
index 00000000..95d8a940
--- /dev/null
+++ b/src/components/Calendar/CalenderComponent/SidebarCalendar.tsx
@@ -0,0 +1,28 @@
+import React,{ useContext } from 'react'
+import Labels from './Labels'
+import dayjs from 'dayjs';
+import GlobalContext from '../context/GlobalContext'
+
+
+export default function SidebarCalendar() {
+ // const { monthIndex, setMonthIndex } = useContext(GlobalContext);
+
+ // function handleReset() {
+ // setMonthIndex(
+ // monthIndex === dayjs().month()
+ // ? monthIndex + Math.random()
+ // : dayjs().month()
+ // );
+ // }
+ return (
+
+ )
+}
diff --git a/src/components/Calendar/CalenderComponent/util.tsx b/src/components/Calendar/CalenderComponent/util.tsx
new file mode 100644
index 00000000..ecbdb7f0
--- /dev/null
+++ b/src/components/Calendar/CalenderComponent/util.tsx
@@ -0,0 +1,15 @@
+import dayjs from "dayjs";
+
+export function getMonth(month = dayjs().month()) {
+ month = Math.floor(month);
+ const year = dayjs().year();
+ const firstDayOfTheMonth = dayjs(new Date(year, month, 1)).day();
+ let currentMonthCount = 0 - firstDayOfTheMonth;
+ const daysMatrix = new Array(5).fill([]).map(() => {
+ return new Array(7).fill(null).map(() => {
+ currentMonthCount++;
+ return dayjs(new Date(year, month, currentMonthCount));
+ });
+ });
+ return daysMatrix;
+}
\ No newline at end of file
diff --git a/src/components/Calendar/context/ContextWrapper.tsx b/src/components/Calendar/context/ContextWrapper.tsx
new file mode 100644
index 00000000..ae956f6f
--- /dev/null
+++ b/src/components/Calendar/context/ContextWrapper.tsx
@@ -0,0 +1,94 @@
+import React,{ useState , useReducer, useEffect, useMemo } from 'react'
+import dayjs from 'dayjs'
+import GlobalContext from './GlobalContext'
+import { DispatchCallEventsAction } from './GlobalContext';
+import { updateLabelAction } from './GlobalContext';
+
+
+
+function savedEventsReducer(state:any,{type,payload}:DispatchCallEventsAction){
+ switch(type){
+ case 'push':
+ return [...state,payload];
+ case 'update':
+ return state.map((evt:any) => evt.id === payload.id ? payload : evt)
+ case 'delete':
+ return state.filter((evt:any) => evt.id !== payload.id )
+ default:
+ throw new Error();
+ }
+}
+
+function initEvents(){
+ const storageEvents = localStorage.getItem('savedEvents')
+ const parsedEvents = storageEvents ? JSON.parse(storageEvents) : []
+ return parsedEvents
+}
+
+export default function ContextWrapper(props: { children: React.ReactNode }) {
+ const[monthIndex,setMonthIndex] = useState(dayjs().month());
+ const[showEventModal,setShowEventModal] = useState(false);
+ const [daySelected, setDaySelected] = useState(dayjs());
+ const [selectedEvent, setSelectedEvent] = useState(null);
+ const[labels,setLabels] = useState([])
+ const [savedEvents,dispatchCallEvents] = useReducer(savedEventsReducer,[],initEvents);
+
+ const filteredEvents = useMemo(() => {
+ return savedEvents.filter((evt:any) =>
+ labels.filter((lbl:updateLabelAction) => lbl.checked)
+ .map((lbl:updateLabelAction) => lbl.label)
+ .includes(evt.label)
+ );
+ },[savedEvents,labels]);
+
+
+ useEffect(() => {
+ setLabels((prevLabels) => {
+ return [...new Set(savedEvents.map((evt:updateLabelAction) => evt.label))].map((label) =>{
+ const currentLabel = prevLabels.find(lbl => lbl.label === label)
+ return {
+ label,
+ checked : currentLabel ? currentLabel.checked :true,
+ }
+ })
+ })
+ },[savedEvents])
+
+ useEffect(() => {
+ localStorage.setItem("savedEvents",JSON.stringify(savedEvents));
+ },[savedEvents])
+
+ useEffect(() => {
+ if(!showEventModal){
+ setSelectedEvent(null);
+ }
+ },[showEventModal])
+
+ function updateLabel(newLabel:updateLabelAction){
+ setLabels(labels.map((lbl:updateLabelAction) => lbl.label === newLabel.label ? newLabel : lbl))
+ }
+
+
+ return (
+
+ {props.children}
+
+ )
+}
diff --git a/src/components/Calendar/context/GlobalContext.tsx b/src/components/Calendar/context/GlobalContext.tsx
new file mode 100644
index 00000000..38f6b57e
--- /dev/null
+++ b/src/components/Calendar/context/GlobalContext.tsx
@@ -0,0 +1,32 @@
+import React from "react";
+
+export interface DispatchCallEventsAction {
+ type: string;
+ payload: any;
+ }
+
+export interface updateLabelAction {
+ label: string;
+ checked: boolean;
+ }
+
+
+
+const GlobalContext = React.createContext({
+ monthIndex:0,
+ setMonthIndex:(index:number) => {},
+ showEventModal:false,
+ setShowEventModal:() => {},
+ daySelected: null,
+ setDaySelected: (day:any) => {},
+ dispatchCallEvents: (action: DispatchCallEventsAction) => {},
+ savedEvents:[],
+ selectedEvent: null,
+ setSelectedEvent: () => {},
+ setLabels:() => {},
+ labels: [],
+ updateLabel: (action: updateLabelAction) => {},
+ filteredEvents:[],
+})
+
+export default GlobalContext;
\ No newline at end of file
diff --git a/tailwind.config.js b/tailwind.config.js
index f2155838..943cc6be 100644
--- a/tailwind.config.js
+++ b/tailwind.config.js
@@ -33,5 +33,6 @@ module.exports = {
},
},
},
- plugins: [require("tailwindcss-animate")],
+ plugins: [require("tailwindcss-animate"),
+ require('@tailwindcss/forms'),],
};
diff --git a/tsconfig.json b/tsconfig.json
index 669e2aec..b54d6e54 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -1,6 +1,6 @@
{
"compilerOptions": {
- "target": "es5",
+ "target": "es2015",
"lib": ["dom", "dom.iterable", "esnext"],
"allowJs": true,
"skipLibCheck": true,
From 5092724ff35cf35d4055e02e1d3590d645b4493e Mon Sep 17 00:00:00 2001
From: PrkharMishra <136120437+Prkhar05@users.noreply.github.com>
Date: Wed, 27 Mar 2024 15:49:10 +0530
Subject: [PATCH 2/9] Removed Commented out codes
---
.../Calendar/CalenderComponent/CalendarHeader.tsx | 3 ---
.../Calendar/CalenderComponent/SidebarCalendar.tsx | 14 --------------
2 files changed, 17 deletions(-)
diff --git a/src/components/Calendar/CalenderComponent/CalendarHeader.tsx b/src/components/Calendar/CalenderComponent/CalendarHeader.tsx
index 365ffd65..65b960c7 100644
--- a/src/components/Calendar/CalenderComponent/CalendarHeader.tsx
+++ b/src/components/Calendar/CalenderComponent/CalendarHeader.tsx
@@ -20,9 +20,6 @@ export default function CalendarHeader() {
return (
- {/*
- Calendar
-
*/}