diff --git a/package.json b/package.json index 0ac21ecd6..3ec85ab10 100644 --- a/package.json +++ b/package.json @@ -36,11 +36,18 @@ "@auth/prisma-adapter": "^1.0.6", "@discordjs/core": "^1.1.1", "@discordjs/next": "^0.1.1-dev.1673526225-a580768.0", + "@fullcalendar/core": "^6.1.15", + "@fullcalendar/daygrid": "^6.1.15", + "@fullcalendar/interaction": "^6.1.15", + "@fullcalendar/react": "^6.1.15", + "@fullcalendar/timegrid": "^6.1.15", + "@hello-pangea/dnd": "^16.6.0", "@hookform/resolvers": "^3.6.0", "@icons-pack/react-simple-icons": "^9.4.0", "@prisma/client": "^5.18.0", "@radix-ui/react-accordion": "^1.1.2", "@radix-ui/react-avatar": "^1.0.4", + "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dialog": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.0.6", "@radix-ui/react-label": "^2.0.2", @@ -48,11 +55,13 @@ "@radix-ui/react-popover": "^1.1.1", "@radix-ui/react-radio-group": "^1.2.0", "@radix-ui/react-scroll-area": "^1.1.0", + "@radix-ui/react-select": "^2.1.2", "@radix-ui/react-separator": "^1.1.0", "@radix-ui/react-slot": "^1.1.0", "@radix-ui/react-switch": "^1.1.0", "@radix-ui/react-tooltip": "^1.0.7", "@tabler/icons-react": "^3.14.0", + "@tanstack/react-table": "^8.19.2", "@types/bcrypt": "^5.0.2", "@types/jsonwebtoken": "^9.0.5", "@uiw/react-markdown-preview": "^5.1.3", @@ -86,7 +95,7 @@ "qs": "^6.13.0", "react": "^18", "react-big-calendar": "^1.13.2", - "react-day-picker": "8.10.1", + "react-day-picker": "^9.0.8", "react-dom": "^18", "react-hook-form": "^7.50.1", "react-icons": "^5.1.0", @@ -97,6 +106,7 @@ "storybook": "^8.0.8", "tailwind-merge": "^2.2.1", "tailwindcss-animate": "^1.0.7", + "tailwindcss-textshadow": "^2.1.3", "vaul": "^0.8.9", "video.js": "^8.6.1", "videojs-contrib-eme": "^3.11.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6a39d1ca3..5cbc380f8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,6 +17,24 @@ importers: '@discordjs/next': specifier: ^0.1.1-dev.1673526225-a580768.0 version: 0.1.1-dev.1673526225-a580768.0 + '@fullcalendar/core': + specifier: ^6.1.15 + version: 6.1.15 + '@fullcalendar/daygrid': + specifier: ^6.1.15 + version: 6.1.15(@fullcalendar/core@6.1.15) + '@fullcalendar/interaction': + specifier: ^6.1.15 + version: 6.1.15(@fullcalendar/core@6.1.15) + '@fullcalendar/react': + specifier: ^6.1.15 + version: 6.1.15(@fullcalendar/core@6.1.15)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fullcalendar/timegrid': + specifier: ^6.1.15 + version: 6.1.15(@fullcalendar/core@6.1.15) + '@hello-pangea/dnd': + specifier: ^16.6.0 + version: 16.6.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@hookform/resolvers': specifier: ^3.6.0 version: 3.9.0(react-hook-form@7.52.2(react@18.3.1)) @@ -32,6 +50,9 @@ importers: '@radix-ui/react-avatar': specifier: ^1.0.4 version: 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-checkbox': + specifier: ^1.1.1 + version: 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-dialog': specifier: ^1.1.1 version: 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -53,6 +74,9 @@ importers: '@radix-ui/react-scroll-area': specifier: ^1.1.0 version: 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-select': + specifier: ^2.1.2 + version: 2.1.2(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-separator': specifier: ^1.1.0 version: 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -68,6 +92,9 @@ importers: '@tabler/icons-react': specifier: ^3.14.0 version: 3.14.0(react@18.3.1) + '@tanstack/react-table': + specifier: ^8.19.2 + version: 8.20.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@types/bcrypt': specifier: ^5.0.2 version: 5.0.2 @@ -168,8 +195,8 @@ importers: specifier: ^1.13.2 version: 1.13.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-day-picker: - specifier: 8.10.1 - version: 8.10.1(date-fns@3.6.0)(react@18.3.1) + specifier: ^9.0.8 + version: 9.0.9(react@18.3.1) react-dom: specifier: ^18 version: 18.3.1(react@18.3.1) @@ -200,6 +227,9 @@ importers: tailwindcss-animate: specifier: ^1.0.7 version: 1.0.7(tailwindcss@3.4.10(ts-node@10.9.2(@types/node@20.16.0)(typescript@5.5.4))) + tailwindcss-textshadow: + specifier: ^2.1.3 + version: 2.1.3 vaul: specifier: ^0.8.9 version: 0.8.9(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -1282,6 +1312,40 @@ packages: '@floating-ui/utils@0.2.7': resolution: {integrity: sha512-X8R8Oj771YRl/w+c1HqAC1szL8zWQRwFvgDwT129k9ACdBoud/+/rX9V0qiMl6LWUdP9voC2nDVZYPMQQsb6eA==} + '@fullcalendar/core@6.1.15': + resolution: {integrity: sha512-BuX7o6ALpLb84cMw1FCB9/cSgF4JbVO894cjJZ6kP74jzbUZNjtwffwRdA+Id8rrLjT30d/7TrkW90k4zbXB5Q==} + + '@fullcalendar/daygrid@6.1.15': + resolution: {integrity: sha512-j8tL0HhfiVsdtOCLfzK2J0RtSkiad3BYYemwQKq512cx6btz6ZZ2RNc/hVnIxluuWFyvx5sXZwoeTJsFSFTEFA==} + peerDependencies: + '@fullcalendar/core': ~6.1.15 + + '@fullcalendar/interaction@6.1.15': + resolution: {integrity: sha512-DOTSkofizM7QItjgu7W68TvKKvN9PSEEvDJceyMbQDvlXHa7pm/WAVtAc6xSDZ9xmB1QramYoWGLHkCYbTW1rQ==} + peerDependencies: + '@fullcalendar/core': ~6.1.15 + + '@fullcalendar/react@6.1.15': + resolution: {integrity: sha512-L0b9hybS2J4e7lq6G2CD4nqriyLEqOH1tE8iI6JQjAMTVh5JicOo5Mqw+fhU5bJ7hLfMw2K3fksxX3Ul1ssw5w==} + peerDependencies: + '@fullcalendar/core': ~6.1.15 + react: ^16.7.0 || ^17 || ^18 || ^19 + react-dom: ^16.7.0 || ^17 || ^18 || ^19 + + '@fullcalendar/timegrid@6.1.15': + resolution: {integrity: sha512-61ORr3A148RtxQ2FNG7JKvacyA/TEVZ7z6I+3E9Oeu3dqTf6M928bFcpehRTIK6zIA6Yifs7BeWHgOE9dFnpbw==} + peerDependencies: + '@fullcalendar/core': ~6.1.15 + + '@fullhuman/postcss-purgecss@2.3.0': + resolution: {integrity: sha512-qnKm5dIOyPGJ70kPZ5jiz0I9foVOic0j+cOzNDoo8KoCf6HjicIZ99UfO2OmE7vCYSKAAepEwJtNzpiiZAh9xw==} + + '@hello-pangea/dnd@16.6.0': + resolution: {integrity: sha512-vfZ4GydqbtUPXSLfAvKvXQ6xwRzIjUSjVU0Sx+70VOhc2xx6CdmJXJ8YhH70RpbTUGjxctslQTHul9sIOxCfFQ==} + peerDependencies: + react: ^16.8.5 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.5 || ^17.0.0 || ^18.0.0 + '@hookform/resolvers@3.9.0': resolution: {integrity: sha512-bU0Gr4EepJ/EQsH/IwEzYLsT/PEj5C0ynLQ4m+GSHS+xKH4TfSelhluTgOaoc4kA5s7eCsQbM4wvZLzELmWzUg==} peerDependencies: @@ -1649,6 +1713,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-checkbox@1.1.1': + resolution: {integrity: sha512-0i/EKJ222Afa1FE0C6pNJxDq1itzcl3HChE9DwskA4th4KRse8ojx8a1nVcOjwJdbpDLcz7uol77yYnQNMHdKw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-collapsible@1.1.0': resolution: {integrity: sha512-zQY7Epa8sTL0mq4ajSJpjgn2YmCgyrG7RsQgLp3C0LQVkG7+Tf6Pv1CeNWZLyqMjhdPkBa5Lx7wYBeSu7uCSTA==} peerDependencies: @@ -1781,6 +1858,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-dismissable-layer@1.1.1': + resolution: {integrity: sha512-QSxg29lfr/xcev6kSz7MAlmDnzbP1eI/Dwn3Tp1ip0KT5CUELsxkekFEMVBEoykI3oV39hKT4TKZzBNMbcTZYQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-dropdown-menu@2.1.1': resolution: {integrity: sha512-y8E+x9fBq9qvteD2Zwa4397pUVhYsh9iq44b5RD5qu1GMJWBCBuVg1hMyItbc6+zH00TxGRqd9Iot4wzf3OoBQ==} peerDependencies: @@ -1812,6 +1902,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-focus-guards@1.1.1': + resolution: {integrity: sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-focus-scope@1.0.4': resolution: {integrity: sha512-sL04Mgvf+FmyvZeYfNu1EPAaaxD+aw7cYeIB9L9Fvq8+urhltTRaEo5ysKOpHuKPclsZcSUMKlN05x4u+CINpA==} peerDependencies: @@ -1947,6 +2046,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-portal@1.1.2': + resolution: {integrity: sha512-WeDYLGPxJb/5EGBoedyJbT0MpoULmwnIPMJMSldkuiMsBAv7N1cRdsTWZWht9vpPOiN3qyiGAtbK2is47/uMFg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-presence@1.0.1': resolution: {integrity: sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==} peerDependencies: @@ -2051,6 +2163,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-select@2.1.2': + resolution: {integrity: sha512-rZJtWmorC7dFRi0owDmoijm6nSJH1tVw64QGiNIZ9PNLyBDtG+iAq+XGsya052At4BfarzY/Dhv9wrrUr6IMZA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-separator@1.1.0': resolution: {integrity: sha512-3uBAs+egzvJBDZAzvb/n4NxxOYpnspmWxO2u5NbZ8Y6FM/NdrGSF9bop3Cf6F6C71z1rTSn8KV0Fo2ZVd79lGA==} peerDependencies: @@ -2551,6 +2676,17 @@ packages: '@tabler/icons@3.14.0': resolution: {integrity: sha512-OakKjK1kuDWKoNwdnHHVMt11kTZAC10iZpN/8o/CSYdeBH7S3v5n8IyqAYynFxLI8yBGTyBvljtvWdmWh57zSg==} + '@tanstack/react-table@8.20.5': + resolution: {integrity: sha512-WEHopKw3znbUZ61s9i0+i9g8drmDo6asTWbrQh8Us63DAk/M0FkmIqERew6P71HI75ksZ2Pxyuf4vvKh9rAkiA==} + engines: {node: '>=12'} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + + '@tanstack/table-core@8.20.5': + resolution: {integrity: sha512-P9dF7XbibHph2PFRz8gfBKEXEY/HJPOhym8CHmjF8y3q5mWpKx9xtZapXQUWCgkqvsK0R46Azuz+VaxD4Xl+Tg==} + engines: {node: '>=12'} + '@testing-library/dom@10.1.0': resolution: {integrity: sha512-wdsYKy5zupPyLCW2Je5DLHSxSfbIp6h80WoHOQc+RPtmPGA52O9x5MJEkv92Sjonpq+poOAtUKhh1kBGAXBrNA==} engines: {node: '>=18'} @@ -2691,6 +2827,9 @@ packages: '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + '@types/hoist-non-react-statics@3.3.5': + resolution: {integrity: sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==} + '@types/html-minifier-terser@6.1.0': resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==} @@ -2778,6 +2917,9 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + '@types/use-sync-external-store@0.0.3': + resolution: {integrity: sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==} + '@types/uuid@9.0.8': resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} @@ -3024,6 +3166,9 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + acorn-node@1.8.2: + resolution: {integrity: sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==} + acorn-walk@7.2.0: resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} engines: {node: '>=0.4.0'} @@ -3180,6 +3325,10 @@ packages: peerDependencies: postcss: ^8.1.0 + autoprefixer@9.8.8: + resolution: {integrity: sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==} + hasBin: true + available-typed-arrays@1.0.7: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} @@ -3495,6 +3644,9 @@ packages: resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} hasBin: true + color@3.2.1: + resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} + color@4.2.3: resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} engines: {node: '>=12.5.0'} @@ -3516,6 +3668,10 @@ packages: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} + commander@5.1.0: + resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} + engines: {node: '>= 6'} + commander@6.2.1: resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} engines: {node: '>= 6'} @@ -3622,6 +3778,9 @@ packages: resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} engines: {node: '>=12'} + css-box-model@1.2.1: + resolution: {integrity: sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==} + css-in-js-utils@3.1.0: resolution: {integrity: sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==} @@ -3647,6 +3806,9 @@ packages: resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} engines: {node: '>=8.0.0'} + css-unit-converter@1.1.2: + resolution: {integrity: sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA==} + css-what@6.1.0: resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} engines: {node: '>= 6'} @@ -3739,6 +3901,9 @@ packages: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} + defined@1.0.1: + resolution: {integrity: sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==} + defu@6.1.4: resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} @@ -3779,6 +3944,11 @@ packages: detect-node-es@1.1.0: resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + detective@5.2.1: + resolution: {integrity: sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==} + engines: {node: '>=0.8.0'} + hasBin: true + devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} @@ -4240,6 +4410,10 @@ packages: resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} engines: {node: '>=14.14'} + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + fs-minipass@2.1.0: resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} engines: {node: '>= 8'} @@ -4454,6 +4628,9 @@ packages: hmac-drbg@1.0.1: resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + hotkeys-js@3.9.4: resolution: {integrity: sha512-2zuLt85Ta+gIyvs4N88pCYskNrxf1TFv3LR9t5mdAZIX8BcgQQ48F2opUptvHa6m8zsy5v/a0i9mWzTrlNWU0Q==} @@ -4814,6 +4991,9 @@ packages: engines: {node: '>=6'} hasBin: true + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} @@ -5407,6 +5587,9 @@ packages: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} engines: {node: '>=10.5.0'} + node-emoji@1.11.0: + resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} + node-fetch-native@1.6.4: resolution: {integrity: sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==} @@ -5453,6 +5636,9 @@ packages: resolution: {integrity: sha512-uhXOdZry0L6M2UIo9BTt7FdpBDiAGN/7oItedQwPKh8jh31ZlvC8U9Xl/EJ3aijDHaywXTW3QbZ6LuCocur1YA==} engines: {node: '>=12.20'} + normalize.css@8.0.1: + resolution: {integrity: sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==} + not@0.1.0: resolution: {integrity: sha512-5PDmaAsVfnWUgTUbJ3ERwn7u79Z0dYxN9ErxCpVJJqe2RK0PJ3z+iFUxuqjwtlDDegXvtWoxD/3Fzxox7tFGWA==} @@ -5486,6 +5672,9 @@ packages: nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + num2fraction@1.2.2: + resolution: {integrity: sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg==} + nwsapi@2.2.12: resolution: {integrity: sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==} @@ -5730,6 +5919,9 @@ packages: resolution: {integrity: sha512-E7mY2VmKqw9jYuXrSWGHFuPCW2SLQenzXLF3amGaY6lXXg4/b3gj5HVM7h8ZjCO/nZS9ICs0Cz285+32FvNd/A==} engines: {node: '>=14.16'} + picocolors@0.2.1: + resolution: {integrity: sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==} + picocolors@1.0.1: resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} @@ -5780,12 +5972,18 @@ packages: resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} engines: {node: '>= 0.4'} + postcss-functions@3.0.0: + resolution: {integrity: sha512-N5yWXWKA+uhpLQ9ZhBRl2bIAdM6oVJYpDojuI1nF2SzXBimJcdjFwiAouBVbO5VuOF3qA6BSFWFc3wXbbj72XQ==} + postcss-import@15.1.0: resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} engines: {node: '>=14.0.0'} peerDependencies: postcss: ^8.0.0 + postcss-js@2.0.3: + resolution: {integrity: sha512-zS59pAk3deu6dVHyrGqmC3oDXBdNdajk4k1RyxeVXCrcEDBUBHoIhE4QTsmhxgzXxsaqFDAkUZfmMa5f/N/79w==} + postcss-js@4.0.1: resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} engines: {node: ^12 || ^14 || >= 16} @@ -5841,6 +6039,9 @@ packages: peerDependencies: postcss: ^8.1.0 + postcss-nested@4.2.3: + resolution: {integrity: sha512-rOv0W1HquRCamWy2kFl3QazJMMe1ku6rCFoAAH+9AcxdbpDeBr6k968MLWuLjvjMcGEip01ak09hKOEgpK9hvw==} + postcss-nested@6.2.0: resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} engines: {node: '>=12.0'} @@ -5851,9 +6052,24 @@ packages: resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} engines: {node: '>=4'} + postcss-value-parser@3.3.1: + resolution: {integrity: sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==} + postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + postcss@6.0.23: + resolution: {integrity: sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==} + engines: {node: '>=4.0.0'} + + postcss@7.0.32: + resolution: {integrity: sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==} + engines: {node: '>=6.0.0'} + + postcss@7.0.39: + resolution: {integrity: sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==} + engines: {node: '>=6.0.0'} + postcss@8.4.31: resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} @@ -5875,6 +6091,9 @@ packages: preact@10.11.3: resolution: {integrity: sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg==} + preact@10.12.1: + resolution: {integrity: sha512-l8386ixSsBdbreOAkqtrwqHwdvR35ID8c3rKPa8lCWuO86dBi32QWHV4vfsZK1utLLFMvw+Z5Ad4XLkZzchscg==} + preact@10.23.2: resolution: {integrity: sha512-kKYfePf9rzKnxOAKDpsWhg/ysrHPqT+yQ7UW4JjdnqjFIeNUnNcEJvhuA8fDenxAGWzUqtd51DfVg7xp/8T9NA==} @@ -5956,6 +6175,10 @@ packages: pretty-format@3.8.0: resolution: {integrity: sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==} + pretty-hrtime@1.0.3: + resolution: {integrity: sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==} + engines: {node: '>= 0.8'} + prisma@5.18.0: resolution: {integrity: sha512-+TrSIxZsh64OPOmaSgVPH7ALL9dfU0jceYaMJXsNrTkFHO7/3RANi5K2ZiPB1De9+KDxCWn7jvRq8y8pvk+o9g==} engines: {node: '>=16.13'} @@ -6005,6 +6228,10 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} + purgecss@2.3.0: + resolution: {integrity: sha512-BE5CROfVGsx2XIhxGuZAT7rTH9lLeQx/6M0P7DTXQH4IUc3BBzs9JUzt4yzGf3JrH9enkeq6YJBe9CTtkm1WmQ==} + hasBin: true + qs@6.11.0: resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} engines: {node: '>=0.6'} @@ -6030,6 +6257,9 @@ packages: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'} + raf-schd@4.0.3: + resolution: {integrity: sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==} + randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} @@ -6062,11 +6292,10 @@ packages: peerDependencies: react: ^16.3.0 || ^17.0.1 || ^18.0.0 - react-day-picker@8.10.1: - resolution: {integrity: sha512-TMx7fNbhLk15eqcMt+7Z7S2KF7mfTId/XJDjKE8f+IUcFn0l08/kI4FiYTL/0yuOLmEcbR4Fwe3GJf/NiiMnPA==} + react-day-picker@9.0.9: + resolution: {integrity: sha512-Sj+1UuuUmdxSKPmJlQFb6h1wKw9N7gG0K4db9mQtHm/qzd94t6LT9X8cGwDHaW9Pdb9dua4/sLhUSW06A1Xqkg==} peerDependencies: - date-fns: ^2.28.0 || ^3.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react: '>=16.8.0' react-docgen-typescript@2.2.2: resolution: {integrity: sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg==} @@ -6173,6 +6402,27 @@ packages: react: ^16.3.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.3.0 || ^17.0.0 || ^18.0.0 + react-redux@8.1.3: + resolution: {integrity: sha512-n0ZrutD7DaX/j9VscF+uTALI3oUPa/pO4Z3soOBIjuRn/FzVu6aehhysxZCLi6y7duMf52WNZGMl7CtuK5EnRw==} + 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 || ^5.0.0-beta.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + react-dom: + optional: true + react-native: + optional: true + redux: + optional: true + react-refresh@0.14.2: resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} engines: {node: '>=0.10.0'} @@ -6207,6 +6457,16 @@ packages: '@types/react': optional: true + react-remove-scroll@2.6.0: + resolution: {integrity: sha512-I2U4JVEsQenxDAKaVa3VZ/JeJZe0/2DxPWL8Tj8yLKctQJQiZM52pn/GWFpSp8dftjM3pSAHVJZscAnC/y+ySQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + react-resizable-panels@1.0.10: resolution: {integrity: sha512-0+g0CNqregkuocr+Mi+e6wgWVARnKTYIX3U1QK7GlkLQKCmbymZakx80YGwcRO7HNnKJTQ5v38HlBos/cGxWvg==} peerDependencies: @@ -6289,6 +6549,12 @@ packages: resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==} engines: {node: '>=4'} + reduce-css-calc@2.1.8: + resolution: {integrity: sha512-8liAVezDmUcH+tdzoEGrhfbGcP7nOV4NkGE3a74+qqvE7nt9i4sKLGBuZNOnpI4WiGksiNPklZxva80061QiPg==} + + redux@4.2.1: + resolution: {integrity: sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==} + refractor@4.8.1: resolution: {integrity: sha512-/fk5sI0iTgFYlmVGYVew90AoYnNMP6pooClx/XKqyeeCQXrL0Kvgn8V0VEht5ccdljbzzF1i3Q213gcntkRExg==} @@ -6744,6 +7010,10 @@ packages: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} + supports-color@6.1.0: + resolution: {integrity: sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==} + engines: {node: '>=6'} + supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -6767,6 +7037,14 @@ packages: peerDependencies: tailwindcss: '>=3.0.0 || insiders' + tailwindcss-textshadow@2.1.3: + resolution: {integrity: sha512-FGVHfK+xnV879VSQDeRvY61Aa+b0GDiGaFBPwCOKvqIrK57GyepWJL1GydjtGOLHE9qqphFucRNj9fHramCzNg==} + + tailwindcss@1.9.6: + resolution: {integrity: sha512-nY8WYM/RLPqGsPEGEV2z63riyQPcHYZUJpAwdyBzVpxQHOHqHE+F/fvbCeXhdF1+TA5l72vSkZrtYCB9hRcwkQ==} + engines: {node: '>=8.9.0'} + hasBin: true + tailwindcss@3.4.10: resolution: {integrity: sha512-KWZkVPm7yJRhdu4SRSl9d4AK2wM3a50UsvgHZO7xY77NQr2V+fIrEuoDGQcbvswWvFGbS2f6e+jC/6WJm1Dl0w==} engines: {node: '>=14.0.0'} @@ -7072,6 +7350,10 @@ packages: unist-util-visit@5.0.0: resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + universalify@0.2.0: resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} engines: {node: '>= 4.0.0'} @@ -7117,6 +7399,11 @@ packages: '@types/react': optional: true + use-memo-one@1.1.3: + resolution: {integrity: sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + use-sidecar@1.1.2: resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} engines: {node: '>=10'} @@ -7127,6 +7414,11 @@ packages: '@types/react': optional: true + use-sync-external-store@1.2.2: + resolution: {integrity: sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -8617,6 +8909,50 @@ snapshots: '@floating-ui/utils@0.2.7': {} + '@fullcalendar/core@6.1.15': + dependencies: + preact: 10.12.1 + + '@fullcalendar/daygrid@6.1.15(@fullcalendar/core@6.1.15)': + dependencies: + '@fullcalendar/core': 6.1.15 + + '@fullcalendar/interaction@6.1.15(@fullcalendar/core@6.1.15)': + dependencies: + '@fullcalendar/core': 6.1.15 + + '@fullcalendar/react@6.1.15(@fullcalendar/core@6.1.15)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@fullcalendar/core': 6.1.15 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@fullcalendar/timegrid@6.1.15(@fullcalendar/core@6.1.15)': + dependencies: + '@fullcalendar/core': 6.1.15 + '@fullcalendar/daygrid': 6.1.15(@fullcalendar/core@6.1.15) + + '@fullhuman/postcss-purgecss@2.3.0': + dependencies: + postcss: 7.0.32 + purgecss: 2.3.0 + + '@hello-pangea/dnd@16.6.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.25.0 + css-box-model: 1.2.1 + memoize-one: 6.0.0 + raf-schd: 4.0.3 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-redux: 8.1.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(redux@4.2.1) + redux: 4.2.1 + use-memo-one: 1.1.3(react@18.3.1) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-native + '@hookform/resolvers@3.9.0(react-hook-form@7.52.2(react@18.3.1))': dependencies: react-hook-form: 7.52.2(react@18.3.1) @@ -8924,6 +9260,22 @@ snapshots: '@types/react': 18.3.3 '@types/react-dom': 18.3.0 + '@radix-ui/react-checkbox@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + '@radix-ui/react-collapsible@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 @@ -9062,6 +9414,19 @@ snapshots: '@types/react': 18.3.3 '@types/react-dom': 18.3.0 + '@radix-ui/react-dismissable-layer@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + '@radix-ui/react-dropdown-menu@2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 @@ -9090,6 +9455,12 @@ snapshots: optionalDependencies: '@types/react': 18.3.3 + '@radix-ui/react-focus-guards@1.1.1(@types/react@18.3.3)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 + '@radix-ui/react-focus-scope@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.25.0 @@ -9246,6 +9617,16 @@ snapshots: '@types/react': 18.3.3 '@types/react-dom': 18.3.0 + '@radix-ui/react-portal@1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + '@radix-ui/react-presence@1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.25.0 @@ -9348,6 +9729,35 @@ snapshots: '@types/react': 18.3.3 '@types/react-dom': 18.3.0 + '@radix-ui/react-select@2.1.2(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/number': 1.1.0 + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + aria-hidden: 1.2.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.6.0(@types/react@18.3.3)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + '@radix-ui/react-separator@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -10007,6 +10417,14 @@ snapshots: '@tabler/icons@3.14.0': {} + '@tanstack/react-table@8.20.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@tanstack/table-core': 8.20.5 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@tanstack/table-core@8.20.5': {} + '@testing-library/dom@10.1.0': dependencies: '@babel/code-frame': 7.24.7 @@ -10178,6 +10596,11 @@ snapshots: dependencies: '@types/unist': 3.0.3 + '@types/hoist-non-react-statics@3.3.5': + dependencies: + '@types/react': 18.3.3 + hoist-non-react-statics: 3.3.2 + '@types/html-minifier-terser@6.1.0': {} '@types/http-cache-semantics@4.0.4': {} @@ -10264,6 +10687,8 @@ snapshots: '@types/unist@3.0.3': {} + '@types/use-sync-external-store@0.0.3': {} + '@types/uuid@9.0.8': {} '@types/warning@3.0.3': {} @@ -10643,6 +11068,12 @@ snapshots: dependencies: acorn: 8.12.1 + acorn-node@1.8.2: + dependencies: + acorn: 7.4.1 + acorn-walk: 7.2.0 + xtend: 4.0.2 + acorn-walk@7.2.0: {} acorn-walk@8.3.3: @@ -10793,6 +11224,16 @@ snapshots: postcss: 8.4.41 postcss-value-parser: 4.2.0 + autoprefixer@9.8.8: + dependencies: + browserslist: 4.23.3 + caniuse-lite: 1.0.30001651 + normalize-range: 0.1.2 + num2fraction: 1.2.2 + picocolors: 0.2.1 + postcss: 7.0.39 + postcss-value-parser: 4.2.0 + available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.0.0 @@ -11151,10 +11592,14 @@ snapshots: dependencies: color-name: 1.1.4 simple-swizzle: 0.2.2 - optional: true color-support@1.1.3: {} + color@3.2.1: + dependencies: + color-convert: 1.9.3 + color-string: 1.9.1 + color@4.2.3: dependencies: color-convert: 2.0.1 @@ -11173,6 +11618,8 @@ snapshots: commander@4.1.1: {} + commander@5.1.0: {} + commander@6.2.1: {} commander@8.3.0: {} @@ -11286,6 +11733,10 @@ snapshots: dependencies: type-fest: 1.4.0 + css-box-model@1.2.1: + dependencies: + tiny-invariant: 1.3.3 + css-in-js-utils@3.1.0: dependencies: hyphenate-style-name: 1.1.0 @@ -11318,6 +11769,8 @@ snapshots: mdn-data: 2.0.14 source-map: 0.6.1 + css-unit-converter@1.1.2: {} + css-what@6.1.0: {} css.escape@1.5.1: {} @@ -11389,6 +11842,8 @@ snapshots: has-property-descriptors: 1.0.2 object-keys: 1.1.1 + defined@1.0.1: {} + defu@6.1.4: {} delayed-stream@1.0.0: {} @@ -11414,6 +11869,12 @@ snapshots: detect-node-es@1.1.0: {} + detective@5.2.1: + dependencies: + acorn-node: 1.8.2 + defined: 1.0.1 + minimist: 1.2.8 + devlop@1.1.0: dependencies: dequal: 2.0.3 @@ -11987,6 +12448,12 @@ snapshots: jsonfile: 6.1.0 universalify: 2.0.1 + fs-extra@8.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + fs-minipass@2.1.0: dependencies: minipass: 3.3.6 @@ -12322,6 +12789,10 @@ snapshots: minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 + hoist-non-react-statics@3.3.2: + dependencies: + react-is: 16.13.1 + hotkeys-js@3.9.4: {} html-encoding-sniffer@4.0.0: @@ -12491,8 +12962,7 @@ snapshots: is-arrayish@0.2.1: {} - is-arrayish@0.3.2: - optional: true + is-arrayish@0.3.2: {} is-binary-path@2.1.0: dependencies: @@ -12681,6 +13151,10 @@ snapshots: json5@2.2.3: {} + jsonfile@4.0.0: + optionalDependencies: + graceful-fs: 4.2.11 + jsonfile@6.1.0: dependencies: universalify: 2.0.1 @@ -13465,6 +13939,10 @@ snapshots: node-domexception@1.0.0: {} + node-emoji@1.11.0: + dependencies: + lodash: 4.17.21 + node-fetch-native@1.6.4: {} node-fetch@2.7.0: @@ -13520,6 +13998,8 @@ snapshots: normalize-url@7.2.0: {} + normalize.css@8.0.1: {} + not@0.1.0: {} notion-client@6.16.0: @@ -13560,6 +14040,8 @@ snapshots: dependencies: boolbase: 1.0.0 + num2fraction@1.2.2: {} + nwsapi@2.2.12: {} nypm@0.3.9: @@ -13801,6 +14283,8 @@ snapshots: peek-readable@5.1.4: {} + picocolors@0.2.1: {} + picocolors@1.0.1: {} picomatch@2.3.1: {} @@ -13845,6 +14329,13 @@ snapshots: possible-typed-array-names@1.0.0: {} + postcss-functions@3.0.0: + dependencies: + glob: 7.2.3 + object-assign: 4.1.1 + postcss: 6.0.23 + postcss-value-parser: 3.3.1 + postcss-import@15.1.0(postcss@8.4.41): dependencies: postcss: 8.4.41 @@ -13852,6 +14343,11 @@ snapshots: read-cache: 1.0.0 resolve: 1.22.8 + postcss-js@2.0.3: + dependencies: + camelcase-css: 2.0.1 + postcss: 7.0.39 + postcss-js@4.0.1(postcss@8.4.41): dependencies: camelcase-css: 2.0.1 @@ -13897,6 +14393,11 @@ snapshots: icss-utils: 5.1.0(postcss@8.4.41) postcss: 8.4.41 + postcss-nested@4.2.3: + dependencies: + postcss: 7.0.39 + postcss-selector-parser: 6.1.2 + postcss-nested@6.2.0(postcss@8.4.41): dependencies: postcss: 8.4.41 @@ -13907,8 +14408,27 @@ snapshots: cssesc: 3.0.0 util-deprecate: 1.0.2 + postcss-value-parser@3.3.1: {} + postcss-value-parser@4.2.0: {} + postcss@6.0.23: + dependencies: + chalk: 2.4.2 + source-map: 0.6.1 + supports-color: 5.5.0 + + postcss@7.0.32: + dependencies: + chalk: 2.4.2 + source-map: 0.6.1 + supports-color: 6.1.0 + + postcss@7.0.39: + dependencies: + picocolors: 0.2.1 + source-map: 0.6.1 + postcss@8.4.31: dependencies: nanoid: 3.3.7 @@ -13933,6 +14453,8 @@ snapshots: preact@10.11.3: {} + preact@10.12.1: {} + preact@10.23.2: {} prelude-ls@1.2.1: {} @@ -13962,6 +14484,8 @@ snapshots: pretty-format@3.8.0: {} + pretty-hrtime@1.0.3: {} + prisma@5.18.0: dependencies: '@prisma/engines': 5.18.0 @@ -14012,6 +14536,13 @@ snapshots: punycode@2.3.1: {} + purgecss@2.3.0: + dependencies: + commander: 5.1.0 + glob: 7.2.3 + postcss: 7.0.32 + postcss-selector-parser: 6.1.2 + qs@6.11.0: dependencies: side-channel: 1.0.6 @@ -14032,6 +14563,8 @@ snapshots: quick-lru@5.1.1: {} + raf-schd@4.0.3: {} + randombytes@2.1.0: dependencies: safe-buffer: 5.2.1 @@ -14081,7 +14614,7 @@ snapshots: react: 18.3.1 tween-functions: 1.2.0 - react-day-picker@8.10.1(date-fns@3.6.0)(react@18.3.1): + react-day-picker@9.0.9(react@18.3.1): dependencies: date-fns: 3.6.0 react: 18.3.1 @@ -14245,6 +14778,21 @@ snapshots: - webpack - worker-loader + react-redux@8.1.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(redux@4.2.1): + dependencies: + '@babel/runtime': 7.25.0 + '@types/hoist-non-react-statics': 3.3.5 + '@types/use-sync-external-store': 0.0.3 + hoist-non-react-statics: 3.3.2 + react: 18.3.1 + react-is: 18.3.1 + use-sync-external-store: 1.2.2(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + react-dom: 18.3.1(react@18.3.1) + redux: 4.2.1 + react-refresh@0.14.2: {} react-remove-scroll-bar@2.3.6(@types/react@18.3.3)(react@18.3.1): @@ -14277,6 +14825,17 @@ snapshots: optionalDependencies: '@types/react': 18.3.3 + react-remove-scroll@2.6.0(@types/react@18.3.3)(react@18.3.1): + dependencies: + react: 18.3.1 + react-remove-scroll-bar: 2.3.6(@types/react@18.3.3)(react@18.3.1) + react-style-singleton: 2.2.1(@types/react@18.3.3)(react@18.3.1) + tslib: 2.6.3 + use-callback-ref: 1.3.2(@types/react@18.3.3)(react@18.3.1) + use-sidecar: 1.1.2(@types/react@18.3.3)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + react-resizable-panels@1.0.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: react: 18.3.1 @@ -14381,6 +14940,15 @@ snapshots: dependencies: redis-errors: 1.2.0 + reduce-css-calc@2.1.8: + dependencies: + css-unit-converter: 1.1.2 + postcss-value-parser: 3.3.1 + + redux@4.2.1: + dependencies: + '@babel/runtime': 7.25.0 + refractor@4.8.1: dependencies: '@types/hast': 2.3.10 @@ -14779,7 +15347,6 @@ snapshots: simple-swizzle@0.2.2: dependencies: is-arrayish: 0.3.2 - optional: true sisteransi@1.0.5: {} @@ -14971,6 +15538,10 @@ snapshots: dependencies: has-flag: 3.0.0 + supports-color@6.1.0: + dependencies: + has-flag: 3.0.0 + supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -14989,6 +15560,35 @@ snapshots: dependencies: tailwindcss: 3.4.10(ts-node@10.9.2(@types/node@20.16.0)(typescript@5.5.4)) + tailwindcss-textshadow@2.1.3: + dependencies: + tailwindcss: 1.9.6 + + tailwindcss@1.9.6: + dependencies: + '@fullhuman/postcss-purgecss': 2.3.0 + autoprefixer: 9.8.8 + browserslist: 4.23.3 + bytes: 3.1.2 + chalk: 4.1.2 + color: 3.2.1 + detective: 5.2.1 + fs-extra: 8.1.0 + html-tags: 3.3.1 + lodash: 4.17.21 + node-emoji: 1.11.0 + normalize.css: 8.0.1 + object-hash: 2.2.0 + postcss: 7.0.39 + postcss-functions: 3.0.0 + postcss-js: 2.0.3 + postcss-nested: 4.2.3 + postcss-selector-parser: 6.1.2 + postcss-value-parser: 4.2.0 + pretty-hrtime: 1.0.3 + reduce-css-calc: 2.1.8 + resolve: 1.22.8 + tailwindcss@3.4.10(ts-node@10.9.2(@types/node@20.16.0)(typescript@5.5.4)): dependencies: '@alloc/quick-lru': 5.2.0 @@ -15293,6 +15893,8 @@ snapshots: unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 + universalify@0.1.2: {} + universalify@0.2.0: {} universalify@2.0.1: {} @@ -15335,6 +15937,10 @@ snapshots: optionalDependencies: '@types/react': 18.3.3 + use-memo-one@1.1.3(react@18.3.1): + dependencies: + react: 18.3.1 + use-sidecar@1.1.2(@types/react@18.3.3)(react@18.3.1): dependencies: detect-node-es: 1.1.0 @@ -15343,6 +15949,10 @@ snapshots: optionalDependencies: '@types/react': 18.3.3 + use-sync-external-store@1.2.2(react@18.3.1): + dependencies: + react: 18.3.1 + util-deprecate@1.0.2: {} util@0.12.5: diff --git a/prisma/migrations/20240626071124_course_schema_edited/migration.sql b/prisma/migrations/20240626071124_course_schema_edited/migration.sql new file mode 100644 index 000000000..4616d3032 --- /dev/null +++ b/prisma/migrations/20240626071124_course_schema_edited/migration.sql @@ -0,0 +1,5 @@ +-- AlterTable +ALTER TABLE "Course" ALTER COLUMN "imageUrl" DROP NOT NULL, +ALTER COLUMN "description" DROP NOT NULL, +ALTER COLUMN "slug" DROP NOT NULL, +ALTER COLUMN "discordRoleId" DROP NOT NULL; diff --git a/prisma/migrations/20240629065854_drag_and_drop_feature/migration.sql b/prisma/migrations/20240629065854_drag_and_drop_feature/migration.sql new file mode 100644 index 000000000..e2df168bf --- /dev/null +++ b/prisma/migrations/20240629065854_drag_and_drop_feature/migration.sql @@ -0,0 +1,4 @@ +-- AlterTable +ALTER TABLE "Content" ADD COLUMN "isFree" BOOLEAN NOT NULL DEFAULT false, +ADD COLUMN "isPublished" BOOLEAN NOT NULL DEFAULT false, +ADD COLUMN "position" INTEGER NOT NULL DEFAULT 0; diff --git a/prisma/migrations/20240701171924_add_void_field_in_content_schema/migration.sql b/prisma/migrations/20240701171924_add_void_field_in_content_schema/migration.sql new file mode 100644 index 000000000..db11b2132 --- /dev/null +++ b/prisma/migrations/20240701171924_add_void_field_in_content_schema/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "Content" ADD COLUMN "voided" BOOLEAN NOT NULL DEFAULT false; diff --git a/prisma/migrations/20240701182215_update_course_schema/migration.sql b/prisma/migrations/20240701182215_update_course_schema/migration.sql new file mode 100644 index 000000000..9239ce2e8 --- /dev/null +++ b/prisma/migrations/20240701182215_update_course_schema/migration.sql @@ -0,0 +1,3 @@ +-- AlterTable +ALTER TABLE "Course" ADD COLUMN "isFree" BOOLEAN NOT NULL DEFAULT false, +ADD COLUMN "isPublished" BOOLEAN NOT NULL DEFAULT false; diff --git a/prisma/migrations/20240701183506_add_voided_field_in_course_schema/migration.sql b/prisma/migrations/20240701183506_add_voided_field_in_course_schema/migration.sql new file mode 100644 index 000000000..6d9bf82a8 --- /dev/null +++ b/prisma/migrations/20240701183506_add_voided_field_in_course_schema/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "Course" ADD COLUMN "voided" BOOLEAN NOT NULL DEFAULT false; diff --git a/prisma/migrations/20240901164958_class/migration.sql b/prisma/migrations/20240901164958_class/migration.sql new file mode 100644 index 000000000..ff52eb2e4 --- /dev/null +++ b/prisma/migrations/20240901164958_class/migration.sql @@ -0,0 +1,27 @@ +/* + Warnings: + + - Made the column `imageUrl` on table `Course` required. This step will fail if there are existing NULL values in that column. + - Made the column `description` on table `Course` required. This step will fail if there are existing NULL values in that column. + - Made the column `slug` on table `Course` required. This step will fail if there are existing NULL values in that column. + - Made the column `discordRoleId` on table `Course` required. This step will fail if there are existing NULL values in that column. + +*/ +-- AlterTable +ALTER TABLE "Course" ALTER COLUMN "imageUrl" SET NOT NULL, +ALTER COLUMN "description" SET NOT NULL, +ALTER COLUMN "slug" SET NOT NULL, +ALTER COLUMN "discordRoleId" SET NOT NULL; + +-- CreateTable +CREATE TABLE "Class" ( + "id" SERIAL NOT NULL, + "title" TEXT NOT NULL, + "description" TEXT NOT NULL, + "date" TEXT NOT NULL, + "startTime" TEXT NOT NULL, + "endTime" TEXT NOT NULL, + "meetingLink" TEXT NOT NULL, + + CONSTRAINT "Class_pkey" PRIMARY KEY ("id") +); diff --git a/prisma/migrations/20241014065045_add_assignment_schema/migration.sql b/prisma/migrations/20241014065045_add_assignment_schema/migration.sql new file mode 100644 index 000000000..fff59abd5 --- /dev/null +++ b/prisma/migrations/20241014065045_add_assignment_schema/migration.sql @@ -0,0 +1,22 @@ +/* + Warnings: + + - Changed the type of `date` on the `Class` table. No cast exists, the column would be dropped and recreated, which cannot be done if there is data, since the column is required. + +*/ +-- AlterTable +ALTER TABLE "Class" DROP COLUMN "date", +ADD COLUMN "date" TIMESTAMP(3) NOT NULL; + +-- CreateTable +CREATE TABLE "Assignment" ( + "id" SERIAL NOT NULL, + "title" TEXT NOT NULL, + "description" TEXT NOT NULL, + "course" TEXT NOT NULL, + "dueDate" TIMESTAMP(3) NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "Assignment_pkey" PRIMARY KEY ("id") +); diff --git a/prisma/migrations/20241014070221_change_assignment_schema/migration.sql b/prisma/migrations/20241014070221_change_assignment_schema/migration.sql new file mode 100644 index 000000000..3bfd33da9 --- /dev/null +++ b/prisma/migrations/20241014070221_change_assignment_schema/migration.sql @@ -0,0 +1,8 @@ +/* + Warnings: + + - Added the required column `dueTime` to the `Assignment` table without a default value. This is not possible if the table is not empty. + +*/ +-- AlterTable +ALTER TABLE "Assignment" ADD COLUMN "dueTime" TEXT NOT NULL; diff --git a/prisma/migrations/20241014071021_change_assignment_duedate/migration.sql b/prisma/migrations/20241014071021_change_assignment_duedate/migration.sql new file mode 100644 index 000000000..a58451a36 --- /dev/null +++ b/prisma/migrations/20241014071021_change_assignment_duedate/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "Assignment" ALTER COLUMN "dueDate" SET DATA TYPE TEXT; diff --git a/prisma/migrations/20241015122319_change_assignment_schema_for_submission/migration.sql b/prisma/migrations/20241015122319_change_assignment_schema_for_submission/migration.sql new file mode 100644 index 000000000..8ee936094 --- /dev/null +++ b/prisma/migrations/20241015122319_change_assignment_schema_for_submission/migration.sql @@ -0,0 +1,5 @@ +-- AlterTable +ALTER TABLE "Assignment" ADD COLUMN "githubLink" TEXT, +ADD COLUMN "submitted" BOOLEAN NOT NULL DEFAULT false, +ADD COLUMN "submittedAt" TIMESTAMP(3), +ADD COLUMN "twitterPost" TEXT; diff --git a/prisma/migrations/20241015144046_add_submission_schema/migration.sql b/prisma/migrations/20241015144046_add_submission_schema/migration.sql new file mode 100644 index 000000000..77a0f398a --- /dev/null +++ b/prisma/migrations/20241015144046_add_submission_schema/migration.sql @@ -0,0 +1,46 @@ +/* + Warnings: + + - You are about to drop the column `course` on the `Assignment` table. All the data in the column will be lost. + - You are about to drop the column `githubLink` on the `Assignment` table. All the data in the column will be lost. + - You are about to drop the column `submitted` on the `Assignment` table. All the data in the column will be lost. + - You are about to drop the column `submittedAt` on the `Assignment` table. All the data in the column will be lost. + - You are about to drop the column `twitterPost` on the `Assignment` table. All the data in the column will be lost. + +*/ +-- AlterTable +ALTER TABLE "Assignment" DROP COLUMN "course", +DROP COLUMN "githubLink", +DROP COLUMN "submitted", +DROP COLUMN "submittedAt", +DROP COLUMN "twitterPost", +ADD COLUMN "courseId" INTEGER; + +-- CreateTable +CREATE TABLE "Submission" ( + "id" SERIAL NOT NULL, + "assignmentId" INTEGER NOT NULL, + "userId" TEXT NOT NULL, + "courseId" INTEGER NOT NULL, + "githubLink" TEXT, + "twitterPost" TEXT, + "videoLink" TEXT, + "submitted" BOOLEAN NOT NULL DEFAULT false, + "submittedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "feedback" TEXT, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "Submission_pkey" PRIMARY KEY ("id") +); + +-- AddForeignKey +ALTER TABLE "Assignment" ADD CONSTRAINT "Assignment_courseId_fkey" FOREIGN KEY ("courseId") REFERENCES "Course"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Submission" ADD CONSTRAINT "Submission_courseId_fkey" FOREIGN KEY ("courseId") REFERENCES "Course"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Submission" ADD CONSTRAINT "Submission_assignmentId_fkey" FOREIGN KEY ("assignmentId") REFERENCES "Assignment"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Submission" ADD CONSTRAINT "Submission_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/prisma/migrations/20241017150435_change_submission_schema_to_add_deployment_link/migration.sql b/prisma/migrations/20241017150435_change_submission_schema_to_add_deployment_link/migration.sql new file mode 100644 index 000000000..84c9c531e --- /dev/null +++ b/prisma/migrations/20241017150435_change_submission_schema_to_add_deployment_link/migration.sql @@ -0,0 +1,11 @@ +/* + Warnings: + + - You are about to drop the column `videoLink` on the `Submission` table. All the data in the column will be lost. + - Added the required column `bounty` to the `Submission` table without a default value. This is not possible if the table is not empty. + +*/ +-- AlterTable +ALTER TABLE "Submission" DROP COLUMN "videoLink", +ADD COLUMN "bounty" TEXT NOT NULL, +ADD COLUMN "deploymentLink" TEXT; diff --git a/prisma/migrations/20241017151454_add_bounty_as_optional/migration.sql b/prisma/migrations/20241017151454_add_bounty_as_optional/migration.sql new file mode 100644 index 000000000..9bc2e3992 --- /dev/null +++ b/prisma/migrations/20241017151454_add_bounty_as_optional/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "Submission" ALTER COLUMN "bounty" DROP NOT NULL; diff --git a/prisma/migrations/20241018105127_relate_class_course_model/migration.sql b/prisma/migrations/20241018105127_relate_class_course_model/migration.sql new file mode 100644 index 000000000..491bab588 --- /dev/null +++ b/prisma/migrations/20241018105127_relate_class_course_model/migration.sql @@ -0,0 +1,12 @@ +/* + Warnings: + + - Added the required column `courseId` to the `Class` table without a default value. This is not possible if the table is not empty. + +*/ +-- AlterTable +ALTER TABLE "Class" ADD COLUMN "courseId" INTEGER NOT NULL, +ALTER COLUMN "date" SET DATA TYPE TEXT; + +-- AddForeignKey +ALTER TABLE "Class" ADD CONSTRAINT "Class_courseId_fkey" FOREIGN KEY ("courseId") REFERENCES "Course"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/prisma/migrations/20241018105254_relate_class_course_model/migration.sql b/prisma/migrations/20241018105254_relate_class_course_model/migration.sql new file mode 100644 index 000000000..af5102c8b --- /dev/null +++ b/prisma/migrations/20241018105254_relate_class_course_model/migration.sql @@ -0,0 +1 @@ +-- This is an empty migration. \ No newline at end of file diff --git a/prisma/migrations/20241018184709_class_date_to_string/migration.sql b/prisma/migrations/20241018184709_class_date_to_string/migration.sql new file mode 100644 index 000000000..054cdc658 --- /dev/null +++ b/prisma/migrations/20241018184709_class_date_to_string/migration.sql @@ -0,0 +1,3 @@ +-- AlterTable +ALTER TABLE "Class" ADD COLUMN "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, +ADD COLUMN "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP; diff --git a/prisma/migrations/20241020182151_remove_voided_is_published_is_free/migration.sql b/prisma/migrations/20241020182151_remove_voided_is_published_is_free/migration.sql new file mode 100644 index 000000000..a077c9ffa --- /dev/null +++ b/prisma/migrations/20241020182151_remove_voided_is_published_is_free/migration.sql @@ -0,0 +1,20 @@ +/* + Warnings: + + - You are about to drop the column `isFree` on the `Content` table. All the data in the column will be lost. + - You are about to drop the column `isPublished` on the `Content` table. All the data in the column will be lost. + - You are about to drop the column `voided` on the `Content` table. All the data in the column will be lost. + - You are about to drop the column `isFree` on the `Course` table. All the data in the column will be lost. + - You are about to drop the column `isPublished` on the `Course` table. All the data in the column will be lost. + - You are about to drop the column `voided` on the `Course` table. All the data in the column will be lost. + +*/ +-- AlterTable +ALTER TABLE "Content" DROP COLUMN "isFree", +DROP COLUMN "isPublished", +DROP COLUMN "voided"; + +-- AlterTable +ALTER TABLE "Course" DROP COLUMN "isFree", +DROP COLUMN "isPublished", +DROP COLUMN "voided"; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index f21792668..da30f236c 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -8,6 +8,38 @@ datasource db { url = env("DATABASE_URL") } +model Assignment { + id Int @id @default(autoincrement()) + courseId Int? + title String + description String + dueDate String + dueTime String + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + submission Submission[] + course Course? @relation(fields: [courseId], references: [id]) +} + +model Submission { + id Int @id @default(autoincrement()) + assignmentId Int + userId String + courseId Int + githubLink String? + twitterPost String? + deploymentLink String? + submitted Boolean @default(false) + submittedAt DateTime @default(now()) + bounty String? + feedback String? + updatedAt DateTime @updatedAt + + course Course @relation(fields: [courseId], references: [id]) + assignment Assignment @relation(fields: [assignmentId], references: [id]) + user User @relation(fields: [userId], references: [id]) +} + model Course { id Int @id @default(autoincrement()) appxCourseId String @@ -22,6 +54,9 @@ model Course { purchasedBy UserPurchases[] certificate Certificate[] certIssued Boolean @default(false) + assignments Assignment[] + submissions Submission[] + class Class[] } model UserPurchases { @@ -53,6 +88,7 @@ model Content { comments Comment[] commentsCount Int @default(0) bookmark Bookmark[] + position Int @default(0) } model CourseContent { @@ -75,6 +111,22 @@ model Certificate { @@unique([userId, courseId]) } +model Class { + id Int @id @default(autoincrement()) + title String + description String + date String + startTime String + endTime String + meetingLink String + + courseId Int + course Course @relation(fields: [courseId], references: [id], onDelete: Cascade) + + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) +} + model NotionMetadata { id Int @id @default(autoincrement()) contentId Int @@ -160,6 +212,7 @@ model User { upiIds UpiId[] @relation("UserUpiIds") solanaAddresses SolanaAddress[] @relation("UserSolanaAddresses") githubUser GitHubLink? @relation("UserGithub") + submissions Submission[] } model GitHubLink { diff --git a/public/admin-card/active-users.png b/public/admin-card/active-users.png new file mode 100644 index 000000000..40bbe43c1 Binary files /dev/null and b/public/admin-card/active-users.png differ diff --git a/public/admin-card/graduation.png b/public/admin-card/graduation.png new file mode 100644 index 000000000..c33cbb043 Binary files /dev/null and b/public/admin-card/graduation.png differ diff --git a/public/admin-card/reading.png b/public/admin-card/reading.png new file mode 100644 index 000000000..f2f00fe23 Binary files /dev/null and b/public/admin-card/reading.png differ diff --git a/public/admin-card/teacher.png b/public/admin-card/teacher.png new file mode 100644 index 000000000..9b5d186b2 Binary files /dev/null and b/public/admin-card/teacher.png differ diff --git a/src/app/admin/add-course/page.tsx b/src/app/admin/add-course/page.tsx index d4b6d5609..fa847cda6 100644 --- a/src/app/admin/add-course/page.tsx +++ b/src/app/admin/add-course/page.tsx @@ -17,7 +17,6 @@ import { useRouter } from 'next/navigation'; import { useState } from 'react'; import { useForm } from 'react-hook-form'; import { toast } from 'sonner'; -import { z } from 'zod'; import { zodResolver } from '@hookform/resolvers/zod'; import { Accordion, @@ -27,23 +26,7 @@ import { } from '@/components/ui/accordion'; import { Cuboid, PackagePlus } from 'lucide-react'; import { FaDiscord } from 'react-icons/fa'; - -const courseSchema = z.object({ - title: z.string().min(5, { - message: 'Title must be at least 5 characters long.', - }), - imageUrl: z.string().url({ - message: 'Invalid URL format for imageUrl.', - }), - description: z.string().min(8, { - message: 'Description must be at least of 8 characters long.', - }), - slug: z.string(), - id: z.string(), - adminSecret: z.string(), - appxCourseId: z.string(), - discordRoleId: z.string(), -}); +import { courseSchema, CourseType } from '@/lib/validation/course'; export default function Courses() { const [isLoading, setIsLoading] = useState(false); @@ -51,7 +34,7 @@ export default function Courses() { const [email, setEmail] = useState(''); const [adminPassword, setAdminPassword] = useState(''); - const form = useForm>({ + const form = useForm({ resolver: zodResolver(courseSchema), defaultValues: { title: '', @@ -65,10 +48,13 @@ export default function Courses() { }, }); - const onSubmit = async (data: z.infer) => { + const onSubmit = async (data: CourseType) => { setIsLoading(true); try { - await axios.post('/api/admin/course', data); + const res = await axios.post('/api/admin/course', data); + if (res.status === 200) { + router.push(`/admin/course/${res?.data?.id}`); + } toast('course succesfully created'); router.push('/'); } catch (error: any) { diff --git a/src/app/admin/assignment/[assignmentId]/page.tsx b/src/app/admin/assignment/[assignmentId]/page.tsx new file mode 100644 index 000000000..f34e02a85 --- /dev/null +++ b/src/app/admin/assignment/[assignmentId]/page.tsx @@ -0,0 +1,17 @@ +import React from 'react'; +import { getSubmissionsByAssignmentId } from '@/db/submission'; +import SubmissionList from '@/components/assignments/SubmissionList'; + +const AssignmentDetailsPage = async ( + {params} : {params: { assignmentId: string}} +) => { + const assignmentId = parseInt(params.assignmentId, 10); + const submittedData = await getSubmissionsByAssignmentId(assignmentId); + return ( + <> + + + ); +}; + +export default AssignmentDetailsPage; \ No newline at end of file diff --git a/src/app/admin/assignment/page.tsx b/src/app/admin/assignment/page.tsx new file mode 100644 index 000000000..4628a44a7 --- /dev/null +++ b/src/app/admin/assignment/page.tsx @@ -0,0 +1,13 @@ +import React from 'react'; +import { getAllAssignments } from '@/db/assignment'; +import Assignments from '@/components/admin/Assignments'; + +const AssignmentPage = async () => { + const assignments = await getAllAssignments(); + + return ( + <> + ); +}; + +export default AssignmentPage; \ No newline at end of file diff --git a/src/app/admin/calendar/page.tsx b/src/app/admin/calendar/page.tsx new file mode 100644 index 000000000..d131de21c --- /dev/null +++ b/src/app/admin/calendar/page.tsx @@ -0,0 +1,14 @@ +import React from 'react'; +import { getAllClasses } from '@/db/class'; +import AdminCalender from '@/components/admin/Calender'; + +const LiveClassPage: React.FC = async () => { + const classes = await getAllClasses(); + return ( + <> + + + ); +}; + +export default LiveClassPage; \ No newline at end of file diff --git a/src/app/admin/course/[courseId]/content/[contentId]/[...moduleId]/page.tsx b/src/app/admin/course/[courseId]/content/[contentId]/[...moduleId]/page.tsx new file mode 100644 index 000000000..a2e1e8d46 --- /dev/null +++ b/src/app/admin/course/[courseId]/content/[contentId]/[...moduleId]/page.tsx @@ -0,0 +1,27 @@ +import { UpdateVideoClient } from '@/components/admin/UpdateVideoClient'; +import { getFullCourseContent } from '@/db/course'; +import findContentById from '@/lib/find-content-by-id'; +import React from 'react'; + +const VideoOrNotionEditPage = async ({ + params, +}: { + params: { moduleId: string[]; courseId: string }; +}) => { + const courseId = params.courseId; + const rest = params.moduleId; + const fullCourseContent = await getFullCourseContent(parseInt(courseId, 10)); + + const courseContent = findContentById( + fullCourseContent, + rest.map((x) => parseInt(x, 10)), + ); + return ( +
+ {/* @ts-ignore */} + +
+ ); +}; + +export default VideoOrNotionEditPage; \ No newline at end of file diff --git a/src/app/admin/course/[courseId]/content/[contentId]/page.tsx b/src/app/admin/course/[courseId]/content/[contentId]/page.tsx new file mode 100644 index 000000000..4b041a9d2 --- /dev/null +++ b/src/app/admin/course/[courseId]/content/[contentId]/page.tsx @@ -0,0 +1,49 @@ +import { redirect } from 'next/navigation'; +import { BookOpenText } from 'lucide-react'; +import { getContentById } from '@/db/course'; +import ContentEditForm from '@/components/admin/ContentEditForm'; + +const ContentPage = async ({ + params, +}: { + params: { courseId: string; contentId: string }; +}) => { + const { contentId } = params; + const courseId = parseInt(params.courseId, 10); + const content = await getContentById(parseInt(contentId, 10)); + if (!content) { + return redirect('/'); + } + const requiredFields = [ + content.title, + content.description, + content.children?.filter((item: any) => item.type === 'video'), + content.thumbnail, + ]; + const totalFields = requiredFields?.length; + const completedFields = requiredFields?.filter((item) => item?.length).length; + const indicator = `(${completedFields}/${totalFields})`; + + return ( +
+
+
+
+ +

Customize course contents

+
+

Complete all fields {indicator}

+
+
+
+ +
+
+ ); +}; + +export default ContentPage; diff --git a/src/app/admin/course/[courseId]/page.tsx b/src/app/admin/course/[courseId]/page.tsx new file mode 100644 index 000000000..b4d562f3e --- /dev/null +++ b/src/app/admin/course/[courseId]/page.tsx @@ -0,0 +1,53 @@ +import React from 'react'; +import { BookOpenText } from 'lucide-react'; +import { getCourse, getFullCourseContent } from '@/db/course'; +import findContentById from '@/lib/find-content-by-id'; +import CourseEditForm from '@/components/admin/CourseEditForm'; + +const CourseUpdatePage = async ({ + params, +}: { + params: { courseId: string }; +}) => { + const courseId = parseInt(params.courseId, 10); + const fullCourseContent = await getFullCourseContent(courseId); + const courseContent = findContentById(fullCourseContent, []); + const course = await getCourse(courseId); + + const requiredFields = [ + course?.title, + course?.description, + course?.discordRoleId, + course?.imageUrl, + course?.slug, + ]; + + const totalFields = requiredFields.length; + const completedFields = requiredFields.filter((item) => item?.length).length; + const indicator = `(${completedFields}/${totalFields})`; + + return ( +
+
+
+
+ +

Customize Course

+
+

Complete all fields {indicator}

+
+
+
+
+ +
+
+
+ ); +}; + +export default CourseUpdatePage; diff --git a/src/app/admin/course/add-course/page.tsx b/src/app/admin/course/add-course/page.tsx new file mode 100644 index 000000000..540c527dc --- /dev/null +++ b/src/app/admin/course/add-course/page.tsx @@ -0,0 +1,380 @@ +'use client'; + +import { Button } from '@/components/ui/button'; +import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; +import { + Form, + FormControl, + FormField, + FormItem, + FormLabel, + FormMessage, +} from '@/components/ui/form'; +import { Input } from '@/components/ui/input'; +import { Textarea } from '@/components/ui/textarea'; +import axios from 'axios'; +import { useRouter } from 'next/navigation'; +import { useState } from 'react'; +import { useForm } from 'react-hook-form'; +import { toast } from 'sonner'; +import { zodResolver } from '@hookform/resolvers/zod'; +import { + Accordion, + AccordionContent, + AccordionItem, + AccordionTrigger, +} from '@/components/ui/accordion'; +import { EyeIcon, EyeOff, PackagePlus } from 'lucide-react'; +import { FaDiscord } from 'react-icons/fa'; +import { courseSchema, CourseType } from '@/lib/validation/course'; + +export default function CourseCreate() { + const [isLoading, setIsLoading] = useState(false); + const router = useRouter(); + const [email, setEmail] = useState(''); + const [adminPassword, setAdminPassword] = useState(''); + const [isPasswordVisible, setIsPasswordVisible] = useState(false); + + const form = useForm({ + resolver: zodResolver(courseSchema), + defaultValues: { + title: '', + imageUrl: '', + description: '', + slug: '', + id: '', + adminSecret: '', + appxCourseId: '', + discordRoleId: '', + }, + }); + + const onSubmit = async (data: CourseType) => { + setIsLoading(true); + try { + const res = await axios.post('/api/admin/course', data); + if (res.status === 200) { + router.push(`/admin/course/${res?.data?.data?.id}`); + } + toast.success('Course succesfully created'); + } catch (error: any) { + console.log(error); + toast(error.message); + } finally { + setIsLoading(false); + } + }; + + return ( +
+ + + +
+ + New course +
+
+ +
+
+ Create new course for 100xdevs community and let user explore + new courses +
+
+ + + {/* Create a new course */} + Fill in the course details below + + +
+ + ( + + Title + + + + + + )} + /> + ( + + Image url + + + + + + )} + /> + ( + + Description + +