From b0d86465f29afb68c08ca00ec86a5151981877cb Mon Sep 17 00:00:00 2001 From: Ayobami Date: Wed, 23 Jul 2025 23:25:19 +0100 Subject: [PATCH] feat: complete day 20 react task --- day19/models/index.js | 16 +- day19/package.json | 3 +- day20/.gitignore | 27 + day20/.prettier | 5 + day20/README.md | 10 +- day20/index.html | 26 + day20/jsconfig.json | 17 + day20/package.json | 179 + day20/postcss.config.js | 7 + day20/src/App.css | 0 day20/src/App.jsx | 34 + day20/src/assets/images/index.js | 3 + day20/src/assets/images/login-new-bg.png | Bin 0 -> 685293 bytes day20/src/assets/images/mkd_logo.png | 18 + day20/src/assets/svgs/CaretLeft.jsx | 24 + day20/src/assets/svgs/CloseIcon.jsx | 14 + day20/src/assets/svgs/DangerIcon.jsx | 13 + day20/src/assets/svgs/Spinner.jsx | 21 + day20/src/assets/svgs/index.js | 9 + day20/src/components/AddButton/AddButton.jsx | 36 + .../components/AddButton/AddButton.module.css | 33 + day20/src/components/AddButton/index.js | 2 + day20/src/components/AddTags/AddTags.jsx | 11 + day20/src/components/AddTags/index.js | 5 + .../components/AdminHeader/AdminHeader.jsx | 180 + day20/src/components/AdminHeader/index.js | 5 + .../components/AdminWrapper/AdminWrapper.jsx | 39 + day20/src/components/AdminWrapper/index.js | 4 + .../src/components/BackButton/BackButton.jsx | 19 + day20/src/components/BackButton/index.js | 5 + day20/src/components/Calendar/Calendar.jsx | 160 + day20/src/components/Calendar/calendar.css | 5 + day20/src/components/Calendar/index.js | 3 + .../CameraToUpload/CameraToUpload.jsx | 323 ++ day20/src/components/CameraToUpload/index.js | 4 + day20/src/components/Chat/Chat.jsx | 509 ++ day20/src/components/Chat/index.js | 5 + day20/src/components/ChatBot/Chat.jsx | 233 + day20/src/components/ChatBot/ChatBot.jsx | 80 + day20/src/components/ChatBot/ChatUtils.jsx | 49 + day20/src/components/ChatBot/Message.jsx | 97 + .../src/components/ChatBot/MobileSidebar.jsx | 65 + day20/src/components/ChatBot/Sidebar.jsx | 50 + day20/src/components/ChatBot/TypingEffect.jsx | 38 + day20/src/components/ChatBot/index.js | 8 + .../CollapsibleMenu/CollapsibleMenu.jsx | 22 + day20/src/components/CollapsibleMenu/index.js | 5 + .../CreateNewRoomModal/CreateNewRoomModal.jsx | 114 + .../components/CreateNewRoomModal/index.js | 7 + .../components/DashboardUI/DashboardUI.jsx | 302 + .../src/components/DashboardUI/IconCards.jsx | 63 + .../src/components/DashboardUI/LineChart.jsx | 55 + .../DashboardUI/NumberLabelCard.jsx | 63 + day20/src/components/DashboardUI/PieChart.jsx | 45 + day20/src/components/DashboardUI/Stats.jsx | 39 + day20/src/components/DashboardUI/index.jsx | 6 + day20/src/components/DateRange/DateRange.jsx | 20 + day20/src/components/DateRange/index.js | 5 + .../DynamicContentType/DynamicContentType.jsx | 467 ++ .../components/DynamicContentType/index.js | 5 + day20/src/components/Editor/Editor.jsx | 47 + .../src/components/Editor/EditorToolbars.jsx | 160 + day20/src/components/Editor/index.js | 2 + .../components/ExportButton/ExportButton.jsx | 25 + day20/src/components/ExportButton/index.js | 1 + .../ImagePreviewModal/ImagePreviewModal.jsx | 55 + .../src/components/ImagePreviewModal/index.js | 5 + .../InteractiveButton/InteractiveButton.jsx | 45 + .../src/components/InteractiveButton/index.js | 1 + day20/src/components/LazyLoad/LazyLoad.jsx | 34 + day20/src/components/LazyLoad/index.js | 5 + day20/src/components/Loader/Loader.jsx | 23 + day20/src/components/Loader/index.js | 5 + .../LoadingIndicator/LoadingIndicator.jsx | 58 + .../src/components/LoadingIndicator/index.js | 5 + day20/src/components/MKDForm/MKDForm.jsx | 14 + day20/src/components/MKDForm/index.js | 4 + .../components/MemberHeader/MemberHeader.jsx | 148 + day20/src/components/MemberHeader/index.js | 5 + .../MemberWrapper/MemberWrapper.jsx | 39 + day20/src/components/MemberWrapper/index.js | 4 + .../MkdDebounceInput/MkdDebounceInput.jsx | 118 + .../src/components/MkdDebounceInput/index.js | 5 + .../components/MkdFileTable/MkdFileTable.jsx | 148 + day20/src/components/MkdFileTable/index.js | 1 + .../MkdFileUpload/MkdFileUpload.jsx | 457 ++ day20/src/components/MkdFileUpload/index.js | 2 + .../components/MkdGridView/MkdGridCard.jsx | 170 + .../components/MkdGridView/MkdGridCards.jsx | 87 + .../components/MkdGridView/MkdGridView.jsx | 325 ++ day20/src/components/MkdGridView/index.js | 5 + day20/src/components/MkdInput/MkdInput.jsx | 120 + day20/src/components/MkdInput/index.js | 3 + .../AnswerTypes/MultipleChoice.jsx | 20 + .../AnswerTypes/ShortLongAnswer.jsx | 67 + .../MkdJsonQuiz/AnswerTypes/SingleChoice.jsx | 20 + .../MkdJsonQuiz/AnswerTypes/TrueOrFalse.jsx | 53 + .../MkdJsonQuiz/AnswerTypes/index.js | 7 + .../MkdJsonQuiz/CircularProgressBar.jsx | 20 + .../components/MkdJsonQuiz/MkdJsonQuiz.jsx | 205 + .../MkdJsonQuiz/MkdJsonQuizOption.jsx | 115 + .../MkdJsonQuiz/MkdJsonQuizOptions.jsx | 24 + .../MkdJsonQuiz/MkdJsonQuizQuestions.jsx | 101 + .../MkdJsonQuiz/MkdJsonQuizResult.jsx | 23 + day20/src/components/MkdJsonQuiz/index.js | 9 + .../components/MkdListTable/MkdListTable.jsx | 209 + .../MkdListTable/MkdListTableHead.jsx | 85 + .../MkdListTable/MkdListTableRow.jsx | 211 + .../MkdListTable/MkdListTableV2.jsx | 646 +++ .../components/MkdListTable/TableActions.jsx | 86 + day20/src/components/MkdListTable/index.js | 9 + .../MkdSimpleTable/MkdSimpleTable.jsx | 57 + day20/src/components/MkdSimpleTable/index.js | 2 + .../MkdTabContainer/MkdTabContainer.jsx | 45 + day20/src/components/MkdTabContainer/index.js | 2 + .../MkdTrelloColumns/AlartMolad.jsx | 37 + .../MkdTrelloColumns/AttachmentCard.jsx | 89 + .../MkdTrelloColumns/AttachmentViewer.jsx | 80 + .../MkdTrelloColumns/BoardCardsPage.jsx | 205 + .../MkdTrelloColumns/CardMember.jsx | 214 + .../MkdTrelloColumns/CardMemberCard.jsx | 104 + day20/src/components/MkdTrelloColumns/Col.jsx | 21 + .../components/MkdTrelloColumns/Comment.jsx | 260 + .../MkdTrelloColumns/CommentForm.jsx | 197 + .../MkdTrelloColumns/CommentReplyBox.jsx | 185 + .../MkdTrelloColumns/CreateNewRoomModal.jsx | 89 + .../MkdTrelloColumns/DropWrapper.jsx | 34 + .../MkdTrelloColumns/InstandEditor.jsx | 115 + .../src/components/MkdTrelloColumns/Item.jsx | 108 + .../components/MkdTrelloColumns/LIstItems.jsx | 257 + .../MkdTrelloColumns/LinkifyText.jsx | 64 + .../MkdTrelloColumns/ListSetting.jsx | 387 ++ .../src/components/MkdTrelloColumns/Lists.jsx | 141 + .../MkdTrelloColumns/MkdTrelloColumns.jsx | 90 + .../components/MkdTrelloColumns/Window.jsx | 288 + .../components/MkdTrelloColumns/data/types.js | 4 + .../src/components/MkdTrelloColumns/index.js | 23 + .../MkdWizardContainer/MkdWizardContainer.jsx | 55 + .../components/MkdWizardContainer/index.js | 5 + day20/src/components/Modal/Modal.jsx | 38 + day20/src/components/Modal/ModalAlert.jsx | 56 + day20/src/components/Modal/ModalPrompt.jsx | 92 + day20/src/components/Modal/index.js | 8 + .../components/ModalSidebar/ModalSidebar.jsx | 57 + day20/src/components/ModalSidebar/index.js | 5 + .../components/MultiSelect/MultiSelect.jsx | 60 + day20/src/components/MultiSelect/index.js | 5 + .../MultipleAnnswer/MultipleAnswer.jsx | 74 + day20/src/components/MultipleAnswer/index.js | 6 + .../PaginationBar/PaginationBar.jsx | 61 + day20/src/components/PaginationBar/index.js | 5 + .../components/PublicHeader/PublicHeader.jsx | 18 + day20/src/components/PublicHeader/index.js | 5 + .../PublicWrapper/PublicWrapper.jsx | 26 + day20/src/components/PublicWrapper/index.js | 4 + .../QrCodeGenerator/QrCodeGenerator.jsx | 61 + day20/src/components/QrCodeGenerator/index.js | 2 + .../components/QrCodeReader/QrCodeReader.jsx | 49 + day20/src/components/QrCodeReader/index.js | 2 + .../src/components/RatingStar/RatingStar.jsx | 98 + day20/src/components/RatingStar/index.js | 6 + .../SessionExpiredModal.jsx | 100 + .../components/SessionExpiredModal/index.js | 4 + day20/src/components/Skeleton/Skeleton.jsx | 44 + day20/src/components/Skeleton/index.js | 6 + day20/src/components/SnackBar/SnackBar.jsx | 125 + day20/src/components/SnackBar/index.js | 5 + .../StripePayments/StripePayments.jsx | 76 + day20/src/components/StripePayments/index.js | 4 + day20/src/components/TopHeader/TopHeader.jsx | 164 + day20/src/components/TopHeader/index.js | 5 + .../UppyFileUpload/UppyFileUpload.jsx | 88 + day20/src/components/UppyFileUpload/index.js | 5 + day20/src/components/video/index.js | 5 + day20/src/components/video/video.jsx | 234 + day20/src/components/video/videoItem.jsx | 29 + day20/src/context/Auth/AuthContext.jsx | 127 + day20/src/context/Auth/index.js | 3 + day20/src/context/Global/GlobalActions.jsx | 370 ++ day20/src/context/Global/GlobalConstants.jsx | 16 + day20/src/context/Global/GlobalContext.jsx | 224 + .../context/Global/InitialGlobalStates.jsx | 14 + day20/src/context/Global/index.js | 28 + day20/src/hooks/useProfile/index.js | 2 + day20/src/hooks/useProfile/useProfile.jsx | 46 + day20/src/index.css | 3435 +++++++++++ day20/src/index.jsx | 26 + day20/src/logo.svg | 10 + day20/src/output.css | 5132 +++++++++++++++++ day20/src/pages/404/NotFoundPage.jsx | 33 + day20/src/pages/404/index.js | 4 + day20/src/pages/Admin/Add/AddAdminCmsPage.jsx | 182 + .../src/pages/Admin/Add/AddAdminEmailPage.jsx | 188 + .../src/pages/Admin/Add/AddAdminPhotoPage.jsx | 86 + .../Admin/Add/AddAdminStripePricePage.jsx | 394 ++ .../src/pages/Admin/Add/AddAdminUserPage.jsx | 193 + .../Admin/Add/AdminAddDepartmentTablePage.jsx | 147 + .../AdminAddItemMovementHistoryTablePage.jsx | 190 + .../Admin/Add/AdminAddItemsTablePage.jsx | 218 + .../Admin/Add/AdminAddLocationTablePage.jsx | 147 + .../pages/Admin/Add/AdminAddUserTablePage.jsx | 370 ++ .../src/pages/Admin/Auth/AdminForgotPage.jsx | 115 + day20/src/pages/Admin/Auth/AdminResetPage.jsx | 168 + .../pages/Admin/Auth/CustomAdminLoginPage.jsx | 184 + .../Admin/Auth/CustomAdminSignUpPage.jsx | 156 + .../Custom/CustomAdminAdminDashboardPage.jsx | 50 + .../Edit/AdminEditDepartmentTablePage.jsx | 173 + .../AdminEditItemMovementHistoryTablePage.jsx | 225 + .../Admin/Edit/AdminEditItemsTablePage.jsx | 259 + .../Admin/Edit/AdminEditLocationTablePage.jsx | 173 + .../Admin/Edit/AdminEditUserTablePage.jsx | 441 ++ .../src/pages/Admin/Edit/EditAdminCmsPage.jsx | 271 + .../pages/Admin/Edit/EditAdminEmailPage.jsx | 198 + .../Admin/Edit/EditAdminStripePricePage.jsx | 158 + .../pages/Admin/Edit/EditAdminUserPage.jsx | 271 + .../src/pages/Admin/List/AdminCmsListPage.jsx | 515 ++ .../pages/Admin/List/AdminEmailListPage.jsx | 393 ++ .../List/AdminListDepartmentTablePage.jsx | 146 + .../AdminListItemMovementHistoryTablePage.jsx | 173 + .../Admin/List/AdminListItemsTablePage.jsx | 191 + .../Admin/List/AdminListLocationTablePage.jsx | 146 + .../Admin/List/AdminListUserTablePage.jsx | 281 + .../pages/Admin/List/AdminPhotoListPage.jsx | 450 ++ .../List/AdminStripeInvoicesListPageV2.jsx | 477 ++ .../Admin/List/AdminStripePricesListPage.jsx | 538 ++ .../List/AdminStripeSubscriptionsListPage.jsx | 642 +++ .../pages/Admin/List/AdminUserListPage.jsx | 473 ++ .../pages/Admin/View/AdminDashboardPage.jsx | 28 + .../View/AdminViewDepartmentTablePage.jsx | 72 + .../AdminViewItemMovementHistoryTablePage.jsx | 99 + .../Admin/View/AdminViewItemsTablePage.jsx | 117 + .../Admin/View/AdminViewLocationTablePage.jsx | 72 + .../Admin/View/AdminViewUserTablePage.jsx | 207 + .../Admin/View/CustomAdminProfilePage.jsx | 696 +++ .../pages/MagicLogin/MagicLoginVerifyPage.jsx | 61 + .../pages/MagicLogin/UserMagicLoginPage.jsx | 107 + .../Member/Auth/CustomMemberLoginPage.jsx | 184 + .../Member/Auth/CustomMemberSignUpPage.jsx | 156 + .../pages/Member/Auth/MemberForgotPage.jsx | 115 + .../src/pages/Member/Auth/MemberResetPage.jsx | 168 + .../Member/View/CustomMemberProfilePage.jsx | 696 +++ .../pages/Member/View/MemberDashboardPage.jsx | 28 + .../Public/Auth/CustomPublicLoginPage.jsx | 184 + .../Public/Auth/CustomPublicSignUpPage.jsx | 156 + .../Public/View/CustomPublicProfilePage.jsx | 696 +++ day20/src/routes/AdminRoutes.jsx | 32 + day20/src/routes/LazyLoad.js | 382 ++ day20/src/routes/MemberRoutes.jsx | 32 + day20/src/routes/PrivateRoutes.jsx | 30 + day20/src/routes/PublicRoutes.jsx | 22 + day20/src/routes/Routes.jsx | 967 ++++ day20/src/utils/EcomSDK.jsx | 529 ++ day20/src/utils/MkdSDK.jsx | 2810 +++++++++ day20/src/utils/TreeSDK.jsx | 419 ++ day20/src/utils/config.jsx | 1449 +++++ day20/src/utils/metadata.json | 71 + day20/src/utils/utils.jsx | 463 ++ day20/tailwind.config.js | 28 + day20/vite.config.js | 72 + 259 files changed, 42427 insertions(+), 11 deletions(-) create mode 100644 day20/.gitignore create mode 100644 day20/.prettier create mode 100644 day20/index.html create mode 100644 day20/jsconfig.json create mode 100644 day20/package.json create mode 100644 day20/postcss.config.js create mode 100644 day20/src/App.css create mode 100644 day20/src/App.jsx create mode 100644 day20/src/assets/images/index.js create mode 100644 day20/src/assets/images/login-new-bg.png create mode 100644 day20/src/assets/images/mkd_logo.png create mode 100644 day20/src/assets/svgs/CaretLeft.jsx create mode 100644 day20/src/assets/svgs/CloseIcon.jsx create mode 100644 day20/src/assets/svgs/DangerIcon.jsx create mode 100644 day20/src/assets/svgs/Spinner.jsx create mode 100644 day20/src/assets/svgs/index.js create mode 100644 day20/src/components/AddButton/AddButton.jsx create mode 100644 day20/src/components/AddButton/AddButton.module.css create mode 100644 day20/src/components/AddButton/index.js create mode 100644 day20/src/components/AddTags/AddTags.jsx create mode 100644 day20/src/components/AddTags/index.js create mode 100644 day20/src/components/AdminHeader/AdminHeader.jsx create mode 100644 day20/src/components/AdminHeader/index.js create mode 100644 day20/src/components/AdminWrapper/AdminWrapper.jsx create mode 100644 day20/src/components/AdminWrapper/index.js create mode 100644 day20/src/components/BackButton/BackButton.jsx create mode 100644 day20/src/components/BackButton/index.js create mode 100644 day20/src/components/Calendar/Calendar.jsx create mode 100644 day20/src/components/Calendar/calendar.css create mode 100644 day20/src/components/Calendar/index.js create mode 100644 day20/src/components/CameraToUpload/CameraToUpload.jsx create mode 100644 day20/src/components/CameraToUpload/index.js create mode 100644 day20/src/components/Chat/Chat.jsx create mode 100644 day20/src/components/Chat/index.js create mode 100644 day20/src/components/ChatBot/Chat.jsx create mode 100644 day20/src/components/ChatBot/ChatBot.jsx create mode 100644 day20/src/components/ChatBot/ChatUtils.jsx create mode 100644 day20/src/components/ChatBot/Message.jsx create mode 100644 day20/src/components/ChatBot/MobileSidebar.jsx create mode 100644 day20/src/components/ChatBot/Sidebar.jsx create mode 100644 day20/src/components/ChatBot/TypingEffect.jsx create mode 100644 day20/src/components/ChatBot/index.js create mode 100644 day20/src/components/CollapsibleMenu/CollapsibleMenu.jsx create mode 100644 day20/src/components/CollapsibleMenu/index.js create mode 100644 day20/src/components/CreateNewRoomModal/CreateNewRoomModal.jsx create mode 100644 day20/src/components/CreateNewRoomModal/index.js create mode 100644 day20/src/components/DashboardUI/DashboardUI.jsx create mode 100644 day20/src/components/DashboardUI/IconCards.jsx create mode 100644 day20/src/components/DashboardUI/LineChart.jsx create mode 100644 day20/src/components/DashboardUI/NumberLabelCard.jsx create mode 100644 day20/src/components/DashboardUI/PieChart.jsx create mode 100644 day20/src/components/DashboardUI/Stats.jsx create mode 100644 day20/src/components/DashboardUI/index.jsx create mode 100644 day20/src/components/DateRange/DateRange.jsx create mode 100644 day20/src/components/DateRange/index.js create mode 100644 day20/src/components/DynamicContentType/DynamicContentType.jsx create mode 100644 day20/src/components/DynamicContentType/index.js create mode 100644 day20/src/components/Editor/Editor.jsx create mode 100644 day20/src/components/Editor/EditorToolbars.jsx create mode 100644 day20/src/components/Editor/index.js create mode 100644 day20/src/components/ExportButton/ExportButton.jsx create mode 100644 day20/src/components/ExportButton/index.js create mode 100644 day20/src/components/ImagePreviewModal/ImagePreviewModal.jsx create mode 100644 day20/src/components/ImagePreviewModal/index.js create mode 100644 day20/src/components/InteractiveButton/InteractiveButton.jsx create mode 100644 day20/src/components/InteractiveButton/index.js create mode 100644 day20/src/components/LazyLoad/LazyLoad.jsx create mode 100644 day20/src/components/LazyLoad/index.js create mode 100644 day20/src/components/Loader/Loader.jsx create mode 100644 day20/src/components/Loader/index.js create mode 100644 day20/src/components/LoadingIndicator/LoadingIndicator.jsx create mode 100644 day20/src/components/LoadingIndicator/index.js create mode 100644 day20/src/components/MKDForm/MKDForm.jsx create mode 100644 day20/src/components/MKDForm/index.js create mode 100644 day20/src/components/MemberHeader/MemberHeader.jsx create mode 100644 day20/src/components/MemberHeader/index.js create mode 100644 day20/src/components/MemberWrapper/MemberWrapper.jsx create mode 100644 day20/src/components/MemberWrapper/index.js create mode 100644 day20/src/components/MkdDebounceInput/MkdDebounceInput.jsx create mode 100644 day20/src/components/MkdDebounceInput/index.js create mode 100644 day20/src/components/MkdFileTable/MkdFileTable.jsx create mode 100644 day20/src/components/MkdFileTable/index.js create mode 100644 day20/src/components/MkdFileUpload/MkdFileUpload.jsx create mode 100644 day20/src/components/MkdFileUpload/index.js create mode 100644 day20/src/components/MkdGridView/MkdGridCard.jsx create mode 100644 day20/src/components/MkdGridView/MkdGridCards.jsx create mode 100644 day20/src/components/MkdGridView/MkdGridView.jsx create mode 100644 day20/src/components/MkdGridView/index.js create mode 100644 day20/src/components/MkdInput/MkdInput.jsx create mode 100644 day20/src/components/MkdInput/index.js create mode 100644 day20/src/components/MkdJsonQuiz/AnswerTypes/MultipleChoice.jsx create mode 100644 day20/src/components/MkdJsonQuiz/AnswerTypes/ShortLongAnswer.jsx create mode 100644 day20/src/components/MkdJsonQuiz/AnswerTypes/SingleChoice.jsx create mode 100644 day20/src/components/MkdJsonQuiz/AnswerTypes/TrueOrFalse.jsx create mode 100644 day20/src/components/MkdJsonQuiz/AnswerTypes/index.js create mode 100644 day20/src/components/MkdJsonQuiz/CircularProgressBar.jsx create mode 100644 day20/src/components/MkdJsonQuiz/MkdJsonQuiz.jsx create mode 100644 day20/src/components/MkdJsonQuiz/MkdJsonQuizOption.jsx create mode 100644 day20/src/components/MkdJsonQuiz/MkdJsonQuizOptions.jsx create mode 100644 day20/src/components/MkdJsonQuiz/MkdJsonQuizQuestions.jsx create mode 100644 day20/src/components/MkdJsonQuiz/MkdJsonQuizResult.jsx create mode 100644 day20/src/components/MkdJsonQuiz/index.js create mode 100644 day20/src/components/MkdListTable/MkdListTable.jsx create mode 100644 day20/src/components/MkdListTable/MkdListTableHead.jsx create mode 100644 day20/src/components/MkdListTable/MkdListTableRow.jsx create mode 100644 day20/src/components/MkdListTable/MkdListTableV2.jsx create mode 100644 day20/src/components/MkdListTable/TableActions.jsx create mode 100644 day20/src/components/MkdListTable/index.js create mode 100644 day20/src/components/MkdSimpleTable/MkdSimpleTable.jsx create mode 100644 day20/src/components/MkdSimpleTable/index.js create mode 100644 day20/src/components/MkdTabContainer/MkdTabContainer.jsx create mode 100644 day20/src/components/MkdTabContainer/index.js create mode 100644 day20/src/components/MkdTrelloColumns/AlartMolad.jsx create mode 100644 day20/src/components/MkdTrelloColumns/AttachmentCard.jsx create mode 100644 day20/src/components/MkdTrelloColumns/AttachmentViewer.jsx create mode 100644 day20/src/components/MkdTrelloColumns/BoardCardsPage.jsx create mode 100644 day20/src/components/MkdTrelloColumns/CardMember.jsx create mode 100644 day20/src/components/MkdTrelloColumns/CardMemberCard.jsx create mode 100644 day20/src/components/MkdTrelloColumns/Col.jsx create mode 100644 day20/src/components/MkdTrelloColumns/Comment.jsx create mode 100644 day20/src/components/MkdTrelloColumns/CommentForm.jsx create mode 100644 day20/src/components/MkdTrelloColumns/CommentReplyBox.jsx create mode 100644 day20/src/components/MkdTrelloColumns/CreateNewRoomModal.jsx create mode 100644 day20/src/components/MkdTrelloColumns/DropWrapper.jsx create mode 100644 day20/src/components/MkdTrelloColumns/InstandEditor.jsx create mode 100644 day20/src/components/MkdTrelloColumns/Item.jsx create mode 100644 day20/src/components/MkdTrelloColumns/LIstItems.jsx create mode 100644 day20/src/components/MkdTrelloColumns/LinkifyText.jsx create mode 100644 day20/src/components/MkdTrelloColumns/ListSetting.jsx create mode 100644 day20/src/components/MkdTrelloColumns/Lists.jsx create mode 100644 day20/src/components/MkdTrelloColumns/MkdTrelloColumns.jsx create mode 100644 day20/src/components/MkdTrelloColumns/Window.jsx create mode 100644 day20/src/components/MkdTrelloColumns/data/types.js create mode 100644 day20/src/components/MkdTrelloColumns/index.js create mode 100644 day20/src/components/MkdWizardContainer/MkdWizardContainer.jsx create mode 100644 day20/src/components/MkdWizardContainer/index.js create mode 100644 day20/src/components/Modal/Modal.jsx create mode 100644 day20/src/components/Modal/ModalAlert.jsx create mode 100644 day20/src/components/Modal/ModalPrompt.jsx create mode 100644 day20/src/components/Modal/index.js create mode 100644 day20/src/components/ModalSidebar/ModalSidebar.jsx create mode 100644 day20/src/components/ModalSidebar/index.js create mode 100644 day20/src/components/MultiSelect/MultiSelect.jsx create mode 100644 day20/src/components/MultiSelect/index.js create mode 100644 day20/src/components/MultipleAnnswer/MultipleAnswer.jsx create mode 100644 day20/src/components/MultipleAnswer/index.js create mode 100644 day20/src/components/PaginationBar/PaginationBar.jsx create mode 100644 day20/src/components/PaginationBar/index.js create mode 100644 day20/src/components/PublicHeader/PublicHeader.jsx create mode 100644 day20/src/components/PublicHeader/index.js create mode 100644 day20/src/components/PublicWrapper/PublicWrapper.jsx create mode 100644 day20/src/components/PublicWrapper/index.js create mode 100644 day20/src/components/QrCodeGenerator/QrCodeGenerator.jsx create mode 100644 day20/src/components/QrCodeGenerator/index.js create mode 100644 day20/src/components/QrCodeReader/QrCodeReader.jsx create mode 100644 day20/src/components/QrCodeReader/index.js create mode 100644 day20/src/components/RatingStar/RatingStar.jsx create mode 100644 day20/src/components/RatingStar/index.js create mode 100644 day20/src/components/SessionExpiredModal/SessionExpiredModal.jsx create mode 100644 day20/src/components/SessionExpiredModal/index.js create mode 100644 day20/src/components/Skeleton/Skeleton.jsx create mode 100644 day20/src/components/Skeleton/index.js create mode 100644 day20/src/components/SnackBar/SnackBar.jsx create mode 100644 day20/src/components/SnackBar/index.js create mode 100644 day20/src/components/StripePayments/StripePayments.jsx create mode 100644 day20/src/components/StripePayments/index.js create mode 100644 day20/src/components/TopHeader/TopHeader.jsx create mode 100644 day20/src/components/TopHeader/index.js create mode 100644 day20/src/components/UppyFileUpload/UppyFileUpload.jsx create mode 100644 day20/src/components/UppyFileUpload/index.js create mode 100644 day20/src/components/video/index.js create mode 100644 day20/src/components/video/video.jsx create mode 100644 day20/src/components/video/videoItem.jsx create mode 100644 day20/src/context/Auth/AuthContext.jsx create mode 100644 day20/src/context/Auth/index.js create mode 100644 day20/src/context/Global/GlobalActions.jsx create mode 100644 day20/src/context/Global/GlobalConstants.jsx create mode 100644 day20/src/context/Global/GlobalContext.jsx create mode 100644 day20/src/context/Global/InitialGlobalStates.jsx create mode 100644 day20/src/context/Global/index.js create mode 100644 day20/src/hooks/useProfile/index.js create mode 100644 day20/src/hooks/useProfile/useProfile.jsx create mode 100644 day20/src/index.css create mode 100644 day20/src/index.jsx create mode 100644 day20/src/logo.svg create mode 100644 day20/src/output.css create mode 100644 day20/src/pages/404/NotFoundPage.jsx create mode 100644 day20/src/pages/404/index.js create mode 100644 day20/src/pages/Admin/Add/AddAdminCmsPage.jsx create mode 100644 day20/src/pages/Admin/Add/AddAdminEmailPage.jsx create mode 100644 day20/src/pages/Admin/Add/AddAdminPhotoPage.jsx create mode 100644 day20/src/pages/Admin/Add/AddAdminStripePricePage.jsx create mode 100644 day20/src/pages/Admin/Add/AddAdminUserPage.jsx create mode 100644 day20/src/pages/Admin/Add/AdminAddDepartmentTablePage.jsx create mode 100644 day20/src/pages/Admin/Add/AdminAddItemMovementHistoryTablePage.jsx create mode 100644 day20/src/pages/Admin/Add/AdminAddItemsTablePage.jsx create mode 100644 day20/src/pages/Admin/Add/AdminAddLocationTablePage.jsx create mode 100644 day20/src/pages/Admin/Add/AdminAddUserTablePage.jsx create mode 100644 day20/src/pages/Admin/Auth/AdminForgotPage.jsx create mode 100644 day20/src/pages/Admin/Auth/AdminResetPage.jsx create mode 100644 day20/src/pages/Admin/Auth/CustomAdminLoginPage.jsx create mode 100644 day20/src/pages/Admin/Auth/CustomAdminSignUpPage.jsx create mode 100644 day20/src/pages/Admin/Custom/CustomAdminAdminDashboardPage.jsx create mode 100644 day20/src/pages/Admin/Edit/AdminEditDepartmentTablePage.jsx create mode 100644 day20/src/pages/Admin/Edit/AdminEditItemMovementHistoryTablePage.jsx create mode 100644 day20/src/pages/Admin/Edit/AdminEditItemsTablePage.jsx create mode 100644 day20/src/pages/Admin/Edit/AdminEditLocationTablePage.jsx create mode 100644 day20/src/pages/Admin/Edit/AdminEditUserTablePage.jsx create mode 100644 day20/src/pages/Admin/Edit/EditAdminCmsPage.jsx create mode 100644 day20/src/pages/Admin/Edit/EditAdminEmailPage.jsx create mode 100644 day20/src/pages/Admin/Edit/EditAdminStripePricePage.jsx create mode 100644 day20/src/pages/Admin/Edit/EditAdminUserPage.jsx create mode 100644 day20/src/pages/Admin/List/AdminCmsListPage.jsx create mode 100644 day20/src/pages/Admin/List/AdminEmailListPage.jsx create mode 100644 day20/src/pages/Admin/List/AdminListDepartmentTablePage.jsx create mode 100644 day20/src/pages/Admin/List/AdminListItemMovementHistoryTablePage.jsx create mode 100644 day20/src/pages/Admin/List/AdminListItemsTablePage.jsx create mode 100644 day20/src/pages/Admin/List/AdminListLocationTablePage.jsx create mode 100644 day20/src/pages/Admin/List/AdminListUserTablePage.jsx create mode 100644 day20/src/pages/Admin/List/AdminPhotoListPage.jsx create mode 100644 day20/src/pages/Admin/List/AdminStripeInvoicesListPageV2.jsx create mode 100644 day20/src/pages/Admin/List/AdminStripePricesListPage.jsx create mode 100644 day20/src/pages/Admin/List/AdminStripeSubscriptionsListPage.jsx create mode 100644 day20/src/pages/Admin/List/AdminUserListPage.jsx create mode 100644 day20/src/pages/Admin/View/AdminDashboardPage.jsx create mode 100644 day20/src/pages/Admin/View/AdminViewDepartmentTablePage.jsx create mode 100644 day20/src/pages/Admin/View/AdminViewItemMovementHistoryTablePage.jsx create mode 100644 day20/src/pages/Admin/View/AdminViewItemsTablePage.jsx create mode 100644 day20/src/pages/Admin/View/AdminViewLocationTablePage.jsx create mode 100644 day20/src/pages/Admin/View/AdminViewUserTablePage.jsx create mode 100644 day20/src/pages/Admin/View/CustomAdminProfilePage.jsx create mode 100644 day20/src/pages/MagicLogin/MagicLoginVerifyPage.jsx create mode 100644 day20/src/pages/MagicLogin/UserMagicLoginPage.jsx create mode 100644 day20/src/pages/Member/Auth/CustomMemberLoginPage.jsx create mode 100644 day20/src/pages/Member/Auth/CustomMemberSignUpPage.jsx create mode 100644 day20/src/pages/Member/Auth/MemberForgotPage.jsx create mode 100644 day20/src/pages/Member/Auth/MemberResetPage.jsx create mode 100644 day20/src/pages/Member/View/CustomMemberProfilePage.jsx create mode 100644 day20/src/pages/Member/View/MemberDashboardPage.jsx create mode 100644 day20/src/pages/Public/Auth/CustomPublicLoginPage.jsx create mode 100644 day20/src/pages/Public/Auth/CustomPublicSignUpPage.jsx create mode 100644 day20/src/pages/Public/View/CustomPublicProfilePage.jsx create mode 100644 day20/src/routes/AdminRoutes.jsx create mode 100644 day20/src/routes/LazyLoad.js create mode 100644 day20/src/routes/MemberRoutes.jsx create mode 100644 day20/src/routes/PrivateRoutes.jsx create mode 100644 day20/src/routes/PublicRoutes.jsx create mode 100644 day20/src/routes/Routes.jsx create mode 100644 day20/src/utils/EcomSDK.jsx create mode 100644 day20/src/utils/MkdSDK.jsx create mode 100644 day20/src/utils/TreeSDK.jsx create mode 100644 day20/src/utils/config.jsx create mode 100644 day20/src/utils/metadata.json create mode 100644 day20/src/utils/utils.jsx create mode 100644 day20/tailwind.config.js create mode 100644 day20/vite.config.js diff --git a/day19/models/index.js b/day19/models/index.js index 62cf181..9be9726 100644 --- a/day19/models/index.js +++ b/day19/models/index.js @@ -16,9 +16,9 @@ const { DataTypes } = require("sequelize"); const config = { DB_DATABASE: "mysql", DB_USERNAME: "root", - DB_PASSWORD: "root", + DB_PASSWORD: process.env.DB_PASSWORD || "root", DB_ADAPTER: "mysql", - DB_NAME: "day_1", + DB_NAME: "day_19", DB_HOSTNAME: "localhost", DB_PORT: 3306, }; @@ -26,7 +26,7 @@ const config = { let db = {}; let sequelize = new Sequelize( - config.DB_DATABASE, + config.DB_NAME, config.DB_USERNAME, config.DB_PASSWORD, { @@ -51,8 +51,14 @@ let sequelize = new Sequelize( } ); -// sequelize.sync({ force: true }); -sequelize.sync(); +sequelize + .sync() + .then(() => { + console.log("Database & tables created!"); + }) + .catch((err) => { + console.log(err); + }); fs.readdirSync(__dirname) .filter((file) => { diff --git a/day19/package.json b/day19/package.json index 219c20e..cd71cf0 100644 --- a/day19/package.json +++ b/day19/package.json @@ -3,7 +3,8 @@ "version": "0.0.0", "private": true, "scripts": { - "start": "node ./bin/www" + "start": "node ./bin/www", + "dev": "node --watch --env-file=.env ./bin/www" }, "dependencies": { "cookie-parser": "~1.4.4", diff --git a/day20/.gitignore b/day20/.gitignore new file mode 100644 index 0000000..db0b720 --- /dev/null +++ b/day20/.gitignore @@ -0,0 +1,27 @@ + +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dev-dist + +*.local +release +config.php +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + \ No newline at end of file diff --git a/day20/.prettier b/day20/.prettier new file mode 100644 index 0000000..3fa6037 --- /dev/null +++ b/day20/.prettier @@ -0,0 +1,5 @@ + +{ + "tabWidth": 2, + "useTabs": false +} diff --git a/day20/README.md b/day20/README.md index b0d3525..f6fa2b7 100644 --- a/day20/README.md +++ b/day20/README.md @@ -1,22 +1,23 @@ # Day 20 Read: + - https://www.notion.so/How-to-Use-Baas-00f549dda3a84dc48b352c79222f1a3a - https://www.notion.so/Create-Manage-Projects-With-Wireframe-Tool-df67b882f0c14735a0192d69dc3ff777 - Request for Wireframe tool url from Project Manager. -1. login to Wireframe tool. Create SOW and Wireframe called . +1. login to Wireframe tool. Create SOW and Wireframe called . -2. Navigate to Wireframe side-menu click, Edit > Setting, create a project () from here according to specifications of wireframe document provided (inventory-app.pdf). +2. Navigate to Wireframe side-menu click, Edit > Setting, create a project () from here according to specifications of wireframe document provided (inventory-app.pdf). 3. Create Models. Switch to Models tab or Web/React tab (Manage Models). -4. Create Roles and set Permissions. (Web/React Tab > Manage Permissions). +4. Create Roles and set Permissions. (Web/React Tab > Manage Permissions). 5. Create React portal and marketing pages and then export React. (Web/React Tab). -6. Create Custom APIs and commit. (API tab). API code would be commited to http://23.29.118.76:3000/mkdlabs/.git +6. Create Custom APIs and commit. (API tab). API code would be commited to http://23.29.118.76:3000/mkdlabs/.git 7. Switch to Deployment Tab. Initialize deployment and create repositories. @@ -27,4 +28,3 @@ Read: 10. Clone backend repo on src/backend/custom 11. Write APIs, and test locally. - diff --git a/day20/index.html b/day20/index.html new file mode 100644 index 0000000..a5e0886 --- /dev/null +++ b/day20/index.html @@ -0,0 +1,26 @@ + + + + + + + + inventorylynx + + +
+
+ + + + diff --git a/day20/jsconfig.json b/day20/jsconfig.json new file mode 100644 index 0000000..5033f8d --- /dev/null +++ b/day20/jsconfig.json @@ -0,0 +1,17 @@ + + { + "compilerOptions": { + "jsx": "react", + "baseUrl": ".", + "paths": { + "Components/*": ["src/components/*"], + "Pages/*": ["src/pages/*"], + "Utils/*": ["src/utils/*"], + "Assets/*": ["src/assets/*"], + "Context/*": ["src/context/*"], + "Routes/*": ["src/routes/*"], + "Hooks/*": ["src/hooks/*"], + "Src/*": ["src/*"] + } + } +} diff --git a/day20/package.json b/day20/package.json new file mode 100644 index 0000000..3ad5527 --- /dev/null +++ b/day20/package.json @@ -0,0 +1,179 @@ + +{ + "name": "adminportal", + "private": true, + "version": "0.0.0", + "scripts": { + "dev": "vite", + "tw": "npx tailwindcss -i ./src/index.css -o ./src/output.css --watch", + "build": "vite build", + "commit": "git add . && git commit -m \"Update\" && git pull && git push", + "commit:script": "node git-script add,commit,pull,push message=\"Update | API SECTION RESTRUCTURE IN PROGRESS\" origin=wireframe", + "preview": "vite preview", + "generate-pwa-assets": "pwa-assets-generator --preset minimal public/mkd_logo.png" + }, + "dependencies": { + "@craftjs/core": "^0.2.0-beta.11", + "@editorjs/attaches": "^1.3.0", + "@editorjs/checklist": "^1.5.0", + "@editorjs/code": "^2.8.0", + "@editorjs/delimiter": "^1.3.0", + "@editorjs/editorjs": "^2.26.5", + "@editorjs/embed": "^2.5.3", + "@editorjs/header": "^2.7.0", + "@editorjs/image": "^2.8.1", + "@editorjs/inline-code": "^1.4.0", + "@editorjs/link": "^2.5.0", + "@editorjs/list": "^1.8.0", + "@editorjs/marker": "^1.3.0", + "@editorjs/nested-list": "^1.3.0", + "@editorjs/paragraph": "^2.9.0", + "@editorjs/personality": "^2.0.2", + "@editorjs/quote": "^2.5.0", + "@editorjs/raw": "^2.4.0", + "@editorjs/simple-image": "^1.5.1", + "@editorjs/table": "^2.2.1", + "@editorjs/underline": "^1.1.0", + "@editorjs/warning": "^1.3.0", + "@emotion/cache": "^11.11.0", + "@emotion/react": "^11.11.1", + "@emotion/serialize": "^1.1.2", + "@emotion/utils": "^1.2.1", + "@fontsource/inter": "^5.0.15", + "@fontsource/poppins": "^4.5.10", + "@fontsource/roboto-mono": "^5.0.16", + "@fortawesome/fontawesome-svg-core": "^6.4.0", + "@fortawesome/free-brands-svg-icons": "^6.4.0", + "@fortawesome/free-regular-svg-icons": "^6.4.0", + "@fortawesome/free-solid-svg-icons": "^6.4.0", + "@fortawesome/react-fontawesome": "^0.2.0", + "@fullcalendar/core": "^5.11.3", + "@fullcalendar/daygrid": "^5.11.3", + "@fullcalendar/interaction": "^5.11.3", + "@fullcalendar/list": "^5.11.3", + "@fullcalendar/react": "^5.11.2", + "@fullcalendar/timegrid": "^5.11.3", + "@headlessui/react": "^1.7.14", + "@heroicons/react": "^2.0.18", + "@hookform/resolvers": "^3.1.0", + "@legendapp/state": "^0.23.4", + "@mantine/core": "^6.0.19", + "@mantine/hooks": "^6.0.19", + "@react-google-maps/api": "^2.19.2", + "@react-pdf-viewer/core": "^3.12.0", + "@splidejs/react-splide": "^0.7.12", + "@stripe/react-stripe-js": "^2.1.0", + "@stripe/stripe-js": "^1.52.1", + "@tailwindcss/forms": "^0.5.3", + "@tippyjs/react": "^4.2.6", + "@uppy/audio": "^1.1.1", + "@uppy/aws-s3": "^3.2.1", + "@uppy/aws-s3-multipart": "^3.4.1", + "@uppy/compressor": "^1.0.2", + "@uppy/core": "^3.7.1", + "@uppy/dashboard": "^3.4.1", + "@uppy/drag-drop": "^3.0.2", + "@uppy/drop-target": "^2.0.1", + "@uppy/dropbox": "^3.1.1", + "@uppy/facebook": "^3.1.3", + "@uppy/file-input": "^3.0.3", + "@uppy/golden-retriever": "^3.1.0", + "@uppy/google-drive": "^3.1.1", + "@uppy/image-editor": "^2.1.2", + "@uppy/instagram": "^3.1.3", + "@uppy/onedrive": "^3.1.1", + "@uppy/progress-bar": "^3.0.3", + "@uppy/react": "^3.1.2", + "@uppy/remote-sources": "^1.0.3", + "@uppy/screen-capture": "^3.1.1", + "@uppy/tus": "^3.4.0", + "@uppy/webcam": "^3.3.1", + "@uppy/xhr-upload": "^3.5.0", + "apexcharts": "^3.40.0", + "axios": "^1.5.0", + "bootstrap": "^5.2.3", + "codemirror": "^5.65.11", + "codemirror-console": "^3.0.4", + "codemirror-console-ui": "^3.0.4", + "emoji-picker-textarea": "^1.0.1", + "file-saver": "^2.0.5", + "framer-motion": "^10.16.4", + "fullcalendar": "^5.11.3", + "html-to-image": "^1.11.11", + "jodit-react": "^1.3.39", + "jszip": "^3.10.1", + "moment": "^2.29.4", + "nanoid": "^4.0.2", + "openai": "^4.24.1", + "papaparse": "^5.4.1", + "pdfjs-dist": "^3.4.120", + "pluralize": "^8.0.0", + "pretty-rating-react": "^2.2.0", + "qr-scanner": "^1.4.2", + "qrcode": "^1.5.3", + "react": "^18.2.0", + "react-addons-update": "^15.6.3", + "react-apexcharts": "^1.4.0", + "react-calendar": "^4.2.1", + "react-codemirror2": "^7.2.1", + "react-confirm-alert": "^3.0.6", + "react-contenteditable": "^3.3.7", + "react-dnd": "^10.0.2", + "react-dnd-html5-backend": "^16.0.1", + "react-dom": "^18.2.0", + "react-google-autocomplete": "^2.7.3", + "react-google-maps": "^9.4.5", + "react-hook-form": "^7.46.1", + "react-icons": "^4.11.0", + "react-infinite-scroll-component": "^6.1.0", + "react-input-emoji": "^5.4.1", + "react-loading-skeleton": "^3.3.1", + "react-modal": "^3.16.1", + "react-outside-click-handler": "^1.3.0", + "react-pdf": "^7.6.0", + "react-qr-reader": "^2.2.1", + "react-quill": "^2.0.0", + "react-ratings-declarative": "^3.4.1", + "react-router": "^6.15.0", + "react-router-dom": "^6.11.1", + "react-select": "^5.8.0", + "react-slick": "^0.29.0", + "react-spinners": "^0.13.8", + "react-timeago": "^7.2.0", + "react-toggle": "^4.1.3", + "redux": "^4.2.1", + "slick-carousel": "^1.8.1", + "swiper": "^9.3.1", + "tw-elements": "^1.0.0-beta2", + "twilio-video": "^2.27.0", + "uppy": "^3.20.0", + "use-debounce": "^9.0.4", + "xlsx": "^0.18.5", + "yup": "^1.2.0" + }, + "devDependencies": { + "@editorjs/link-autocomplete": "^0.1.0", + "@editorjs/opensea": "^1.0.2", + "@editorjs/translate-inline": "^1.0.0-rc.0", + "@types/react": "^18.2.6", + "@types/react-dom": "^18.2.4", + "@vite-pwa/assets-generator": "^0.0.8", + "@vitejs/plugin-react": "^4.0.0", + "@vitejs/plugin-react-refresh": "^1.3.6", + "autoprefixer": "^10.4.14", + "eslint": "^8.40.0", + "eslint-config-react-app": "^7.0.1", + "eslint-plugin-react": "^7.32.2", + "eslint-plugin-react-hooks": "^4.6.0", + "husky": "^8.0.3", + "lint-staged": "^13.2.2", + "postcss": "^8.4.23", + "prettier": "^2.8.8", + "prettier-plugin-tailwindcss": "^0.2.8", + "tailwindcss": "^3.3.2", + "vite": "^4.3.5", + "vite-plugin-compression": "^0.5.1", + "vite-plugin-eslint": "^1.8.1", + "vite-plugin-pwa": "^0.16.4" + } +} diff --git a/day20/postcss.config.js b/day20/postcss.config.js new file mode 100644 index 0000000..f231f2f --- /dev/null +++ b/day20/postcss.config.js @@ -0,0 +1,7 @@ + + module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/day20/src/App.css b/day20/src/App.css new file mode 100644 index 0000000..e69de29 diff --git a/day20/src/App.jsx b/day20/src/App.jsx new file mode 100644 index 0000000..29135d0 --- /dev/null +++ b/day20/src/App.jsx @@ -0,0 +1,34 @@ + + import React from "react"; + import {AuthProvider} from "Context/Auth"; + import {GlobalProvider} from "Context/Global"; + import Main from "./routes/Routes"; + import "@uppy/core/dist/style.css"; + import "@uppy/dashboard/dist/style.css"; + import { BrowserRouter as Router } from "react-router-dom"; + import "react-loading-skeleton/dist/skeleton.css"; + import { loadStripe } from "@stripe/stripe-js"; + import { Elements } from "@stripe/react-stripe-js"; + + + const stripePromise = loadStripe("pk_test_51Ll5ukBgOlWo0lDUrBhA2W7EX2MwUH9AR5Y3KQoujf7PTQagZAJylWP1UOFbtH4UwxoufZbInwehQppWAq53kmNC00UIKSmebO"); + + function App() { + return ( + + + + + +
+ + + + + + ); + } + + export default App; + + diff --git a/day20/src/assets/images/index.js b/day20/src/assets/images/index.js new file mode 100644 index 0000000..78772ff --- /dev/null +++ b/day20/src/assets/images/index.js @@ -0,0 +1,3 @@ + +// export { default as LoginBg } from "./login-bg.jpg"; +export { default as LoginBgNew } from "./login-new-bg.png"; diff --git a/day20/src/assets/images/login-new-bg.png b/day20/src/assets/images/login-new-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..5c7cf5b00a491cd66ede48a57853d2dd349163f7 GIT binary patch literal 685293 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

xZJ-;8DBx6uA6EyEyF1hl>7 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

v$|nX8;~)irhXz49Dfg;zUZ6}EV}W=W?$Papo) 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%0AV<$;>SU+~u{k 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

>Yundz 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

6f-co_Xu!zyi#_rpal1tsokl?s0KW za^}GeIW}L{K-1)8sQf+Flk{XvB~8m+i)ZAPZtsi1I%(6^-3HU>X0SZfmByINbKLNg zv+2uRNqTXyU!H&X>HeJd_O@;(UU(E9*yg1TDFf1wAhT|1CZ>HahS#l)M4siDqD7o- zX@q?D6})X3p`qD*+&W}IzC49dzh7!BJQW=pq0z3pt1{Bl$5wYpqB zzvH}M+5VwtZw@jUy!)7qqwJsqFgeO=&-{^BPJ_#)F0Y+`kj=j8zla=q;hC>WK;uP1c+sFuuvXBCSTJms_0NwN$NZky25j4eb27A?KD_&yYwy&K z!Kv>ovh$BJHV@seUZAfY0)sDQJ6G;W;JVfC1&E~S^Y5pM@WDwSNdX&VX!O<>cz(bk z(mBw6W$}K&OI~oNpzt_-!SLjaP3Dl>4z`;x^i$*powWUlr%KX-aM0Hry06}Dw>JE$ zk`C{XU%~B=WH0r0A?qs*PHT$Sz07et^|vsvM0!d73SPX;d@y+N-fQFC>N#CD^wMqw zhF11%UH^%K%ZIp|aQo`nn@Eq>L_3t-qGZy$n?q;w=5jdSR?k=bNf#OuO|v2MZEhZs zCyy>tCFCV!nX3}~9x~c(AKcauM=~_|@?`XzvheOmaJXpnZZhJDUrpt){Myx;B`_#*eYjFS@OwuiocZdkd&A++VfG;CNK+}2d+nq{@|N#kKF2fXZ; zCnMpuUbK5)HpS!3aF&X_n?b=iMSh$jX-}XYA`M$K=El3(#-E%gZZZ;1Tbr{B``0Nt z>xNUi(=&R0&qza``(JQUHh^u9Xlu23?iOv(Do{S zM=HhqoV2UI!sEYc2;QQp-Oe^vukAg}txQvSi->et&FBFd&&{~~rhwiWj$lB@*3HU$ zQ!<{yW!mSS_y&jRW+`=NjYjk@p*yGW6X*B3m1$+jDNOdZ$ZnVT-0*7Y^G0{Vi#Jyj z1b<_`zaApfQgfprhfuuXI6M#{ZSQZqb56p_$y)S+uLp9EcZOR5kJInv{cp5O_%=8a z0kn{~?XsB@ZXUoEkjV*!C-n)NSM>?>=~Z$4;u)X)@q1r|&s&`@?e*r;3|aQR;4%l- z`9d3_FxWf1hWsA9OxvJc&OMY#9&bX)F)sKpMi|_wUkI7@M0-^XzV_)QjB8tGsqe)| zHfWb7wz0h_o_?jDC%h=U9KkUC9=dHx->tlygX{%2K1cXZW#|hsl)m9ar&oi;VDrjC ze!6)cn-`OY?eA1@fELPYzT1$)u!rH(%V9-XNu%C=@YsJyhT z@ziSwd3spo=S`7y@?5(i+vWM~T;xqjbc-bXRVRR#Xr3=;ixW=XYYo4$zmg(^bJb5$ z7M^Ik$zV6-!;7=hZTT5tF7ak7wru% z>p1JwEi%{Z=4*=BQ+W+94iu+$8MkO_?%YX7!9kuQPpK{jTeOy8XOG_lnbBcz+ShU% zpa*wyy%;hFoQIq7^2?b2Mxm|Jd3id6wG9se1FO5;v>P(%I14bycTp6iH^zVsX%jej z#|hCJGk793xQ%!^Cx+0TgtrBX1M>{h&=>0seFJT>dDCJuOTdJnwRw=q?s<;Sov?m@ z(C>Pteikh}vnh+*t^;zEnNBFeoD|&&%UutB=kpo+sc*`I2UwULX2!)LOnUm@zUOAW z%?0Y_atXtH=sCjp_#(ss7D@U7ANt}I^Su|f4U{)^CJ!{=RcgS4GZxGV#u!Vu`#g10 zZ!R>sR(OtaFvc6L^^4Dj4jhK&_og&wY)I-qNWr9yYtA{wu`QZ2Hq2FEWu%`Q_<{ub zk@ch?VQ&DC^9~`=b!I;{*k}bksW&fYna}v1!-2!<2fif1!0Xj>3!XIZ*2o$}f`lXKACqbJ}^4y|wD zY{s;u39$cEE(rCzPR#)5G3`tYMkoBml1EkFugsOdnN63zjA%$(1HhDw%M{!yR@p|G;g>AAbB(QDR>GRacLWT zkvwe$+Ey?90jYeZOxkB!W&3jfqz%CB%gc6%SQ`+XFwgtG6xzyMoOhD0C!WcDY=hS@ zrx){QUzMAzSNwz)b8B(|3`kY;zoBoSAo1 zm-)gnYDQwr_>fwLXQkgVXwC9&Lki{*N5cH15TkH8^?5G;C$3#h_VCxAHR|37=(donOsiym^X!%?nM) zaC>i~4|RX>N@y1vrUiy_Up=GkRnx+bv81GBG4nnR(%TFHmdk=}G<~7_w9&V*8mF9I zCr^@g`GDufi-*n48r?h;zaV*(4J_&4P%HN>v3a-MLM@wRGIKN9_yBTjsprMh5JBdr zAz}&o<2G&l(bmJ0CGf<9hUxspntbx~!3dCH>1~aHe_E(nmPr^>8>dr###ZmIg!;Y0 zb1~CLyyUkwOz&4Oq8FatF2?u@drIf~q?*c{i1e3tUvfvD`1L2Abs6f{auDLlj@Q>~ zx)jr9@UqsnJmM|yCb{nHwP}3uG&7vL5_)cBoze~%$rGo&Gm&0q=8tWSciUPt*iZO` z`h4(m|6k_Ke?`PmMkZ|SXrIqm;Sj(Wzl06HrjlUnk|+LUxo@GBeWL4j&%o5X8Ji4; z%x<2h;B`Jt--zs_j!ct)GB|TRpVDe%yWQVRNwn?F90INIuyaL53t(7oq4Y1FzC53E zk0_&zHf{1KPDn|se1zao{3;lkbqu%d`sQsxt@ssEaV`w_ydcj*8`}QKzH^IiGML*a&wsk-B~Zq`j7_dD{`@vi z+gfvyLo)3p=K<0sy+%tW{aXs2t(`ZxZ0`rJWxPbVB``Y7&rQ$snos}hnd$eA`o4M7 zzJUE1W78K}4seVm`u%h#&HQ1hl?Ld_Vl32k99Mmtm+nd>+)^`1g~2lfO8czN0CJ2YktUxcL0sX6exbKhE+ z5gw5M+Q2WlNTuhn4>=eh=v#w5MnQURWdBK*VIZ&~jN4G*dB-7>(8ZIdp}p$DDT=YWGt=7ei= z0{&@&074{X4(x^OIg)F&Jylx0L@^AYH$OLe-8{nW5rpvVep;xo@X5P`VKvbICiHmh z`5nPKv3WM(aRE)5H(&CY%d)35<$>vY3-O~LZU4&%9^OrUg%Ai@NWIa#-*OyLc<|jn#07?ax549>JZ&QZ^TuhU+=jLm zW`qE_)&c3QQt<}NQ-mSY#*~k?Fjp?zq3!nmx3cMkdB@%)csyB7a^0IOVES&U*8D7c zwxfoO{F{A@vQD{ENz-N|PoMZE(+>@rho_a{14oGsa;@JYv2I?h_IS_Fb02L$E_4~W z_9H7~3Xp;4k)sGXkWmMpgQ=4@&1*X$gN7PV*ay!n30CHi%MvU7kFPL`2tNCGeUa{pqF+#*fwm6heu=4ls^ ze60@pgM&~5_fBkkGidu7XOU4pJ4y~%`H9oGv4cNlNp)2_O2w=U~6C2ncq<# zDgIufI#LF9+ctP!0oF6iUGD$THNCUvSt47r4b3wZLJ#y9s^)_k8i zk&Cu++_$M8@8*+|bOUEBkNLD?^FkkZJghft?aVYFIA0)38_+k;>V|2@KE--u-nQ;< z&}8*N+iRgaZD^@C=tJA%2B{PIPae=O7J&p_47VJb#;e68t-?R`76O?EY-`tM;YV=H z!{is-ye66l*@m0N1$u4PveS6C?_Tmff3e5|x9^L0XS4D)4^02QT^yCXHGgN?5OA_m z^BwKT{97m9&o)4d=DF}nr|mg=4Q5}Ui!Xfo0z$p;LcYD9o*)<@e)R&9fob>Z0g^e7 z$>B$;3KUh&m&`Ma?Q316nfMyAJHVp=@1&os--9h$q~(VGip}%$hRi#@T~1?~pXSSE zk@b5UzKrGX;o+Jd7@If0Y2yA3=;O(g`vs2JNw9`Y9}(7C{>66Ln%ma;v(>e|o7nd0 zpLn-ASMeb8LT*UDxz&BTA0w4aZd-;d4qEQbG{|mw^3#L(3x3s0tzu9-@Msw9?@Hy$O%f6#S3od3M=t4#J%M>Z;^lY*x%aFyxOw= zZC|Foyzq$d;h{_0uV3bSBG;3b{MNr$#8!(IIIXKriPOCG+w+6Q3$JqIDPjo6jphvF z5OarwpXMWSjnkiP7s7E)pK+MKQSh9w_4!Mr>dWV+@7g-CMJnM0lj(VgTzHLo_|xH{ z#TPg_#bs~_+)E_0>r5IjS6_H?+gJazTz1I%a;iV+k#*c6f9BujG}Uwx4K30fW716y zX?Q))(6>B0jr`RNiQ8I}IuZKr{KMPY_OFMF?P%j^ep{x^DA%pO8-Aicc;Q>q;j8Wp zyxgIZOK7Ao)5%mp*#xB==BR^yIV_+|v zT)e0UK`=r7o1`O?zcHvSuNL&uv%|l)e8;J9Og?IPi_(J4=I7^t6`gKRE~cCEd2m|r znb`cK3}})Ulo;6t7U^aI9y)oRZXOE`Q}VSp|5w|)Xv>xx$F(Faspaec|5VE|*<@d34^DY16bYc}9L5-A zpIx;I3y%bl$VVWN-fS=C{QKnjOl~nelOA&vYa+)Pw-%w|a@)IzvP!fyZ2E+;U@d|c zrEPRuJCl!lJB;!9ugbvKA`CXP2w!uHu^v$u;Ao{ma8+b2uUuD#c zGe1yz2cF};#LaTc7@qo%GI*w~W2f~u`v`tN{^#i4j8sH_H87qs$9cDnil!FG@-m8* zeJMF)6HwJyPT6y}`#ZLX8B;F|=J(ux(V{*LNA0!f;a|($9tqZBXE$I-cR8>3jga-? zC>_`D1)dY1I@WvvS)yh20S@CCy+=Fvee$MFyCDo&Ig> zZD!9jFwc}&3-V8OIGaONG{rp7HhG86JgsXMeCW9D&Mn+6C zH6U|ggB=f+GiVbsE5=~WHpotKo!M`l`9%M=EI{@}>Tfu^?6htTwy|=5Se~7khdmG-n1KcBF?1b-#oRy8HpXi zpHWgT5hb)Mqd;G|NC5{8D;2H2?pu$?OC+D$%A)&Clxf0sIz@MRO})*}7w@h6=awy! z^~w~QN8f@H+4fCvxR+gpH7@gXR{@`#kOXjBE8yL@uE8dbdHm*-Q- zh+*fnXSRLgn=H+SQ|9c3m$6As?95ys6X)CdxDKaC^eu{fJD>X8Fc|rn_prx)n!&u) zv)Ko>-wjynvoD-6@xqOtdVbFL+kFnsbUL;52A@k`f9F0UbIfCvwvm?%N6wA6OfW~; z=f#cfxq4|Hp~N*(Yhxv z2|!MU<`v3_7>p6E?ytt@0bYO>rD8Zr8?Vi6qe1|i7bUr<2hE^Nm%td3cD#+WN5Z8iR~TbTl^Odow%$|E^6`r)5kX;C3brxhYlla<_4${wP!f zZZpq!n-`MjvK&up^U1Y$0(+@Q;ik?FxhNwCrvsUdl>>Ot_+3U^rFYL`K^apIJcq8^ zsUGl28yNbMXRmRGWn|G{GnDziZmYS`jeH-nvqjrdC(tgy1IfP+SUcuj=0?2%X9s2H zyFGsSo%`!w%f+g$Gtn0Y^BwsbDu&()7p}eAbzKB zPUpWP&%a-~5YdlY1pJMY9l6RrncoqG*Ej%kpRxfi%cJh8xO!dmen0I>K6dJKiXwkC zh9vhR>C`dcHN8cx+USyX<5E&1%OLV3^($v23|dr?-wzzY;&%*~ zZ#f3e5aRbu2W#Ux?M??WKoP}}>#+DF{ z*SS7@lG#Y7Osob{@e`Rj19-M^Mi1yKvObNBN^4_=kr}uQBAK&|mYs}{yE$0$-HxD7 zzRCvQy^!Tiy@=ALU()dIbqJk+I-m4+ziZY@_gO}`CW!pT8PL{eV2VCRu+wIK+b*hg z{miqPk?RR(6c6Ac$EcNa4Bk_orEUXg0)eAo(QjyD-YGLW3Q@0?h18{U+y||WTjXrY z=&!nC1lggy>E~>tk^H3%EwVe29PPZzbxrwfYmL_lc(q%GfrEgy;Iy3g9@mj+-ZlS* zo89|Nf~?KFA0acM4CIz~oid$Vw*dxY;Eas{8CR#V8%(?Hgm6Dho40i%Bf;sLww|{7 zW?4-q$3DRCc^`8)VI9Ej8?>nWyl0BGc+57(CVGdB)&nyBXse^n$$ZXi(_G__CDv7b z@A9T!83SiY0_Y+Q>bPZ~H5~%yIKSKWF8|(rW@jegoP?41#o$VCp5>qcO33LiXQn1H zQ;z!MK=dnfC4t}a0GIe`4WM7${=7~5jET7s`bIh3(s3_c-OYM zn>&p5zGe!%M*AhEuakE$`w`lRc?U{y%FVW)*~sd#;Bb!uncT)(2Go2vbz%N)vXamF z_q>NXW%O{X@6W=7B-{v?8CV8COVG@ zKkrT39*7gO^;?TdO<8q+x$eAoo0s2Y1cA0bWrXX<(Jd1*vurV_-s<*=jHJGtAjA6A zVSCFs$UO^(=sf$WQ}_h>0ICMJq3zi(`%v3&U*^*ZjHSoSx*LC+3McW`;Nab!NrU|D zJ{#*yr;G8nEP@w((U~luaSfX??uJ|gnvCZ=J~{Jxe&3?x8@9E>{LovUXFYvSMn8SX^qR;QV~)yxYYxEYT*AQU75b+ zzil$wgHGzi>A=FI$8$Z{4yZ;mT6~kTG-w-4Q zjE=i)OzyY*Zc9xv8m-T54Qq0WoZMvcMZxoCa>6I_e>0-L!0mRVBI~is+s4>N@@6on zAN{VZXZu~&vGsHI*Qx(b2VA0fZ+)L~(hgumK)xc49T?>|#bislYl_gRUte%br)_hM zKHB8vv}b%`BxijlT@6mv+gjHyzT!~p^!OijOuL`*oi;#Z6zZuw*0PZ=(?EQCSj)ZP zll8~&Sm*xg`rVv-H*EFuJ5DrDFSt4Qkk6O3_8aHj>7e$~4tN9oTt-%XVzfQUMAL6m zSAq5<55=F#ZR)1z?E@k^Kat%$*ngteG<@rjY5UtoAu@nw&ARQUMtwUnKiR8JWe(Dz z2*30OqG4Nvc|%KwAK=i<==s}4RU6v8&GI&90)6nQLAqt6oQ#2=l=m7ymcJ#!cQY(( zZTx0!zd7%4NOLLLtOd=1c+wY7FvVu0lKiwyc>!1kd|`v3Yz#+fu-zO=w{sxxZ-$@~ zUe+<_%1rI?m%rapGx%m*`4NY9d*@B&)9`=$4db{`T^XKFetzVZsBm;S=Gu#s9puI1 zhJzH1oBX;zUV_?Q=_+0R3(viQtuJkrpCIMxo3+Wf(Exp`k9%&Cq2sgFjK?=)ve^%t zG5JIRdvYG%U|IO%e>CpDb2e8|E+R*Lq;rSblWK^DRJxXjc4Zt zpG4W5B6l~KS2U>r@|i&@4>@i(W$=?|Ps`}mZ|!}gel-sAwrQRsjh#*5vG`U|X_4a` zj$7ND(slAUpU^zQ81qk=4hBX^QmEQt$L})dGHw1Oaf4?K(g4o;e{`M2_+sUsEQH*X+q-VjJIGSo<9*o9)ITHpI{86I zF{l4tltarp3hE}Kxn6j@UX?bdQP07*t$kV6r;g=Qbm}JCubkNCJ?A%VpKbfxC&tQc z?{0^^hEL`&oaPuvP7yp?8@8zYDQ9c5qf7=l2A0ErL?+h@r{y5~<3<0u87Q*M=KTId z$MWy(1l;=V<`CQVi_`w~>d4J9T4dG68$2NMuVsb}8h7G$Uxjfqbn^X6Mqie--TQFj zQ{R5;H3*n5v(+u-;C2YkDAC)w>eP40de+fdG0@r&xz_@jxRi_FtK0l?#zSJuaC<#} zw|RBqMc$ri?|b3;ZqBhE#m0C3vi6#9)pcYYvJHVuv(#%p(cf zk5fn50so~rJagW*_Cfeh`#v$CbFtjiDLJ@Zj=5d4PB$ep*M8#@9}2e$K%(f%Ac9c>ktgFb=uiCg%5c&TuH6&vLHk zVSO;|-Npj`?tzUI0QqCSZ~#qATip)mc95%4!snTdatN5m7y~5lvr)lvmNJMj!2OZ^ zH1&g`gZIt33COalewI#SoaIkkDl$89l%0By*24Xn%N`fUC11nZmW zV9IqO`=dD(;R&Q~w?h?eYP{*EciiCLPkkNiGDuEIGBjNe>l8CCjgQ$5fdRbv1Mi`} z4jA6cT>+P z=XPP2qhB|ejt3y`+c^SEUFTV^z4@*jH~3(UcHTEH{vg*l9OGo!fm@vc<@ufy+GOyz zqqqm=^94kB8)SNBo2&KkrrSr|=W!^LggXekM}@UQ)(r+&Y?Rhr$fL3;%VMh+; zx7^c{Z6PSu@LAzo`&dSEO=7;A`HK8keqxVQ+67>(Q&}bi`@p(7ohoKgdGjnQVj z=n1H35-5vl`0zs2+Stkh%?mz#%ff}c;IU$nPL4yP87*I;tv9?JWZlNxaBSRa-`mlZ z(G2vDqk9G@d{eIb5WeDU&#!T@&UQi0$&22MkE{(wu8EEUnlh-{#ye<5_J1BOYT4w9 zdQz`#jka;hDW3*W92{5%$Xm*;(~z@o>3`Nw{-(^l)Zvo|T&QIll9I{wqMvhbwX7g- zZ6lv|rXt|aa!tzqa$nm3P9}^&zY#$K@?h_|m1*QIC;OGCYL5eJt}puVT41@SzS)-; z1;FMEFz6@mwN8J|HTERmIX82y+}6eH{}-h**QyqMK>zY=bGq_et~c|WbRHx&XPS*? ziHyFP@gNh3@uply9P!_llI;HTd;d?lK#Ovj5A+$|B}L1CXScm64KS2rJrUHU z5&j+XEoC_8m&eR&6`#-VF^thBqFXcIz|QiN(~|)y*Y@pM>sy07(83D|=e;Qa2GhrO z^4<)ZNlnMQk+qw{m3k3*kK+X6TE5@?&)#;@Wie>|DD`18xbQc+`+$gE8<4a9z7(qI z`UC4x*#}tI#I2R4F1tzhJSX8mIevT>c5qh8zGUeoAoaKHzbeh!+^E&JF` zSR&f}ZfD*OaE=dJMvb!=K%+dMzJJqYa}E?pXH|kbp|&&Z_CCXxJZ^zwhWEG@064#4 zoIIatm**egIplZx%2~+-l8|XPu#^54e3bhh*UzP9AjNy_BFczPGG4qy8ZKg3ld=kDR5GqK)OvuF%lh@3PsKw|Qh)*yg>< zyiwSsLEq(D4pVMfpAuxDx@^j9vXOnU>F%$Q)$NWZfG*J1_yqm;`)=a2e*bM=MT5c1 z!zUfnIs)a}3X~6Z=4gJAIfldw^LfUwy3MCvErC2!O=q-N@|qqZEu zgCal_8+B_@=q}e6BsFZtsvk|CA@a`Lz=IZf0H9MCIKtTVBJzN8Y`i^j_!^XXTKt`| z&U=xYOyjf%`WBH$JE%AFpl$fn&khG0)21HoGhmr*@@pEJiJtbmA*Tlz%;06`U3h(g z6@gSzq3!VDw!!Tv@VMrIx<$SW*tlIsFOm(L0RX<$K{~`N=Z$;T?<4&*(_3ka zpUa5Cgb!<=8QVFK;q4u?3=!aZWON-enZM^Z^tBIc4b;u!wopYjH=vkvaMk+h7CJNbi@*GLi)b_KV3~S2QXTjlLOWmJ^}-y$AomXIo805j#xa3DMC!O{ zArpCz(a0EqSYR{$&?f{S0n?Wmrdv$3b&@(6vmV({&iA=5`;2JkmD`gJ)#f12pfH}< zvSZr*o9EZ8Cq^;r2s6&SYg^A+KYCsm$c*U(0sPP-pBcb_(JP%8rXt+re{)K)m)a?d zp?m7$IqV<|>Oi|UZhY?5u&!XBpH9C!TZOZv_YnHb@7UHfo^$57`{ERcHQ%2c3^||d z9HUKB=XQsP<;3!FTAODa@_Pr(<=J!FYcunCfV||oVKlo!gCpr%6!Rd@rg>)o$SnCb zk6yAH0PnHRa&tDHz`8o1Uu};}{ka7uoEQueIW}oKYI9_x2CMC%pg|r+tVB7TlL2t! ztb7oikY!;+aN}}8CZ*-Hp;M2H;H6%hf-%oH?b&ETyLFnqenb`i(?9i#=0HY<4d|zg zmNjw%_W`3VW=GAMQQZ7)M`-#&tAXhzX6%@g z&A^g<(^6j(jgvMp?T6N2`oRYdm$OB8VrX>z+^4tAB$eu{+X)$6!Q5+gMc$naGS8*= z)`qfyz3~QR5H){uFl8!HMvXFu{_uxC{5P3ooEv4!1`gl!QInNvo6}IIFB%mFb<8M9 zuqo{}h$WgK#gsY!{P#olZ%&g%t6PT41ori@6bL zmyI~{8Eet>1^kQD!=T>NK2orK_}H?MFbFx?oPZ6C0krEB0SVgrJYXHBK8BrbMvkG! zh1lA=ECjZKG*`W5?%*pP9{~))SJ&dzi4-!i>7WE zkLG!wjc=KV(|6Xpz&2idjv>!;;$+;)K!ZWbww+pojjH2+T`mQuT`tSIiQn4-d@$M| zH(L-GXy+q4a+@9q4UnBtrb$4aGy2i}aHHn|>><>H-(kSaRDUvF|G#qIj5Fh07P!d` z>oMifzRVl~Wch9ZA{d^rEoIgufES$ppwHO*5_aND-I6kuz>^HVX>B$S;0o1G{P z@R^a^kO5$zQEDOgTff^;b2^K^?4R4Zik{Dz&-HR$roBEVI%Au2esk(&0FiBbgXWl~ zoYs%OpA#wQWZc7Jmi%E}I4CC@n~QO#+qlAbbT&oELT6+0fGB|hhP%W(!@^|`OyahX zJ0jCutf!68i?;{W3+YMe&ZzS=$mQgQ0DNHMaBhC)2J-uz`sye+r@s1~94aU)1v5cJ zj#Cs}o+pmIN893<27^rB&Png+6{iz!iX}!G%L}CShBvd!BtYh}Khgv5=-7-{rk)#e z!En7AP;gz(B;ik`f`jWk?}KN`?=3wgadI>uFS+P#a38_Pmu+EPGqUVYqIV2mX5dur zHV!_}54Ls35!g}z zlaKAhbv&?aoDO6}3QYMZ+~$zWa!-oIHm1sf8`2)&1djCAV{~`N@Tep^JYH$nvnWE%(VSV+Ditz$s~@ z%L5zL`5THb`j056hJXM21wWp9o7}boj1SHyBmT`vmG9vomQnr#<}*%|E#)3KTFnNe zlxL7e1J9vG=f!XA(7~W*<9Hg22dQ`FzcV9)EDbwze3wLXK(gnj-sHAqWD}V@P}lgk zjTWJ;#krn)Ew*u~$-mdp%n);(TgDa+5mHV4n~bd4kp1qpvH^p6uElK+&8Y8`VYrWJ zPeW#V4hUMYytdS3-rwlVwur5^H*aT(rklMO{ae7$pzUuNTr$YNUk$n^hj!Bmn-Mwn zZ~BfiD&u9RQmel+Ax?FKf@Q1E8Wk4$$rhyLtRI6672vb+4Xs@R%i&8P(CvK=K4{+! zy#C}qbIPi7U7Lf##+l|w_1uK-+w;YA46Pn>K59|hWOEMK|J|M~69R7j0a5S{4B|US z)V~`4r+qDx!~HSuPaQS)2>#w2VQs9rz}JR$ko{+U&*!)djKs#%DBcp&N38vup?U*U zoU{WS&2uC5F!w=Hb5hQr$&@L09JnxGJ@7utf5|vH%}4J|gQPxj-CIA7ygP_Boe7LB z&Yf-j@S4@=&o5_g(N`y6Y=yeF1puAS-RYq4y)3|vX5jg_Id8mgq+@~e zK6SG!O}~&;k-u~B*!+*Nq8w)D5mcYl zgD4t|RogQx_yeAG6iq`$sC)uAk8btnxf}4dr8mnSD*l~)!C1V$>oj(!ex{xn05@9-7u5=WHf%A8-t8W{B&MsB;hCT9-N~5H+WvT z{#(DC-m%TWR@NxA2S*7^*&{d6tGSU2tPT?o|i zw2rklTMqm^5tygFhp}jf##WCuPWjwzEjyt_^S;d8ZT_Ebh^MZ}CH;ae%Kzp0o4z=J z5BTLBr@dj5O(MOBKBE0Rf0OB38;}7Gj!8#$svBssKI1uka-!bC*=HJtPxWuF2R9k? z_Z+ysbwIZ@rS%ifK^69@8~FZ&0rypG>-vlz4mh&P{Qg&*<_qh&WvcbL571kCU)S-M z`I}|APX6w7y<;AHdLA)uvN(NtqvJ`u?qA5jsjV2i+WdUc5rF%Y`XO`fd$0SsUbtPa z@6Iu2UO?}{d(h`z*7AmL&ZYiclR3BXB;TybuR06;*w#_9B%4fR9dpegkj(vO`p9qk z^=AU39(v^Ke%NH~b&c5es@eCT@SJ{}=l-WIKPC(5mhHFA6@vh8K#;$A*2-&g%baOz zub-!nUgqL<_Hb~Pvys#J{G(_1ExTfH+xs@VMXNV~hd)!^{f_NykZ9`#WALLk+yvvF z{RmAIMtpxy-Koo;NXv9&2!@8u({41+Rtvk%4m0=5RM@w(nx{13i!@MVTnB{rq&Vh6 zn>%9f&uCs)XK?U4*SAIWIa>$H55QW>+UK<;qc1t&<@jw*Rm((Dp|tij zdI?~~7HpTbSXNugx8e2r#L4VFPOj;MQ~C0@fHwL99Y34g^sGU-PC5eBbu(U-Ga^tp z*!XwI6_MbUu`OFHQ^WK7tzI1P298>BM8m)lxUOfrlfl@=?Zj0Ga-F*!BC;LEybI%V z)A-ucJ}2O#_dM`^u~vWNa8vxNo@t^vN#6r8f8jqGFkZuULOb=KE_@!7_dzQtjZ?@2lI_#|?l z!Eouh(=y_5j8T8%BdXpZbNVD_a|H$ZST>Y0jgYK9Tf&hO^;uq&IorGI!jj zZO_lKHTUzDp<}wDq%w5hZuC@$q^VtBj-WSW4>J+036Yb2N~o+H`6LG%=q9#J3XN>#y7686X4KI z;eSyMbFn}f%*ln)JHTj_XhA|0!{`AUk23-=Ju+#ezYey%eBFJQ+ird0S6YR>JM;AI1Px;M_zMWTAHRe7V4Jm z#`u|^J31^4_D#|B8ZqA^zowPoGLrTl;5jhZl=VDl@b8nu<^=CApvh7*y3z(yKRA_| z=&ixF=gqsk;kI^9zas0YT;xSy17AegXcF>o8>dX6%ATTn`G1Gbz7=nFp zP6ubEC#GVY>3NO%0t1@Yt!e9@bwhc+n*+V!?>~+5W!-E0=zx8We<%05IogPb-}bg# z8?qi#hoqk}SPwEibiiIhmO#o8&fC`bC5(fIJ9q+J$Web zo|Krm_Rp6KhIlU1z5N~kP5#5=HQgvi(1%85EN4wl@-i9&*|Whb<=xztrwH73_}dOx z)XQr|>g@w_+gfj9KZT-WfI*eNTVLD^8T7*-$8%u403%D26Zmx#+k62{KW3g~#I@&N zrp*I8`(8#jV?1`ZIQz1tj3xpp5D2)4mg znKtsLW5c=@*o+e`C4GR73T;x#7ZhZJq>FGW{6_JZI(^cgZS5a$c5k4b+lBSqKj3$s zoRwaGsW0Q7?IO~dx|ze;&m|g_QeN2mf8wGu-nZ4??Z`dEK}w$hx{?e&@K_Kiz#8j) zaOE<2+s_lc7pg2%W%~P^%gsJTo#;pF zh^DJ+?{3+mNl9WP?P>#kZ>O8}CjZv!dj=GGuKza*4h*fiAZ&CF9G+A8c}WczWEg)- zUAU#G7#M@vcT*?0vu>$d^Q=?V5)NmlJufMOnSRjtm9l+PXS}ro6s%k7S%$_to%y6( z+)@)hP1^$)2J!T>iL_^KuuN=Y$#^sh5~w#`Xf>SPyp30@yZaf1%?n1RBQ%-LNOeE+ zX?hAY0;l#;=82Bs1lQ?r59vzz9^QehQbx8l|4u{Asjl$PkqPlC&(w)Aar!LsH{-)x zO-uf9^uBN4-`@7Pg!`BXclfn) zP0l*P`Fo07InC`Y74ro|&^cJZ@|=I0Qh~Lny^GIra7^S*>kFLxO;+G%Y~@={UiOvS zdj2DG_!GR;736wpnuLu)=M|YE-}>Ow6zw1FSjxV+(5d7A<@BN6W@Y z`02Tl`I^6P>lM#Z-|X*KysX>XdTFYib|x^Avc%Z*GXjHdG^GRt-Oj%GyW86MqBoj5 z+2x(|q!YCn#&w^~K55IR`^h$LH$Bg~_b0fOYxvHdZ_DBt{%d`B0JY+F7IZXqn(cUz;JIeemxN}TL6!28X%fBEm**le=x{(Rlf$Ek-bwqTNM+mugTKb2pD zK4I*CH$dN%3k%9=f?D8`!?a=Ra5^9bwF%kD*wWC1_XHwvP=uLye$VScf_A+sxh%BF zMML`E911_>bIyayAQk;w;Jslx5{I-tkE16qpPv?oX2iSoho9XRTsFCHcqoAv2Nax) zD!G-pDdd#>$>wq^vn}i%v&PY9q+Dj(PRd0_RN~Ft6d@}Oo@2N6(qE^|%j?-U&Jqr% zL|48V)LP_cLp#XuS#lE27x0{& zg?{*idlV4G?q_rDwA^pp{-1#QdaWj{I~^-GNAaiQ{Ms+c8=o@W*7^;(Uw*=gPdYxv ztTz8VFHd}I33G?HayQ2y^?5aXwY_8B>Bv}Lcw`yInAplA$^`jDR<`wbTbrPP*rItc zHf#X~jp}W%IaL!mKCimn%bJ<=NuL}B0rK(NiB7)j=28PbY^F z;0!dsH7C34__7b>x?r8_hL=E%6HdCf`y|hyO|DLD-R5YvecD6Dt$+90_H8|UHSo|M ze*V*aYiVJ@Yf>ehc*b*1(V4{Y96zZ$|OcIlajd zzj>|O_FOv92N}o$wa^PvHvW;$>22=Y@!RwQGSQpOgx{a!$Q6OeY;_-KK1+CswN?6k|99iUywjZFC%K;g+j`J--L7%0za z9Huo$xP7$QK!B5D&@>;EPim^+G@<0hV)1kt8~i@n3U^g|w((Fxlj3xSK}(_W;&_`K_f$5+QvIz zlO$qe{@d1|OnI9A!L#Z%PI+DzTvqZEHMF^#vgUVf*o;z%%pkFRB#lmP>fRVnKn|Mm zr_D1*a83QPof|~}^5^Jc%5%zfrlaN>(cWSDBLJV9rEf#qhKM{S+VXFc9iPtSK`fc-evLHfaSG}of6uMLqnD+eQoUN_nvYW}eo*iqTi zGqYUkmog0>8|@|it&Mx`m)YN@FPSU7vk#y=P## zrV+9n<5vE={M-{$t)JPC-w+bI^Err!Je$%e+Z6>W>Duld;XQa5h#t ziQHCbiJI=joFrgwJDXVdGmz^hM?QlO+#jZHqul1W8MG|(yc4Fae;eQz$8qs$45K~- zm~6ltr8X28S`7Gc`nxCKXEPTaA z^YG^H23|->8FhM_7xGN)0N(8A0}e$PBEV+gNbmD@3Bw=$@ZWii9MzqR-f2VF(yU#k zkp@IxLIN;cXL&v_0md}n#RYd8yrCHM3!Yz;4;%R1pKx*lbGbIWtZ^K8GgWk3Ys~$| zvrReM45%2GvrZ_e7>mu@G{|)cgJ|QbPH>2@V&(d89E)jW$v&~;FE4wdOd^o7?uOTu zjGh3wS1_lYiiV<}4w6BWzvgt=oF%Lg?XWcaG2E60eM0mW83(}Y!t@bQ0P{bLk}k8Q z%_ov;(DnC!4HTDc?MV*)1V$$gjqr50J^6MQ#DFZIQ&tA`-ki0hw!uRHV_0r+_VRDW!aTeAuBkJ73$nw(hD;P9!~GjaH+x^lc%St+ku;MqQzMc%r+jrYt2<&D4e*Q-1%r(pBfVN*Z zqm+Xe$ebkds@;u|n0IonX$E(K4syPq>NX%Mk$1p(yur?GexK(9GF%5~)NMxp7lV}d z%69hzdOMEYG=QHnoviO~K~Dq5-m;r#?siVY*v#5Dz_|8_(`i7zVytxC2JAQRpXNNX zPM-CJiY^15^0%ArOHkRAd7?L={s#MFMrt;l+@E=0+TdWCW+OpXHY1H4y(z!WCbt8y z%{{U|KpJ_t{EYeIJ~2Lx(1cFLaNwcq$2wweXrIsL-`O@t`zJhBtQGWgdp_lkJ%Ft3 zm$kxs@5zAaAV_%o2h&&PE#@;L1Has!q)nslt&U_E^FFwBc_!t*tzp)Wp>G1IW7x6j zI{j_AQ-pRV&oQ(wgSH-EupQ9H=<=r5abKlOo}!@1t|L1;;W`n_2Pl)M?-RV&v#!}z z<^LvH+0D@HEa?Fp-u_Lao8rC9&nYK$HZrTY(_pKk`=_0yrX1^ZZQuG+;}#lN(5CQ{ zq1y1F$qE1waBTLC1lx=Cz}_1oZZeYA=E%O95rT47BoGZ~CDf^gP*lzc<$TH@`a>@g0TNj8*L-i2N<>1IR1RA&)1|ap+)^vay8v zw~GJ_#)o#Fs0c{UI4R7?GqOQy$9BMXBp&r^Ym*mFN3mpCl!Kx|nN3M`e`Bc5sLzqF zj0y(Me6Spn&ID%e-J*b8Z;Y(o@LTHtAe9>G_+KstP~UF`4-84K(XPNUN2+}~I-B>u z)t$QLx;uUAo2GLd;1qAL+&JCJ#wa3AvOd$EOzi?Gf1XEHTsLL;v~FdJYJ;7f&OV{+ zyohK1z8!QO^}zhieG{2vjcbm+lz-#J*hdr%o_Ik2ID&&Vwy0qrK0c-Gxz%kjGLRR1 zrR?*pqv21{%^33rD7=nP-kcIR{*bqM))6Kc%BIel?rd;SxBN{VvR&I8heBcC^^3ZA z4pMKTHgAzGxrXw*>q2{SezJ}`LYckOIuGB$%MLt`amw(S$J6t{Y0zYZS%=~9Yg!c0 z4!6A9^_lVC4nG_?((!T&Mre*0BMpbFHR(J*8Rl;3wdNJg3v#k7)~YQ^(GilF`9Z(n ztaF_(8l?O?Xk>nq^b3^hAd+;Ngc@-^v!!( z_8!LO#P<0K7)>x%ddz)EUvm}>ZceW)(~jRd$Ot&&FIgq(#Bb*zj)* zS`F#Mn}53=tQEZ5PAq2$wev2&|Kq}&+ratLa9`N5o^4`$+kItFRpk4rTXR4rJ%igv zKo4~$^BjFMZ7t5yZ2LL9yr+OF>csCYV{Lt8Ps-otZ^1lohy1`!NsyW8%}@-o-*5&_ zAI&=Leo2EX>k5&)>44kTVe9)Z&JRCB+3j4tWoqBX3~<-d07|+6W8%OFf=C-^-^ot( zg5Tx!KRWR@^N2J)kx!8+ms@%5fRsq@<_)Ao+vB}Oat|6uA(6{1e0@G6EoQ6xsm>f? zPPo%)w+H8vh|-phY6=;eXO?QC--d8=~6 z;q%-KIdJk{j3k~n?RTHTGEI3LW*Lv$A@2qBgQK_-r?tk0Qk*tz{dieB49oj$JX?h1 z32;4~IMGhLxdsO=x1p8mu`;(8he-O+oK(hqZUrv!y1p`=@IBcPa4Przmdhf!z=O6C zd7jaczx{USIn8y$Ys1Eun-})rco_p`8yAhKM-7WG7EE|o(nk*^Hd)vEC zmlXZ&@y>(oHz`M_^1dD0R~_!9zlp;3ye6$02d%lJ;l*UWe^dWYbc)oSvRz)QKIO}& z|A|~C(4;;8sU9?FYYG{a+a7h=8#Y`^@*$4?Qiou?^)P@ z!}!z4@K11?KLg91dCv*pGF=b`&G|0x=xRDglZ(?i1Sd#a%U!pD>umjyHaQr=a`cUE zL3Zx#Y(i#^gEUR&Wr|>&`w8Z;&-y%@XYfxi51q5K*(1PF$!?$$f=`q5z7r3el!L?1=RIz$}pcZ z(Gpf7H(|da2i9$%{7;0pZL(~JZG2u7xy_*AK7=a7DH^wOU;2&q_+b6Z-wm56(@t^z zSzwaCC@m)gU>af?+C?#Vd~b(6ln)I5ZR45GNw)x2F1(=SSbyrQx-DkSh}zOMT|dS? z=Yb;-63tlL6t0t@dGN_Whqha0P6kI~`gz8#&0Qh{T03oMwc)E7r(O)CP3D?`-0d}5 ze?lRWr#g7>AJoj$o8iq)4*t%Y$4?iM za_ITQf&9tZ22T5*%VUnXy=j~tG^57Lc;@`cxt(*ED64Or5+@)F^!v{+W+Xgk?9?8d z){%75-rAM>&23)ie&lyFMYvs#_X_JAxre*Yp(@JDr1QBPC(oPgD_=6#bPJ-$tP`E! zKDn(W+qiA-X`efgW7^T4x#_jpmwx_}^&>(1^Zm$&`=`kvM!qH!Y2bZX|6kV6+Z@l! zCy5H&oO?DzxQ@s=x_r)`Df?#7$&0ZPKf@_xd3x!;CV$)SOfxX}R@Syddu9jQ@PxCz z>02-56Wp@RlWlDT(1N_41iIGbj3{;n&UF-xUJK_+a)O6a5}*0@6#g1COL5Dw#%Yg8WpK} zq$3)R2FSXByiCN0b?Rh+aN4`;vk}?jmDv_Dgp~!MrO=pP5hM?d@oVro4!qIQzN8=U z?=!Uq?%{m*z#;!FB`4G348|M-lRcs{rnj`tTu7;l(=DjCFI9m*Y1(DO+>QH_v3I>l z!OglNd+x6-)ndjlC$1yV9HHcT3^?2mrr&Ic-7eSje3-H^dTfhMi%{^T4;b19jc?J& zOV1KcX=!MYOLji}^{@Z^A}*psF+!Wy*&xc5f73QF{W;}ssm%N?IdR?JZH@q6s$yP8 z`i%c_=<_>&`Q?||r_8HdgL1s=XyalV>JLUf%)iCFHIo0DHn=Qv%(@K&k30RG>AbFQ zIt2XtMqQApj;8~x9Tc8p)ajoK&-f|*ao}{;-yTx0UX`=lsdU{fHIf7;Jx*{2k_2COlOJIjh%E|O8d(~j0WW#Z6j=7H0Arw-;Wq>UL=k@JKyF&+RL2ev(Z`kDG!_uSe>e>#eMgZHliedd&C zumuqC8SVH*>7ZasbImp0ZGe($yLfkgJLR1?i#N(Tb1phn6_{os=lXzXEcbglSK3<8 zD1~^Qcg~n?=OErqdzrr&f}J%uw2c`Pq{Dim3~9#XT2iJB&p;4Zm-LZAa4e}q@HWY zC~$-9&GtNwxqN<*`fdJuu$>nOp4ezkUEb6s$7Sn(%U}!KLZ+-^xsLN5>?}DKe<{>B z*_TrT`X5EMhE8P5#1J==DxMnTtt=4kuK$?p-+o0njVm`(3grkfGj)2!y1 zev-fn|Bd&fr36uj<{?b4#{8~LsFQcmb#_0#c;2_vvD^Cw_Nd%ERk!Gp&AW3-v$??+ zF4%()=&P6L_-sSA_a&MtBRMut50S82%H#GMM++uSY5VOt<0XPAquyGC@U8wVp!~L_ z@222ux_Kuz+2)qo+Zywd zviE6}Wdg_6^iNweZgV`Nm#On9qT?26(d6Fspw7tkCp1qtINEia`>#=dxB0t$-{?zT z;n>gP>2YFU@JY)xl# z`JJC+5`II4l67vtVDoae+rZejHUEVw!dbH4ym#=;8S1A0wzd2<;(vR`Cz)XhXH)!0 zrT}HV(5)mKsm*UQ?f#Q<1=JD*k~qTvSt8r#+q#})&}T}rhupRkTyD!KPPDyXfR4$% z7`KRV<45G_gqD@@@-EZVA_v)~Pw4zU0p&LRf%7GQTSk+jvB@v?p_8K<3e_!>r}dxf znELC9ox$MTX-@f1b;P!Q^4V$JH~U7OA$?~0{X*;)3XW{_rex)dQF1;_#Ywy<%CCzZ z6Y7`0^8~%r%|i5T$`ym>v|sn@&rm`bYzxY3xs5w@>X)9BJTPQ`_~L;EqNZ=kZ>B)o zyXkk?JKm@wyn&=cmk#{$NY5f04Z(J#ZoGHpUK^$57w6 zU9Dc9%##zH0`<8m*DWgPWaK+37Rd*0Y%;KYew%-pI-CX&<_la~*{3aK?__Aqjd99E z0Zop)`5y1|3k}8wr=h?6_Qg2aHbcve$Ik2bjjQkUxudl|bvC{r>-OTbNVs2L`f>2d zVd|zJZtui+#@hD{HOD9QIOzj+3cRK)zV>Asvrp+Twz@a!oRfp98SmJCFjReNq=zQS znFF7q?XTHyKk5`q`N+d@;w7bcGelT#Lbu67DUqWMmaXJA{+W1{;lb%H0~;-H6uj>D z)`LGWBBXH@d1?K0Q&lW6}p>v7_facwf|x;WEhu&t@n*V8^fOA0b;!Qe*k z&;kf-I7~{fd3NgfYNT!W=DY9`R z5NZaT5EiB7bP=m3K}=L}APaLB?x!m0F1C)z+e{M+&T4??{^qjK3%r!*NnTa*ULKIbd+zn+F#fE6Ft|dthR=^ z|6lie*Tb0(3FOTIDL#WHx3>2Iw*x!E;6)d>QEANBOc|%Sy2;-bkha0+H0+2*t|i~l zB&wrAu7QfA&D)t93D=}zacl# z!71&B=bQ5CG)dY5Fia&?Ln2dt=yWSW7Iq@e{N621(2++Dd*>bY2LBQlfH~xzaCo9= zcrU-7`f*sGop|@CTN|5g!r%dUndH+J%TilZhzc8cB6=Zr1efLSv~jpir0%7GE`d@0 z-MoGMxOX(MY9nDH~!2meJjTB=&6*S3GBA&Bup8JIq4eagjo zMoYgWYLtHDJvhQzN;Ae3Z)RIcJs{0F+n04mS!nQn<1+krTMsNZrY6eNv4Pv<`ew?r z(^oTs*}uv8!kzvEgO?0WJE9h`@ik+*!fcY`Pe2ZmItu=_O{~c|6&F zpozd~dV^)zx`L7Gkl{L5dG&sh&u2dn*)ej^bT0a0>XvoMea#?PB9XdbW?jv}%g@X> z9`Jk~U_92j z{-DQl&>S#c?QoBS*>$)DM%cO7%Hv*ZJ57yuDtD0mNS|Tweg*3+;|z@>SqUyHvtRAt=kI2KJt4;+ zBRY*OQqsEhz~gKxlUA3O<=ehb<1^*D{yu}bZdtDNR%C7ZFH_}Bp)t=TjTmd^VA`K_ zdW=o(qfPfRpp+X-nVtvpp84O6PV@xY;ph0wW0WcUd^dHEyB>(m8ASY-8p?HJ^X^+h?FWs~P6Zw~k^Rjk)c% z_}@gNg6(~#nHgYsOtig@Y&zgf-$tj^=-Avpw(T_ie7;AIrj8DP@>zm9r`~}bVfqMO z`V$zlCL2&`H2sctF>mZRF`Vt}=QsGAMi7^Om+c`dkMcKtjUb)D^ik5=0p6F{Pt9I= z+dK12xz&%oz~eRTInl1BzR}izKly;Y!IRb-*nFNm&vY13iyq9jSZ<#YDYd~Q=xie3 z)Rr{9&Rkhi5m1*c^YpM3KJcpg;r^f-=u~ z(VlvzQPG$_#>>d_u7jVmf=@Yl2$^wlDuLVH;P>4QnV38xOBEdK!bB^wA zJb(s=xk2)gBj0U-$TCy$w*zIyo`^MrD4H~+y&#Po*-pljD2)V08Mkdd+ZM|oNedio zhAyHKt+XVF7_|INeYQgteZm;9rsSb5pLcp0?-&rBy5VLVBa$}X>pC{R=IwyfF6%Mo z_gs)gyKHO){v3GxT_^g^d{jA?a*S=LIqf5)iZ!%4ZfG*tY^{*Adj*n@nCIsE#(zCyXBnP;Lsspe0y7>qMp<#C{aZB509mo@_#o>x zB{yJO$IQjs;JPK}ApOw{n+DOr{u{@#FUbjG_%>e5JAClM@ixDC zF)oq`ciY=izj2fyuwk~L=@4Eo{afm8L)`rPpZ<(UiwEu# zqRJ`9y1Dy--(uu~gVF0}?nCKBZeahIcC~e-?JW+Nm^ChG_K04-IpET0oM@Scw8vvU zZJ+-Ug$V3~H@0_D=Il={XWDyOTTg}_mtoLnTc#(-V4!*abitSn28JEXP-XCL_Yuy- z8_>&G`_lM8U*?$b?+l`8#tou@0s4H7y~h)|v@v*)b2RtV?1$+qbO8Sr0~CDIekbc} z>JqLW&)_J1f%_ym#|H$B(e8PN14ojZeXy+ z-HfNsJaBe$(o1l6j{_f?u9f=UNhf$2TP{W9-`PfIHktMYn;!MSMv$2A$;>$+o#k!p zebF+&&J2pqbW&j86cYZblm9qV9 zj&mQ&X7pwcv4akWyTN@P>7Z=mx3wp2Bfn?F+$cC&YKjLJc=5RLPGafbCfbSr^%J!8 zDLi{_M~2={o2UM5KwrZ28x=<4-yXu`^BH)MI20s22B$hhrk}*=d^hhnrJWIF;Iwud z?r)%;mLno+_{>Hpzk6%rYswSK&uL@jaM03>Zz*`~84j}cs-9#h+j#psaY_xcOeK8- zG$M}n-nfkZ^5IRfPTk4qQx-v@BHEhKqAy?4>_5Sl2ACXDNmX$=d|?PQ?aJQ@|M^RL zcXD&z+TsYO?DtbSv=RB>x2-;)$sCvYVB~kd-BR97Y4d5y&kG+_ld&1gsb|XYJnIPi zn{2iHZ=(gGUX2Rk*I(}(m~d}X&Wvly<85u^Fq-n0R5*VWmwHCexvf6~*+(gFP8+4} z-%wcL`0||*ILJ;o-B!=R=eAD_w)MlGo1e4EL_WJYWk0!3fOdF4*iyz{k@QZkw|OJE z2o3md57rT<*>A|cYWq{$t8v<~b|qinE6?}sGq>Ad4EV0Sk0@~J_Dx!(aa+@zO8X5h zLX(}7tTz3a&rbTe;WlBM;Ot@jmCP?2FU&vQkh;fBCcIwc-g|ma;>KgjTy2yOpS+Jc zw)YXC_euZ1yo)y6ctSTYCOH?{9Q#H;%zoSW{5N`w#HNGs9_E>4tF0rS&0LasBSHtX-~?QBy%OMhYDe$~?l+aBcleu|TPQ>N)a$@Fyl zUThTkEaUmfyanb!-o9@-_^12PC+ls(Ys*RBZST0rWcK$~{x|!t-$U6090Z>tXwp0fJel&EhK@mcIg<`zV2@P_X7d^}Po&GlX3K@I-22BQA5zcPC9rch)XZ+{cz z4o(}2`Lno~!S%`%8dEkny1)y1OK;8Scg8g73WyMNR9mBvuuM>gKZ=7II700Ou1lkb zv9pIYWB!{doAxq#4o;hrcE$82z?3Wi!{zj4dfb1zMCLM<)GgPWjZcfRrwtsKn`ake zIL~J~8f_;{JE=uBCigoVl=N2Q;N-exLLd_VThRCuI)Lwn&VPHV0$=&P; zcl+7&>Q7m1-yQ>!``^armZq9c)2&{u&+M#(rXe}~I3N!!vqYwN@1&fJGH$@YNCuVn z1DrFg50uj~S6cZvAXC2?Fi)CM*^wzeq^2V?Rf+5S57}Cqi_21 zWq-GPaOq?2#RH;U({VJqU#!N^IF+O(z9Jlo3FZ(XdlyQe|v# zw!y&tKyNrpsY}~;a*pyY3?u{k-2IDl`$T^+-_t)X1KlCd*%^iH zHVx>n6U9c#fHO0I$INow`p0MO>{pzi3FriH*!uk^swjXQk@;r*qph2*%#8fzoI)_4 zzoSfNa$4U6MEh@gw#S7!GoCl2=9HOhYwDl|PQpP3C+2?CY%&1b1!Zp7qIkR@^-qp^u4C628tu@VFZ{uqz>r*!H(+oZ${$n?1dc7?@nhvoSIpO4eq06 zqp>_w9x|JC%`y7V2G_d0S6BfBrVYf-wdV>a)~i+dWjF-SQibvx%Z^ahsYoF6AI zH}C&ut$WQlc*%}1?1*F&_u6=Z`|XoRl?0b~I4$qB4URUV9P0E*MCLY6w*BNK!u?kE zRzD6XFS1WPwkSbUcbIbJRQ78oPon7)P8I#6T=uKeT=9PSNt9NL-f%?L?PAzhw6ZeN z$WgtdbiR!HmMQVg+LC3x_9f$q?EOeoS3{Fi-tp_h{XvW_`E zIEYV~HO{Ia8>rD?q1&{z9S5q%4Q3CIWz1;+T4nUfhP4P*)PKRzSy1|zc#m(;`ie(6Kr0xbSh&TX+sj|T@I_-PX6?aOop z!+$q##k|*1LZ^s8U`sy-FUp!uPNNS>Q>#}F$|<5TQ-LzQ%pi&|IdrlPo9FIRWCR9) zLlJPW&kK3XjR`%$pm__Ye`m~5uq=Bg@87m*cmYA-1aMAflw58{r}&381fFrPsk zaXUC{kuxaXMp8kL@;-G;8X%AP&De=!mB`tKEn4d~Udgw%Wk_UHlFKEUxkd0axZk!t z_Ed%=WjtR$QLw2iPG-0JB~m{*q!XzKna>p&PmV>iv77-RUe7DfA) z<)X*r+}tAc5~S1m{l@8lK*TdJKPL4sprZzHKm;22mK(9eX{3rUrer9M`h*wcIGE^fAhb5&IV1_(e)qX zJae13J8@pI?f+TN!HjQPtIT=o$VJYS$jG$MW1Pn4ymw=8Y8RPjnZ;-0OJ)%H-znF= zu*~OS)(7~*Q-^dp%z-=$0%w9DL-RKoHz4oOfPTVYed8TOHIikOx@jW!bq5#Wgc>CO z{Wj<5hm4NR>~4@*J@iLrlD2)x?O}Xc_RYY067!MoZ+r7e7uohd_t)&PZH{?Djqo@;AXF4W0u=?$@c8 zA^$CF!SZE;JAZHXHs)RKJFV`>;`C!u%$gE|>~G)A<39A=A*q|0K_D}_T&E`I$UxJ5 z=!=c2Edyhk?bPKYwz0Ncr+&bk$}At=v++Cw>m^M_D+hFX^{He_PlssU6?}uO4@)~Vpvwfar*$a}M zM5m&E8r{|EjA8iG2>oxommGW=_c4(Gjhl!l#*B>2h-;^oWP3Kw-sxYb!}=i7C zYgEB$4!Mq_Ad=p9TPOK#n@gWylhNc?{!~`B2!Ji>mBSm3K&PTYF_itC(W=RjpLIU% zhfZ^4O@5KbydNQv{Cm(}hSp(lhESs7t=dP*0wrm8; zPg}RGA7Jz%GNkPrKO2k*@(wH~FXPeVYTNJJCyqG%6fgX-hWnp!H7|Q2dD~CO2)y|p zM#R&6YuS0w7;Sw*U!L0g$s96Y_X`?-ed>QL`nZ+<66r~K85Hok7iQU;Ue(^Y1-rDi z+}4*VkL}uaJ1}~XBO%~Xz(}?ZwUnAbL zeEOm3_0ZFqx`nI}F1Fmx1uwenb{_@hyhQV7om^&<=TG;IZ}yqYMl~JO>1^b8HCs!| z{F(Mc9dg2HUH%zs-v2Fkx4q1ON-5GK1 z=zy#Pi(&H0;Ze;9MvPxB!ybM|?Irizz^PY&I-EA8TzDFHwx6?S6xs3(;cdPG%K?3A zF82-d9viC%|Ko5`S9-dCD;HxWEMMkLocg&>S@)*Q3iAC+rx9?rfPM@06xgRb{jI1dEoiKWtGrp82FfD zerDDaUuI_DvG?D0FgoIQjQi6b*V|rZQfJe!Y0Nk|>J_6f3M$VS$-lR)WuWaF$RwaY zGm?LU_tE(+^E$_#y0{H3LxQy0m#EOpG|EUc+VKL$2gC3nGb6Tt4@l8$-wo^l#`wUY z#QdzrDGKz2Hf~ckk)h^#Ouq8`{gy43WrK`H<2~?rXA}<6YzfbWl>3a-VLf&Plj}2M zddh_0U_SrF@wCDFGzXxWciURoIKh)2x<$GZ;YWLO9IQi8PVyBRWY=J9dzstjulHRn zuB)A}Q^%y1$gHJ5F876iDbH)(;3Z=d!-CtJdKI519Q`~p;Q5$QLi7FRRCReXzAyVH z{nO@^0mnKZI<4`UZhD2eaQXL12gezZ^#HuvcgCFR?>UM?Y=B`1q)hN#M%|~rNY-Qa zCF3#g9Qk$m&KNR(yZK1Bz0BOjS&z&%9q@M=kDEc`W|*JfJ8J`uarbe;)CblL_^f4a zz?Yiq_D#P(eNS1ZHHfTCpZ!?}TG>PyZxNX7-^hV!I{7`$w?U()O5ntt?_59T&%C!q zL6Skc?KvI`)=<`3zMuECJ{h@XeiMAskZZCj+qlHg@cj9ga$iCMN{Fd{qe&P*Ww~*r z+gU>-_(?x%{ed3terVj(t^?zeclKb^2lNB&bd)=RM|p=Ezi}Vtyl-Qc+4MZ)tfR)| zeS+(hv@eZ$VcR#hIqfW8gL%{72<&DYesO$c{~;F{95n4uz0%*iz94n2?VNr>?h`&I zfK#B-X3I_acU^N2&J5GvCD3UVh8HS+l){i+VOPTGAbCK=c%4dQ6Do|3x6}^ccH{(^ zIyMd_>bKE;5ZN*?7pYUAHig`Z`wU(VpchGduM%1B76qLL;#A6w`D_#9mX?2mqv8fh zNN$)$pnYcpe@^~w6Z5+`_)h(2;y5+7852PEu_vTGwTae_E#=T@Xu#v(I{5u*hzHX~ zJ38h$B2GZgTSwgwoL=1Cx8d|mOa1YB!CYsMQb+wEWKFHUFl581m^$%TX%j(>^@4=391O`;rkHARbGM4XutY zW8}^kin>qcef<5}zZ)_Fa#Lcs0MN3TX;rR&!l|-W)SU{PYXcELC`2uyfWEPji27#V z1Fs40zdUf8HpP67PSIu$%C&CWn<&ptQrG2_vQMTEAayO9qhl8_J))X@*(%ZQHNgX9LTr4Ql8yUeDY5 z=QTd(eA2oMvhElJaeUg4>^Xw2*#aSa`KV>V&KP9L7t6TpOikPlt#(dt5wq@VE?uPD z6I>SeWe`Mwqq9+VdHxSlXGi8)*Z9o5=3XGBNdO6hR=3wyZf@3UE3hSU->h z>*QWn6F5uZGCiSXHMZ1rJ57P*iaS+sg1O!NE-wrHI1p1?|P>b z+wzp{CsJ_RbFDw8ZsOpPsjDe1+gXLP_jZOw@9>(H>xtpH){KBt7PK=S56&_hHob7l zY7R{5omqo^1`3d*J#esvK^EIfL_K?hjk5qcs`;)31r6FeaB}h;-~9lvqr61) zdQYJ4siXKzZCWNM4NY(1{-9jy`Umw(%9G_N0}Gm*&^AY`dhMCt^802~v>ZTZv_&xw zY_K+(9mnsZp7UF%v3MTJBI>ZU6;L<&3aY6=uJJe70@H5xS<3R-MVnb`L9RorlcsI7 z!-qW*V?T0Zr<}p>(g~dKeO|1~rs~OgJ>R(ck)~zlQ;E+|NI^b4!m1zdW4-jeP^rmjl{b}i@bvR z{Ci3DCn9evx1|eg&%6CoF2aS-oYD>wtsnBU*HjyBfBl3aBjLKX)SV3V_eB=&f1FSA#C1}&E6M~7+XsD4ULB6H67>FM|}4>76S}R$(MI)Q`VzVt)%Dk6P)C+fqDCq zuJR-49w@cQj#HYpR1P-dZPRs~9of23hz#hTTM7|%zO7X`XZ~6)&`j{2R<8t^1WifE zRJEjw$u?r>BpQwN-4|n=+W41}3eQ3M(>48;W=G$jC}D0mt!>6%4;P{hrXS&G+b+%U z_}%8oZI06Bl%*Gni5D7-nR`Uf`tUq>p?+cy_)WZ(w>~_r)21r1!MjlpeUnyqTGzj! z-~l<#95T^!PGhyb7lYx6@+c3M-)0Wb@0kvrXnWR-!*~j*;Ya34;?|d^wfb8)E5y_{%(ZWDO3OwM zzFp$!xjfHt*4ohazE8%!)dl1B))uluk_H8%iw)9t2%PHlGv#T}DBn(dGj+Y4BT^Pm zvf1YTO;>3&TuoLoLhxifyipbb)}^dNqb%XG9Jl#?`Y!2^zFFJbZ?Y|v|B0*_rjDRb zb3dIie9&CZx z$m?GG3W9iA;MXk^=><(cd>OC2SasXWOoc`^$?cr_ zBCnQvvc+sq8+iXQ4U_BI_R|xxZd+gFrHIqNIDS8cDTi@BnO?_ebH;VfJr_{k@0r>Z z?il>84q<(B97>7AT0Jt^>2#q6%(rB9Pz&J~16R}L0 zcyO4U%@gm5OWph#3g-)&Va-uy|MqZsTVAjModCa0q4s2VI;jO3Ba!P#Y8L#XdC7}Y z$`k2D$xATkck0Rk+DPv>TvQGA^4`Y6W6WZP!2pybUM zjBCm$5dr?3XI~W^C@bKLZ=jFcg=oN06v{;oWtA|GJ>R!JOnM>8p3fb%$nzjC>EXK<<8$^)i=xh~iw&0b!6{YFpKWQ3 zfc~Pc{Elo1{_Q?xy*Edl*GSj%21hSuI&}6Q9PY0BW_hBeo_C-0ngmgQM3UnOKj}T6%q3G-agNHhtEB@w4L_qkPuU_y8~aV) zWlwY;J7ba0{d*#`2lPGJGwBG+I&FGz-lt-0^6$)wL{h#HNlyJU`kRam>%YG(R4Lov z`Ft}z-}Wo`g#p1&r}>q9(gTmD@04-5JfB&Qmen+Nr0$pN9#mt%x@Y1vpK?E7yi&HO z{FEn0(dOEb?=*D;>#pY@V|dar>4Vh$pnD?4J?#xpQe>pQ%RGT`$B=EzyDgjMtsUSH z+uCBd9JpGi{1+-la5Lt)f1E)BoW%*I-%k2kqm}v;xfj2T%L!1B8AQS(2d6WaK{n^M zJ~B6~+tFXhD8F@tILI-xj_!Aw;$<-JYfjOm?U?c5ES3(27iU50oXJ~lU5mEaFnkJ7 z#kuCs5@|n!I*)A1luZId#&GU6();O)jxl9;k2D3D*AHKcIGBI8y9Hig%3-rSBnSDR z^=oEDyWWfm<^87tIty|d*bNLGMonJg4KIx$sX(TJNhMqAg9kfP4+iam7A8ziU^<9s zZ^}F=d!!23%VOosAeuTC)SN(x5jq49p1M}=!PK=GeY_ZLlojTPZS}$6Yu>5>8-8xK z=3pE&0|UQLB!96DB=lo?j&ifYtIcnim`Q!nuqp0SUZ!@E?%8~qs$xgSwGbpK_9JC)c>!JZ#ifj;tQM zM!BTySgwiU1w;olS!i@3Hj?@hJ&e4skbzoe4@ZLKh`Gm&D{CAnfjTUXoqY=g(Z@`QuU!4l}t15@u%Z=C7;Z{Wzt zZ0FR;1}7p{`5W+_)Qylo`iR4G?#J66lWVdKOKAuKzSn{8=YJT)`Tph5ntP%%N-}-d z{YUVGKhL(9;)k|4eHPA6AJjQ0=Q|s9z$cMQxtFAa&}Fmk8`iz^75Ig)I=lx3X76WLBlCwT_>U81{n%;q9 z0JO7O;-!D4KARyC-Nis&P3HxYYR|AyFyB9b_uBM@zGG;RYwJnwxWB=_XKyjuKFmEh zd8bVVJtXDcC&0ddF6dxNK(I{%?`wM=L7j{PeG6>c+Gt~F-$_r&^@%!JzoVRdt~nY` z$TQ<6v+eUHk6HJ0HY7}e;=g|n92^Rcma^^0B`60z#VuvX8-?G=g8offL`xHKI>8ol zkI@tFMoYKeF!f9x#Rej$y%=PwgZm7_!6{9^{q`xGMwOgqTi<{CzO4`WJX2Gg3h?s2 zd2S}W)3s54UN_qBy}uEO0z`suLVdM5PkJ z_L?gCn!fykmVWY*K68Wnn)+^icWY1nF2`z<X zv(ntghr3?s$x zlk`l|;PWDp+dTMm|9(j?|C#Ij;B{SpN&n;^U^=7I{A$QPczv&(L1ZAjP|`FI4V-hG z%U$@L=?9RD*49QJ_DT)K@0@CCY-^G!cLtyCao|_o%U~)68>m3;Ri1w-w@#bhD9S#S zofD`V{r;MwJ9V0R5E+(rqP%P$+^n}Vm1S*PlV0bj=gvl_2wvAF*U5T+d*=yFPIGSa zclNQff)Xd1xkMYQwhmAxQF~eMMxVfMyk{CoMd5nq7=3dV{{%1cMDR%K&#iu~|F?B^ z+MN4ogJr?xw>5Pe|C26pqwBoQ69>LH3*3h36RcyV^C3SYvu~q_dU?OhCWYwhpA{~9PQip$u%bXmIi@*&~LZ+TAMBUNh2$Yo! z>Smmx$xQkWAo;$5amdIm4$GuvgUutm9ZF8XxNl^19Z_D?vw8ha5pX_ym|o!3Lp0co zj{c5_KYQ(3w5S2m{w?id>dM5V4E}b1q(_(UGBQ3v)PUz5hH*!Z^Iw#M0djfc_j9Vy zOW$u%>F%q|o9KR;ch0~4J4e`V>ri^YiO{jEks7%fS)7Vz;LM_oOce#Ebk7r}?5P(H zLJYgKHS0SER%C@kj13nVr2%q-^DV}pc}nRIuUk!dcC>6O$7`Zf8aYr8vdk^AVe?iG z+TM|J!!w^MDvlrrQ-&k4i7sxO$}WdzFaUWi@V|XnW1g7~$q{=E(=Qx)`FoHQDFeoZ zHs-ovZ2N`RYe#+>cHq8JvH&i%%jk^uZ_pyf!ReB@e1>}w{0{o)W_)%eJeX&p=gKI@ z>@&|lGMdO>`UctWFUIF>o%j683yB7&wEUOxhlekzbxwMzfl)uv;6oLi=X`8xAE>w`%_0?ECMAcqv;n-Pv+fe2qgmBpFt4^e0IXHoaF)=$&>3AB(*}G50c{0j@OgDAny<| zyrysT43xdy_2Ym09hnK^GCAwFvjz2NHiZ0)y0x}B0^Q$lR6Aai32+)PcG%`}oM?~V z(i|KYd~f)Y$^mEf%pkcr zZ1aAE%`wojkr|_m&iDM@oU8dB0$us{f1deWpn1LWAUVjznU}yT+;Hlkt#Lb|9JRwua$-?$)&tiuIgtE*>bD&jz43Vt<(f0Nr6OTSBAQ{!p8w^# z@Tp;rdh)*k{W|0GQa{U7t`+9+VqKvfhK)VH>9VMX&4@uHZbn2I*^ZWe%5N+;ZJuS> zF9-1rErKuM+s`oodHv?Hm`pP#qQ!FTce&n4;o!As;M=O1*UTpl_NVrGzi=91QW&@n zjTVOQ+PLJQDBEl$Jr7F8X|KsOA)PjV`O9DaOQfE&i;~KPjGb0z>TojL``x)-<^?Wf z8<A5} z7JxqNlk5b>Afw5x_oW_?hGeh>fB>KOI0J&0XxdzNnloT9eL$unWpDdj*4b32rnjI> za5}e{`oYL^_SBzqK0yyQ81fA7%l29}8udx`sk1f#b7XVkCfugm`6u^g2N#@lpp@Nq z_lM60Ef6T-AYJ+eLu<;$^i%G$4%lfrs$n`X%J%-|`D=K*wtWEo+-H3wvni1M>C?@w znn6+Yv*|;AFMIxP^B}vjQ^{?DOl4jpN`T*qVK<|Qo9ARO2P*2a@f&Xupaw>7N0H6% zw?*m2h>+2cDDm4x0Or#iWHbUGQuTywQ@+)Egvf_w;0T%|L{Cmbp3g{>jJPFo&k-1u zyB%s=e;X5l3f)O~;vpmBv}e{8_%@d^}m-k){*7hNbc*fx3SVLZn4+s4bt2I9WV zG4^7Y(H}0ub@xKFA?3vebN}ueW9eY}G*iPeZ4ERdfg0{=)%nnn&Nklfd1d~nTWYY&9h@%BXuq*+n{T?6?PmZHra6aR<~wv1 zzI^tj-t%0GjL5P3#7L9{Rz3G;R4<)%a;I$~-*YxB+b z8q7O!(4wqiOi9?_(fB-Z$h9^N>`c$!{^1Y*FIvdiRs$lVYz(~VIGeF!upNxtFPVXq zk!hJ`4^qEqhvYQmdEGrlpJgyWqbNz(*lDALFXtla(euo5Pmn=dLmKbwpZ|UfxTEt) zVKmZlY=u4#KiMxnIMar985l@|tH+FTn8!rrxIP$n2!1eqg%7c;YHM@rW6`hVq z;TLTBW=24@h_-nTsj`C>f!xX)kO~XM)PT#~s8?pNFsHnp<~waHu>)|>?ogR`dk)%Q zo#p!Xj4AK%ds1J?@^jDoUva_cz=mGehs-HQb{m@^&FR#X1IQX}k+6x(9!NMSB6+4? zzYMcGLGqdC6Qd1{cUV$dfuj*cjYD>ch{aZFDe|G8WMMIAPW&mT$~$)?-h zW7xpOJ89FVFXlKnOUTiL^Z6|(qm8LSW+Y&oZN$lSI(0f{rnPbKvzG7E*{1EO+l9B= zIg9a5U0{$r_O74z5bB5#&Gkn=a|-{dJu?O&b~nh2bnd>IBl6R&K5G7 z4q>^l49#zw>}OWNfW2h9TWmo6xyN9`w)Wn@nFo2|zhr?ss|Ov#?Mr#aaqi42XG^v< zWX5jFY%B%a8L*AzU<*_O$z$)n_Sj?;cyo>pyk^obzHjVwe^|~-Yyv(r57MDXT~7Mc z)RBxEBLgBSABQN&easZWTLyBojirMFL-%%`1h#w4zkP28_4)npjLgXfFmW7mkCJ62 z@1_iJ5eEu3hid3A1|AS!EN~jAc3}c-@qyO^WTk_&-+3QK@7!eR=$l7mkOsmnx`2fs z7XS{#w53I38>i@9zHj9H9_xSAE!^(wT*z~>^6rd&Fxp`R>W_gV^)ijD9i&-U2W^9I z2Ncpo=C|f4+R$YAHV#>4My%v!nuZ@w*um+*N7>BVEp5gruY*Pw&%)ro_CjvO!u83h zj?HsM-ONko3#T@?uN?Ucw#%oeqwAKOw9OFUI&b|x{gUrZt~_(vZx_*Fq+`>jK2yFk zJ&dL-Od_JV+%RDam`xE13#q!gDm8 zQSFd?x^yNlVRK*M@HJ&ercQgTx5Lw$L+Ow$11{ola5@|k8dO*CV?-<^l5go6wW zKEsgLvatr%L2`ZC4z-(cnu}&L=wz0FklUiw#e}d#D4+*h8|58jL(}4xQ`9@w5NYr(l&bp zdqmd1z1NNt*TqhJzoVVg2~2~U5)OX?8V2d0^qmU8V@utkvdXq)dmTt+!|lnCmvEMp z`>O4IE%M!C_+noId45N3U3cqVJey+TP(P?iQ`@$YY;ryvCY3&2to|FYp}@WFyl?uRjDn{M*0n7puFD zZOvlb?U3O8M(%fcF3G(vnJefc_m}beC4^bAje}-hyhZa;87jx&lm&%D4Bqx{@Is2s zg+3b)j;sURUL$BkYKF^^`kfA*#!G*s2Llip##rZb zL|HUL3DGex_4G!X?;N;q>3`lozfIC|!~K~Tm9YT9P0IV>j?I*$m$ul5OkMrnPs;N% znclRG+2G&)etUI`s=#=f2INLRv0eCp(_}DniPT>Xaml~;vT2eIbi;Om*MPA*_021Y z0%!;GZEYgu#0oc*AJjW#A?4s#U7mD9{&u^x0i&g{T|)FJ=#Sg@o%(G6H4hx*ZGUO) zYkLv&8aNfV-y(9 zqrN_UMbg#9Q^{eD`9QYMk(m-%V9-TXV(j3#&fEbC%;o!az>(;jFY zd+G%R33c>u(Q|)ve6l{-{!iAo8*&||Y=UH13%B=ex~t{N^&Po3_w4PWvR9qx8|2x> z_59@Aka%6|Kf&#{sqeFfz3jgOKbK>ac-0x1J2=N%^w-AG`m^z>GvD-{h9A`n!A1U0y*!r9ws%|acqji&8=U+2wEn#AO9|@d zvR~Fs_Q%a(G@y?-Ur+lzRynpe*-QJ+;Ln$fv2i9^XC*5&>rEfHFaDGl+cl3OiY!s7 z&1-^ZlNaI9ndi-uH~)rqB2zB-Ee#piV(!k|yyPRGY00;j!717qaXr5!8Y?3xsQ+n0 zLRhQ}13Vjm)U1rkJ#Dh-VS70^*aK}~fB>0J=Tt_&7X^Haq;QJQz(Ux#u-&&l062ww zklrfO9@r^j4k|kloEDK2qa8+k8K3J)8Ygvakvb;|k8BTyO(SJ2<&=I&Zx!jf9-Fq% zZHsKm1oBQ9&Vm@E5#O+v(;JlG`r9DfHs0i+ZDoK{suRYlOcxvwjg*n-yx-|!zRZD$ z)y8c&AR5{!XS~BHnC-W~k=d--cCIuo)lC6PY&`Fb`=(r)u7G_Z`CkV_R=LlhKN=8O zlk(y8XwyE-vvxL7hSwdB+n}wL^M3l0K5Lt8Uh+d~qR}!5{5gG<(YmgqvF&d}5&YeS6kOWj?oq+oNKZj1<93bY+RH^uEX%>dwt9CJ4Ig_x0Ln) z{YoFFK9o97D&9`(A8e6ySx#n%aY%5Vr6VUlOU_24al9HW0HmetC#@aSVacW2GFUb^ z+6Q??SMzUiTDLa6$iO!LJjS`UurDz0w=!~_1TAZVgObONV3EeLJlL`wvp$w9zB@(! za=^9m9D|k_z4d|RH+9hykZUeh8+>AXZkdYPTs&o<;tZmFX_#`^<~VMk z{x{?E0OvkPIu9H`zv*reBMp(}z4!Yu%;p$l>+*B?j+@=38Q%a#V58}O+nLL>LDZMe zlST^Ng!ejFX>47ay@~eOu$XQ%9Vu@LlGhO2=8t4_#`sZZGbr&xzn|{5BZhG6j@Fz75fA7%!1?4gPH_XY;hB zET`wlWt}|X`Mbt#j1%CW$|WB5X3cxpu$n<9%YO09B^=dzn$NDAQ%ycWu1hV#n8UX( z*dl@(S--72eh*`H@)U3Nah($1^mWSPO9sSNuZ9+dbc@<>oyM3u@3DtDdCS3%dX!If zKE3NTLM_YlI!PV2G4$Nyw>CUH&9P@FLqkQic@%bq-J7`&9@dsf7=V_3k*OUOzpU!?qs7dMyx~d3*Xw2vd!9^Z=P?_AK8MiDQXFG7Hhq~;= z=ya;{ErQJT*v7ogK~isT^*fydyw_y5VMC7hEvs>pAu>_7`FuNzwX;Tx_yqJHb9x)E zr1^Wr%lgMSw0WAiMXhc)=|;RO`}R|vbiOAL!}Y`vmHSZ}kJNik(bNRS`Mm4BZG-#m z^(=R@h1_({Z9KPfGrF^lHB^pm4(HfyeSO+Dp%U80JkL^a + + + + + + + + + + + + + + + + diff --git a/day20/src/assets/svgs/CaretLeft.jsx b/day20/src/assets/svgs/CaretLeft.jsx new file mode 100644 index 0000000..67aad76 --- /dev/null +++ b/day20/src/assets/svgs/CaretLeft.jsx @@ -0,0 +1,24 @@ + + + import React from "react"; + +export const CaretLeft = ({ className = "" }) => { + return ( + + + + ); +}; diff --git a/day20/src/assets/svgs/CloseIcon.jsx b/day20/src/assets/svgs/CloseIcon.jsx new file mode 100644 index 0000000..7eb7697 --- /dev/null +++ b/day20/src/assets/svgs/CloseIcon.jsx @@ -0,0 +1,14 @@ + + import React from "react"; + + export const CloseIcon = ({ className = "" }) => { + return ( + + + + ); + }; + \ No newline at end of file diff --git a/day20/src/assets/svgs/DangerIcon.jsx b/day20/src/assets/svgs/DangerIcon.jsx new file mode 100644 index 0000000..70cd36d --- /dev/null +++ b/day20/src/assets/svgs/DangerIcon.jsx @@ -0,0 +1,13 @@ + + import React from 'react' + + export const DangerIcon = ( { className } ) => { + return ( + + + + + ) + } + + \ No newline at end of file diff --git a/day20/src/assets/svgs/Spinner.jsx b/day20/src/assets/svgs/Spinner.jsx new file mode 100644 index 0000000..20c7a65 --- /dev/null +++ b/day20/src/assets/svgs/Spinner.jsx @@ -0,0 +1,21 @@ + + import React, { useId } from "react"; + import MoonLoader from "react-spinners/MoonLoader"; + +const override = { + borderColor: "red", +}; + +export const Spinner = ({ size = 20, color = "#ffffff" }) => { + const id = useId(); + return ( + + ); +}; diff --git a/day20/src/assets/svgs/index.js b/day20/src/assets/svgs/index.js new file mode 100644 index 0000000..60e06e8 --- /dev/null +++ b/day20/src/assets/svgs/index.js @@ -0,0 +1,9 @@ + + import { lazy } from "react"; + + export const CloseIcon = lazy(() => import("./CloseIcon").then((module) => ({ default: module.CloseIcon }))); + export const DangerIcon = lazy(() => import("./DangerIcon").then((module) => ({ default: module.DangerIcon }))); + export const Spinner = lazy(() => import("./Spinner").then((module) => ({ default: module.Spinner }))); + export const CaretLeft = lazy(() => import("./CaretLeft").then((module) => ({ default: module.CaretLeft }))); + + \ No newline at end of file diff --git a/day20/src/components/AddButton/AddButton.jsx b/day20/src/components/AddButton/AddButton.jsx new file mode 100644 index 0000000..aa4ded3 --- /dev/null +++ b/day20/src/components/AddButton/AddButton.jsx @@ -0,0 +1,36 @@ + + + import React, { useState } from "react"; + import classes from "./AddButton.module.css"; + + const AddButton = ({ + onClick, + children = "Add New", + showPlus = true, + className, + showChildren = true, + }) => { + const [animate, setAnimate] = useState(false); + + const onClickHandle = () => { + if (onClick) { + onClick(); + } + setAnimate(true); + }; + + return ( + + ); + }; + + export default AddButton; + \ No newline at end of file diff --git a/day20/src/components/AddButton/AddButton.module.css b/day20/src/components/AddButton/AddButton.module.css new file mode 100644 index 0000000..6b0b7b6 --- /dev/null +++ b/day20/src/components/AddButton/AddButton.module.css @@ -0,0 +1,33 @@ + + .button { + position: relative; + border: none; + color: #ffffff; + text-align: center; + -webkit-transition-duration: 0.4s; /* Safari */ + transition-duration: 0.4s; + text-decoration: none; + overflow: hidden; + cursor: pointer; + } + .button:after { + content: ""; + background-color: #6752e0; + /* background: #4f46e5; */ + display: block; + position: absolute; + padding-top: 300%; + padding-left: 350%; + margin-left: -20px !important; + margin-top: -120%; + opacity: 0; + transition: all 0.8s; + } + + .button:active:after { + padding: 0; + margin: 0; + opacity: 1; + transition: 0s; + } + diff --git a/day20/src/components/AddButton/index.js b/day20/src/components/AddButton/index.js new file mode 100644 index 0000000..24c1845 --- /dev/null +++ b/day20/src/components/AddButton/index.js @@ -0,0 +1,2 @@ + + export {default as AddButton } from "./AddButton"; diff --git a/day20/src/components/AddTags/AddTags.jsx b/day20/src/components/AddTags/AddTags.jsx new file mode 100644 index 0000000..c9983eb --- /dev/null +++ b/day20/src/components/AddTags/AddTags.jsx @@ -0,0 +1,11 @@ + + import React from 'react'; + + const AddTags = ({tags, tag, setTagData}) => { + // console.log('addtag--->',{tags, tag, setTagData}) + return ( +

  • {tag}
  • + ); +}; + +export default AddTags; diff --git a/day20/src/components/AddTags/index.js b/day20/src/components/AddTags/index.js new file mode 100644 index 0000000..b3763e4 --- /dev/null +++ b/day20/src/components/AddTags/index.js @@ -0,0 +1,5 @@ + + import { lazy } from 'react' + + export const AddTagsTemplate = lazy(()=> import("./AddTagsTemplate")) + \ No newline at end of file diff --git a/day20/src/components/AdminHeader/AdminHeader.jsx b/day20/src/components/AdminHeader/AdminHeader.jsx new file mode 100644 index 0000000..89ec206 --- /dev/null +++ b/day20/src/components/AdminHeader/AdminHeader.jsx @@ -0,0 +1,180 @@ + +import React from "react"; +import { Link, NavLink } from "react-router-dom"; +import { PiUsersThreeFill } from "react-icons/pi"; +import MkdSDK from "Utils/MkdSDK"; +import { MdDashboard } from "react-icons/md"; +import { GlobalContext } from "Context/Global"; +import { AuthContext, tokenExpireError } from "Context/Auth"; +let sdk = new MkdSDK(); + +const NAV_ITEMS = [ + { + to: "/admin/dashboard", + text: "Dashboard", + icon: , + value: "admin", + }, + + + { + to: "/admin/cms", + text: " Cms", + icon: , + value: "cms", + }, + + + { + to: "/admin/email", + text: " Emails", + icon: , + value: "email", + }, + + + { + to: "/admin/photo", + text: " Photos", + icon: , + value: "photo", + }, + + + { + to: "/admin/users", + text: " Users", + icon: , + value: "users", + }, + + + + { + to: "/admin/profile", + text: "Profile", + icon: , + value: "profile", + }, +]; + +export const AdminHeader = () => { + const { + state: { isOpen, path }, + dispatch: gobalDispatch, + } = React.useContext(GlobalContext); + const { state: authState, dispatch } = React.useContext(AuthContext); + const [openDropdown, setOpenDropdown] = React.useState(false); + const [isHovering, setIsHovering] = React.useState(false); + + // const handleMouseOver = () => { + // setIsHovering(true); + // }; + + // const handleMouseOut = () => { + // setIsHovering(false); + // }; + let toggleOpen = (open) => { + gobalDispatch({ + type: "OPEN_SIDEBAR", + payload: { isOpen: open }, + }); + }; + + React.useEffect(() => { + async function fetchData() { + try { + const result = await sdk.getProfile(); + dispatch({ + type: "UPDATE_PROFILE", + payload: result, + }); + } catch (error) { + console.log("Error", error); + tokenExpireError( + dispatch, + error.response.data.message + ? error.response.data.message + : error.message + ); + } + } + + fetchData(); + }, []); + // sidebar-holder + return ( + <> +
    +
    +
    + {isOpen && ( +
    + +

    + Baas Brand{" "} +

    + +
    + )} +
    + +
    +
    +
      + {NAV_ITEMS.map((item) => ( +
    • + +
      + {item.icon} + {isOpen && {item.text}} +
      +
      +
    • + ))} +
    +
    +
    +
    +
    + toggleOpen(!isOpen)}> + + + + +
    +
    +
    + + ); +}; + +export default AdminHeader; + diff --git a/day20/src/components/AdminHeader/index.js b/day20/src/components/AdminHeader/index.js new file mode 100644 index 0000000..8f8cfd9 --- /dev/null +++ b/day20/src/components/AdminHeader/index.js @@ -0,0 +1,5 @@ + + import { lazy } from 'react' + + export const AdminHeader = lazy(()=> import("./AdminHeader")) + \ No newline at end of file diff --git a/day20/src/components/AdminWrapper/AdminWrapper.jsx b/day20/src/components/AdminWrapper/AdminWrapper.jsx new file mode 100644 index 0000000..ae4362d --- /dev/null +++ b/day20/src/components/AdminWrapper/AdminWrapper.jsx @@ -0,0 +1,39 @@ + + + +import React, { Suspense, memo } from "react"; + +import {AdminHeader} from "Components/AdminHeader"; +import {TopHeader} from "Components/TopHeader"; +import { Spinner } from "Assets/svgs"; +const navigation = [] +const AdminWrapper = ({ children }) => { + return ( +
    +
    + +
    + + + +
    + } + > +
    + {children} +
    + +
    +
    + + ); +}; + +export default memo(AdminWrapper); + diff --git a/day20/src/components/AdminWrapper/index.js b/day20/src/components/AdminWrapper/index.js new file mode 100644 index 0000000..c98297f --- /dev/null +++ b/day20/src/components/AdminWrapper/index.js @@ -0,0 +1,4 @@ + + import {lazy} from 'react' + export const AdminWrapper = lazy( ()=> import('./AdminWrapper')) + \ No newline at end of file diff --git a/day20/src/components/BackButton/BackButton.jsx b/day20/src/components/BackButton/BackButton.jsx new file mode 100644 index 0000000..f503590 --- /dev/null +++ b/day20/src/components/BackButton/BackButton.jsx @@ -0,0 +1,19 @@ + + import React from "react"; +import { CaretLeft } from "Assets/svgs"; + +import { NavLink } from "react-router-dom"; + +const BackButton = ({ text = "back", link }) => { + return ( +
    + + + {text} + +
    + ); +}; + +export default BackButton; + \ No newline at end of file diff --git a/day20/src/components/BackButton/index.js b/day20/src/components/BackButton/index.js new file mode 100644 index 0000000..ed5e016 --- /dev/null +++ b/day20/src/components/BackButton/index.js @@ -0,0 +1,5 @@ + + import { lazy } from "react"; + +export const BackButton = lazy(()=> import("./BackButton")) + diff --git a/day20/src/components/Calendar/Calendar.jsx b/day20/src/components/Calendar/Calendar.jsx new file mode 100644 index 0000000..b5aad20 --- /dev/null +++ b/day20/src/components/Calendar/Calendar.jsx @@ -0,0 +1,160 @@ + + import { useState } from "react"; +// import { formatDate } from '@fullcalendar/core' +import '@fullcalendar/react/dist/vdom'; +import FullCalendar, { formatDate } from "@fullcalendar/react"; +import dayGridPlugin from "@fullcalendar/daygrid"; +import timeGridPlugin from "@fullcalendar/timegrid"; +import interactionPlugin from "@fullcalendar/interaction"; +import listPlugin from "@fullcalendar/list"; +import { Modal } from 'Components/Modal/Modal'; +import ModalPrompt from 'Components/Modal/ModalPrompt'; +import "./calendar.css" + + +const Calendar = ({defaulEvents, setEvents, isCalendarFullWidth = true}) => { + const [currentEvents, setCurrentEvents] = useState([]); + const [showAddEventmodal, setShowAddEventmodal] = useState(false); + const [showDeleteEventmodal, setShowDeleteEventmodal] = useState(false); + const [newEventName, setNewEventName] = useState(''); + const [currentSelectedDate, setCurrentSelectedDate] = useState(); + const [currentSelectedEvent, setCurrentSelectedEvent] = useState(); + + const handleDateClick = (selected) => { + setShowAddEventmodal(true) + setCurrentSelectedDate(selected) + // console.log(selected) + }; + + + const handleEventsSet = (events) => { + setCurrentEvents(events) + if(setEvents){ + setEvents(events) + } + }; + + const handleAddModalSubmit = () =>{ + const calendarApi = currentSelectedDate.view.calendar; + calendarApi.unselect(); + + if (newEventName) { + setShowAddEventmodal(false) + calendarApi.addEvent({ + id: `${currentSelectedDate.dateStr}-${newEventName}`, + title: newEventName, + start: currentSelectedDate.startStr, + end: currentSelectedDate.endStr, + allDay: currentSelectedDate.allDay, + }); + } + setNewEventName('') + + } + + const handleEventClick = (selected) => { + // console.log(selected) + setCurrentSelectedEvent(selected) + setShowDeleteEventmodal(true) + }; + + const handleDeletEventClick = () => { + currentSelectedEvent.event.remove() + setShowDeleteEventmodal(false) + }; + + + + return ( + <> + +
    +
    + {/* CALENDAR SIDEBAR */} +
    +
    Events
    +
      + {currentEvents.map((event) => ( +
    • +
      +
      + {event.title} +
      +

      + {formatDate(event.start, { + year: "numeric", + month: "short", + day: "numeric", + })} +

      +
      +
    • + ))} +
    +
    + + {/* CALENDAR */} +
    + handleEventsSet(events)} + initialEvents={defaulEvents} + /> +
    +
    +
    + + setShowAddEventmodal(false)} + modalHeader={true} + classes={'w-1/2 '} + > +
    + setNewEventName(e.target.value)} /> + +
    +
    + + { + showDeleteEventmodal && + {setShowDeleteEventmodal(false)}} + message="Are you sure you want to delete this event?" + title = "Delete Event" + loading = {false} + actionHandler={handleDeletEventClick} + /> + } + + ); +}; + +export default Calendar; + \ No newline at end of file diff --git a/day20/src/components/Calendar/calendar.css b/day20/src/components/Calendar/calendar.css new file mode 100644 index 0000000..1b314a6 --- /dev/null +++ b/day20/src/components/Calendar/calendar.css @@ -0,0 +1,5 @@ + + .calendar-full-width .fc.fc-media-screen.fc-direction-ltr{ + width:100%; + } + \ No newline at end of file diff --git a/day20/src/components/Calendar/index.js b/day20/src/components/Calendar/index.js new file mode 100644 index 0000000..5a39545 --- /dev/null +++ b/day20/src/components/Calendar/index.js @@ -0,0 +1,3 @@ + + export {default as Calendar} from "./Calendar" + \ No newline at end of file diff --git a/day20/src/components/CameraToUpload/CameraToUpload.jsx b/day20/src/components/CameraToUpload/CameraToUpload.jsx new file mode 100644 index 0000000..09661d7 --- /dev/null +++ b/day20/src/components/CameraToUpload/CameraToUpload.jsx @@ -0,0 +1,323 @@ + +import React, { memo, useEffect, useRef, useState } from "react"; +import MkdSDK from "Utils/MkdSDK"; +import { AuthContext, tokenExpireError } from "Context/Auth"; +import { GlobalContext, showToast } from "Context/Global"; +import { Spinner } from "Assets/svgs"; + +const sdk = new MkdSDK(); + +const CameraToUpload = ({ onSave = undefined, uploadSuccess = undefined }) => { + const { dispatch, state } = React.useContext(AuthContext); + const { dispatch: globalDispatch, state: globalState } = + React.useContext(GlobalContext); + + const photoTrayRef = useRef(null); + const videoRef = useRef(null); + const canvasRef = useRef(null); + const [profilePictures, setProfileProfilePictures] = useState(); + const [submitLoading, setSubmitLoading] = useState(false); + const [showCamera, setShowCamera] = useState(false); + const [useFrontCam, setUseFrontCam] = useState(true); + const [photos, setPhotos] = useState([]); + + const constraints = { + video: { + facingMode: { exact: useFrontCam ? "user" : "environment" }, + advanced: [{ zoom: 1 }], + }, + }; + + const handleCapture = () => { + const video = videoRef.current; + const canvas = canvasRef.current; + const aspectRatio = video.videoWidth / video.videoHeight; + + // Calculate the aspect ratio of the video + let canvasWidth = video.offsetWidth; + let canvasHeight = canvasWidth / aspectRatio; + + if (canvasHeight > video.offsetHeight) { + canvasHeight = video.offsetHeight; + canvasWidth = canvasHeight * aspectRatio; + } + + // Set the canvas size based on the aspect ratio of the video + canvas.width = canvasWidth; + canvas.height = canvasHeight; + + // Draw the current video frame on the canvas + const context = canvas.getContext("2d"); + context.drawImage(video, 0, 0, canvasWidth, canvasHeight); + + // Get the data URL of the canvas + // const dataUrl = canvasRef.current.toDataURL("image/png"); + // setProfileProfilePictures(dataUrl); + // fileUpload(dataUrl); + // stopCapture(); + // Draw the video frame on the canvas + // const context = canvas.getContext("2d"); + // context.drawImage(video, 0, 0, canvas.width, canvas.height); + + // Convert the canvas data to a blob + canvas.toBlob((blob) => { + // Upload the blob to the server + // const formData = new FormData(); + setPhotos((prev) => [...prev, blob]); + if (!photos.length) { + photoTrayRef.current.style.maxHeight = `150px`; + } + // formData.append("file", blob); + // fileUpload(blob); + // console.log(formData); + // stopCapture(); + // fetch('/upload', { method: 'POST', body: formData }); + }); + }; + + const handleStream = (stream) => { + const video = videoRef.current; + video.style.display = "block"; + video.srcObject = stream; + video.play(); + }; + async function uploadFunction(formData) { + try { + let uploadResult = await sdk.uploadImage(formData); + + if (!uploadResult.error) { + return uploadResult?.url; // Return the response data from the server + } + } catch (error) { + throw new Error(error.message); + } + } + + const handleUpload = async () => { + if (!uploadSuccess) { + throw new Error("uploadSuccess is not a function"); + } + setSubmitLoading(true); + try { + if (photos && photos.length) { + const uploadPromises = photos.map(async (item) => { + let formData = new FormData(); + formData.append("file", item); + + // Perform the upload operation for 'item' and return the result + return uploadFunction(formData); // Replace 'uploadFunction' with your actual upload logic + }); + const uploadResults = await Promise.all(uploadPromises); + // Process uploadResults if needed + console.log(uploadResults); + showToast(globalDispatch, "Upload Successful", 5000, "success"); + uploadSuccess(uploadResults); + } + setSubmitLoading(false); + } catch (error) { + setSubmitLoading(false); + tokenExpireError( + dispatch, + error?.response?.data?.message + ? error?.response?.data?.message + : error?.message + ); + showToast( + globalDispatch, + error?.response?.data?.message + ? error?.response?.data?.message + : error?.message, + 5000, + "error" + ); + console.log(error.message); + // Handle errors + } + }; + + const handleSave = () => { + if (onSave) { + onSave(photos); + } + }; + + const handleError = (error) => { + console.error("Error accessing camera:", error); + }; + + const startCapture = async () => { + try { + // Request access to the camera + const stream = await navigator.mediaDevices.getUserMedia(constraints); + + setShowCamera(true); + // Display the camera feed on the video element + handleStream(stream); + } catch (error) { + handleError(error); + } + }; + + const stopCapture = () => { + // Stop all tracks in the stream + if (videoRef.current.srcObject) { + videoRef.current.srcObject.getTracks().forEach((track) => track.stop()); + } + setPhotos(() => []); + // // Clear the stream from state + // setStream(null); + setShowCamera(false); + // Release the camera resources + videoRef.current.srcObject = null; + }; + const removeItem = (index) => { + const tempPhotos = [...photos]; + tempPhotos.splice(index, 1); + setPhotos(() => [...tempPhotos]); + }; + + useEffect(() => { + if (photos.length === 0) { + photoTrayRef.current.style.maxHeight = null; + } + // console.log(photos); + }, [photos.length]); + useEffect(() => { + startCapture(true); + }, [useFrontCam]); + + return ( + <> +
    +
    +
    + Take picture now + + Switch to Mobile to take picture + +
    +
    startCapture()} + className={`flex h-full w-[5.625rem] min-w-[5.625rem] items-center justify-center rounded-[0rem_1.25rem] bg-blue-600 md:hidden`} + > + camera +
    +
    +

    +
    + +
    +
    +
    +
    + + + ); +}; + +export default memo(CameraToUpload); diff --git a/day20/src/components/CameraToUpload/index.js b/day20/src/components/CameraToUpload/index.js new file mode 100644 index 0000000..d833601 --- /dev/null +++ b/day20/src/components/CameraToUpload/index.js @@ -0,0 +1,4 @@ + +import {lazy} from "react"; + +export const CameraToUpload = lazy(()=> import("./CameraToUpload")) diff --git a/day20/src/components/Chat/Chat.jsx b/day20/src/components/Chat/Chat.jsx new file mode 100644 index 0000000..e332c74 --- /dev/null +++ b/day20/src/components/Chat/Chat.jsx @@ -0,0 +1,509 @@ + + import React from "react"; + import MkdSDK from "Utils/MkdSDK"; + + import moment from "moment"; + import { ImagePreviewModal } from "Components/ImagePreviewModal"; + import { CreateNewRoomModal } from "Components/CreateNewRoomModal"; + import { + UserCircleIcon, + PaperAirplaneIcon, + ArrowLeftIcon, + PaperClipIcon, + } from "@heroicons/react/20/solid"; + import { FaceSmileIcon } from "@heroicons/react/24/outline"; + import { AuthContext, tokenExpireError } from "Context/Auth"; + import InputEmoji from "react-input-emoji"; + import { renderName } from "Components/CreateNewRoomModal"; + + const Chat = ({roles=[]}) => { + const { state } = React.useContext(AuthContext); + const { dispatch } = React.useContext(AuthContext); + const [rooms, setRooms] = React.useState([]); + const [messages, setMessages] = React.useState([]); + const [chatId, setChatId] = React.useState(); + const otherUserId = React.useRef(); + const currentRooms = React.useRef(); + const inputRef = React.useRef(null); + const [message, setMessage] = React.useState(""); + const [roomId, setRoomId] = React.useState(); + const [file, setFile] = React.useState(null); + const [previewModal, showPreviewModal] = React.useState(false); + const [screenSize, setScreenSize] = React.useState(window.innerWidth); + const [showContacts, setShowContacts] = React.useState(true); + const [createRoom, setCreateRoom] = React.useState(false); + const [filteredRooms, setFilteredRooms] = React.useState([]); + + function setDimension(e) { + if (e.currentTarget.innerWidth > 1024) { + setShowContacts(true); + } + setScreenSize(e.currentTarget.innerWidth); + } + + let sdk = new MkdSDK(); + + const handleClick = () => { + inputRef.current.click(); + }; + + const cancelFileUpload = () => { + showPreviewModal(false); + setFile(null); + inputRef.current.value = ""; + }; + + const formatDate = (time) => { + let currentTime = moment(new Date()); + let messageDate = moment(time); + if (currentTime.diff(messageDate, "days") > 1) { + return moment(messageDate).format("Do MMMM"); + } else { + return moment(messageDate).format("hh:mm A"); + } + }; + + const handleFileUpload = async (e) => { + e.preventDefault(); + const formData = new FormData(); + for (let i = 0; i < file.length; i++) { + formData.append("file", file[i]); + } + try { + const upload = await sdk.uploadImage(formData); + await sendImageAsMessage(upload); + } catch (err) { + console.log(err); + } + }; + + async function handleKeyDown(event) { + if (event.key === "Enter" && !event.shiftKey) { + event.preventDefault(); + sendMessage(); + } + } + + async function getRooms(filter) { + try { + if (filter) { + return setFilteredRooms( + rooms.filter((user) => + `${renderName(user).toLowerCase()}`.includes(filter.toLowerCase()) + ) + ); + } + + const chats = await sdk.getMyRoom(); + if (chats && chats.list && chats.list[0]) { + setRooms(chats.list); + setFilteredRooms(chats.list); + currentRooms.current = chats.list; + } + } catch (err) { + console.log("Error:", err); + } + } + + async function createNewRoom(otherUser) { + try { + const createdRoom = await sdk.createRoom({ + user_id: state.user, + other_user_id: otherUser.id, + }); + let newRoom = { + chat_id: createdRoom.chat_id, + create_at: new Date(), + email: otherUser.email, + first_name: otherUser.first_name, + id: createdRoom.room_id, + last_name: otherUser.last_name, + other_user_id: otherUser.id, + other_user_update_at: new Date(), + photo: otherUser.photo, + unread: 0, + update_at: new Date(), + user_id: state.user, + user_update_at: new Date(), + }; + + const updatedRoomList = [newRoom, ...rooms]; + setRooms(updatedRoomList); + setFilteredRooms(updatedRoomList); + currentRooms.current = updatedRoomList; + setCreateRoom(false); + + if (document.getElementById(`user-${otherUser.id}`)) { + document.getElementById(`user-${otherUser.id}`).click(); + } else { + setTimeout(() => { + document.querySelector(".container-chat").firstChild.click(); + }, 200); + } + } catch (err) { + setCreateRoom(false); + document.getElementById(`user-${otherUser.id}`).click(); + } + } + + async function getChats(room_id, chat_id) { + try { + setRoomId(room_id); + setChatId(chat_id); + let date = new Date().toISOString().split("T")[0]; + const messages = await sdk.getChats(room_id, chat_id, date); + if (messages && messages.model) { + setMessages(messages.model.reverse()); + } + } catch (err) { + console.log("Error:", err); + } + } + + async function sendMessage() { + try { + let date = new Date().toISOString().split("T")[0]; + await sdk.postMessage({ + room_id: roomId, + chat_id: chatId, + user_id: state.user, + message, + date, + }); + let newMessageObj = { + message: message, + user_id: state.user, + is_image: false, + timeStamp: new Date(), + }; + const updatedMessages = [...messages, newMessageObj]; + setMessages(updatedMessages); + setMessage(""); + } catch (err) { + console.log("Error:", err); + } + } + + async function sendImageAsMessage(upload) { + try { + let date = new Date().toISOString().split("T")[0]; + await sdk.postMessage({ + room_id: roomId, + chat_id: chatId, + user_id: state.user, + message: upload.url, + date, + is_image: true, + }); + let newMessageObj = { + message: upload.url, + user_id: state.user, + is_image: true, + timeStamp: new Date(), + }; + const updatedMessages = [...messages, newMessageObj]; + setMessages(updatedMessages); + showPreviewModal(false); + setFile(null); + inputRef.current.value = ""; + setMessage(""); + } catch (err) { + console.log("Error:", err); + } + } + + async function startPooling() { + try { + const pool = await sdk.startPooling(state.user); + if (pool.message) { + let newMessageObj = { + message: pool.message, + user_id: pool.user_id, + is_image: false, + timeStamp: new Date(), + }; + if (pool.user_id === otherUserId.current) { + setMessages((prevMessages) => [...prevMessages, newMessageObj]); + setTimeout(async () => { + await startPooling(); + }, 2000); + } else { + setTimeout(async () => { + await startPooling(); + }, 1000); + } + } else { + setTimeout(async () => { + startPooling(); + }, 1000); + } + } catch (err) { + console.log(err.message); + tokenExpireError(dispatch, err.message); + if (err.message === "TOKEN_EXPIRED") + window.location.replace(`/${state.role}/login/`); + else + setTimeout(async () => { + startPooling(); + }, 500); + } + } + + React.useEffect(() => { + (async function () { + await getRooms(); + await startPooling(); + })(); + }, []); + + React.useEffect(() => { + window.addEventListener("resize", setDimension); + + return () => { + window.removeEventListener("resize", setDimension); + }; + }, [screenSize]); + + return ( +
    +
    +
    +
    +

    Chat

    +
    +
    + {showContacts && ( + <> +
    + +
    +
    +
    + getRooms(e.target.value)} + /> +
    + +
    + {filteredRooms && + filteredRooms.map((room, idx) => ( +
    { + getChats(room.id, room.chat_id); + otherUserId.current = room.other_user_id; + otherUserId.currentRoom = room; + if (screenSize < 1024) { + setShowContacts(false); + } + }} + > +
    +
    + {room.photo ? ( + user-photo + ) : ( + + )} +
    +
    +
    +
    + + {renderName(room)} + +
    +
    +
    +
    + + {formatDate(room.update_at)} + +
    + {room.unread > 0 && ( +
    + + {room.unread} + +
    + )} +
    +
    + ))} +
    +
    + + )} + + {screenSize > 1023 || (screenSize < 1024 && !showContacts) ? ( +
    + {otherUserId?.current ? ( +
    +
    +

    + setShowContacts(true)} + > + + + Chatting with{" "} + {`${renderName( + otherUserId.currentRoom + )}`} +

    +
    + + {messages && ( +
    + {messages.map((message, idx) => ( +
    + {message?.user_id !== state.user && ( +
    +
    + +
    +
    + )} +
    +
    + {message.is_image ? ( + + ) : ( +

    + {message?.message} +

    + )} +
    +
    + + {moment(message.timestamp).format("hh:mm A")} + +
    +
    +
    + ))} +
    + )} + +
    +
    + {/*
    + + + +
    */} + +
    + {/* */} + {}} + placeholder="Type a message" + /> +
    +
    +
    + + { + setFile(e.target.files); + showPreviewModal(true); + }} + /> + + +
    +
    + +
    +
    +
    +
    +
    + ) : ( +
    + Select a Chat to view +
    + )} +
    + ) : null} +
    +
    +
    + {previewModal && file ? ( + + ) : null} + {createRoom && ( + + )} +
    + ); + }; + + export default Chat; + + diff --git a/day20/src/components/Chat/index.js b/day20/src/components/Chat/index.js new file mode 100644 index 0000000..960d765 --- /dev/null +++ b/day20/src/components/Chat/index.js @@ -0,0 +1,5 @@ + + import { lazy } from 'react' + + export const Chat = lazy(()=> import("./Chat")) + \ No newline at end of file diff --git a/day20/src/components/ChatBot/Chat.jsx b/day20/src/components/ChatBot/Chat.jsx new file mode 100644 index 0000000..942a4d1 --- /dev/null +++ b/day20/src/components/ChatBot/Chat.jsx @@ -0,0 +1,233 @@ +import { useContext, useEffect, useRef, useState } from "react"; +import { FiSend } from "react-icons/fi"; +import { BsPlusLg } from "react-icons/bs"; +import { RxHamburgerMenu } from "react-icons/rx"; + +import Message from "./Message"; +import { homePage } from "./ChatUtils"; + +import MkdSDK from "Utils/MkdSDK"; +import { GlobalContext } from "Context/Global"; +import { AuthContext, tokenExpireError } from "Context/Auth"; + +const Chat = (props) => { + const { toggleComponentVisibility, index, currentRoom } = props; + + const { state, dispatch } = useContext(GlobalContext); + const { dispatch: authDispatch } = useContext(AuthContext); + const [isLoading, setIsLoading] = useState(false); + const [errorMessage, setErrorMessage] = useState(""); + const [showEmptyChat, setShowEmptyChat] = useState(true); + const [conversation, setConversation] = useState([]); + const [message, setMessage] = useState(""); + const [generating, setGenerating] = useState(false); + const bottomOfChatRef = useRef(null); + + let sdk = new MkdSDK(); + + useEffect(() => { + if (bottomOfChatRef.current) { + bottomOfChatRef.current.scrollIntoView({ behavior: "smooth" }); + } + }, [conversation]); + + const sendMessage = async (e) => { + // Don't send empty messages + if (message.length < 1) { + setErrorMessage("Please enter a message."); + return; + } else { + setErrorMessage(""); + dispatch({ + type: "SETROOM", + payload: { position: props.index, value: message }, + }); + } + + setIsLoading(true); + + // Add the message to the conversation + setConversation([ + ...conversation, + { content: message, role: "user", content2: null, role2: "system" }, + ]); + + // Clear the message & remove empty chat + setMessage(""); + setShowEmptyChat(false); + + try { + setGenerating(true); + const response = await sdk.chatGPT(message); + + if (response.ok) { + const data = await response.json(); + setGenerating(false); + + // Add the message to the conversation + setConversation([ + ...conversation, + { + content: message, + role: "user", + content2: data.Answer, + role2: "system", + }, + ]); + } else { + console.error(response); + setGenerating(false); + + setErrorMessage(response.statusText); + } + + setIsLoading(false); + } catch (error) { + console.error(error); + setGenerating(false); + setErrorMessage(error.message); + tokenExpireError( + authDispatch, + error?.response?.data?.messsage + ? error?.response?.data?.messsage + : error?.message + ); + setIsLoading(false); + } + }; + + const handleKeypress = (e) => { + // It's triggers by pressing the enter key + if (e.keyCode == 13 && !e.shiftKey) { + sendMessage(e); + e.preventDefault(); + } + }; + + return ( +
    + ); +}; + +export default BoardCardsPage; + + \ No newline at end of file diff --git a/day20/src/components/MkdTrelloColumns/CardMember.jsx b/day20/src/components/MkdTrelloColumns/CardMember.jsx new file mode 100644 index 0000000..a7a447e --- /dev/null +++ b/day20/src/components/MkdTrelloColumns/CardMember.jsx @@ -0,0 +1,214 @@ +import { AuthContext } from "Context/Auth"; +import { GlobalContext } from "Context/Global"; +import MkdSDK from "Utils/MkdSDK"; +import React from "react"; +import { useParams } from "react-router"; +import CardMemberCard from "./CardMemberCard"; + +let sdk = new MkdSDK(); + +const CardMember = ({ cardId }) => { + const { dispatch } = React.useContext(AuthContext); + const { dispatch: globalDispatch } = React.useContext(GlobalContext); + const [showForm, setShowForm] = React.useState(false); + const [users, setUsers] = React.useState([]); + const [cardMembers, setCardMembers] = React.useState([]); + + const { workspaceId } = useParams(); + + const getWorkspaceMember = async () => { + try { + const result = await sdk.callRawAPI( + `/v2/api/lambda/pm/workspaces/${workspaceId}/members`, + {}, + "GET" + ); + console.log(result, "workspaces member"); + if (!result.error) { + setUsers(result.list); + } + } catch (error) { + console.log("ERROR", error); + tokenExpireError(dispatch, error.message); + } + }; + + const getCardUsers = async () => { + try { + const result = await sdk.callRawAPI( + `/v2/api/lambda/pm/cards/${cardId}/members`, + {}, + "GET" + ); + console.log(result, "Cardmember result"); + // setUsers(result); + if (!result.error) { + setCardMembers(result.list); + } + } catch (error) { + console.log("ERROR", error); + tokenExpireError(dispatch, error.message); + } + }; + + const assigneMember = async (id) => { + console.log(id); + + try { + const result = await sdk.callRawAPI( + `/v2/api/lambda/pm/cards/${cardId}/members/${id}/attach`, + {}, + "POST" + ); + console.log(result, "Assinged result"); + if (!result.error) { + showToast(globalDispatch, "User Added"); + getCardUsers(); + } + } catch (error) { + console.log("ERROR", error); + tokenExpireError(dispatch, error.message); + } + }; + + console.log(users, cardMembers, "users"); + + React.useEffect(() => { + (async function () { + await getWorkspaceMember(); + })(); + (async function () { + await getCardUsers(); + })(); + }, []); + + return ( +
    + {cardMembers.length === 0 ? ( +
    setShowForm(true)} + className=" relative mt-4 rounded-sm bg-[#c7c8d4] " + > +

    + add member +

    +
    + ) : ( + <> +
    +

    + + + + Members +

    +
    +
      + {cardMembers?.map((item, i) => ( + + ))} +
    • +

      setShowForm(true)} + className=" mr-[1px] flex h-[40px] w-[40px] cursor-pointer items-center justify-center rounded-full bg-[#b1b1c8] text-[20px] font-bold uppercase text-white shadow-[0_0_3px_0_#1111115e] hover:bg-[#9e9ecf] " + > + + + +

      +
    • +
    + + )} + + {showForm && ( +
    +
    setShowForm(false)} + className=" absolute left-0 top-0 h-full w-full bg-[#0000004f] " + /> +
    +
    +
    +

    Members

    + +
    +
    + {users.map((item, i) => ( +
    assigneMember(item.id)} + > +

    + {item.first_name ? item.first_name.substring(0, 1) : "N"} + {item.last_name ? item.last_name.substring(0, 1) : "/A"} +

    +

    + {" "} + {`${ + item.first_name + ? `${item.first_name} ${ + item.last_name ? item.last_name : "N/A" + }` + : "N/A" + }`} +

    +
    + ))} +
    +
    +
    +
    + )} +
    + ); +}; + +export default CardMember; + + \ No newline at end of file diff --git a/day20/src/components/MkdTrelloColumns/CardMemberCard.jsx b/day20/src/components/MkdTrelloColumns/CardMemberCard.jsx new file mode 100644 index 0000000..b7b05d4 --- /dev/null +++ b/day20/src/components/MkdTrelloColumns/CardMemberCard.jsx @@ -0,0 +1,104 @@ +import { AuthContext } from "Context/Auth"; +import { GlobalContext } from "Context/Global"; +import MkdSDK from "Utils/MkdSDK"; +import React from "react"; + +let sdk = new MkdSDK(); + +const CardMemberCard = ({ cardId, item, getCardUsers }) => { + const { dispatch } = React.useContext(AuthContext); + const { dispatch: globalDispatch } = React.useContext(GlobalContext); + const [cardMemberProfilePopup, setCardMemberProfilePopup] = + React.useState(false); + + console.log(item); + const removeMember = async () => { + try { + const result = await sdk.callRawAPI( + `/v2/api/lambda/pm/cards/${cardId}/members/${item.user_id}/detach`, + {}, + "DELETE" + ); + console.log(result, "attachment deleted"); + if (!result.error) { + showToast(globalDispatch, "User Removed"); + getCardUsers(); + setCardMemberProfilePopup(false); + } + } catch (error) { + console.log("ERROR", error); + tokenExpireError(dispatch, error.message); + } + }; + + return ( + <> +
  • +

    setCardMemberProfilePopup(true)} + className=" mr-[3px] flex h-[40px] w-[40px] cursor-pointer items-center justify-center rounded-full bg-[#DE350B] text-[16px] font-bold uppercase text-white shadow-[0_0_3px_0_#1111115e] hover:bg-[#b22b09] " + > + {item.first_name ? item.first_name.substring(0, 1) : "N"} + {item.last_name ? item.last_name.substring(0, 1) : "/A"} +

    +
  • + {cardMemberProfilePopup && ( +
    +
    setCardMemberProfilePopup(false)} + className=" absolute left-0 top-0 h-full w-full bg-[#0000004f] " + /> +
    +
    +
    +

    + {" "} + {item.first_name + ? `${item.first_name} ${ + item.last_name ? item.last_name : "" + }` + : "N/A"} + {} +

    + +
    + +
    +
      +
    • + Remove from card +
    • +
    +
    +
    +
    +
    + )} + + ); +}; + +export default CardMemberCard; + + \ No newline at end of file diff --git a/day20/src/components/MkdTrelloColumns/Col.jsx b/day20/src/components/MkdTrelloColumns/Col.jsx new file mode 100644 index 0000000..f4e0888 --- /dev/null +++ b/day20/src/components/MkdTrelloColumns/Col.jsx @@ -0,0 +1,21 @@ +import React from "react"; + +const Col = ({ isOver, children }) => { + const className = isOver + ? "bg-[#f5eaea] min-h-[6.25rem] rounded-[.3125rem]" + : ""; + + return ( +
    + {children} +
    + ); +}; + +export default Col; + + \ No newline at end of file diff --git a/day20/src/components/MkdTrelloColumns/Comment.jsx b/day20/src/components/MkdTrelloColumns/Comment.jsx new file mode 100644 index 0000000..7725f27 --- /dev/null +++ b/day20/src/components/MkdTrelloColumns/Comment.jsx @@ -0,0 +1,260 @@ +import React from "react"; +import moment from "moment"; +import MkdSDK from "Utils/MkdSDK"; +import { GlobalContext, showToast } from "Context/Global"; +import { AuthContext } from "Context/Auth"; +import LinkifyText from "./LinkifyText"; +import CommentReplyBox from "./CommentReplyBox"; + +let sdk = new MkdSDK(); + +const Comment = ({ cardId, comment, deleteComment, getComment }) => { + const { dispatch } = React.useContext(AuthContext); + const { dispatch: globalDispatch } = React.useContext(GlobalContext); + const [commentText, setCommentText] = React.useState(); + const [commentBoxShow, setCommentBoxShow] = React.useState(false); + const [replyCommentBoxShow, setReplyCommentBoxShow] = React.useState(false); + const [textareaHeight, setTextareaHeight] = React.useState(20); + const textareaRef = React.useRef(null); + const user_id = JSON.parse(localStorage.getItem("user")); + + const onSubmit = async (_data) => { + try { + const result = await sdk.callRawAPI( + `/v2/api/lambda/pm/cards/${cardId}/comments/${comment.id}`, + { + comment: JSON.stringify(commentText.split(` +`)), + // attachment: "/uploads/1678393390494-334071424_1672975889824064_4323871217183033675_n.jpg", + }, + "PUT" + ); + console.log(result); + if (!result.error) { + showToast(globalDispatch, "Comment is Added"); + // getData(); + setCommentText(""); + setCommentBoxShow(!commentBoxShow); + getComment(); + } + } catch (error) { + console.log("Error", error); + tokenExpireError(dispatch, error.message); + } + }; + + React.useEffect(() => { + if (textareaRef.current) { + textareaRef.current.style.height = "0px"; + const scrollHeight = textareaRef.current.scrollHeight; + textareaRef.current.style.height = scrollHeight + "px"; + } + }, [commentText]); + + React.useEffect(() => { + setCommentText(JSON.parse(comment?.comment).join(` +`)); + if (textareaRef.current) { + textareaRef.current.style.height = "0px"; + const scrollHeight = textareaRef.current.scrollHeight; + textareaRef.current.style.height = scrollHeight + "px"; + } + }, [commentBoxShow]); + + // console.log(comment.comment, "commentsList"); + return ( +
    +
    + {/* */} + {!comment.parent_id && ( +

    + ys +

    + )} +
    +
    + {commentBoxShow ? ( +
    +
    + + +
    +
    + {commentText ? ( + + ) : ( + + )} + +
    +
      +
    • + + + +
    • +
    +
    +
    +
    + ) : ( +
    +
    + + Yea Sin + {" "} + + {moment(comment.update_at) + .startOf(new Date(), "hour") + .fromNow()} + +
    + + + + {/*

    +

    + + {comment?.comment} + +

    + */} +
      + {user_id === comment.user_id && ( + <> +
    • + +
    • +

      +
    • + +
    • +

      + + )} + +
    • + +
    • +
    +
    + )} + {replyCommentBoxShow && ( + <> + + + )} +
    +
    + ); +}; + +export default Comment; + + \ No newline at end of file diff --git a/day20/src/components/MkdTrelloColumns/CommentForm.jsx b/day20/src/components/MkdTrelloColumns/CommentForm.jsx new file mode 100644 index 0000000..7a95860 --- /dev/null +++ b/day20/src/components/MkdTrelloColumns/CommentForm.jsx @@ -0,0 +1,197 @@ +import React from "react"; +import { AuthContext } from "Context/Auth"; +import { GlobalContext } from "Context/Global"; +import MkdSDK from "Utils/MkdSDK"; + +let sdk = new MkdSDK(); + +const CommentForm = ({ cardId, getComment }) => { + const { dispatch } = React.useContext(AuthContext); + const { dispatch: globalDispatch } = React.useContext(GlobalContext); + const [commentText, setCommentText] = React.useState(""); + const [commentBoxShow, setCommentBoxShow] = React.useState(false); + const [textareaHeight, setTextareaHeight] = React.useState(20); + const [attachment, setAttachment] = React.useState(""); + const textareaRef = React.useRef(null); + + const onSubmit = async (_data) => { + try { + let formData = new FormData(); + formData.append("file", attachment); + const attachmentUrl = await sdk.uploadImage(formData); + const result = await sdk.callRawAPI( + `/v2/api/lambda/pm/cards/${cardId}/comments`, + { + comment: JSON.stringify(commentText.split(` +`)), + attachment: attachmentUrl.url ? attachmentUrl.url : "", + }, + "POST" + ); + console.log(result); + if (!result.error) { + showToast(globalDispatch, "Comment is Added"); + // getData(); + setCommentText(""); + setCommentBoxShow(!commentBoxShow); + getComment(); + } + } catch (error) { + console.log("Error", error); + tokenExpireError(dispatch, error.message); + } + }; + + const attachmentHanle = async (e) => { + setAttachment(e.target.files[0]); + console.log(e.target.files[0].name); + + // try { + // let formData = new FormData(); + // formData.append("file", e.target.files[0]); + // const attachment = await sdk.uploadImage(formData); + // console.log(attachment); + // if (attachment.url) { + // setAttachmentUrl(attachment.url); + // const result = await sdk.callRawAPI( + // `/v2/api/lambda/pm/cards/${cardId}/attachments`, + // { + // name: e.target.files[0].name, + // attachment: attachment.url, + // }, + // "POST" + // ); + // console.log(result, "attachment uploaded"); + // if (!result.error) { + // setCommentText( + // `${commentText} [${e.target.files[0].name}] (${attachment.url})` + // ); + // } + // } + // } catch (error) { + // console.log("ERROR", error); + // tokenExpireError(dispatch, error.message); + // } + }; + + React.useEffect(() => { + if (textareaRef.current) { + textareaRef.current.style.height = "0px"; + const scrollHeight = textareaRef.current.scrollHeight; + textareaRef.current.style.height = scrollHeight + "px"; + } + }, [commentText]); + console.log(commentText.split(` +`)); + return ( +
    +
    + {/* */} +

    + ys +

    +
    + {commentBoxShow ? ( +
    +
    + + +
    +
    + {commentText ? ( + + ) : ( + + )} + +
    +
      +
    • + + + + +
    • +
    +
    +
    +
    + ) : ( + + )} +
    + ); +}; + +export default CommentForm; + + \ No newline at end of file diff --git a/day20/src/components/MkdTrelloColumns/CommentReplyBox.jsx b/day20/src/components/MkdTrelloColumns/CommentReplyBox.jsx new file mode 100644 index 0000000..bd09317 --- /dev/null +++ b/day20/src/components/MkdTrelloColumns/CommentReplyBox.jsx @@ -0,0 +1,185 @@ +import React from "react"; + import { AuthContext } from "Context/Auth"; +import { GlobalContext } from "Context/Global"; +import MkdSDK from "Utils/MkdSDK"; + +const CommentReplyBox = ({ + replyCommentBoxShow, + setReplyCommentBoxShow, + parentId, + cardId, + getComment, +}) => { + let sdk = new MkdSDK(); + + const { dispatch } = React.useContext(AuthContext); + const { dispatch: globalDispatch } = React.useContext(GlobalContext); + const [commentText, setCommentText] = React.useState(); + const [commentBoxShow, setCommentBoxShow] = React.useState(false); + const [attachment, setAttachment] = React.useState(""); + // const [replyCommentBoxShow, setReplyCommentBoxShow] = React.useState(false); + const [textareaHeight, setTextareaHeight] = React.useState(20); + + const textareaRef = React.useRef(null); + const user_id = JSON.parse(localStorage.getItem("user")); + + const onSubmit = async (_data) => { + try { + let formData = new FormData(); + formData.append("file", attachment); + const attachment = await sdk.uploadImage(formData); + const result = await sdk.callRawAPI( + `/v2/api/lambda/pm/cards/${cardId}/comments`, + { + comment: JSON.stringify(commentText.split(` +`)), + parent_id: parentId, + attachment: attachment.url ? attachment.url : "", + }, + "POST" + ); + console.log(result); + if (!result.error) { + showToast(globalDispatch, "Comment is Added"); + // getData(); + setCommentText(""); + setReplyCommentBoxShow(!replyCommentBoxShow); + getComment(); + } + } catch (error) { + console.log("Error", error); + tokenExpireError(dispatch, error.message); + } + }; + + const attachmentHanle = async (e) => { + let sdk = new MkdSDK(); + console.log(e.target.files); + console.log(e.target.files[0].name); + setAttachment(e.target.files[0]); + + // try { + // let formData = new FormData(); + // formData.append("file", e.target.files[0]); + // const attachment = await sdk.uploadImage(formData); + // console.log(attachment); + // if (attachment.url) { + // setAttachmentUrl(attachment.url); + // const result = await sdk.callRawAPI( + // `/v2/api/lambda/pm/cards/${cardId}/attachments`, + // { + // name: e.target.files[0].name, + // attachment: attachment.url, + // }, + // "POST" + // ); + // console.log(result, "attachment uploaded"); + // if (!result.error) { + // setCommentText( + // `${commentText} [${e.target.files[0].name}] (${attachment.url})` + // ); + // } + // } + // } catch (error) { + // console.log("ERROR", error); + // tokenExpireError(dispatch, error.message); + // } + }; + + React.useEffect(() => { + if (textareaRef.current) { + textareaRef.current.style.height = "0px"; + const scrollHeight = textareaRef.current.scrollHeight; + textareaRef.current.style.height = scrollHeight + "px"; + } + }, [commentText]); + + return ( +
    +
    + + +
    +
    + {commentText ? ( + + ) : ( + + )} + +
    +
      +
    • + + + +
    • +
    +
    +
    +
    + ); +}; + +export default CommentReplyBox; + + \ No newline at end of file diff --git a/day20/src/components/MkdTrelloColumns/CreateNewRoomModal.jsx b/day20/src/components/MkdTrelloColumns/CreateNewRoomModal.jsx new file mode 100644 index 0000000..83cacf5 --- /dev/null +++ b/day20/src/components/MkdTrelloColumns/CreateNewRoomModal.jsx @@ -0,0 +1,89 @@ +import React from "react"; + import { AuthContext } from "Context/Auth"; +import MkdSDK from "Utils/MkdSDK"; + +const CreateNewRoomModal = ({ createNewRoom, setCreateRoom }) => { + const [otherUsers, setOtherUsers] = React.useState(); + const [unfilteredUsers, setUnfilteredUsers] = React.useState(); + const [search, setSearch] = React.useState(""); + const { state } = React.useContext(AuthContext); + + let sdk = new MkdSDK(); + const getAllUsers = async () => { + try { + let users = await sdk.getAllUsers(); + + if (!users.error) { + setOtherUsers(users?.list.filter((user) => user.id !== state.user)); + setUnfilteredUsers( + users?.list.filter((user) => user.id !== state.user) + ); + } + } catch (err) { + console.log("Error", err); + } + }; + + const filterList = (value) => { + setSearch(value); + if (value.length > 0) { + setOtherUsers( + [...unfilteredUsers].filter((user) => + `${user.first_name.toLowerCase()} ${user.last_name.toLowerCase()}`.includes( + value.toLowerCase() + ) + ) + ); + } else { + setOtherUsers(unfilteredUsers); + } + }; + + React.useEffect(() => { + (async function () { + await getAllUsers(); + })(); + }, []); + + return ( + <> +
    +
    setCreateRoom(false)} + >
    +
    +
    +
    +
    + filterList(e.target.value)} + /> +
      + {otherUsers && + otherUsers.map((user) => ( +
    • createNewRoom(user)} + className={`w-full cursor-pointer bg-white px-4 py-2 hover:bg-gray-200 user-${user.id}`} + > + {user.first_name} {user.last_name} +
    • + ))} +
    +
    +
    +
    +
    +
    + + ); +}; + +export default CreateNewRoomModal; + + \ No newline at end of file diff --git a/day20/src/components/MkdTrelloColumns/DropWrapper.jsx b/day20/src/components/MkdTrelloColumns/DropWrapper.jsx new file mode 100644 index 0000000..828a675 --- /dev/null +++ b/day20/src/components/MkdTrelloColumns/DropWrapper.jsx @@ -0,0 +1,34 @@ +import React from "react"; +import { useDrop } from "react-dnd"; +import { statuses } from "./data"; +import ITEM_TYPE from "./data/types"; + +const DropWrapper = ({ onDrop, children, status }) => { + const [{ isOver }, drop] = useDrop({ + accept: ITEM_TYPE, + canDrop: (item, monitor) => { + const itemIndex = statuses.findIndex((si) => si.status === item.status); + const statusIndex = statuses.findIndex((si) => si.status === status); + return [itemIndex + 1, itemIndex - 1, itemIndex].includes(statusIndex); + }, + drop: (item, monitor) => { + onDrop(item, monitor, status); + }, + collect: (monitor) => ({ + isOver: monitor.isOver(), + }), + }); + + return ( +
    + {React.cloneElement(children, { isOver })} +
    + ); +}; + +export default DropWrapper; + + \ No newline at end of file diff --git a/day20/src/components/MkdTrelloColumns/InstandEditor.jsx b/day20/src/components/MkdTrelloColumns/InstandEditor.jsx new file mode 100644 index 0000000..7c7e609 --- /dev/null +++ b/day20/src/components/MkdTrelloColumns/InstandEditor.jsx @@ -0,0 +1,115 @@ +import React, {useContext} from "react"; +import { useForm } from "react-hook-form"; +import { yupResolver } from "@hookform/resolvers/yup"; +import * as yup from "yup"; +import MkdSDK from "Utils/MkdSDK"; +import { AuthContext} from "Context/Auth"; + +const InstandEditor = ({ setShowInstandEditor, item, list, getData }) => { + const {dispatch} = useContext(AuthContext); + + const schema = yup.object({ + name: yup.string().required("Title is required"), + }); + const { + register, + handleSubmit, + setError, + reset, + setValue, + formState: { errors }, + } = useForm({ + resolver: yupResolver(schema), + }); + console.log(item, list); + + const onSubmit = async (_data) => { + let sdk = new MkdSDK(); + console.log(_data); + try { + const result = await sdk.callRawAPI( + `/v2/api/lambda/pm/lists/${list.status}/cards/${item.id}`, + { name: _data.name }, + "PUT" + ); + console.log(result); + if (!result.error) { + getData(); + setShowInstandEditor(false); + } + } catch (error) { + console.log("Error", error); + tokenExpireError(dispatch, error.message); + } + }; + + React.useEffect(() => { + setValue("name", item.content); + }, []); + + return ( +
    +
    setShowInstandEditor(false)} + className="fixed left-0 top-0 z-[99999] h-full w-full bg-[#11111169]" + >
    +
    +
    + +

    {errors.name?.message}

    +
    + +
    + + +
    +
    +
    + ); +}; + +export default InstandEditor; + + \ No newline at end of file diff --git a/day20/src/components/MkdTrelloColumns/Item.jsx b/day20/src/components/MkdTrelloColumns/Item.jsx new file mode 100644 index 0000000..eafeb93 --- /dev/null +++ b/day20/src/components/MkdTrelloColumns/Item.jsx @@ -0,0 +1,108 @@ +import React, { Fragment, useState, useRef } from "react"; +import { useDrag, useDrop } from "react-dnd"; +import Window from "./Window"; +import ITEM_TYPE from "./data/types"; +import InstandEditor from "./InstandEditor"; + +const Item = ({ item, index, moveItem, list, getData }) => { + const ref = useRef(null); + const [showInstandEditor, setShowInstandEditor] = React.useState(false); + const [show, setShow] = useState(false); + + const [, drop] = useDrop({ + accept: ITEM_TYPE, + hover(item, monitor) { + if (!ref.current) { + return; + } + const dragIndex = item.index; + const hoverIndex = index; + + if (dragIndex === hoverIndex) { + return; + } + + const hoveredRect = ref.current.getBoundingClientRect(); + const hoverMiddleY = (hoveredRect.bottom - hoveredRect.top) / 2; + const mousePosition = monitor.getClientOffset(); + const hoverClientY = mousePosition.y - hoveredRect.top; + + if (dragIndex < hoverIndex && hoverClientY < hoverMiddleY) { + return; + } + + if (dragIndex > hoverIndex && hoverClientY > hoverMiddleY) { + return; + } + + moveItem(dragIndex, hoverIndex); + item.index = hoverIndex; + }, + }); + + const [{ isDragging }, drag] = useDrag({ + type: ITEM_TYPE, + item: { type: ITEM_TYPE, ...item, index }, + collect: (monitor) => ({ + isDragging: monitor.isDragging(), + }), + }); + + drag(drop(ref)); + + const onOpen = () => setShow(true); + const onClose = () => setShow(false); + + return ( + +
    +
    + {/*
    */} +

    {item.content}

    +
    + +
    + {show && } + {showInstandEditor && ( + + )} + + ); +}; + +export default Item; + + \ No newline at end of file diff --git a/day20/src/components/MkdTrelloColumns/LIstItems.jsx b/day20/src/components/MkdTrelloColumns/LIstItems.jsx new file mode 100644 index 0000000..f998cdb --- /dev/null +++ b/day20/src/components/MkdTrelloColumns/LIstItems.jsx @@ -0,0 +1,257 @@ +import React from "react"; +import { useForm } from "react-hook-form"; +import { yupResolver } from "@hookform/resolvers/yup"; +import * as yup from "yup"; +import { GlobalContext, showToast } from "Context/Global"; +import { AuthContext, tokenExpireError } from "Context/Auth"; +import MkdSDK from "Utils/MkdSDK"; +import ListSetting from "./ListSetting"; +import DropWrapper from "./DropWrapper"; +import Item from "./Item"; +import Col from "./Col"; + +const LIstItems = ({ + list, + cardItems, + getData, + statuses, + items, + setItems, + setCurrentTableData, +}) => { + const [cardFormShow, setCardFormShow] = React.useState(false); + const { dispatch } = React.useContext(AuthContext); + const { dispatch: globalDispatch } = React.useContext(GlobalContext); + + const schema = yup.object({ + name: yup.string().required("Title is required"), + }); + const { + register, + handleSubmit, + setError, + reset, + formState: { errors }, + } = useForm({ + resolver: yupResolver(schema), + }); + + const onDrop = (item, monitor, status) => { + const mapping = statuses.find((si) => si.status === status); + + setItems((prevState) => { + const newItems = prevState + .filter((i) => i?.id !== item?.id) + .concat({ ...item, status, icon: mapping?.icon }); + return [...newItems]; + }); + + // console.log(item, status, monitor, "now"); + updateCardListId(item, status); + }; + + const moveItem = (dragIndex, hoverIndex) => { + const item = items[dragIndex]; + setItems((prevState) => { + const newItems = prevState.filter((i, idx) => idx !== dragIndex); + newItems.splice(hoverIndex, 0, item); + return [...newItems]; + }); + }; + + const updateCardListId = async (item, status) => { + console.log(item, status); + let sdk = new MkdSDK(); + + try { + const result = await sdk.callRawAPI( + `/v2/api/lambda/pm/lists/${status}/cards/${item.id}`, + { list_id: status }, + "PUT" + ); + console.log(result); + if (!result.error) { + setCurrentTableData(() => []); + getData(); + } + } catch (error) { + console.log("Error", error); + tokenExpireError(dispatch, error.message); + } + }; + const onSubmit = async (_data) => { + let sdk = new MkdSDK(); + console.log(_data); + + try { + const result = await sdk.callRawAPI( + `/v2/api/lambda/pm/lists/${list.status}/cards`, + { + name: _data.name, + start_date: new Date().toISOString().split("T")[0], + due_date: new Date().toISOString().split("T")[0], + }, + "POST" + ); + if (!result.error) { + showToast(globalDispatch, "Added"); + setCurrentTableData(() => []); + getData(); + reset(); + setCardFormShow(!cardFormShow); + } else { + if (result.validation) { + const keys = Object.keys(result.validation); + for (let i = 0; i < keys.length; i++) { + const field = keys[i]; + setError(field, { + type: "manual", + message: result.validation[field], + }); + } + } + } + } catch (error) { + console.log("Error", error); + setError("name", { + type: "manual", + message: error.message, + }); + tokenExpireError(dispatch, error.message); + } + }; + + return ( + <> +
    +
    +

    + {list.title.toUpperCase()}{" "} +

    + + +
    + + + {cardItems.map((i, idx) => ( + + ))} + {/* {items + .filter((i) => i.status == s.status) + .map((i, idx) => ( + + ))} */} + { + <> + {!cardFormShow && ( + + )} + + {cardFormShow && ( +
    +
    + +

    + {errors.name?.message} +

    +
    + +
    + + +
    +
    + )} + + } + +
    +
    + + ); +}; + +export default LIstItems; + + \ No newline at end of file diff --git a/day20/src/components/MkdTrelloColumns/LinkifyText.jsx b/day20/src/components/MkdTrelloColumns/LinkifyText.jsx new file mode 100644 index 0000000..4aaa3b8 --- /dev/null +++ b/day20/src/components/MkdTrelloColumns/LinkifyText.jsx @@ -0,0 +1,64 @@ +import React from "react"; + +const LinkifyText = ({ comment, attachment }) => { + // React.useEffect(() => { + // JSON.parse(comment).map((com) => { + // let parts = com.match(/(?<=[).*?(?=])/g); + // let parts2 = com.match(/(([^)]+))/); + // console.log(com.split("["), "linked text"); + // }); + // }, []); + return ( +
    +
    + {" "} + {attachment && ( + + + + + + )} +
    + {comment + ? JSON.parse(comment).map((com, i) => ( + + {com.match(/(([^)]+))/) ? ( + <> + {com.split("[")[0]} + + {com.match(/(?<=[).*?(?=])/g)[0]} + + {com.split(")")[1]} + + ) : ( + com + )} +
    +
    + )) + : "N/A"} + {/* {comment?.comment ? comment?.comment : "N/A"} */} +
    + ); +}; + +export default LinkifyText; + + \ No newline at end of file diff --git a/day20/src/components/MkdTrelloColumns/ListSetting.jsx b/day20/src/components/MkdTrelloColumns/ListSetting.jsx new file mode 100644 index 0000000..f1f85ea --- /dev/null +++ b/day20/src/components/MkdTrelloColumns/ListSetting.jsx @@ -0,0 +1,387 @@ +import React from "react"; +import { useParams } from "react-router"; +import AlartMolad from "./AlartMolad"; +import { AuthContext } from "Context/Auth"; +import { GlobalContext } from "Context/Global"; +import MkdSDK from "Utils/MkdSDK"; + +const ListSetting = ({ cardFormShow, setCardFormShow, list, getData }) => { + const { dispatch } = React.useContext(AuthContext); + const { dispatch: globalDispatch } = React.useContext(GlobalContext); + const [showModal, setShowModal] = React.useState(false); + const [showMoveListModal, setShowMoveListModal] = React.useState(false); + const [showNameChangeModal, setShowNameChangeModal] = React.useState(false); + const [showDeleteModal, setShowDeleteModal] = React.useState(false); + const [showArchiveModal, setShowArchiveModal] = React.useState(false); + const [currentTableData, setCurrentTableData] = React.useState([]); + const [listName, setListName] = React.useState(list.title); + + const { id } = useParams(); + + async function getLists() { + let sdk = new MkdSDK(); + try { + const result = await sdk.callRawAPI( + `/v2/api/lambda/pm/boards/${id}/lists?order_by=id&direction=asc`, + {}, + "GET" + ); + + const { list } = result; + setCurrentTableData(list); + } catch (error) { + console.log("ERROR", error); + tokenExpireError(dispatch, error.message); + } + } + + const updateListPosition = async (listId) => { + let sdk = new MkdSDK(); + console.log(listId); + try { + const result = await sdk.callRawAPI( + `/v2/api/lambda/pm/boards/${id}/lists/${list.status}`, + { + position: listId, + }, + "PUT" + ); + console.log(result); + if (!result.error) { + getData(); + } + } catch (error) { + console.log("ERROR", error); + tokenExpireError(dispatch, error.message); + } + }; + const updateListName = async () => { + let sdk = new MkdSDK(); + if (listName) { + try { + const result = await sdk.callRawAPI( + `/v2/api/lambda/pm/boards/${id}/lists/${list.status}`, + { + name: listName, + }, + "PUT" + ); + console.log(result); + if (!result.error) { + getData(); + setShowNameChangeModal(false); + } + } catch (error) { + console.log("ERROR", error); + tokenExpireError(dispatch, error.message); + } + } else { + showToast(globalDispatch, "Enter Name"); + } + }; + + const deleteList = async () => { + let sdk = new MkdSDK(); + try { + const result = await sdk.callRawAPI( + `/v2/api/lambda/pm/lists/${list.status}`, + {}, + "DELETE" + ); + console.log(result); + if (!result.error) { + getData(); + setShowDeleteModal(false); + setShowModal(false); + } + } catch (error) { + console.log("ERROR", error); + tokenExpireError(dispatch, error.message); + } + }; + const archiveList = async () => { + let sdk = new MkdSDK(); + if (listName) { + try { + const result = await sdk.callRawAPI( + `/v2/api/lambda/pm/lists/${list.status}`, + { + archive: true, + }, + "DELETE" + ); + console.log(result); + if (!result.error) { + getData(); + setShowArchiveModal(false); + setShowModal(false); + } + } catch (error) { + console.log("ERROR", error); + tokenExpireError(dispatch, error.message); + } + } else { + showToast(globalDispatch, "Enter Name"); + } + }; + + React.useEffect(() => { + (async function () { + await getLists(); + })(); + }, []); + + // console.log(s, "s"); + + return ( + <> + + {showModal && ( +
    +
    setShowModal(false)} + className=" absolute left-0 top-0 h-full w-full bg-[#0000004f] " + /> +
    +
    + List actions + +
    +
      +
    • { + setCardFormShow(!cardFormShow); + setShowModal(false); + }} + className=" cursor-pointer px-[12px] py-[6px] text-[#172b4d] hover:bg-[#ceecfc5d] " + > + Add Card... +
    • +
    • { + setShowMoveListModal(true); + // setShowModal(false); + }} + className=" cursor-pointer px-[12px] py-[6px] text-[#172b4d] hover:bg-[#ceecfc5d] " + > + Move List... +
    • +
    • { + setShowNameChangeModal(true); + // setShowModal(false); + }} + className=" cursor-pointer px-[12px] py-[6px] text-[#172b4d] hover:bg-[#ceecfc5d] " + > + Change Name +
    • +
    • { + setShowDeleteModal(true); + }} + className=" cursor-pointer px-[12px] py-[6px] text-[#172b4d] hover:bg-[#ceecfc5d] " + > + Delete +
    • +
    • { + setShowArchiveModal(true); + }} + className=" cursor-pointer px-[12px] py-[6px] text-[#172b4d] hover:bg-[#ceecfc5d] " + > + Archive +
    • +
    +
    +
    + )} + {showMoveListModal && ( +
    +
    setShowMoveListModal(false)} + className=" absolute left-0 top-0 h-full w-full bg-[#0000004f] " + /> +
    +
    + Move + +
    +
    + + +
    +
    +
    + )} + {showNameChangeModal && ( +
    +
    setShowNameChangeModal(false)} + className=" absolute left-0 top-0 h-full w-full bg-[#0000004f] " + /> +
    +
    + Change Name + +
    +
    +
    +
    + +
    + +
    + + {/* */} +
    +
    +
    +
    +
    + )} + {showDeleteModal && ( + + )} + {showArchiveModal && ( + + )} + + ); +}; + +export default ListSetting; + + \ No newline at end of file diff --git a/day20/src/components/MkdTrelloColumns/Lists.jsx b/day20/src/components/MkdTrelloColumns/Lists.jsx new file mode 100644 index 0000000..2d2eb54 --- /dev/null +++ b/day20/src/components/MkdTrelloColumns/Lists.jsx @@ -0,0 +1,141 @@ +import React from "react"; +import { useDrag, useDrop } from "react-dnd"; +import { AuthContext, tokenExpireError } from "Context/Auth"; +import { GlobalContext } from "Context/Global"; +import MkdSDK from "Utils/MkdSDK"; +import LIstItems from "./LIstItems"; + +const style = { + border: "1px dashed gray", + padding: "0.5rem 1rem", + marginBottom: ".5rem", + backgroundColor: "white", + cursor: "move", +}; + +const ItemTypes = { + CARD: "card", +}; +const icons = { 1: "⭕️", 2: "🔆️", 3: "📝", 4: "✅" }; + +const Lists = ({ + list, + cardLIst, + getData, + statuses, + items, + setItems, + moveList, + setCurrentTableData, + id, + index, +}) => { + const { dispatch } = React.useContext(AuthContext); + const { dispatch: globalDispatch } = React.useContext(GlobalContext); + const [cardItems, setCardItems] = React.useState([]); + + const ref = React.useRef(null); + + const [{ handlerId }, drop] = useDrop({ + accept: ItemTypes.CARD, + collect(monitor) { + return { + handlerId: monitor.getHandlerId(), + }; + }, + hover(item, monitor) { + console.log(item, monitor, "monitor"); + if (!ref.current) { + return; + } + const dragIndex = item.index; + const hoverIndex = index; + if (dragIndex === hoverIndex) { + return; + } + const hoveredRect = ref.current.getBoundingClientRect(); + const hoverMiddleY = (hoveredRect.bottom - hoveredRect.top) / 2; + const mousePosition = monitor.getClientOffset(); + const hoverClientY = mousePosition.y - hoveredRect.top; + + if (dragIndex < hoverIndex && hoverClientY < hoverMiddleY) { + return; + } + + if (dragIndex > hoverIndex && hoverClientY > hoverMiddleY) { + return; + } + console.log(dragIndex, hoverIndex); + moveList(dragIndex, hoverIndex); + item.index = hoverIndex; + }, + }); + const [{ isDragging }, drag] = useDrag({ + type: ItemTypes.CARD, + item: { type: ItemTypes.CARD, id, index }, + collect: (monitor) => ({ + isDragging: monitor.isDragging(), + }), + }); + const opacity = isDragging ? 0 : 1; + drag(drop(ref)); + + const getCardsByList = async () => { + let sdk = new MkdSDK(); + try { + const result = await sdk.callRawAPI( + `/v2/api/lambda/pm/lists/${list?.status}/cards`, + {}, + "GET" + ); + let cardsList = []; + result.list.map((item) => + cardsList.push({ + id: item.id, + icon: icons[item.list_id], + // status: "open", + status: item.list_id, + title: "Human Interest Form", + content: item.name, + }) + ); + setCardItems(cardsList); + } catch (error) { + console.log("ERROR", error); + tokenExpireError(dispatch, error.message); + } + }; + + // console.log(cardLIst, items, s); + + React.useEffect(() => { + // setItems(cardLIst); + // console.log(cardLIst, items); + (async function () { + await getCardsByList(); + })(); + }, [list?.status]); + + return ( +
    + +
    + ); +}; + +export default Lists; + + \ No newline at end of file diff --git a/day20/src/components/MkdTrelloColumns/MkdTrelloColumns.jsx b/day20/src/components/MkdTrelloColumns/MkdTrelloColumns.jsx new file mode 100644 index 0000000..9636f76 --- /dev/null +++ b/day20/src/components/MkdTrelloColumns/MkdTrelloColumns.jsx @@ -0,0 +1,90 @@ +import React from "react"; +import { HTML5Backend } from "react-dnd-html5-backend"; +import { DndProvider } from "react-dnd"; +import BoardCardsPage from "./BoardCardsPage"; +import { AuthContext, tokenExpireError } from "Context/Auth"; +import { GlobalContext } from "Context/Global"; +import MkdSDK from "Utils/MkdSDK"; + +const icons = { 1: "⭕️", 2: "🔆️", 3: "📝", 4: "✅" }; + +const MkdTrelloColumns = ({ activeBoardId, handleBackButton }) => { + const { dispatch } = React.useContext(AuthContext); + const { dispatch: globalDispatch } = React.useContext(GlobalContext); + const [currentTableData, setCurrentTableData] = React.useState([]); + const [cardLIst, setCardLIst] = React.useState([]); + + async function getData() { + let sdk = new MkdSDK(); + try { + const result = await sdk.callRawAPI( + `/v2/api/lambda/pm/boards/${0}/lists?order_by=id&direction=asc`, + {}, + "GET" + ); + + const { list } = result; + let lists = []; + list.map((item) => + lists.push({ + // status: "open", + status: item.id, + title: item.name, + // icon: "⭕️", + icon: icons[item.id], + color: "#EB5A46", + position: item.position, + }) + ); + setCurrentTableData(lists); + } catch (error) { + console.log("ERROR", error); + tokenExpireError(dispatch, error.message); + } + } + + React.useEffect(() => { + (async function () { + await getData(); + })(); + }, []); + + // console.log(currentTableData, "currentTableData"); + + return ( +
    + {/* + + + + */} + + {/* {cardLIst.length > 0 && ( */} + + {/* )} */} + +
    + ); +}; + +export default MkdTrelloColumns; + + \ No newline at end of file diff --git a/day20/src/components/MkdTrelloColumns/Window.jsx b/day20/src/components/MkdTrelloColumns/Window.jsx new file mode 100644 index 0000000..35c3639 --- /dev/null +++ b/day20/src/components/MkdTrelloColumns/Window.jsx @@ -0,0 +1,288 @@ +import moment from "moment"; +import React from "react"; +import Modal from "react-modal"; +import AttachmentCard from "./AttachmentCard"; +import CardMember from "./CardMember"; +import Comment from "./Comment"; +import CommentForm from "./CommentForm"; +import { AuthContext } from "Context/Auth"; +import { GlobalContext } from "Context/Global"; +import MkdSDK from "Utils/MkdSDK"; + +let sdk = new MkdSDK(); + +const Window = ({ show, onClose, item }) => { + const { dispatch } = React.useContext(AuthContext); + const { dispatch: globalDispatch } = React.useContext(GlobalContext); + const [currentTableData, setCurrentTableData] = React.useState({}); + const [showAttachments, setShowAttachments] = React.useState(false); + const [attachmentsList, setAttachmentsList] = React.useState([]); + const [commentsList, setCommentsList] = React.useState([]); + + async function getData() { + try { + const result = await sdk.callRawAPI( + `/v2/api/lambda/pm/cards/${item.id}`, + {}, + "GET" + ); + const result2 = await sdk.callRawAPI( + `/v2/api/lambda/pm/cards/${item.id}/attachments?order_by=id&direction=asc`, + {}, + "GET" + ); + console.log(result2, "result2 attachment"); + setAttachmentsList(result2.list); + const { model } = result; + setCurrentTableData(model); + } catch (error) { + console.log("ERROR", error); + tokenExpireError(dispatch, error.message); + } + } + async function getComment() { + try { + const result = await sdk.callRawAPI( + `/v2/api/lambda/pm/cards/${item.id}/comments?order_by=id&direction=desc&limit=20`, + {}, + "GET" + ); + console.log(result, "commentsList result"); + setCommentsList(result.list); + } catch (error) { + console.log("ERROR", error); + tokenExpireError(dispatch, error.message); + } + } + + React.useEffect(() => { + (async function () { + await getData(); + })(); + (async function () { + await getComment(); + })(); + }, []); + + // console.log(currentTableData, "on popup card"); + + const attachmentHanle = async (e) => { + console.log(e.target.files); + + try { + let formData = new FormData(); + formData.append("file", e.target.files[0]); + const attachment = await sdk.uploadImage(formData); + console.log(attachment); + if (attachment.url) { + const result = await sdk.callRawAPI( + `/v2/api/lambda/pm/cards/${item.id}/attachments`, + { + name: e.target.files[0].name, + attachment: attachment.url, + }, + "POST" + ); + console.log(result, "attachment uploaded"); + if (!result.error) { + showToast(globalDispatch, "Added"); + getData(); + } + } + } catch (error) { + console.log("ERROR", error); + tokenExpireError(dispatch, error.message); + } + }; + + const deleteAttachment = async (id) => { + try { + const result = await sdk.callRawAPI( + `/v2/api/lambda/pm/attachments/${id}`, + {}, + "DELETE" + ); + console.log(result, "attachment deleted"); + if (!result.error) { + getData(); + } + } catch (error) { + console.log("ERROR", error); + tokenExpireError(dispatch, error.message); + } + }; + const deleteComment = async (id) => { + try { + const result = await sdk.callRawAPI( + `/v2/api/lambda/pm/comments/${id}`, + {}, + "DELETE" + ); + console.log(result, "Comment deleted"); + if (!result.error) { + getComment(); + } + } catch (error) { + console.log("ERROR", error); + tokenExpireError(dispatch, error.message); + } + }; + + Modal.setAppElement("body"); + + return ( + +
    +

    + {currentTableData.name} +

    + +
    +
    + {/*

    Description

    */} +

    {item.content}

    + {/*

    Status {item.icon}

    */} +

    {/* {item.name} */}

    +
    + + {/* Card member */} + + + +
    + {/* Attachment secttion */} +
    + {attachmentsList.length > 0 ? ( +
    +

    + + + + attachments +

    +
    + ) : ( +
    + +

    + add attachment +

    +
    + )} + + {attachmentsList?.map((attach, i) => ( + + ))} + {attachmentsList.length > 0 && ( + + )} +
    + + {/* Comment secttion */} +
    +
    + + + +

    Comments

    +
    + + + + {commentsList.length > 0 && + commentsList?.map((com, i) => ( + + ))} +
    +
    + ); +}; + +export default Window; + + \ No newline at end of file diff --git a/day20/src/components/MkdTrelloColumns/data/types.js b/day20/src/components/MkdTrelloColumns/data/types.js new file mode 100644 index 0000000..aac2a46 --- /dev/null +++ b/day20/src/components/MkdTrelloColumns/data/types.js @@ -0,0 +1,4 @@ +const ITEM_TYPE = "ITEM"; + +export default ITEM_TYPE; + \ No newline at end of file diff --git a/day20/src/components/MkdTrelloColumns/index.js b/day20/src/components/MkdTrelloColumns/index.js new file mode 100644 index 0000000..e9ffb85 --- /dev/null +++ b/day20/src/components/MkdTrelloColumns/index.js @@ -0,0 +1,23 @@ + + export { default as AlartMolad } from "./AlartMolad"; + export { default as AttachmentCard } from "./AttachmentCard"; + export { default as AttachmentViewer } from "./AttachmentViewer"; + export { default as BoardCardsPage } from "./BoardCardsPage"; + export { default as CardMember } from "./CardMember"; + export { default as CardMemberCard } from "./CardMemberCard"; + export { default as Col } from "./Col"; + export { default as Comment } from "./Comment"; + export { default as CommentForm } from "./CommentForm"; + export { default as CommentReplyBox } from "./CommentReplyBox"; + export { default as CreateNewRoomModal } from "./CreateNewRoomModal"; + export { default as DropWrapper } from "./DropWrapper"; + export { default as InstandEditor } from "./InstandEditor"; + export { default as Item } from "./Item"; + export { default as LinkifyText } from "./LinkifyText"; + export { default as LIstItems } from "./LIstItems"; + export { default as Lists } from "./Lists"; + export { default as ListSetting } from "./ListSetting"; + export { default as MkdTrelloColumns } from "./MkdTrelloColumns"; + export { default as Window } from "./Window"; + + \ No newline at end of file diff --git a/day20/src/components/MkdWizardContainer/MkdWizardContainer.jsx b/day20/src/components/MkdWizardContainer/MkdWizardContainer.jsx new file mode 100644 index 0000000..371df80 --- /dev/null +++ b/day20/src/components/MkdWizardContainer/MkdWizardContainer.jsx @@ -0,0 +1,55 @@ + + import React, { useState } from "react"; + + const MkdWizardContainer = ({ children }) => { + const [activeId, setActiveId] = useState(1); + + const childrenArray = React.Children.toArray(children); + + const activeIndex = childrenArray.findIndex( + (child) => child.props.componentId === activeId + ); + + const handlePreviousClick = () => { + const newIndex = activeIndex - 1; + if (newIndex >= 0) { + setActiveId(childrenArray[newIndex].props.componentId); + } + }; + + const handleNextClick = () => { + const newIndex = activeIndex + 1; + if (newIndex < childrenArray.length) { + setActiveId(childrenArray[newIndex].props.componentId); + } + }; + + return ( +
    +
    + {childrenArray.map((child) => + child.props.componentId === activeId ? child : null + )} +
    +
    + + +
    +
    + ); + }; + + export default MkdWizardContainer; + \ No newline at end of file diff --git a/day20/src/components/MkdWizardContainer/index.js b/day20/src/components/MkdWizardContainer/index.js new file mode 100644 index 0000000..f08528d --- /dev/null +++ b/day20/src/components/MkdWizardContainer/index.js @@ -0,0 +1,5 @@ + + + import {lazy} from "react" + export const MkdWizardContainer = lazy(()=> import("./MkdWizardContainer")) + \ No newline at end of file diff --git a/day20/src/components/Modal/Modal.jsx b/day20/src/components/Modal/Modal.jsx new file mode 100644 index 0000000..d891127 --- /dev/null +++ b/day20/src/components/Modal/Modal.jsx @@ -0,0 +1,38 @@ + + import React, { memo } from "react"; +import { MdClose } from "react-icons/md"; + +const Modal = ({ children, title, modalCloseClick, modalHeader, classes, page = "" }) => { + return ( +
    +
    + {modalHeader && ( +
    +
    {title}
    +
    + +
    +
    + )} + +
    {children}
    +
    +
    + ); +}; + +const ModalMemo = memo(Modal); +export { ModalMemo as Modal }; + + \ No newline at end of file diff --git a/day20/src/components/Modal/ModalAlert.jsx b/day20/src/components/Modal/ModalAlert.jsx new file mode 100644 index 0000000..a579365 --- /dev/null +++ b/day20/src/components/Modal/ModalAlert.jsx @@ -0,0 +1,56 @@ + +// import { Close, danger, warning } from 'Assets/svgs' +import React from 'react' + + +const ModalAlert = ( { closeModalFunction, message, title, messageClasses, titleClasses, buttonText = "OK" } ) => { + return ( + + ) +} + +export default ModalAlert diff --git a/day20/src/components/Modal/ModalPrompt.jsx b/day20/src/components/Modal/ModalPrompt.jsx new file mode 100644 index 0000000..b2e55a8 --- /dev/null +++ b/day20/src/components/Modal/ModalPrompt.jsx @@ -0,0 +1,92 @@ + + import React from "react"; +import { CloseIcon, DangerIcon } from "Assets/svgs"; +import { InteractiveButton } from "Components/InteractiveButton"; + +// type Props = { +// closeModalFunction: () => void +// actionHandler: any +// message?: string +// title?: string +// rejectText?: string +// acceptText?: string +// titleClasses?: string +// messageClasses?: string +// } + +const ModalPrompt = ({ + open, + closeModalFunction, + actionHandler, + message, + title, + messageClasses = "font-normal text-base", + titleClasses = "text-center font-bold text-lg", + acceptText = "YES", + rejectText = "NO", + loading = false, + isInfo = false +}) => { + return ( + + ); +}; + +export default ModalPrompt; + + \ No newline at end of file diff --git a/day20/src/components/Modal/index.js b/day20/src/components/Modal/index.js new file mode 100644 index 0000000..6fab98b --- /dev/null +++ b/day20/src/components/Modal/index.js @@ -0,0 +1,8 @@ + + import { lazy } from "react"; + + export const Modal = lazy(() => import("./Modal").then((module) => ({ default: module.Modal }))); + export const ModalPrompt = lazy(() => import("./ModalPrompt")); + export const ModalAlert = lazy(() => import("./ModalAlert")); + + \ No newline at end of file diff --git a/day20/src/components/ModalSidebar/ModalSidebar.jsx b/day20/src/components/ModalSidebar/ModalSidebar.jsx new file mode 100644 index 0000000..650d2be --- /dev/null +++ b/day20/src/components/ModalSidebar/ModalSidebar.jsx @@ -0,0 +1,57 @@ + + import { useEffect, useRef } from 'react' + +const ModalSidebar = ( + { + customMinWidthInTw = "min-w-[30%]", + isModalActive = false, + closeModalFn = () => { }, + children + } +) => { + + const modalRef = useRef() + + useEffect(() => { + const handleClickOutside = (e) => { + if (modalRef.current && !modalRef.current.contains(e.target)) { + closeModalFn(); + } + }; + + document.addEventListener('mousedown', handleClickOutside); + + return () => { + document.removeEventListener('mousedown', handleClickOutside); + }; + }, []); + + useEffect(() => { + if (isModalActive && modalRef) { + modalRef.current.focus(); + } + }, [isModalActive]); + + return ( + + ) +} + +export default ModalSidebar + + \ No newline at end of file diff --git a/day20/src/components/ModalSidebar/index.js b/day20/src/components/ModalSidebar/index.js new file mode 100644 index 0000000..94eaa7f --- /dev/null +++ b/day20/src/components/ModalSidebar/index.js @@ -0,0 +1,5 @@ + + import { lazy } from 'react' + + export const ModalSidebar = lazy(()=> import("./ModalSidebar")) + \ No newline at end of file diff --git a/day20/src/components/MultiSelect/MultiSelect.jsx b/day20/src/components/MultiSelect/MultiSelect.jsx new file mode 100644 index 0000000..10537d2 --- /dev/null +++ b/day20/src/components/MultiSelect/MultiSelect.jsx @@ -0,0 +1,60 @@ + + import React, { useCallback } from "react"; + import { memo } from "react"; + import { CheckIcon, PlusIcon } from "@heroicons/react/24/solid"; + + const MultiSelect = ({ label, options, selected, setSelected }) => { + const toggleOption = useCallback( + (option) => { + let temp = selected && selected.length ? [...selected] : []; + console.log(temp, selected); + const index = temp.findIndex((i) => i === option); + if (index > -1) { + temp.splice(index, 1); + setSelected([...temp]); + } else { + console.log("option >>", option); + temp.push(option); + setSelected([...temp]); + } + }, + [selected] + ); + + return ( +
    +
    +
    {label}
    +
    + +
    + {options.map((option, key) => { + const isSelected = selected.includes(option); + return ( +
    toggleOption(option)} + > + {option} + {isSelected ? ( + + ) : ( + + )} +
    + ); + })} +
    +
    + ); + }; + + export default memo(MultiSelect); + diff --git a/day20/src/components/MultiSelect/index.js b/day20/src/components/MultiSelect/index.js new file mode 100644 index 0000000..36d4a17 --- /dev/null +++ b/day20/src/components/MultiSelect/index.js @@ -0,0 +1,5 @@ + + import { lazy } from 'react' + + export const MultiSelect = lazy(()=> import("./MultiSelect")) + \ No newline at end of file diff --git a/day20/src/components/MultipleAnnswer/MultipleAnswer.jsx b/day20/src/components/MultipleAnnswer/MultipleAnswer.jsx new file mode 100644 index 0000000..c3c5a69 --- /dev/null +++ b/day20/src/components/MultipleAnnswer/MultipleAnswer.jsx @@ -0,0 +1,74 @@ +import React, { useId, useState } from "react"; +import { PlusIcon, TrashIcon } from "@heroicons/react/24/solid"; + +const MultipleAnswer = () => { + const inputId = useId(); + const [inputValue, setInputValue] = useState([]); + const [currentValue, setCurrentValue] = useState(""); + + function handleInput(e) { + const inputValue = e.target.value; + setCurrentValue(inputValue); + } + + const handleValueInput = () => { + setInputValue((prev) => [currentValue, ...prev]); + setCurrentValue(""); + }; + const handleKeyDown = (e) => { + if (e.key === "Enter") { + handleValueInput(); + } + }; + + return ( + <> +
    +
    +
    + handleInput(e)} + onKeyDown={(e) => handleKeyDown(e)} + value={currentValue} + className="block w-full rounded-lg border border-blue-600 bg-white p-4 pl-3 text-sm text-black placeholder-black focus:border-blue-500 focus:ring-blue-500 dark:text-gray-400 dark:placeholder-gray-400" + /> + + + +
    + {inputValue?.length > 0 && + inputValue.map((input) => { + return ( +
    + {input} + + setInputValue((prev) => prev.filter((p) => p != input)) + } + > + + +
    + ); + })} +
    +
    + + ); +}; + +export default MultipleAnswer; diff --git a/day20/src/components/MultipleAnswer/index.js b/day20/src/components/MultipleAnswer/index.js new file mode 100644 index 0000000..762b69d --- /dev/null +++ b/day20/src/components/MultipleAnswer/index.js @@ -0,0 +1,6 @@ + + import { lazy } from "react"; + + export const MultipleAnswer = lazy(()=> import("./MultipleAnswer")) + + \ No newline at end of file diff --git a/day20/src/components/PaginationBar/PaginationBar.jsx b/day20/src/components/PaginationBar/PaginationBar.jsx new file mode 100644 index 0000000..5b76d71 --- /dev/null +++ b/day20/src/components/PaginationBar/PaginationBar.jsx @@ -0,0 +1,61 @@ + + import React from "react"; +const PaginationBar = ({ + currentPage, + pageCount, + pageSize, + canPreviousPage, + canNextPage, + updatePageSize, + previousPage, + nextPage, +}) => { + return ( + <> +
    +
    + + Page{" "} + + {+currentPage} of {pageCount} + {" "} + + +
    + {/* */} +
    + {" "} + {" "} +
    +
    + + ); +}; + +export default PaginationBar; + + \ No newline at end of file diff --git a/day20/src/components/PaginationBar/index.js b/day20/src/components/PaginationBar/index.js new file mode 100644 index 0000000..292c203 --- /dev/null +++ b/day20/src/components/PaginationBar/index.js @@ -0,0 +1,5 @@ + + import { lazy } from 'react' + + export const PaginationBar = lazy(()=> import("./PaginationBar")) + \ No newline at end of file diff --git a/day20/src/components/PublicHeader/PublicHeader.jsx b/day20/src/components/PublicHeader/PublicHeader.jsx new file mode 100644 index 0000000..49d0904 --- /dev/null +++ b/day20/src/components/PublicHeader/PublicHeader.jsx @@ -0,0 +1,18 @@ + + +import React, { useState } from "react"; +import { useNavigate } from "react-router"; +import { AuthContext } from "Context/Auth"; + +export const PublicHeader = () => { + const { state, dispatch } = React.useContext(AuthContext); + const [isOpen, setIsOpen] = useState(false); + const navigate = useNavigate(); + + return
    + +
    ; +}; + +export default PublicHeader; + diff --git a/day20/src/components/PublicHeader/index.js b/day20/src/components/PublicHeader/index.js new file mode 100644 index 0000000..bb63986 --- /dev/null +++ b/day20/src/components/PublicHeader/index.js @@ -0,0 +1,5 @@ + + import { lazy } from 'react' + + export const PublicHeader = lazy(()=> import("./PublicHeader")) + \ No newline at end of file diff --git a/day20/src/components/PublicWrapper/PublicWrapper.jsx b/day20/src/components/PublicWrapper/PublicWrapper.jsx new file mode 100644 index 0000000..327130d --- /dev/null +++ b/day20/src/components/PublicWrapper/PublicWrapper.jsx @@ -0,0 +1,26 @@ + +import React, { Suspense, memo } from "react"; +import {PublicHeader} from "Components/PublicHeader"; +import { Spinner } from "Assets/svgs"; + +const PublicWrapper = ({ children }) => { + return ( +
    + +
    + + +
    + } + > + {children} + +
    + {/*
    */} +
    + ); +}; + +export default memo(PublicWrapper); diff --git a/day20/src/components/PublicWrapper/index.js b/day20/src/components/PublicWrapper/index.js new file mode 100644 index 0000000..0b3922c --- /dev/null +++ b/day20/src/components/PublicWrapper/index.js @@ -0,0 +1,4 @@ + + import {lazy} from 'react' + export const PublicWrapper = lazy( ()=> import('./PublicWrapper')) + \ No newline at end of file diff --git a/day20/src/components/QrCodeGenerator/QrCodeGenerator.jsx b/day20/src/components/QrCodeGenerator/QrCodeGenerator.jsx new file mode 100644 index 0000000..300a4b8 --- /dev/null +++ b/day20/src/components/QrCodeGenerator/QrCodeGenerator.jsx @@ -0,0 +1,61 @@ + + import React from 'react' +import QRCode from "qrcode" + + +const QrCodeGenerator = ({setResult}) => { + const [textToGenerate, setTextToGenerate] = React.useState(''); + const [generatedQrcodeImageUrl, setGeneratedQrcodeImageUrl] = React.useState(); + + + async function generateQrCode(text){ + try { + const response = await QRCode.toDataURL(text) + setGeneratedQrcodeImageUrl(response) + console.log(response) + if(setResult){ + setResult(response) + } + } catch (error) { + console.error(error) + } + } + + + + return ( + <> +
    +
    +
    + + setTextToGenerate(e.target.value)} + className="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 mb-3 leading-tight focus:outline-none focus:shadow-outline" + /> +
    +
    + + { generatedQrcodeImageUrl && + + + + } +
    +
    + {generatedQrcodeImageUrl && Qr Code} +
    + + ); +} + +export default QrCodeGenerator diff --git a/day20/src/components/QrCodeGenerator/index.js b/day20/src/components/QrCodeGenerator/index.js new file mode 100644 index 0000000..bb1982d --- /dev/null +++ b/day20/src/components/QrCodeGenerator/index.js @@ -0,0 +1,2 @@ +import { lazy } from 'react' +export const QrCodeGenerator = lazy(()=> import("./QrCodeGenerator")) \ No newline at end of file diff --git a/day20/src/components/QrCodeReader/QrCodeReader.jsx b/day20/src/components/QrCodeReader/QrCodeReader.jsx new file mode 100644 index 0000000..5494381 --- /dev/null +++ b/day20/src/components/QrCodeReader/QrCodeReader.jsx @@ -0,0 +1,49 @@ + + import React,{useRef} from 'react' +import QrScanner from "qr-scanner" + +const QrCodeReader = ({setResult}) => { + const [scannedQrFile, setScannedQrFile] = React.useState(''); + const fileRef = useRef(null) + + function handleScanFileBtn(){ + fileRef.current.click() + } + + async function handleChangeScanFileBtn(e){ + const file = e.target.files[0]; + try{ + const result = await QrScanner.scanImage(file, {returnDetailedScanResult: true}) + await setScannedQrFile(result.data) + console.log(result) + if(setResult){ + setResult(result.data) + } + }catch(err){ + setScannedQrFile(err) + console.log(err) + } + + } + + return ( +
    +
    +
    + +
    +

    Scanned Code Result: {scannedQrFile && scannedQrFile}

    +
    +
    + ) +} + +export default QrCodeReader; diff --git a/day20/src/components/QrCodeReader/index.js b/day20/src/components/QrCodeReader/index.js new file mode 100644 index 0000000..76ed8dc --- /dev/null +++ b/day20/src/components/QrCodeReader/index.js @@ -0,0 +1,2 @@ +import { lazy } from 'react' +export const QrCodeReader = lazy(()=> import("./QrCodeReader")) \ No newline at end of file diff --git a/day20/src/components/RatingStar/RatingStar.jsx b/day20/src/components/RatingStar/RatingStar.jsx new file mode 100644 index 0000000..2304659 --- /dev/null +++ b/day20/src/components/RatingStar/RatingStar.jsx @@ -0,0 +1,98 @@ +import { StarIcon } from "@heroicons/react/24/solid"; +import React, { useEffect, useState } from "react"; + +const RatingStar = ({ rate = 0, onSetRate }) => { + const [rateValue, setRateValue] = useState(0); + const [hoveredIndex, setHoveredIndex] = useState(0); + + const handleClick = (number) => { + if (rateValue === number) { + onSetRate(0); + if (setRateValue) { + setRateValue(0); + } + } else { + onSetRate(number); + if (setRateValue) { + setRateValue(number); + } + } + }; + useEffect(() => { + setRateValue(rate); + }, [rate]); + + + const handleMouseOver = (e) => { + if (e.target.id) { + if (e.target.id.includes("path_")) { + setHoveredIndex(e.target.id.replace("path_", "").trim()); + } else { + setHoveredIndex(e.target.id); + } + } + }; + + const handleMouseOut = () => { + setHoveredIndex(0); + }; + + return ( + <> +
    + + = 1 ? "text-yellow-200" : "" + } ${rateValue >= 1 ? "text-yellow-400 " : "text-gray-500"}`} + onClick={() => handleClick(1)} + /> + + + = 2 ? "text-yellow-200" : "" + } ${ rateValue >= 2 ? "text-yellow-400 " : "text-gray-500" }`} + + onClick={() => handleClick(2)} + /> + + + = 3 ? "text-yellow-200" : "" + } ${rateValue >= 3 ? "text-yellow-400 " : "text-gray-500"}`} + onClick={() => handleClick(3)} + /> + + + = 4 ? "text-yellow-200" : "" + } ${rateValue >= 4 ? "text-yellow-400 " : "text-gray-500"}`} + onClick={() => handleClick(4)} + /> + + + = 5 ? "text-yellow-200" : "" + } ${rateValue === 5 ? "text-yellow-400 " : "text-gray-500"}`} + onClick={() => handleClick(5)} + /> + +
    + + ); +}; + +export default RatingStar; diff --git a/day20/src/components/RatingStar/index.js b/day20/src/components/RatingStar/index.js new file mode 100644 index 0000000..cf4c6fe --- /dev/null +++ b/day20/src/components/RatingStar/index.js @@ -0,0 +1,6 @@ + + import { lazy } from "react"; + + export const RatingStar = lazy(()=> import("./RatingStar")) + + \ No newline at end of file diff --git a/day20/src/components/SessionExpiredModal/SessionExpiredModal.jsx b/day20/src/components/SessionExpiredModal/SessionExpiredModal.jsx new file mode 100644 index 0000000..3175247 --- /dev/null +++ b/day20/src/components/SessionExpiredModal/SessionExpiredModal.jsx @@ -0,0 +1,100 @@ + + import { Dialog, Transition } from "@headlessui/react"; + import React, { Fragment } from "react"; + import { useEffect } from "react"; + import { useContext } from "react"; + import { useLocation, useNavigate } from "react-router"; + import { AuthContext } from "Context/Auth"; + + let modalTimeout; + export default function SessionExpiredModal() { + const { state, dispatch } = useContext(AuthContext); + const { pathname } = useLocation(); + const navigate = useNavigate(); + + const logout = () => { + dispatch({ type: "SESSION_EXPIRED", payload: false }); + dispatch({ type: "LOGOUT" }); + if (state.role) { + navigate(`${state?.role}/login?redirect_uri=${pathname}`); + } else { + window.location.href = `/login?redirect_uri=${pathname}`; + } + clearTimeout(modalTimeout); + }; + + useEffect(() => { + if (state.sessionExpired) { + modalTimeout = setTimeout(() => { + logout(); + }, 4000); + } + }, [state.sessionExpired]); + + + if (!state.sessionExpired) return null; + + return ( +
    + + {}} + > + +
    + + +
    +
    + + + + Session Expired + +
    +

    Your current login session has expired. Redirecting to login page shortly

    +
    + +
    + +
    +
    +
    +
    +
    +
    +
    +
    + ); +} diff --git a/day20/src/components/SessionExpiredModal/index.js b/day20/src/components/SessionExpiredModal/index.js new file mode 100644 index 0000000..02cc877 --- /dev/null +++ b/day20/src/components/SessionExpiredModal/index.js @@ -0,0 +1,4 @@ + + export { default as SessionExpiredModal } from "./SessionExpiredModal"; + + \ No newline at end of file diff --git a/day20/src/components/Skeleton/Skeleton.jsx b/day20/src/components/Skeleton/Skeleton.jsx new file mode 100644 index 0000000..742a551 --- /dev/null +++ b/day20/src/components/Skeleton/Skeleton.jsx @@ -0,0 +1,44 @@ + + import React from "react"; +import Skeleton from "react-loading-skeleton"; + +const SkeletonLoader = ({ + className = "", + count = 5, + counts = [2, 1, 3, 1, 1], + circle = false, +}) => { + return ( +
    + {/* */} + {Array.from({ length: count }).map((_, index) => ( + 1 + ? 25 + : index + 1 === count + ? 25 + : 80 + } + circle={circle} + style={{ marginBottom: "0.6rem" }} + /> + ))} +
    + ); +}; + +export default SkeletonLoader; + +{ + /* + + + */ +} + + diff --git a/day20/src/components/Skeleton/index.js b/day20/src/components/Skeleton/index.js new file mode 100644 index 0000000..dc09e78 --- /dev/null +++ b/day20/src/components/Skeleton/index.js @@ -0,0 +1,6 @@ + + import { lazy } from "react"; + + export const SkeletonLoader = lazy(()=> import("./Skeleton")) + + \ No newline at end of file diff --git a/day20/src/components/SnackBar/SnackBar.jsx b/day20/src/components/SnackBar/SnackBar.jsx new file mode 100644 index 0000000..02c45d1 --- /dev/null +++ b/day20/src/components/SnackBar/SnackBar.jsx @@ -0,0 +1,125 @@ + + import React from "react"; +import { GlobalContext } from "Context/Global"; +const SnackBar = () => { + const { + state: { globalMessage, toastStatus }, + dispatch, + } = React.useContext(GlobalContext); + const show = globalMessage.length > 0; + return show ? ( + + ) : null; +}; + +export default SnackBar; + diff --git a/day20/src/components/SnackBar/index.js b/day20/src/components/SnackBar/index.js new file mode 100644 index 0000000..5c096a8 --- /dev/null +++ b/day20/src/components/SnackBar/index.js @@ -0,0 +1,5 @@ + + import { lazy } from 'react' + + export const SnackBar = lazy(()=> import("./SnackBar")) + \ No newline at end of file diff --git a/day20/src/components/StripePayments/StripePayments.jsx b/day20/src/components/StripePayments/StripePayments.jsx new file mode 100644 index 0000000..30e42ba --- /dev/null +++ b/day20/src/components/StripePayments/StripePayments.jsx @@ -0,0 +1,76 @@ + +import React, { useState } from "react"; +import { + AdminStripeInvoicesListPageV2, + AdminStripePricesListPage, + AdminStripeSubscriptionsListPage, +} from "Pages/Admin/List"; +import { GlobalContext } from "Context/Global"; +import { LazyLoad } from "Components/LazyLoad"; + +const StripePayments = () => { + const [activeTab, setActiveTab] = useState("plans"); + const { state, dispatch } = React.useContext(GlobalContext); + + const TABS = { + plans: ( + + + + ), + subscriptions: ( + + + + ), + invoices: ( + + + + ), + }; + React.useEffect(() => { + dispatch({ + type: "SETPATH", + payload: { + path: "payments", + }, + }); + }, []); + + return ( +
    +
    +
    +
    setActiveTab("plans")} + > + Plans +
    +
    setActiveTab("subscriptions")} + > + Subscriptions +
    +
    setActiveTab("invoices")} + > + Invoices +
    +
    +
    +
    {TABS[activeTab]}
    +
    + ); +}; + +export default StripePayments; diff --git a/day20/src/components/StripePayments/index.js b/day20/src/components/StripePayments/index.js new file mode 100644 index 0000000..ecb76e7 --- /dev/null +++ b/day20/src/components/StripePayments/index.js @@ -0,0 +1,4 @@ + + import { lazy } from 'react' + export const StripePayments = lazy(()=> import("./StripePayments")) + \ No newline at end of file diff --git a/day20/src/components/TopHeader/TopHeader.jsx b/day20/src/components/TopHeader/TopHeader.jsx new file mode 100644 index 0000000..fd4784b --- /dev/null +++ b/day20/src/components/TopHeader/TopHeader.jsx @@ -0,0 +1,164 @@ + + import React, { useEffect, useState } from "react"; + import { GlobalContext } from "Context/Global"; + import { Link, useLocation } from "react-router-dom"; + import { BackButton } from "Components/BackButton"; + import { AuthContext } from "Context/Auth"; + import { StringCaser } from "Utils/utils"; + import { useProfile } from "Hooks/useProfile"; + + const TopHeader = () => { + const { state: globalState, dispatch: globalDispatch } = + React.useContext(GlobalContext); + const { state, dispatch } = React.useContext(AuthContext); + const [currentPath, setCurrentPath] = useState(""); + const { isOpen, showBackButton } = globalState; + const location = useLocation(); + const [profile] = useProfile(); + + let toggleOpen = (open) => { + dispatch({ + type: "OPEN_SIDEBAR", + payload: { isOpen: open }, + }); + }; + + useEffect(() => { + const pathArr = location.pathname.split("/"); + if (pathArr[1] !== "user" && pathArr[1] !== "admin") { + setCurrentPath(pathArr[1]); + } else { + setCurrentPath(pathArr[2]); + } + }, [location]); + return ( + //
    + // toggleOpen(!isOpen)}> + // + // + // + + // + //
    + +
    +
    + {showBackButton && } +

    + {StringCaser(currentPath, { casetype: "capitalize", separator: " " })} +

    +
    +
    + {/*
    + + + + +
    */} + +
    + +
      +
    • + + + + + + + + + + Account + +
    • +
    • + + dispatch({ + type: "LOGOUT", + }) + } + > + + + + + + Logout + +
    • +
    +
    +
    +
    + ); + }; + + export default TopHeader; + \ No newline at end of file diff --git a/day20/src/components/TopHeader/index.js b/day20/src/components/TopHeader/index.js new file mode 100644 index 0000000..4f72403 --- /dev/null +++ b/day20/src/components/TopHeader/index.js @@ -0,0 +1,5 @@ + + import { lazy } from 'react' + + export const TopHeader = lazy(()=> import("./TopHeader")) + \ No newline at end of file diff --git a/day20/src/components/UppyFileUpload/UppyFileUpload.jsx b/day20/src/components/UppyFileUpload/UppyFileUpload.jsx new file mode 100644 index 0000000..16dd019 --- /dev/null +++ b/day20/src/components/UppyFileUpload/UppyFileUpload.jsx @@ -0,0 +1,88 @@ +import React, { useState, useEffect } from "react"; +import Uppy from "@uppy/core"; +import Webcam from "@uppy/webcam"; +import Tus from "@uppy/tus"; +import GoogleDrive from "@uppy/google-drive"; +import Instagram from '@uppy/instagram'; +import Facebook from '@uppy/facebook'; +import { Dashboard, ProgressBar, FileInput } from "@uppy/react"; + +import "@uppy/core/dist/style.css"; +import "@uppy/dashboard/dist/style.css"; +import "@uppy/drag-drop/dist/style.css"; +import "@uppy/file-input/dist/style.css"; +import "@uppy/progress-bar/dist/style.css"; +import '@uppy/webcam/dist/style.min.css'; +import MkdSDK from "Utils/MkdSDK"; + +const sdk = new MkdSDK(); + +export default function UppyFileUpload({ companionUrl, setFileProcessedUrl }) { + const handleImageChange = async (file) => { + const formData = new FormData(); + formData.append("file", file); + try { + const result = await sdk.uploadImage(formData); + console.log(result.url); + if (setFileProcessedUrl) { + setFileProcessedUrl(result.url); + } + } catch (err) { + console.error(err); + } + }; + + const uppy = new Uppy({ id: "uppy1", autoProceed: true, debug: true }) + // .use(Tus, { endpoint: 'https://tusd.tusdemo.net/files/' }) + .use(GoogleDrive, { + companionUrl: companionUrl || "https://companion.uppy.io", + }) + .use(Webcam) + .use(Instagram, { + companionUrl: companionUrl || "https://companion.uppy.io", + }) + .use(Facebook, { + companionUrl: companionUrl || "https://companion.uppy.io", + }) + + const uppy3 = new Uppy({ autoProceed: false, allowMultipleUploadBatches: false }); + + uppy3.on("file-added", (file) => { + handleImageChange(file.data); + }); + + uppy.on("file-added", (file) => { + handleImageChange(file.data); + }); + + // uppy.on('complete', (file) => { + // console.log("Complete action", file) + // }); + + useEffect(() => { + return () => { + uppy.close({ reason: "unmount" }); + // uppy2.close({ reason: 'unmount' }); + }; + }, [uppy]); + + return ( +
    +

    File Uploader

    + + + +

    Progress Bar

    + + +

    File Input

    + +
    + ); +} diff --git a/day20/src/components/UppyFileUpload/index.js b/day20/src/components/UppyFileUpload/index.js new file mode 100644 index 0000000..908e496 --- /dev/null +++ b/day20/src/components/UppyFileUpload/index.js @@ -0,0 +1,5 @@ + + import { lazy } from 'react' + + export const UppyFileUpload = lazy(()=> import("./UppyFileUpload")) + \ No newline at end of file diff --git a/day20/src/components/video/index.js b/day20/src/components/video/index.js new file mode 100644 index 0000000..9d3f08a --- /dev/null +++ b/day20/src/components/video/index.js @@ -0,0 +1,5 @@ + + import {lazy} from 'react' + export const VideoItem = lazy( ()=> import('./VideoItem')) +export const Video = lazy( ()=> import('./Video')) + \ No newline at end of file diff --git a/day20/src/components/video/video.jsx b/day20/src/components/video/video.jsx new file mode 100644 index 0000000..2ef4e8b --- /dev/null +++ b/day20/src/components/video/video.jsx @@ -0,0 +1,234 @@ + +import { useState, useEffect } from "react"; +import TwilioVideo from "twilio-video"; +import VideoItem from "./VideoItem"; +import React from "react"; + +function Video() { + const [room, setRoom] = useState(null); + const [roomName, setRoomName] = useState("room"); + const [userName, setUserName] = useState("room"); + const [audio, setAudio] = useState(null); + const [video, setVideo] = useState(null); + const [error, setError] = useState(""); + + useEffect(() => { + const handleTabClose = (event) => { + event.preventDefault(); + console.log(room); + + console.log("beforeunload event triggered"); + document.getElementById("local-participant") && (document.getElementById("local-participant").style.display = "none"); + document.getElementById("remote-participant") && (document.getElementById("remote-participant").style.display = "none"); + document.getElementById("leave-btn") && (document.getElementById("leave-btn").style.display = "none"); + return room && room.disconnect(); + }; + + window.addEventListener("beforeunload", handleTabClose); + + return () => { + room && room.disconnect(); + window.removeEventListener("beforeunload", handleTabClose); + }; + }, [room]); + + const startMeeting = async () => { + try { + setError(""); + + function participantDisconnected(participant, room) { + document.getElementById("remote-participant") && (document.getElementById("remote-participant").style.display = "none"); + } + + function trackPublished(publication, participant) { + // If the TrackPublication is already subscribed to, then attach the Track to the DOM. + if (publication.track) { + if (track.kind === "video") setVideo(publication.track); + else setAudio(publication.track); + } + + // Once the TrackPublication is subscribed to, attach the Track to the DOM. + publication.on("subscribed", (track) => { + if (track.kind === "video") setVideo(publication.track); + else setAudio(publication.track); + document.getElementById("local-participant") && (document.getElementById("local-participant").style.display = "block"); + document.getElementById("remote-participant") && (document.getElementById("remote-participant").style.display = "block"); + document.getElementById("leave-btn") && (document.getElementById("leave-btn").style.display = "block"); + }); + + // Once the TrackPublication is unsubscribed from, detach the Track from the DOM. + // publication.on("unsubscribed", (track) => { + // detachTrack(track, participant); + // }); + } + + function participantConnected(participant, room) { + // Handle the TrackPublications already published by the Participant. + participant.tracks.forEach((publication) => { + trackPublished(publication, participant); + }); + + // Handle theTrackPublications that will be published by the Participant later. + participant.on("trackPublished", (publication) => { + trackPublished(publication, participant); + }); + } + + const res = await fetch("http://localhost:3048/v2/api/lambda/video/token", { + method: "POST", + headers: { + "Content-Type": "application/json" + }, + body: JSON.stringify({ + identity: userName + Math.random().toFixed(2), + room: roomName + }) + }); + const roomInfo = await res.json(); + + const connectOptions = { + // Available only in Small Group or Group Rooms only. Please set "Room Type" + // to "Group" or "Small Group" in your Twilio Console: + // https://www.twilio.com/console/video/configure + bandwidthProfile: { + video: { + dominantSpeakerPriority: "high", + mode: "collaboration", + clientTrackSwitchOffControl: "auto", + contentPreferencesMode: "auto" + } + }, + + // Available only in Small Group or Group Rooms only. Please set "Room Type" + // to "Group" or "Small Group" in your Twilio Console: + // https://www.twilio.com/console/video/configure + dominantSpeaker: true, + + // Comment this line if you are playing music. + maxAudioBitrate: 16000, + + // VP8 simulcast enables the media server in a Small Group or Group Room + // to adapt your encoded video quality for each RemoteParticipant based on + // their individual bandwidth constraints. This has no utility if you are + // using Peer-to-Peer Rooms, so you can comment this line. + preferredVideoCodecs: [{ codec: "VP8", simulcast: true }], + + // Capture 720p video @ 24 fps. + video: { height: 720, frameRate: 24, width: 1280 } + }; + + const dvcs = await navigator.mediaDevices.enumerateDevices(); + const audioDevice = dvcs.filter((dvc) => dvc.kind === "audioinput"); + const videoDevice = dvcs.filter((dvc) => dvc.kind === "videoinput"); + + connectOptions.audio = { + deviceId: { + exact: audioDevice.deviceId + } + }; + + // Add the specified Room name to ConnectOptions. + connectOptions.name = roomName; + + // Add the specified video device ID to ConnectOptions. + connectOptions.video.deviceId = { + exact: videoDevice.deviceId + }; + + const room = await TwilioVideo.connect(roomInfo.data, connectOptions); + setRoom(room); + document.getElementById("local-participant") && (document.getElementById("local-participant").style.display = "block"); + document.getElementById("leave-btn") && (document.getElementById("leave-btn").style.display = "block"); + + // Subscribe to the media published by RemoteParticipants already in the Room. + room.participants.forEach((participant) => { + participantConnected(participant, room); + }); + + // Subscribe to the media published by RemoteParticipants joining the Room later. + room.on("participantConnected", (participant) => { + participantConnected(participant, room); + }); + + room.on("participantDisconnected", (participant) => { + participantDisconnected(participant, room); + }); + + room.once("disconnected", (room, error) => { + participantDisconnected(); + }); + } catch (err) { + if (err.message === "Room contains too many Participants") setError("Room contains too many Participants."); + else setError("Something went wrong."); + document.getElementById("start-btn") && (document.getElementById("start-btn").style.display = "block"); + console.error(err); + } + }; + + return ( + <> +
    + { + setUserName(e.target.value); + }} + /> + { + setRoomName(e.target.value); + }} + /> + +
    + {error &&
    {error + " Please try again later!"}
    } + {room && ( +
    +
    + +
    + {audio && video && ( +
    + +
    + )} + +
    + )} + + ); +} + +export default Video; diff --git a/day20/src/components/video/videoItem.jsx b/day20/src/components/video/videoItem.jsx new file mode 100644 index 0000000..10665a9 --- /dev/null +++ b/day20/src/components/video/videoItem.jsx @@ -0,0 +1,29 @@ + +import { useRef, useEffect } from "react"; + +function VideoItem({ videoStream, audioStream, muted }) { + const videoRef = useRef(null); + const audioRef = useRef(null); + + useEffect(() => { + videoRef.current && videoStream?.attach(videoRef.current); + audioRef.current && audioStream?.attach(audioRef.current); + }, [videoStream, audioStream]); + + return ( + <> + + + + ); +} + +export default VideoItem; diff --git a/day20/src/context/Auth/AuthContext.jsx b/day20/src/context/Auth/AuthContext.jsx new file mode 100644 index 0000000..7ae6010 --- /dev/null +++ b/day20/src/context/Auth/AuthContext.jsx @@ -0,0 +1,127 @@ + + import React, { useReducer } from "react"; + import MkdSDK from "Utils/MkdSDK"; + const initialState = { + isAuthenticated: false, + user: null, + userDetails: { + firstName: null, + lastName: null, + photo: null, + }, + token: null, + role: null, + sessionExpired: null, + }; + export const AuthContext = React.createContext(initialState); + + const reducer = (state, action) => { + switch (action.type) { + case "LOGIN": + localStorage.setItem("user", Number(action.payload.user_id)); + localStorage.setItem("token", action.payload.token); + localStorage.setItem("role", action.payload.role); + return { + ...state, + isAuthenticated: true, + user: Number(localStorage.getItem("user")), + token: localStorage.getItem("token"), + role: localStorage.getItem("role"), + userDetails: { + firstName: action.payload.first_name, + lastName: action.payload.last_name, + photo: action.payload.photo, + }, + }; + case "UPDATE_PROFILE": + return { + ...state, + role: localStorage.getItem("role"), + profile: { ...action?.payload }, + }; + case "LOGOUT": + localStorage.removeItem("user"); + localStorage.removeItem("token"); + return { + ...state, + isAuthenticated: false, + user: null, + }; + case "SESSION_EXPIRED": + return { + ...state, + sessionExpired: action?.payload, + }; + default: + return state; + } + }; + + let sdk = new MkdSDK(); + + export const tokenExpireError = (dispatch, errorMessage) => { + /** + * either this or we pass the role as a parameter + */ + const role = localStorage.getItem("role"); + if (errorMessage === "TOKEN_EXPIRED") { + dispatch({ type: "SESSION_EXPIRED", payload: true }); + // dispatch({ + // type: "LOGOUT", + // }); + + // location.href = "/" + role + "/login"; + } + }; + + const AuthProvider = ({ children }) => { + const [state, dispatch] = useReducer(reducer, initialState); + + React.useEffect(() => { + const user = localStorage.getItem("user"); + const token = localStorage.getItem("token"); + const role = localStorage.getItem("role"); + + if (token) { + (async function () { + try { + const result = await sdk.check(role); + dispatch({ + type: "LOGIN", + payload: { + user_id: user, + token, + role: role, + }, + }); + } catch (error) { + if (role) { + dispatch({ + type: "LOGOUT", + }); + window.location.href = "/" + role + "/login"; + } else { + dispatch({ + type: "LOGOUT", + }); + window.location.href = "/"; + } + } + })(); + } + }, []); + + return ( + + {children} + + ); + }; + + export default AuthProvider; + \ No newline at end of file diff --git a/day20/src/context/Auth/index.js b/day20/src/context/Auth/index.js new file mode 100644 index 0000000..9357863 --- /dev/null +++ b/day20/src/context/Auth/index.js @@ -0,0 +1,3 @@ + + export {default as AuthProvider,AuthContext, tokenExpireError} from "./AuthContext" + \ No newline at end of file diff --git a/day20/src/context/Global/GlobalActions.jsx b/day20/src/context/Global/GlobalActions.jsx new file mode 100644 index 0000000..e6e5d2b --- /dev/null +++ b/day20/src/context/Global/GlobalActions.jsx @@ -0,0 +1,370 @@ + + import { tokenExpireError } from "Context/Auth"; + +import MkdSDK from "Utils/MkdSDK"; + +import { + REQUEST_FAILED, + REQUEST_LOADING, + REQUEST_SUCCESS, + RequestItems, + SET_GLOBAL_PROPERTY, +} from "./GlobalConstants"; + +import { showToast } from "./GlobalContext"; +import TreeSDK from "Utils/TreeSDK"; + +/** + * @param {any} dispatch - Global Dispatch + * @param {String | Number | Boolean | Object} data - + * @param {String} property - any propert name + */ + +export const setGLobalProperty = (dispatch, data, property) => { + // console.log("property >>", property); + dispatch({ + property, + type: SET_GLOBAL_PROPERTY, + payload: data, + }); +}; + +/** + * @param {any} dispatch - Global Dispatch + * @param {boolean} data - true || false + * @param { String } item - string of the needed action + */ + +export const setLoading = (dispatch, data, item, where) => { + // console.log("setLoading data >>", data, where); + dispatch({ + item, + type: REQUEST_LOADING, + payload: data, + }); +}; + +/** + * @param {any} dispatch - Global Dispatch + * @param {Array | any} data - any[] + * @param { String } item - string of the needed action + */ + +export const dataSuccess = (dispatch, data, item) => { + dispatch({ + item, + type: REQUEST_SUCCESS, + payload: data, + }); +}; +/** + * @param {any} dispatch - Global Dispatch + * @param {Array | any} data - any[] + * @param { String } item - string of the needed action + */ + +export const dataFailure = (dispatch, data, item) => { + dispatch({ + item, + type: REQUEST_FAILED, + payload: data, + }); +}; + +/** + * @param {any} globalDispatch - Global Dispatch + * @param {any} authDispatch - Auth Dispatch + * @param {String} table - table model + * @param {Number | String} id - id + * @param {String} method - method + */ + +export const getSingleModel = async ( + globalDispatch, + authDispatch, + table, + id, + method = "GET", + join = null +) => { + const sdk = new MkdSDK(); + setLoading(globalDispatch, true, RequestItems.viewModel); + try { + sdk.setTable(table.trim()); + const result = await sdk.callRestAPI( + { id: Number(id), ...{ ...(join ? { join: join } : null) } }, + method + ); + + if (!result?.error) { + dataSuccess( + globalDispatch, + { data: result?.model }, + RequestItems.viewModel + ); + } + setLoading(globalDispatch, false, RequestItems.viewModel); + // showToast(globalDispatch, "Project Saved", 4000, "info"); + } catch (error) { + const message = error?.response?.data?.message + ? error?.response?.data?.message + : error?.message; + setLoading(globalDispatch, false, RequestItems.viewModel); + dataFailure(globalDispatch, { message, id }, RequestItems.viewModel); + showToast(globalDispatch, message, 4000, "error"); + tokenExpireError(authDispatch, message); + } +}; + +/** + * @param {any} globalDispatch - Global Dispatch + * @param {any} authDispatch - Auth Dispatch + * @param {String} table - table model + * @param {Array[Number] | Array[String]} ids - list of ids + * @param { String } join - join table + */ + +export const getManyByIds = async ( + globalDispatch, + authDispatch, + table, + ids, + join = null +) => { + const tdk = new TreeSDK(); + setLoading(globalDispatch, true, RequestItems.listModel); + try { + // const filters = ids.map((id) => computeFilter("id", "in", id)); + const result = await tdk.getList(table, { + ...{ + ...(join ? { join: join } : null), + filter: [`id,in,${ids.join(",")}`], + }, + }); + + if (!result?.error) { + dataSuccess( + globalDispatch, + { data: result?.list }, + RequestItems.listModel + ); + } + setLoading(globalDispatch, false, RequestItems.listModel); + // showToast(globalDispatch, "Project Saved", 4000, "info"); + } catch (error) { + const message = error?.response?.data?.message + ? error?.response?.data?.message + : error?.message; + setLoading(globalDispatch, false, RequestItems.listModel); + dataFailure(globalDispatch, { message, id }, RequestItems.listModel); + showToast(globalDispatch, message, 4000, "error"); + tokenExpireError(authDispatch, message); + } +}; + +/** + * @param {any} globalDispatch - Global Dispatch + * @param {any} authDispatch - Auth Dispatch + * @param {String} table - table model + * @param { Object } payload - data to create + */ + +export const createRequest = async ( + globalDispatch, + authDispatch, + table, + payload +) => { + const tdk = new TreeSDK(); + setLoading(globalDispatch, true, RequestItems.createModel); + try { + const result = await tdk.create(table, payload); + + if (!result?.error) { + dataSuccess( + globalDispatch, + { message: result?.message }, + RequestItems.createModel + ); + setLoading(globalDispatch, false, RequestItems.createModel); + showToast(globalDispatch, result?.message, 4000, "success"); + return { error: false }; + } else { + setLoading(globalDispatch, false, RequestItems.createModel); + showToast(globalDispatch, result?.message, 4000, "error"); + return { error: true }; + } + } catch (error) { + const message = error?.response?.data?.message + ? error?.response?.data?.message + : error?.message; + setLoading(globalDispatch, false, RequestItems.createModel); + dataFailure(globalDispatch, { message }, RequestItems.createModel); + showToast(globalDispatch, message, 4000, "error"); + tokenExpireError(authDispatch, message); + return { error: true }; + } +}; + +/** + * @param {any} globalDispatch - Global Dispatch + * @param {any} authDispatch - Auth Dispatch + * @param {String} table - table model + * @param {String | Number} id - item id + * @param { Object } payload - data to create + */ + +export const updateRequest = async ( + globalDispatch, + authDispatch, + table, + id, + payload +) => { + const tdk = new TreeSDK(); + setLoading(globalDispatch, true, RequestItems.updateModel); + try { + const result = await tdk.update(table, id, payload); + + if (!result?.error) { + // dataSuccess(globalDispatch, { message: result?.message }, RequestItems.updateModel); + setLoading(globalDispatch, false, RequestItems.updateModel); + showToast(globalDispatch, result?.message, 4000, "success"); + return { error: false }; + } else { + setLoading(globalDispatch, false, RequestItems.updateModel); + showToast(globalDispatch, result?.message, 4000, "error"); + return { error: true }; + } + } catch (error) { + const message = error?.response?.data?.message + ? error?.response?.data?.message + : error?.message; + setLoading(globalDispatch, false, RequestItems.updateModel); + // dataFailure(globalDispatch, { message }, RequestItems.updateModel); + showToast(globalDispatch, message, 4000, "error"); + tokenExpireError(authDispatch, message); + return { error: true }; + } +}; + +/** + * @param {any} globalDispatch - Global Dispatch + * @param {any} authDispatch - Auth Dispatch + * @param {String} table - table model + * @param { Object } options - options are filter, join, size, direction and order query + * @param { Array } [options.filter=null] filter: [] + * @param { String } [options.join=null] join: "table1,table2,table3" - joins another table + * @param { Number } [options.size=10] size number of items per page + * @param { String } [options.order=id] order by any field | default is the id field + * @param { String } [options.direction=desc] direction, desc or asc | desc is the default + */ + +export const getList = async ( + globalDispatch, + authDispatch, + table, + options = {} +) => { + const tdk = new TreeSDK(); + setLoading(globalDispatch, true, table); + try { + const result = await tdk.getList(table, options); + + if (!result?.error) { + // dataSuccess(globalDispatch, { message: result?.message }, table); + setLoading(globalDispatch, false, table); + // showToast(globalDispatch, result?.message, 4000, "success"); + return { error: false, data: result?.list }; + } else { + setLoading(globalDispatch, false, table); + // showToast(globalDispatch, result?.message, 4000, "error"); + return { error: true }; + } + } catch (error) { + const message = error?.response?.data?.message + ? error?.response?.data?.message + : error?.message; + setLoading(globalDispatch, false, table); + // dataFailure(globalDispatch, { message }, table); + // showToast(globalDispatch, message, 4000, "error"); + tokenExpireError(authDispatch, message); + return { error: true }; + } +}; + +/** + * @param {any} globalDispatch - Global Dispatch + * @param {any} authDispatch - Auth Dispatch + * @param {String} endpoint - the api endpoint + * @param { Object } payload - payload data + * @param { String } state - a field in the global content to access the loading state + */ + +export const customCreateRequest = async ( + globalDispatch, + authDispatch, + endpoint, + payload, + state +) => { + const sdk = new MkdSDK(); + setLoading(globalDispatch, true, state); + try { + const result = await sdk.customCreateRequest(endpoint, payload); + + if (!result?.error) { + // dataSuccess(globalDispatch, { message: result?.message }, state); + setLoading(globalDispatch, false, state); + showToast(globalDispatch, result?.message, 4000, "success"); + return { error: false }; + } else { + setLoading(globalDispatch, false, state); + showToast(globalDispatch, result?.message, 4000, "error"); + return { error: true, validation: result?.validation }; + } + } catch (error) { + const message = error?.response?.data?.message + ? error?.response?.data?.message + : error?.message; + setLoading(globalDispatch, false, state); + // dataFailure(globalDispatch, { message }, state); + showToast(globalDispatch, message, 4000, "error"); + tokenExpireError(authDispatch, message); + return { error: true, validation: result?.validation }; + } +}; + +// BASIC SETUP ABOVE + +/** + * @param {any} globalDispatch - Global Dispatch + * @param {any} authDispatch - Auth Dispatch + * @param {Number | String} id - project id + */ + +export const getProject = async (globalDispatch, authDispatch, id) => { + const sdk = new MkdSDK(); + setLoading(globalDispatch, true, RequestItems.Project); + try { + const result = await sdk.getProject(id); + + if (!result?.error) { + dataSuccess(globalDispatch, result?.model, RequestItems.Project); + } + setLoading(globalDispatch, false, RequestItems.Project); + // showToast(globalDispatch, "Project Saved", 4000, "info"); + } catch (error) { + const message = error?.response?.data?.message + ? error?.response?.data?.message + : error?.message; + setLoading(globalDispatch, false, RequestItems.Project); + dataFailure(globalDispatch, { message, id }, RequestItems.Project); + showToast(globalDispatch, message, 4000, "error"); + tokenExpireError(authDispatch, message); + } +}; + +function computeFilter(field, operator, value) { + return `${field},${operator},${value}`; +} diff --git a/day20/src/context/Global/GlobalConstants.jsx b/day20/src/context/Global/GlobalConstants.jsx new file mode 100644 index 0000000..3f45253 --- /dev/null +++ b/day20/src/context/Global/GlobalConstants.jsx @@ -0,0 +1,16 @@ + + export const REQUEST_LOADING = "REQUEST_LOADING"; +export const REQUEST_SUCCESS = "REQUEST_SUCCESS"; +export const REQUEST_FAILED = "REQUEST_FAILED"; +export const SET_GLOBAL_PROPERTY = "SET_GLOBAL_PROPERTY"; + +const RequestItems = { + viewModel: "viewModel", + createModel: "createModel", + updateModel: "updateModel", + listModel: "listModel", +}; + +Object.freeze(RequestItems); + +export { RequestItems }; diff --git a/day20/src/context/Global/GlobalContext.jsx b/day20/src/context/Global/GlobalContext.jsx new file mode 100644 index 0000000..1033cb4 --- /dev/null +++ b/day20/src/context/Global/GlobalContext.jsx @@ -0,0 +1,224 @@ + + import React, { useReducer } from "react"; +// import { DefaultInitialState } from "./InitialStates"; +import { + REQUEST_FAILED, + REQUEST_LOADING, + REQUEST_SUCCESS, + SET_GLOBAL_PROPERTY, +} from "./GlobalConstants"; + +/** + * @typedef {Object} GlobalState + * @property {string} globalMessage - Toast Message. + * @property {"success"| "error" | "warning"} toastStatus - Toast State - "success" | "error" | "warning". + * @property {boolean} isOpen + * @property {string} path + * @property {any} projectRow + */ + +/** + * The Value of the Global State . + * @param {GlobalState} initialState + */ + +const initialState = { + globalMessage: "", + toastStatus: "success", + isOpen: true, + showBackButton: false, + path: "", + projectRow: null, + leftPanel: [], + middlePanel: [], + rightPanel: {}, + selectedComponent: 0, + rightComponentId: "", + selectedPageComponent: 0, + rooms: [], +}; + +export const GlobalContext = React.createContext(initialState); + +const reducer = (state, action) => { + switch (action.type) { + case "SNACKBAR": + return { + ...state, + globalMessage: action.payload.message, + toastStatus: action.payload.toastStatus, + }; + case "SETPATH": + return { + ...state, + path: action.payload.path, + }; + case "OPEN_SIDEBAR": + return { + ...state, + isOpen: action.payload.isOpen, + }; + case "SHOW_BACKBUTTON": + return { + ...state, + showBackButton: action.payload.showBackButton, + }; + case "SET_PROJECT_ROW": + return { + ...state, + projectRow: action.payload, + }; + case "SET_LEFT_PANEL": + return { + ...state, + leftPanel: action.payload, + }; + case "SET_MIDDLE_PANEL": + return { + ...state, + middlePanel: action.payload, + }; + case "SET_RIGHT_PANEL": + return { + ...state, + rightPanel: action.payload, + rightComponentId: action.rightComponentId, + }; + case "SET_SELECTED_COMPONENT": + return { + ...state, + selectedComponent: action.payload, + }; + case "SET_SELECTED_PAGE_COMPONENT": + return { + ...state, + selectedPageComponent: action.payload, + }; + case "SETROOM": + const existingRoom = state.rooms.find( + (rooms) => rooms.position === action.payload.position + ); + if (existingRoom) { + // Update the item in the array + const updatedItems = [...state?.rooms]; + updatedItems[action.payload.position] = { + position: action.payload.position, + value: action.payload.value, + }; + return { + ...state, + + rooms: updatedItems, + }; + } else { + return { + ...state, + rooms: [...state?.rooms, action.payload], + }; + } + case SET_GLOBAL_PROPERTY: + if (action.property.includes(".")) { + const [prop, field] = action.property.split("."); + return { + ...state, + [prop]: { ...state[prop], [field]: action?.payload }, + }; + } else { + return { + ...state, + [action.property]: action?.payload, + }; + } + case REQUEST_LOADING: + return { + ...state, + [action.item]: { + ...state[action?.item], + loading: action?.payload, + }, + }; + case REQUEST_SUCCESS: + return { + ...state, + [action.item]: { + ...state[action?.item], + ...action?.payload, + data: action?.payload?.data, + error: false, + success: true, + loading: false, + }, + }; + case REQUEST_FAILED: + return { + ...state, + [action.item]: { + ...state[action?.item], + ...action?.payload, + error: true, + success: false, + loading: false, + }, + }; + default: + return state; + } +}; + +/** + * @param {"success"| "error" | "warning"} toastStatus + * @param {any} dispatch + * @param {string} message + * @param {number} timeout + */ + +export const showToast = ( + dispatch, + message, + timeout = 3000, + toastStatus = "success" +) => { + dispatch({ + type: "SNACKBAR", + payload: { + message, + toastStatus, + }, + }); + + setTimeout(() => { + dispatch({ + type: "SNACKBAR", + payload: { + message: "", + }, + }); + }, timeout); +}; + +export const setGlobalProjectRow = (dispatch, data) => { + dispatch({ + type: "SET_PROJECT_ROW", + payload: data, + }); +}; + +const GlobalProvider = ({ children }) => { + const [state, dispatch] = useReducer(reducer, initialState); + // React.useEffect(() => { + + // }, []); + + return ( + + {children} + + ); +}; + +export default GlobalProvider; diff --git a/day20/src/context/Global/InitialGlobalStates.jsx b/day20/src/context/Global/InitialGlobalStates.jsx new file mode 100644 index 0000000..f8c19a1 --- /dev/null +++ b/day20/src/context/Global/InitialGlobalStates.jsx @@ -0,0 +1,14 @@ + +/** + * @property {boolean} loading + * @property {boolean} success + * @property {boolean} error + * @property {Array} data + * */ + +export const PropertyInitialState = { + loading: false, + success: false, + error: false, + data: [], +}; diff --git a/day20/src/context/Global/index.js b/day20/src/context/Global/index.js new file mode 100644 index 0000000..416ce1d --- /dev/null +++ b/day20/src/context/Global/index.js @@ -0,0 +1,28 @@ + + export { + default as GlobalProvider, + GlobalContext, + showToast, + setGlobalProjectRow, + } from "./GlobalContext"; + export { PropertyInitialState } from "./InitialGlobalStates"; + + export { + setGLobalProperty, + setLoading, + getSingleModel, + getManyByIds, + createRequest, + updateRequest, + getList, + customCreateRequest, + } from "./GlobalActions"; + + export { + RequestItems, + REQUEST_FAILED, + REQUEST_LOADING, + REQUEST_SUCCESS, + SET_GLOBAL_PROPERTY, + } from "./GlobalConstants"; + \ No newline at end of file diff --git a/day20/src/hooks/useProfile/index.js b/day20/src/hooks/useProfile/index.js new file mode 100644 index 0000000..232884e --- /dev/null +++ b/day20/src/hooks/useProfile/index.js @@ -0,0 +1,2 @@ + + export { default as useProfile } from "./useProfile"; diff --git a/day20/src/hooks/useProfile/useProfile.jsx b/day20/src/hooks/useProfile/useProfile.jsx new file mode 100644 index 0000000..94dc3fd --- /dev/null +++ b/day20/src/hooks/useProfile/useProfile.jsx @@ -0,0 +1,46 @@ + + import React from "react"; +import MkdSDK from "Utils/MkdSDK"; +import { AuthContext, tokenExpireError } from "Context/Auth"; + +const useProfile = (refresh = false) => { + const sdk = new MkdSDK(); + + const { + state: { profile: AuthProfile }, + dispatch, + } = React.useContext(AuthContext); + const [profile, setProfile] = React.useState(null); + + const getProfile = React.useCallback(() => { + (async () => { + try { + const result = await sdk.getProfile(); + console.log(result); + if (!result?.error) { + setProfile(() => result); + dispatch({ + type: "UPDATE_PROFILE", + payload: result, + }); + } + } catch (error) { + console.log(error.message); + tokenExpireError(dispatch, error.message); + } + })(); + }, [profile]); + + React.useEffect(() => { + if (!AuthProfile || refresh) { + getProfile(); + } else { + setProfile(AuthProfile); + } + // console.log("AuthProfile >>", AuthProfile); + }, [AuthProfile]); + + return [profile, setProfile]; +}; + +export default useProfile; diff --git a/day20/src/index.css b/day20/src/index.css new file mode 100644 index 0000000..6f6dd86 --- /dev/null +++ b/day20/src/index.css @@ -0,0 +1,3435 @@ + + * { + margin: 0; + padding: 0; + box-sizing: border-box; + scrollbar-width: .625rem; + scroll-padding: 6.25rem; + /* transition: all 0.5s ease-in-out; */ +} +html { + font-size: .875rem; +} +::-webkit-scrollbar { + width: .625rem; + border-radius: .75rem; +} + +::-webkit-scrollbar-thumb { + background-color: #a8a8a8; + border-radius: .75rem; +} +body { + position: relative; + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", + "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", + sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +code { + font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New", + monospace; +} +.react-toggle { + touch-action: pan-x; + + display: inline-block; + position: relative; + cursor: pointer; + background-color: transparent; + border: 0; + padding: 0; + + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + -webkit-tap-highlight-color: transparent; +} + +.react-toggle-screenreader-only { + border: 0; + clip: rect(0 0 0 0); + height: .0625rem; + margin: -0.0625rem; + overflow: hidden; + padding: 0; + position: absolute; + width: .0625rem; +} + +.react-toggle--disabled { + cursor: not-allowed; + opacity: 0.5; + -webkit-transition: opacity 0.25s; + transition: opacity 0.25s; +} + +.react-toggle-track { + width: 3.125rem; + height: 1.5rem; + padding: 0; + border-radius: 1.875rem; + background-color: #e4f1f7; + -webkit-transition: all 0.2s ease; + -moz-transition: all 0.2s ease; + transition: all 0.2s ease; +} + +.react-toggle:hover:not(.react-toggle--disabled) .react-toggle-track { + background-color: #eeeeee; +} + +.react-toggle--checked .react-toggle-track, +.react-toggle--checked .react-toggle-track:hover { + background-color: #4f46e5; +} + +.react-toggle--checked:hover:not(.react-toggle--disabled) .react-toggle-track { + background-color: #4f46e5; +} + +.react-toggle-track-check { + position: absolute; + width: .875rem; + height: .625rem; + top: 0rem; + bottom: 0rem; + margin-top: auto; + margin-bottom: auto; + line-height: 0; + left: .5rem; + opacity: 0; + -webkit-transition: opacity 0.25s ease; + -moz-transition: opacity 0.25s ease; + transition: opacity 0.25s ease; +} + +.react-toggle--checked .react-toggle-track-check { + opacity: 1; + -webkit-transition: opacity 0.25s ease; + -moz-transition: opacity 0.25s ease; + transition: opacity 0.25s ease; +} + +.react-toggle-track-x { + position: absolute; + width: .625rem; + height: .625rem; + top: 0rem; + bottom: 0rem; + margin-top: auto; + margin-bottom: auto; + line-height: 0; + right: .625rem; + opacity: 1; + -webkit-transition: opacity 0.25s ease; + -moz-transition: opacity 0.25s ease; + transition: opacity 0.25s ease; +} + +.react-toggle--checked .react-toggle-track-x { + opacity: 0; +} + +.react-toggle-thumb { + transition: all 0.5s cubic-bezier(0.23, 1, 0.32, 1) 0ms; + position: absolute; + top: .0625rem; + left: .0625rem; + width: 1.375rem; + height: 1.375rem; + border: .0625rem solid #fafafa; + border-radius: 50%; + background-color: #fafafa; + + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + + -webkit-transition: all 0.25s ease; + -moz-transition: all 0.25s ease; + transition: all 0.25s ease; +} + +.react-toggle--checked .react-toggle-thumb { + left: 1.6875rem; + border-color: #4f46e5; +} + +.react-toggle--focus .react-toggle-thumb { + -webkit-box-shadow: 0rem 0rem .1875rem .125rem #4f46e5; + -moz-box-shadow: 0rem 0rem .1875rem .125rem #4f46e5; + box-shadow: 0rem 0rem .125rem .1875rem #4f46e5; +} + +.react-toggle:active:not(.react-toggle--disabled) .react-toggle-thumb { + -webkit-box-shadow: 0rem 0rem .3125rem .3125rem #4f46e5; + -moz-box-shadow: 0rem 0rem .3125rem .3125rem #4f46e5; + box-shadow: 0rem 0rem .3125rem .3125rem #4f46e5; +} +.scrollbar-hide::-webkit-scrollbar { + display: none; +} +.scrollbar-hide { + -ms-overflow-style: none; + scrollbar-width: none; +} +.sidebar-holder { + width: 100%; + min-width: 15rem; + max-width: 15rem; + position: relative; + background: #151515; + color: #fff; + z-index: 2; + /* transition: all 0.3s; */ + min-height: 100vh; + overflow: hidden; + transition: 0.2s; +} +.open-nav { + min-width: 0rem !important; + max-width: 0rem !important; + width: 0 !important; + transition: 0.2s; + opacity: 0; +} + +.sidebar-list ul li a { + padding: .625rem; + display: block; + width: 100%; + font-size: .875rem; + font-weight: 600; + transition: 0.2s ease-in; + text-transform: capitalize; +} + +.sidebar-list .active-nav { + padding: .75rem; + color: #262626; + border-radius: .375rem; + background: #f4f4f4; +} + +.sidebar-list .active-nav:hover { + background: #f4f4f4; +} + +.sidebar-list ul li a:hover { + color: #262626; +} + +.page-header { + width: 100%; + padding: 1.25rem; + background: white; +} +.page-header span { + cursor: pointer; + display: block; + width: fit-content; + font-size: 1.25rem; +} + +.center-svg { + aspect-ratio: 1/1; + align-items: center; + justify-content: center; + line-height: 1.2em !important; +} + +.uppy-Dashboard-inner { + width: 100% !important; +} + +@tailwind base; +@tailwind components; +@tailwind utilities; + +@media screen and (max-width: 47.9375rem) { + .sidebar-holder { + width: 100%; + min-width: 12.5rem; + max-width: 12.5rem; + position: fixed; + top: 0; + left: 0; + } + .page-header span { + margin-left: auto; + } +} + +@media (max-width: 61.9988rem) { + .offcanvas-collapse { + position: fixed; + top: 3.5rem; /* Height of navbar */ + bottom: 0; + left: 100%; + width: 100%; + padding-right: 16px; + padding-left: 16px; + overflow-y: auto; + visibility: hidden; + background-color: #f8f9fa; + transition: transform 0.3s ease-in-out, visibility 0.3s ease-in-out; + } + .offcanvas-collapse.open { + visibility: visible; + transform: translateX(-100%); + } +} + +.bg-custom-light { + background-color: #e7e7e7; +} + +.bg-dim { + background-color: rgba(0, 0, 0, 0.6); +} + +.cover { + object-fit: cover; +} + +.opacity-6 { + opacity: 0.6; +} + +.opacity-5 { + opacity: 0.5; +} + +.image-vertical-scroller { + overflow-y: auto; + max-height: 28.75rem; + -webkit-overflow-scrolling: touch; + -ms-overflow-style: none; /* IE and Edge */ + scrollbar-width: none; +} + +.image-vertical-scroller::-webkit-scrollbar { + display: none; +} + +.h-scroller { + position: relative; + z-index: 2; + height: 60px; + overflow-y: hidden; +} + +.h-scroller .nav { + display: flex; + flex-wrap: nowrap; + padding-bottom: 16px; + margin-top: -0.0625rem; + overflow-x: auto; + color: rgba(255, 255, 255, 0.75); + text-align: center; + white-space: nowrap; + -webkit-overflow-scrolling: touch; +} + +.h-underline .h-link { + padding-top: 12px; + padding-bottom: 12px; + font-size: 14px; + color: #6c757d; +} + +.list-group { + display: flex; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; + border-radius: 4px; +} + +.list-group-flush { + border-radius: 0; +} +.list-group-flush > .list-group-item { + border-width: 0 0 .0625rem; +} +.list-group-flush > .list-group-item:last-child { + border-bottom-width: 0; +} + +.list-group-item { + position: relative; + display: block; + padding: 8px 16px; + color: #212529; + text-decoration: none; + background-color: #fff; + border: .0625rem solid rgba(0, 0, 0, 0.125); +} +.list-group-item:first-child { + border-top-left-radius: inherit; + border-top-right-radius: inherit; +} +.list-group-item:last-child { + border-bottom-right-radius: inherit; + border-bottom-left-radius: inherit; +} +.list-group-item.disabled, +.list-group-item:disabled { + color: #6c757d; + pointer-events: none; + background-color: #fff; +} +.list-group-item.active { + z-index: 2; + color: #fff; + background-color: #212529; + border-color: #212529; +} +.list-group-item + .list-group-item { + border-top-width: 0; +} +.list-group-item + .list-group-item.active { + margin-top: -0.0625rem; + border-top-width: .0625rem; +} + +[hidden] { + display: none; +} + +.btn { + display: inline-block; + line-height: 1.5; + text-align: center; + text-decoration: none; + vertical-align: middle; + cursor: pointer; + user-select: none; + border: .0625rem solid transparent; + padding: 6px 12px; + border-radius: 4px; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .btn { + transition: none; + } +} +.btn:hover { + color: #212529; +} +.btn-check:focus + .btn, +.btn:focus { + outline: 0; + box-shadow: 0 0 0 4px rgba(33, 37, 41, 0.25); +} +.btn:disabled, +.btn.disabled, +fieldset:disabled .btn { + pointer-events: none; + opacity: 0.65; +} + +.btn-primary { + color: #fff; + background-color: #212529; + border-color: #212529; +} +.btn-primary:hover { + color: #fff; + background-color: #1c1f23; + border-color: #1a1e21; +} +.btn-check:focus + .btn-primary, +.btn-primary:focus { + color: #fff; + background-color: #1c1f23; + border-color: #1a1e21; + box-shadow: 0 0 0 4px rgba(66, 70, 73, 0.5); +} +.btn-check:checked + .btn-primary, +.btn-check:active + .btn-primary, +.btn-primary:active, +.btn-primary.active, +.show > .btn-primary.dropdown-toggle { + color: #fff; + background-color: #1a1e21; + border-color: #191c1f; +} +.btn-check:checked + .btn-primary:focus, +.btn-check:active + .btn-primary:focus, +.btn-primary:active:focus, +.btn-primary.active:focus, +.show > .btn-primary.dropdown-toggle:focus { + box-shadow: 0 0 0 4px rgba(66, 70, 73, 0.5); +} +.btn-primary:disabled, +.btn-primary.disabled { + color: #fff; + background-color: #212529; + border-color: #212529; +} + +.btn-secondary { + color: #fff; + background-color: #0d6efd; + border-color: #0d6efd; +} +.btn-secondary:hover { + color: #fff; + background-color: #0b5ed7; + border-color: #0a58ca; +} +.btn-check:focus + .btn-secondary, +.btn-secondary:focus { + color: #fff; + background-color: #0b5ed7; + border-color: #0a58ca; + box-shadow: 0 0 0 4px rgba(49, 132, 253, 0.5); +} +.btn-check:checked + .btn-secondary, +.btn-check:active + .btn-secondary, +.btn-secondary:active, +.btn-secondary.active, +.show > .btn-secondary.dropdown-toggle { + color: #fff; + background-color: #0a58ca; + border-color: #0a53be; +} +.btn-check:checked + .btn-secondary:focus, +.btn-check:active + .btn-secondary:focus, +.btn-secondary:active:focus, +.btn-secondary.active:focus, +.show > .btn-secondary.dropdown-toggle:focus { + box-shadow: 0 0 0 4px rgba(49, 132, 253, 0.5); +} +.btn-secondary:disabled, +.btn-secondary.disabled { + color: #fff; + background-color: #0d6efd; + border-color: #0d6efd; +} + +.btn-success { + color: #fff; + background-color: #198754; + border-color: #198754; +} +.btn-success:hover { + color: #fff; + background-color: #157347; + border-color: #146c43; +} +.btn-check:focus + .btn-success, +.btn-success:focus { + color: #fff; + background-color: #157347; + border-color: #146c43; + box-shadow: 0 0 0 4px rgba(60, 153, 110, 0.5); +} +.btn-check:checked + .btn-success, +.btn-check:active + .btn-success, +.btn-success:active, +.btn-success.active, +.show > .btn-success.dropdown-toggle { + color: #fff; + background-color: #146c43; + border-color: #13653f; +} +.btn-check:checked + .btn-success:focus, +.btn-check:active + .btn-success:focus, +.btn-success:active:focus, +.btn-success.active:focus, +.show > .btn-success.dropdown-toggle:focus { + box-shadow: 0 0 0 4px rgba(60, 153, 110, 0.5); +} +.btn-success:disabled, +.btn-success.disabled { + color: #fff; + background-color: #198754; + border-color: #198754; +} + +.btn-info { + color: #000; + background-color: #0dcaf0; + border-color: #0dcaf0; +} +.btn-info:hover { + color: #000; + background-color: #31d2f2; + border-color: #25cff2; +} +.btn-check:focus + .btn-info, +.btn-info:focus { + color: #000; + background-color: #31d2f2; + border-color: #25cff2; + box-shadow: 0 0 0 4px rgba(11, 172, 204, 0.5); +} +.btn-check:checked + .btn-info, +.btn-check:active + .btn-info, +.btn-info:active, +.btn-info.active, +.show > .btn-info.dropdown-toggle { + color: #000; + background-color: #3dd5f3; + border-color: #25cff2; +} +.btn-check:checked + .btn-info:focus, +.btn-check:active + .btn-info:focus, +.btn-info:active:focus, +.btn-info.active:focus, +.show > .btn-info.dropdown-toggle:focus { + box-shadow: 0 0 0 4px rgba(11, 172, 204, 0.5); +} +.btn-info:disabled, +.btn-info.disabled { + color: #000; + background-color: #0dcaf0; + border-color: #0dcaf0; +} + +.btn-warning { + color: #000; + background-color: #ffc107; + border-color: #ffc107; +} +.btn-warning:hover { + color: #000; + background-color: #ffca2c; + border-color: #ffc720; +} +.btn-check:focus + .btn-warning, +.btn-warning:focus { + color: #000; + background-color: #ffca2c; + border-color: #ffc720; + box-shadow: 0 0 0 4px rgba(217, 164, 6, 0.5); +} +.btn-check:checked + .btn-warning, +.btn-check:active + .btn-warning, +.btn-warning:active, +.btn-warning.active, +.show > .btn-warning.dropdown-toggle { + color: #000; + background-color: #ffcd39; + border-color: #ffc720; +} +.btn-check:checked + .btn-warning:focus, +.btn-check:active + .btn-warning:focus, +.btn-warning:active:focus, +.btn-warning.active:focus, +.show > .btn-warning.dropdown-toggle:focus { + box-shadow: 0 0 0 4px rgba(217, 164, 6, 0.5); +} +.btn-warning:disabled, +.btn-warning.disabled { + color: #000; + background-color: #ffc107; + border-color: #ffc107; +} + +.btn-danger { + color: #fff; + background-color: #dc3545; + border-color: #dc3545; +} +.btn-danger:hover { + color: #fff; + background-color: #bb2d3b; + border-color: #b02a37; +} +.btn-check:focus + .btn-danger, +.btn-danger:focus { + color: #fff; + background-color: #bb2d3b; + border-color: #b02a37; + box-shadow: 0 0 0 4px rgba(225, 83, 97, 0.5); +} +.btn-check:checked + .btn-danger, +.btn-check:active + .btn-danger, +.btn-danger:active, +.btn-danger.active, +.show > .btn-danger.dropdown-toggle { + color: #fff; + background-color: #b02a37; + border-color: #a52834; +} +.btn-check:checked + .btn-danger:focus, +.btn-check:active + .btn-danger:focus, +.btn-danger:active:focus, +.btn-danger.active:focus, +.show > .btn-danger.dropdown-toggle:focus { + box-shadow: 0 0 0 4px rgba(225, 83, 97, 0.5); +} +.btn-danger:disabled, +.btn-danger.disabled { + color: #fff; + background-color: #dc3545; + border-color: #dc3545; +} + +.btn-light { + color: #000; + background-color: #f8f9fa; + border-color: #f8f9fa; +} +.btn-light:hover { + color: #000; + background-color: #f9fafb; + border-color: #f9fafb; +} +.btn-check:focus + .btn-light, +.btn-light:focus { + color: #000; + background-color: #f9fafb; + border-color: #f9fafb; + box-shadow: 0 0 0 4px rgba(211, 212, 213, 0.5); +} +.btn-check:checked + .btn-light, +.btn-check:active + .btn-light, +.btn-light:active, +.btn-light.active, +.show > .btn-light.dropdown-toggle { + color: #000; + background-color: #f9fafb; + border-color: #f9fafb; +} +.btn-check:checked + .btn-light:focus, +.btn-check:active + .btn-light:focus, +.btn-light:active:focus, +.btn-light.active:focus, +.show > .btn-light.dropdown-toggle:focus { + box-shadow: 0 0 0 4px rgba(211, 212, 213, 0.5); +} +.btn-light:disabled, +.btn-light.disabled { + color: #000; + background-color: #f8f9fa; + border-color: #f8f9fa; +} + +.btn-dark { + color: #fff; + background-color: #212529; + border-color: #212529; +} +.btn-dark:hover { + color: #fff; + background-color: #1c1f23; + border-color: #1a1e21; +} +.btn-check:focus + .btn-dark, +.btn-dark:focus { + color: #fff; + background-color: #1c1f23; + border-color: #1a1e21; + box-shadow: 0 0 0 4px rgba(66, 70, 73, 0.5); +} +.btn-check:checked + .btn-dark, +.btn-check:active + .btn-dark, +.btn-dark:active, +.btn-dark.active, +.show > .btn-dark.dropdown-toggle { + color: #fff; + background-color: #1a1e21; + border-color: #191c1f; +} +.btn-check:checked + .btn-dark:focus, +.btn-check:active + .btn-dark:focus, +.btn-dark:active:focus, +.btn-dark.active:focus, +.show > .btn-dark.dropdown-toggle:focus { + box-shadow: 0 0 0 4px rgba(66, 70, 73, 0.5); +} +.btn-dark:disabled, +.btn-dark.disabled { + color: #fff; + background-color: #212529; + border-color: #212529; +} + +.btn-outline-primary { + color: #212529; + border-color: #212529; +} +.btn-outline-primary:hover { + color: #fff; + background-color: #212529; + border-color: #212529; +} +.btn-check:focus + .btn-outline-primary, +.btn-outline-primary:focus { + box-shadow: 0 0 0 4px rgba(33, 37, 41, 0.5); +} +.btn-check:checked + .btn-outline-primary, +.btn-check:active + .btn-outline-primary, +.btn-outline-primary:active, +.btn-outline-primary.active, +.btn-outline-primary.dropdown-toggle.show { + color: #fff; + background-color: #212529; + border-color: #212529; +} +.btn-check:checked + .btn-outline-primary:focus, +.btn-check:active + .btn-outline-primary:focus, +.btn-outline-primary:active:focus, +.btn-outline-primary.active:focus, +.btn-outline-primary.dropdown-toggle.show:focus { + box-shadow: 0 0 0 4px rgba(33, 37, 41, 0.5); +} +.btn-outline-primary:disabled, +.btn-outline-primary.disabled { + color: #212529; + background-color: transparent; +} + +.btn-outline-secondary { + color: #0d6efd; + border-color: #0d6efd; +} +.btn-outline-secondary:hover { + color: #fff; + background-color: #0d6efd; + border-color: #0d6efd; +} +.btn-check:focus + .btn-outline-secondary, +.btn-outline-secondary:focus { + box-shadow: 0 0 0 4px rgba(13, 110, 253, 0.5); +} +.btn-check:checked + .btn-outline-secondary, +.btn-check:active + .btn-outline-secondary, +.btn-outline-secondary:active, +.btn-outline-secondary.active, +.btn-outline-secondary.dropdown-toggle.show { + color: #fff; + background-color: #0d6efd; + border-color: #0d6efd; +} +.btn-check:checked + .btn-outline-secondary:focus, +.btn-check:active + .btn-outline-secondary:focus, +.btn-outline-secondary:active:focus, +.btn-outline-secondary.active:focus, +.btn-outline-secondary.dropdown-toggle.show:focus { + box-shadow: 0 0 0 4px rgba(13, 110, 253, 0.5); +} +.btn-outline-secondary:disabled, +.btn-outline-secondary.disabled { + color: #0d6efd; + background-color: transparent; +} + +.btn-outline-success { + color: #198754; + border-color: #198754; +} +.btn-outline-success:hover { + color: #fff; + background-color: #198754; + border-color: #198754; +} +.btn-check:focus + .btn-outline-success, +.btn-outline-success:focus { + box-shadow: 0 0 0 4px rgba(25, 135, 84, 0.5); +} +.btn-check:checked + .btn-outline-success, +.btn-check:active + .btn-outline-success, +.btn-outline-success:active, +.btn-outline-success.active, +.btn-outline-success.dropdown-toggle.show { + color: #fff; + background-color: #198754; + border-color: #198754; +} +.btn-check:checked + .btn-outline-success:focus, +.btn-check:active + .btn-outline-success:focus, +.btn-outline-success:active:focus, +.btn-outline-success.active:focus, +.btn-outline-success.dropdown-toggle.show:focus { + box-shadow: 0 0 0 4px rgba(25, 135, 84, 0.5); +} +.btn-outline-success:disabled, +.btn-outline-success.disabled { + color: #198754; + background-color: transparent; +} + +.btn-outline-info { + color: #0dcaf0; + border-color: #0dcaf0; +} +.btn-outline-info:hover { + color: #000; + background-color: #0dcaf0; + border-color: #0dcaf0; +} +.btn-check:focus + .btn-outline-info, +.btn-outline-info:focus { + box-shadow: 0 0 0 4px rgba(13, 202, 240, 0.5); +} +.btn-check:checked + .btn-outline-info, +.btn-check:active + .btn-outline-info, +.btn-outline-info:active, +.btn-outline-info.active, +.btn-outline-info.dropdown-toggle.show { + color: #000; + background-color: #0dcaf0; + border-color: #0dcaf0; +} +.btn-check:checked + .btn-outline-info:focus, +.btn-check:active + .btn-outline-info:focus, +.btn-outline-info:active:focus, +.btn-outline-info.active:focus, +.btn-outline-info.dropdown-toggle.show:focus { + box-shadow: 0 0 0 4px rgba(13, 202, 240, 0.5); +} +.btn-outline-info:disabled, +.btn-outline-info.disabled { + color: #0dcaf0; + background-color: transparent; +} + +.btn-outline-warning { + color: #ffc107; + border-color: #ffc107; +} +.btn-outline-warning:hover { + color: #000; + background-color: #ffc107; + border-color: #ffc107; +} +.btn-check:focus + .btn-outline-warning, +.btn-outline-warning:focus { + box-shadow: 0 0 0 4px rgba(255, 193, 7, 0.5); +} +.btn-check:checked + .btn-outline-warning, +.btn-check:active + .btn-outline-warning, +.btn-outline-warning:active, +.btn-outline-warning.active, +.btn-outline-warning.dropdown-toggle.show { + color: #000; + background-color: #ffc107; + border-color: #ffc107; +} +.btn-check:checked + .btn-outline-warning:focus, +.btn-check:active + .btn-outline-warning:focus, +.btn-outline-warning:active:focus, +.btn-outline-warning.active:focus, +.btn-outline-warning.dropdown-toggle.show:focus { + box-shadow: 0 0 0 4px rgba(255, 193, 7, 0.5); +} +.btn-outline-warning:disabled, +.btn-outline-warning.disabled { + color: #ffc107; + background-color: transparent; +} + +.btn-outline-danger { + color: #dc3545; + border-color: #dc3545; +} +.btn-outline-danger:hover { + color: #fff; + background-color: #dc3545; + border-color: #dc3545; +} +.btn-check:focus + .btn-outline-danger, +.btn-outline-danger:focus { + box-shadow: 0 0 0 4px rgba(220, 53, 69, 0.5); +} +.btn-check:checked + .btn-outline-danger, +.btn-check:active + .btn-outline-danger, +.btn-outline-danger:active, +.btn-outline-danger.active, +.btn-outline-danger.dropdown-toggle.show { + color: #fff; + background-color: #dc3545; + border-color: #dc3545; +} +.btn-check:checked + .btn-outline-danger:focus, +.btn-check:active + .btn-outline-danger:focus, +.btn-outline-danger:active:focus, +.btn-outline-danger.active:focus, +.btn-outline-danger.dropdown-toggle.show:focus { + box-shadow: 0 0 0 4px rgba(220, 53, 69, 0.5); +} +.btn-outline-danger:disabled, +.btn-outline-danger.disabled { + color: #dc3545; + background-color: transparent; +} + +.btn-outline-light { + color: #f8f9fa; + border-color: #f8f9fa; +} +.btn-outline-light:hover { + color: #000; + background-color: #f8f9fa; + border-color: #f8f9fa; +} +.btn-check:focus + .btn-outline-light, +.btn-outline-light:focus { + box-shadow: 0 0 0 4px rgba(248, 249, 250, 0.5); +} +.btn-check:checked + .btn-outline-light, +.btn-check:active + .btn-outline-light, +.btn-outline-light:active, +.btn-outline-light.active, +.btn-outline-light.dropdown-toggle.show { + color: #000; + background-color: #f8f9fa; + border-color: #f8f9fa; +} +.btn-check:checked + .btn-outline-light:focus, +.btn-check:active + .btn-outline-light:focus, +.btn-outline-light:active:focus, +.btn-outline-light.active:focus, +.btn-outline-light.dropdown-toggle.show:focus { + box-shadow: 0 0 0 4px rgba(248, 249, 250, 0.5); +} +.btn-outline-light:disabled, +.btn-outline-light.disabled { + color: #f8f9fa; + background-color: transparent; +} + +.btn-outline-dark { + color: #212529; + border-color: #212529; +} +.btn-outline-dark:hover { + color: #fff; + background-color: #212529; + border-color: #212529; +} +.btn-check:focus + .btn-outline-dark, +.btn-outline-dark:focus { + box-shadow: 0 0 0 4px rgba(33, 37, 41, 0.5); +} +.btn-check:checked + .btn-outline-dark, +.btn-check:active + .btn-outline-dark, +.btn-outline-dark:active, +.btn-outline-dark.active, +.btn-outline-dark.dropdown-toggle.show { + color: #fff; + background-color: #212529; + border-color: #212529; +} +.btn-check:checked + .btn-outline-dark:focus, +.btn-check:active + .btn-outline-dark:focus, +.btn-outline-dark:active:focus, +.btn-outline-dark.active:focus, +.btn-outline-dark.dropdown-toggle.show:focus { + box-shadow: 0 0 0 4px rgba(33, 37, 41, 0.5); +} +.btn-outline-dark:disabled, +.btn-outline-dark.disabled { + color: #212529; + background-color: transparent; +} + +.btn-link { + font-weight: 400; + color: #212529; + text-decoration: underline; +} +.btn-link:hover { + color: #1a1e21; +} +.btn-link:disabled, +.btn-link.disabled { + color: #6c757d; +} + +.btn-lg, +.btn-group-lg > .btn { + padding: 8px 16px; + font-size: 20px; + border-radius: 4.8px; +} + +.btn-sm, +.btn-group-sm > .btn { + padding: 4px 8px; + font-size: 14px; + border-radius: 3.2px; +} + +.rounded-pill { + border-radius: 800px; +} + +.form-check { + display: block; + min-height: 24px; + padding-left: 1.5em; + margin-bottom: 2px; +} +.form-check .form-check-input { + float: left; + margin-left: -1.5em; +} + +.form-check-input { + width: 1em; + height: 1em; + margin-top: 0.25em; + vertical-align: top; + background-color: #fff; + background-repeat: no-repeat; + background-position: center; + background-size: contain; + border: .0625rem solid rgba(0, 0, 0, 0.25); + appearance: none; + /* color-adjust: exact; */ +} +.form-check-input[type="checkbox"] { + border-radius: 0.25em; +} +.form-check-input[type="radio"] { + border-radius: 50%; +} +.form-check-input:active { + filter: brightness(90%); +} +.form-check-input:focus { + border-color: #909294; + outline: 0; + box-shadow: 0 0 0 4px rgba(33, 37, 41, 0.25); +} +.form-check-input:checked { + background-color: #212529; + border-color: #212529; +} +.form-check-input:checked[type="checkbox"] { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10l3 3l6-6'/%3e%3c/svg%3e"); +} +.form-check-input:checked[type="radio"] { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e"); +} +.form-check-input[type="checkbox"]:indeterminate { + background-color: #212529; + border-color: #212529; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e"); +} +.form-check-input:disabled { + pointer-events: none; + filter: none; + opacity: 0.5; +} +.form-check-input[disabled] ~ .form-check-label, +.form-check-input:disabled ~ .form-check-label { + opacity: 0.5; +} + +.form-switch { + padding-left: 2.5em; +} +.form-switch .form-check-input { + width: 2em; + margin-left: -2.5em; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e"); + background-position: left center; + border-radius: 2em; + transition: background-position 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-switch .form-check-input { + transition: none; + } +} +.form-switch .form-check-input:focus { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23909294'/%3e%3c/svg%3e"); +} +.form-switch .form-check-input:checked { + background-position: right center; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e"); +} + +.form-check-inline { + display: inline-block; + margin-right: 16px; +} +.form-check-input[disabled] ~ .form-check-label, +.form-check-input:disabled ~ .form-check-label { + opacity: 0.5; +} +.form-check-input.is-valid ~ .form-check-label { + color: #198754; +} +.form-check-input.is-invalid ~ .form-check-label { + color: #dc3545; +} +.is-invalid ~ .invalid-feedback, +.is-invalid ~ .invalid-tooltip { + display: block; +} + +.was-validated .form-control:invalid, +.form-control.is-invalid { + border-color: #dc3545; + padding-right: calc(1.5em + 12px); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: right calc(0.375em + 3px) center; + background-size: calc(0.75em + 6px) calc(0.75em + 6px); +} +.was-validated .form-control:invalid:focus, +.form-control.is-invalid:focus { + border-color: #dc3545; + box-shadow: 0 0 0 4px rgba(220, 53, 69, 0.25); +} + +.was-validated textarea.form-control:invalid, +textarea.form-control.is-invalid { + padding-right: calc(1.5em + 12px); + background-position: top calc(0.375em + 3px) right + calc(0.375em + 3px); +} +.form-select { + display: block; + width: 100%; + padding: 6px 36px 6px 12px; + font-size: 16px; + font-weight: 400; + line-height: 1.5; + color: #212529; + background-color: #fff; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: right 12px center; + background-size: 1rem .75rem; + border: .0625rem solid #ced4da; + border-radius: 4px; + appearance: none; +} +.form-select:focus { + border-color: #909294; + outline: 0; + box-shadow: 0 0 0 4px rgba(33, 37, 41, 0.25); +} +.form-select[multiple], +.form-select[size]:not([size="1"]) { + padding-right: 12px; + background-image: none; +} +.form-select:disabled { + background-color: #e9ecef; +} +.form-select:-moz-focusring { + color: transparent; + text-shadow: 0 0 0 #212529; +} + +.form-select-sm { + padding-top: 4px; + padding-bottom: 4px; + padding-left: 8px; + font-size: 14px; +} + +.form-select-lg { + padding-top: 8px; + padding-bottom: 8px; + padding-left: 16px; + font-size: 20px; +} + +.was-validated .form-select:invalid, +.form-select.is-invalid { + border-color: #dc3545; +} +.was-validated .form-select:invalid:not([multiple]):not([size]), +.was-validated .form-select:invalid:not([multiple])[size="1"], +.form-select.is-invalid:not([multiple]):not([size]), +.form-select.is-invalid:not([multiple])[size="1"] { + padding-right: 66px; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"), + url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e"); + background-position: right 12px center, center right 36px; + background-size: 1rem .75rem, calc(0.75em + 6px) calc(0.75em + 6px); +} +.was-validated .form-select:invalid:focus, +.form-select.is-invalid:focus { + border-color: #dc3545; + box-shadow: 0 0 0 4px rgba(220, 53, 69, 0.25); +} + +.was-validated .form-check-input:invalid, +.form-check-input.is-invalid { + border-color: #dc3545; +} +.was-validated .form-check-input:invalid:checked, +.form-check-input.is-invalid:checked { + background-color: #dc3545; +} +.was-validated .form-check-input:invalid:focus, +.form-check-input.is-invalid:focus { + box-shadow: 0 0 0 4px rgba(220, 53, 69, 0.25); +} +.was-validated .form-check-input:invalid ~ .form-check-label, +.form-check-input.is-invalid ~ .form-check-label { + color: #dc3545; +} + +.form-check-inline .form-check-input ~ .invalid-feedback { + margin-left: 0.5em; +} + +.was-validated .input-group .form-control:invalid, +.input-group .form-control.is-invalid, +.was-validated .input-group .form-select:invalid, +.input-group .form-select.is-invalid { + z-index: 2; +} +.was-validated .input-group .form-control:invalid:focus, +.input-group .form-control.is-invalid:focus, +.was-validated .input-group .form-select:invalid:focus, +.input-group .form-select.is-invalid:focus { + z-index: 3; +} +.form-floating { + position: relative; +} +.form-floating > .form-control, +.form-floating > .form-select { + height: calc(56px + .125rem); + padding: 16px 12px; +} +.form-floating > label { + position: absolute; + top: 0; + left: 0; + height: 100%; + padding: 16px 12px; + pointer-events: none; + border: .0625rem solid transparent; + transform-origin: 0 0; + transition: opacity 0.1s ease-in-out, transform 0.1s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-floating > label { + transition: none; + } +} +.form-floating > .form-control::placeholder { + color: transparent; +} +.form-floating > .form-control:focus, +.form-floating > .form-control:not(:placeholder-shown) { + padding-top: 26px; + padding-bottom: 10px; +} +.form-floating > .form-control:-webkit-autofill { + padding-top: 26px; + padding-bottom: 10px; +} +.form-floating > .form-select { + padding-top: 26px; + padding-bottom: 10px; +} +.form-floating > .form-control:focus ~ label, +.form-floating > .form-control:not(:placeholder-shown) ~ label, +.form-floating > .form-select ~ label { + opacity: 0.65; + transform: scale(0.85) translateY(-8px) translateX(2.4px); +} +.form-floating > .form-control:-webkit-autofill ~ label { + opacity: 0.65; + transform: scale(0.85) translateY(-8px) translateX(2.4px); +} +.form-control { + display: block; + width: 100%; + padding: 6px 12px; + font-size: 16px; + font-weight: 400; + line-height: 1.5; + color: #212529; + background-color: #fff; + background-clip: padding-box; + border: .0625rem solid #ced4da; + appearance: none; + border-radius: 4px; + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-control { + transition: none; + } +} +.form-control[type="file"] { + overflow: hidden; +} +.form-control[type="file"]:not(:disabled):not([readonly]) { + cursor: pointer; +} +.form-control:focus { + color: #212529; + background-color: #fff; + border-color: #909294; + outline: 0; + box-shadow: 0 0 0 4px rgba(33, 37, 41, 0.25); +} +.form-control::-webkit-date-and-time-value { + height: 1.5em; +} +.form-control::placeholder { + color: #6c757d; + opacity: 1; +} +.form-control:disabled, +.form-control[readonly] { + background-color: #e9ecef; + opacity: 1; +} +.form-control::file-selector-button { + padding: 6px 12px; + margin: -6px -12px; + margin-inline-end: 12px; + color: #212529; + background-color: #e9ecef; + pointer-events: none; + border-color: inherit; + border-style: solid; + border-width: 0; + border-inline-end-width: .0625rem; + border-radius: 0; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-control::file-selector-button { + transition: none; + } +} +.form-control:hover:not(:disabled):not([readonly])::file-selector-button { + background-color: #dde0e3; +} +.form-control::-webkit-file-upload-button { + padding: 6px 12px; + margin: -6px -12px; + margin-inline-end: 12px; + color: #212529; + background-color: #e9ecef; + pointer-events: none; + border-color: inherit; + border-style: solid; + border-width: 0; + border-inline-end-width: .0625rem; + border-radius: 0; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-control::-webkit-file-upload-button { + transition: none; + } +} +.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button { + background-color: #dde0e3; +} + +.form-control-plaintext { + display: block; + width: 100%; + padding: 6px 0; + margin-bottom: 0; + line-height: 1.5; + color: #212529; + background-color: transparent; + border: solid transparent; + border-width: .0625rem 0; +} +.form-control-plaintext.form-control-sm, +.form-control-plaintext.form-control-lg { + padding-right: 0; + padding-left: 0; +} + +.form-control-sm { + min-height: calc(1.5em + 8px + .125rem); + padding: 4px 8px; + font-size: 14px; + border-radius: 3.2px; +} +.form-control-sm::file-selector-button { + padding: 4px 8px; + margin: -4px -8px; + margin-inline-end: 8px; +} +.form-control-sm::-webkit-file-upload-button { + padding: 4px 8px; + margin: -4px -8px; + margin-inline-end: 8px; +} + +.form-control-lg { + min-height: calc(1.5em + 16px + .125rem); + padding: 8px 16px; + font-size: 20px; + border-radius: 4.8px; +} +.form-control-lg::file-selector-button { + padding: 8px 16px; + margin: -8px -16px; + margin-inline-end: 16px; +} +.form-control-lg::-webkit-file-upload-button { + padding: 8px 16px; + margin: -8px -16px; + margin-inline-end: 16px; +} + +textarea.form-control { + min-height: calc(1.5em + 12px + .125rem); +} +textarea.form-control-sm { + min-height: calc(1.5em + 8px + .125rem); +} +textarea.form-control-lg { + min-height: calc(1.5em + 16px + .125rem); +} + +.form-control-color { + max-width: 48px; + height: auto; + padding: 6px; +} +.form-control-color:not(:disabled):not([readonly]) { + cursor: pointer; +} +.form-control-color::-moz-color-swatch { + height: 1.5em; + border-radius: 4px; +} +.form-control-color::-webkit-color-swatch { + height: 1.5em; + border-radius: 4px; +} +.form-floating > .form-control::placeholder { + color: transparent; +} +.form-floating > .form-control:focus, +.form-floating > .form-control:not(:placeholder-shown) { + padding-top: 26px; + padding-bottom: 10px; +} +.form-floating > .form-control:-webkit-autofill { + padding-top: 26px; + padding-bottom: 10px; +} +.form-floating > .form-select { + padding-top: 26px; + padding-bottom: 10px; +} +.form-floating > .form-control:focus ~ label, +.form-floating > .form-control:not(:placeholder-shown) ~ label, +.form-floating > .form-select ~ label { + opacity: 0.65; + transform: scale(0.85) translateY(-8px) translateX(2.4px); +} +.form-floating > .form-control:-webkit-autofill ~ label { + opacity: 0.65; + transform: scale(0.85) translateY(-8px) translateX(2.4px); +} + +.input-group { + position: relative; + display: flex; + flex-wrap: wrap; + align-items: stretch; + width: 100%; +} +.input-group > .form-control, +.input-group > .form-select { + position: relative; + flex: 1 1 auto; + width: 1%; + min-width: 0; +} +.input-group > .form-control:focus, +.input-group > .form-select:focus { + z-index: 3; +} +.form-control.is-valid { + border-color: #198754; + padding-right: calc(1.5em + 12px); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: right calc(0.375em + 3px) center; + background-size: calc(0.75em + 6px) calc(0.75em + 6px); +} +.was-validated .form-control:valid:focus, +.form-control.is-valid:focus { + border-color: #198754; + box-shadow: 0 0 0 4px rgba(25, 135, 84, 0.25); +} + +.was-validated textarea.form-control:valid, +textarea.form-control.is-valid { + padding-right: calc(1.5em + 12px); + background-position: top calc(0.375em + 3px) right + calc(0.375em + 3px); +} +.was-validated .input-group .form-control:valid, +.input-group .form-control.is-valid, +.was-validated .input-group .form-select:valid, +.input-group .form-select.is-valid { + z-index: 1; +} +.was-validated .input-group .form-control:valid:focus, +.input-group .form-control.is-valid:focus, +.was-validated .input-group .form-select:valid:focus, +.input-group .form-select.is-valid:focus { + z-index: 3; +} +.form-control.is-invalid { + border-color: #dc3545; + padding-right: calc(1.5em + 12px); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: right calc(0.375em + 3px) center; + background-size: calc(0.75em + 6px) calc(0.75em + 6px); +} +.was-validated .form-control:invalid:focus, +.form-control.is-invalid:focus { + border-color: #dc3545; + box-shadow: 0 0 0 4px rgba(220, 53, 69, 0.25); +} + +.was-validated textarea.form-control:invalid, +textarea.form-control.is-invalid { + padding-right: calc(1.5em + 12px); + background-position: top calc(0.375em + 3px) right + calc(0.375em + 3px); +} +.was-validated .input-group .form-control:invalid, +.input-group .form-control.is-invalid, +.was-validated .input-group .form-select:invalid, +.input-group .form-select.is-invalid { + z-index: 2; +} +.was-validated .input-group .form-control:invalid:focus, +.input-group .form-control.is-invalid:focus, +.was-validated .input-group .form-select:invalid:focus, +.input-group .form-select.is-invalid:focus { + z-index: 3; +} +.breadcrumb { + display: flex; + flex-wrap: wrap; + /* padding: 0 0; */ + margin-bottom: 16px; + list-style: none; +} + +.breadcrumb-item + .breadcrumb-item { + padding-left: 8px; +} +.breadcrumb-item + .breadcrumb-item::before { + float: left; + padding-right: 8px; + color: #6c757d; + content: var(--bs-breadcrumb-divider, "/") + /* rtl: var(--bs-breadcrumb-divider, "/") */; +} +.breadcrumb-item.active { + color: #6c757d; +} +.link-secondary { + color: #0d6efd; +} +.link-secondary:hover, +.link-secondary:focus { + color: #0a58ca; +} +.nav { + display: flex; + flex-wrap: wrap; + padding-left: 0; + margin-bottom: 0; + list-style: none; +} + +.nav-link { + display: block; + padding: 8px 16px; + color: #212529; + text-decoration: none; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .nav-link { + transition: none; + } +} +.nav-link:hover, +.nav-link:focus { + color: #1a1e21; +} +.nav-link.disabled { + color: #6c757d; + pointer-events: none; + cursor: default; +} + +.nav-tabs { + border-bottom: .0625rem solid #dee2e6; +} +.nav-tabs .nav-link { + margin-bottom: -0.0625rem; + background: none; + border: .0625rem solid transparent; + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} +.nav-tabs .nav-link:hover, +.nav-tabs .nav-link:focus { + border-color: #e9ecef #e9ecef #dee2e6; + isolation: isolate; +} +.nav-tabs .nav-link.disabled { + color: #6c757d; + background-color: transparent; + border-color: transparent; +} +.nav-tabs .nav-link.active, +.nav-tabs .nav-item.show .nav-link { + color: #495057; + background-color: #fff; + border-color: #dee2e6 #dee2e6 #fff; +} +.nav-tabs .dropdown-menu { + margin-top: -0.0625rem; + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.nav-pills .nav-link { + background: none; + border: 0; + border-radius: 4px; +} +.nav-pills .nav-link.active, +.nav-pills .show > .nav-link { + color: #fff; + background-color: #212529; +} + +.nav-fill > .nav-link, +.nav-fill .nav-item { + flex: 1 1 auto; + text-align: center; +} + +.nav-justified > .nav-link, +.nav-justified .nav-item { + flex-basis: 0; + flex-grow: 1; + text-align: center; +} + +.nav-fill .nav-item .nav-link, +.nav-justified .nav-item .nav-link { + width: 100%; +} +.accordion-button { + position: relative; + display: flex; + align-items: center; + width: 100%; + padding: 16px 20px; + font-size: 16px; + color: #212529; + text-align: left; + background-color: #fff; + border: 0; + border-radius: 0; + overflow-anchor: none; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, + border-radius 0.15s ease; +} +@media (prefers-reduced-motion: reduce) { + .accordion-button { + transition: none; + } +} +.accordion-button:not(.collapsed) { + color: #1e2125; + background-color: #e9e9ea; + box-shadow: inset 0 -0.0625rem 0 rgba(0, 0, 0, 0.125); +} +.accordion-button:not(.collapsed)::after { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%231e2125'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); + transform: rotate(-180deg); +} +.accordion-button::after { + flex-shrink: 0; + width: 20px; + height: 20px; + margin-left: auto; + content: ""; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-size: 20px; + transition: transform 0.2s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .accordion-button::after { + transition: none; + } +} +.accordion-button:hover { + z-index: 2; +} +.accordion-button:focus { + z-index: 3; + border-color: #909294; + outline: 0; + box-shadow: 0 0 0 4px rgba(33, 37, 41, 0.25); +} + +.accordion-header { + margin-bottom: 0; +} + +.accordion-item { + background-color: #fff; + border: .0625rem solid rgba(0, 0, 0, 0.125); +} +.accordion-item:first-of-type { + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} +.accordion-item:first-of-type .accordion-button { + border-top-left-radius: calc(4px - .0625rem); + border-top-right-radius: calc(4px - .0625rem); +} +.accordion-item:not(:first-of-type) { + border-top: 0; +} +.accordion-item:last-of-type { + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +.accordion-item:last-of-type .accordion-button.collapsed { + border-bottom-right-radius: calc(4px - .0625rem); + border-bottom-left-radius: calc(4px - .0625rem); +} +.accordion-item:last-of-type .accordion-collapse { + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} + +.accordion-body { + padding: 16px 20px; +} + +.accordion-flush .accordion-collapse { + border-width: 0; +} +.accordion-flush .accordion-item { + border-right: 0; + border-left: 0; + border-radius: 0; +} +.accordion-flush .accordion-item:first-child { + border-top: 0; +} +.accordion-flush .accordion-item:last-child { + border-bottom: 0; +} +.accordion-flush .accordion-item .accordion-button { + border-radius: 0; +} +.collapse:not(.show) { + display: none; +} +.accordion-item:last-of-type .accordion-button.collapsed { + border-bottom-right-radius: calc(4px - .0625rem); + border-bottom-left-radius: calc(4px - .0625rem); +} + +.row { + --bs-gutter-x: 24px; + --bs-gutter-y: 0; + display: flex; + flex-wrap: wrap; + margin-top: calc(var(--bs-gutter-y) * -1); + margin-right: calc(var(--bs-gutter-x) / -2); + margin-left: calc(var(--bs-gutter-x) / -2); +} +.row > * { + flex-shrink: 0; + width: 100%; + max-width: 100%; + padding-right: calc(var(--bs-gutter-x) / 2); + padding-left: calc(var(--bs-gutter-x) / 2); + margin-top: var(--bs-gutter-y); +} + +.col { + flex: 1 0 0%; +} + +.row-cols-auto > * { + flex: 0 0 auto; + width: auto; +} + +.row-cols-1 > * { + flex: 0 0 auto; + width: 100%; +} + +.row-cols-2 > * { + flex: 0 0 auto; + width: 50%; +} + +.row-cols-3 > * { + flex: 0 0 auto; + width: 33.3333333333%; +} + +.row-cols-4 > * { + flex: 0 0 auto; + width: 25%; +} + +.row-cols-5 > * { + flex: 0 0 auto; + width: 20%; +} + +.row-cols-6 > * { + flex: 0 0 auto; + width: 16.6666666667%; +} + +.flex-shrink-0 { + flex-shrink: 0; +} +.text-muted { + color: #6c757d; +} +.pagination { + display: flex; + padding-left: 0; + list-style: none; +} +.pagination-lg .page-link { + padding: 12px 24px; + font-size: 20px; +} +.pagination-lg .page-item:first-child .page-link { + border-top-left-radius: 4.8px; + border-bottom-left-radius: 4.8px; +} +.pagination-lg .page-item:last-child .page-link { + border-top-right-radius: 4.8px; + border-bottom-right-radius: 4.8px; +} + +.page-item:not(:first-child) .page-link { + margin-left: -0.0625rem; +} +.page-item.active .page-link { + z-index: 3; + color: #fff; + background-color: #212529; + border-color: #212529; +} +.page-item.disabled .page-link { + color: #6c757d; + pointer-events: none; + background-color: #fff; + border-color: #dee2e6; +} + +.page-link { + padding: 6px 12px; +} + +.page-item:first-child .page-link { + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; +} +.page-item:last-child .page-link { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; +} + +.pagination-sm .page-link { + padding: 4px 8px; + font-size: 14px; +} +.pagination-sm .page-item:first-child .page-link { + border-top-left-radius: 3.2px; + border-bottom-left-radius: 3.2px; +} +.pagination-sm .page-item:last-child .page-link { + border-top-right-radius: 3.2px; + border-bottom-right-radius: 3.2px; +} +.page-link { + position: relative; + display: block; + color: #212529; + text-decoration: none; + background-color: #fff; + border: .0625rem solid #dee2e6; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .page-link { + transition: none; + } +} +.page-link:hover { + z-index: 2; + color: #1a1e21; + background-color: #e9ecef; + border-color: #dee2e6; +} +.page-link:focus { + z-index: 3; + color: #1a1e21; + background-color: #e9ecef; + outline: 0; + box-shadow: 0 0 0 4px rgba(33, 37, 41, 0.25); +} + +.page-item:not(:first-child) .page-link { + margin-left: -0.0625rem; +} +.page-item.active .page-link { + z-index: 3; + color: #fff; + background-color: #212529; + border-color: #212529; +} +.page-item.disabled .page-link { + color: #6c757d; + pointer-events: none; + background-color: #fff; + border-color: #dee2e6; +} + +.page-link { + padding: 6px 12px; +} + +.page-item:first-child .page-link { + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; +} +.page-item:last-child .page-link { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; +} + +.page-item.active .page-link { + z-index: 3; + color: #fff; + background-color: #212529; + border-color: #212529; +} +.card { + position: relative; + display: flex; + flex-direction: column; + min-width: 0; + word-wrap: break-word; + background-color: #fff; + background-clip: border-box; + border: .0625rem solid rgba(0, 0, 0, 0.125); + border-radius: 4px; +} +.card > hr { + margin-right: 0; + margin-left: 0; +} +.card > .list-group { + border-top: inherit; + border-bottom: inherit; +} +.card > .list-group:first-child { + border-top-width: 0; + border-top-left-radius: calc(4px - .0625rem); + border-top-right-radius: calc(4px - .0625rem); +} +.card > .list-group:last-child { + border-bottom-width: 0; + border-bottom-right-radius: calc(4px - .0625rem); + border-bottom-left-radius: calc(4px - .0625rem); +} +.card > .card-header + .list-group, +.card > .list-group + .card-footer { + border-top: 0; +} + +.card-body { + flex: 1 1 auto; + padding: 16px 16px; +} + +.card-title { + margin-bottom: 8px; +} + +.card-subtitle { + margin-top: -4px; + margin-bottom: 0; +} + +.card-text:last-child { + margin-bottom: 0; +} + +.card-link:hover { + text-decoration: none; +} +.card-link + .card-link { + margin-left: 16px; +} + +.card-header { + padding: 8px 16px; + margin-bottom: 0; + background-color: rgba(0, 0, 0, 0.03); + border-bottom: .0625rem solid rgba(0, 0, 0, 0.125); +} +.card-header:first-child { + border-radius: calc(4px - .0625rem) calc(4px - .0625rem) 0 0; +} + +.card-footer { + padding: 8px 16px; + background-color: rgba(0, 0, 0, 0.03); + border-top: .0625rem solid rgba(0, 0, 0, 0.125); +} +.card-footer:last-child { + border-radius: 0 0 calc(4px - .0625rem) calc(4px - .0625rem); +} + +.card-header-tabs { + margin-right: -8px; + margin-bottom: -8px; + margin-left: -8px; + border-bottom: 0; +} + +.card-header-pills { + margin-right: -8px; + margin-left: -8px; +} + +.card-img-overlay { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: 16px; + border-radius: calc(4px - .0625rem); +} + +.card-img, +.card-img-top, +.card-img-bottom { + width: 100%; +} + +.card-img, +.card-img-top { + border-top-left-radius: calc(4px - .0625rem); + border-top-right-radius: calc(4px - .0625rem); +} + +.card-img, +.card-img-bottom { + border-bottom-right-radius: calc(4px - .0625rem); + border-bottom-left-radius: calc(4px - .0625rem); +} + +.card-group > .card { + margin-bottom: 12px; +} +@media (min-width: 36rem) { + .card-group { + display: flex; + flex-flow: row wrap; + } + .card-group > .card { + flex: 1 0 0%; + margin-bottom: 0; + } + .card-group > .card + .card { + margin-left: 0; + border-left: 0; + } + .card-group > .card:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + .card-group > .card:not(:last-child) .card-img-top, + .card-group > .card:not(:last-child) .card-header { + border-top-right-radius: 0; + } + .card-group > .card:not(:last-child) .card-img-bottom, + .card-group > .card:not(:last-child) .card-footer { + border-bottom-right-radius: 0; + } + .card-group > .card:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } + .card-group > .card:not(:first-child) .card-img-top, + .card-group > .card:not(:first-child) .card-header { + border-top-left-radius: 0; + } + .card-group > .card:not(:first-child) .card-img-bottom, + .card-group > .card:not(:first-child) .card-footer { + border-bottom-left-radius: 0; + } +} +.card-group > .card { + margin-bottom: 12px; +} +@media (min-width: 36rem) { + .card-group { + display: flex; + flex-flow: row wrap; + } + .card-group > .card { + flex: 1 0 0%; + margin-bottom: 0; + } + .card-group > .card + .card { + margin-left: 0; + border-left: 0; + } + .card-group > .card:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + .card-group > .card:not(:last-child) .card-img-top, + .card-group > .card:not(:last-child) .card-header { + border-top-right-radius: 0; + } + .card-group > .card:not(:last-child) .card-img-bottom, + .card-group > .card:not(:last-child) .card-footer { + border-bottom-right-radius: 0; + } + .card-group > .card:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } + .card-group > .card:not(:first-child) .card-img-top, + .card-group > .card:not(:first-child) .card-header { + border-top-left-radius: 0; + } + .card-group > .card:not(:first-child) .card-img-bottom, + .card-group > .card:not(:first-child) .card-footer { + border-bottom-left-radius: 0; + } +} +.col { + flex: 1 0 0%; +} +.col-4 { + flex: 0 0 auto; + width: 33.3333333333%; +} +.rounded-start { + border-bottom-left-radius: 4px; + border-top-left-radius: 4px; +} +.bg-dark { + background-color: #212529; +} +.col-1 { + flex: 0 0 auto; + width: 8.3333333333%; +} + +.col-2 { + flex: 0 0 auto; + width: 16.6666666667%; +} + +.col-3 { + flex: 0 0 auto; + width: 25%; +} + +.col-4 { + flex: 0 0 auto; + width: 33.3333333333%; +} + +.col-5 { + flex: 0 0 auto; + width: 41.6666666667%; +} + +.col-6 { + flex: 0 0 auto; + width: 50%; +} + +.col-7 { + flex: 0 0 auto; + width: 58.3333333333%; +} + +.col-8 { + flex: 0 0 auto; + width: 66.6666666667%; +} + +.col-9 { + flex: 0 0 auto; + width: 75%; +} + +.col-10 { + flex: 0 0 auto; + width: 83.3333333333%; +} + +.col-11 { + flex: 0 0 auto; + width: 91.6666666667%; +} + +.col-12 { + flex: 0 0 auto; + width: 100%; +} +.text-dark { + color: #212529; +} +.badge { + display: inline-block; + padding: 0.35em 0.65em; + font-size: 0.75em; + font-weight: 700; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: 4px; +} +.badge:empty { + display: none; +} + +.btn .badge { + position: relative; + top: -0.0625rem; +} +.card-img, +.card-img-top, +.card-img-bottom { + width: 100%; +} + +.card-img, +.card-img-top { + border-top-left-radius: calc(4px - .0625rem); + border-top-right-radius: calc(4px - .0625rem); +} + +.lead { + font-size: 20px; + font-weight: 300; +} + +@media (min-width: 36rem) { + .row { + --bs-gutter-x: 40px; + --bs-gutter-y: 0; + display: flex; + flex-wrap: wrap; + margin-top: calc(var(--bs-gutter-y) * -1); + margin-right: calc(var(--bs-gutter-x) / -2); + margin-left: calc(var(--bs-gutter-x) / -2); + } + .col-sm { + flex: 1 0 0%; + } + + .row-cols-sm-auto > * { + flex: 0 0 auto; + width: auto; + } + + .row-cols-sm-1 > * { + flex: 0 0 auto; + width: 100%; + } + + .row-cols-sm-2 > * { + flex: 0 0 auto; + width: 50%; + } + + .row-cols-sm-3 > * { + flex: 0 0 auto; + width: 33.3333333333%; + } + + .row-cols-sm-4 > * { + flex: 0 0 auto; + width: 25%; + } + + .row-cols-sm-5 > * { + flex: 0 0 auto; + width: 20%; + } + + .row-cols-sm-6 > * { + flex: 0 0 auto; + width: 16.6666666667%; + } + + .col-sm-auto { + flex: 0 0 auto; + width: auto; + } + + .col-sm-1 { + flex: 0 0 auto; + width: 8.3333333333%; + } + + .col-sm-2 { + flex: 0 0 auto; + width: 16.6666666667%; + } + + .col-sm-3 { + flex: 0 0 auto; + width: 25%; + } + + .col-sm-4 { + flex: 0 0 auto; + width: 33.3333333333%; + } + + .col-sm-5 { + flex: 0 0 auto; + width: 41.6666666667%; + } + + .col-sm-6 { + flex: 0 0 auto; + width: 50%; + } + + .col-sm-7 { + flex: 0 0 auto; + width: 58.3333333333%; + } + + .col-sm-8 { + flex: 0 0 auto; + width: 66.6666666667%; + } + + .col-sm-9 { + flex: 0 0 auto; + width: 75%; + } + + .col-sm-10 { + flex: 0 0 auto; + width: 83.3333333333%; + } + + .col-sm-11 { + flex: 0 0 auto; + width: 91.6666666667%; + } + + .col-sm-12 { + flex: 0 0 auto; + width: 100%; + } + + .offset-sm-0 { + margin-left: 0; + } + + .offset-sm-1 { + margin-left: 8.3333333333%; + } + + .offset-sm-2 { + margin-left: 16.6666666667%; + } + + .offset-sm-3 { + margin-left: 25%; + } + + .offset-sm-4 { + margin-left: 33.3333333333%; + } + + .offset-sm-5 { + margin-left: 41.6666666667%; + } + + .offset-sm-6 { + margin-left: 50%; + } + + .offset-sm-7 { + margin-left: 58.3333333333%; + } + + .offset-sm-8 { + margin-left: 66.6666666667%; + } + + .offset-sm-9 { + margin-left: 75%; + } + + .offset-sm-10 { + margin-left: 83.3333333333%; + } + + .offset-sm-11 { + margin-left: 91.6666666667%; + } +} +@media (min-width: 48rem) { + .col-md { + flex: 1 0 0%; + } + + .row-cols-md-auto > * { + flex: 0 0 auto; + width: auto; + } + + .row-cols-md-1 > * { + flex: 0 0 auto; + width: 100%; + } + + .row-cols-md-2 > * { + flex: 0 0 auto; + width: 50%; + } + + .row-cols-md-3 > * { + flex: 0 0 auto; + width: 33.3333333333%; + } + + .row-cols-md-4 > * { + flex: 0 0 auto; + width: 25%; + } + + .row-cols-md-5 > * { + flex: 0 0 auto; + width: 20%; + } + + .row-cols-md-6 > * { + flex: 0 0 auto; + width: 16.6666666667%; + } + + .col-md-auto { + flex: 0 0 auto; + width: auto; + } + + .col-md-1 { + flex: 0 0 auto; + width: 8.3333333333%; + } + + .col-md-2 { + flex: 0 0 auto; + width: 16.6666666667%; + } + + .col-md-3 { + flex: 0 0 auto; + width: 25%; + } + + .col-md-4 { + flex: 0 0 auto; + width: 33.3333333333%; + } + + .col-md-5 { + flex: 0 0 auto; + width: 41.6666666667%; + } + + .col-md-6 { + flex: 0 0 auto; + width: 50%; + } + + .col-md-7 { + flex: 0 0 auto; + width: 58.3333333333%; + } + + .col-md-8 { + flex: 0 0 auto; + width: 66.6666666667%; + } + + .col-md-9 { + flex: 0 0 auto; + width: 75%; + } + + .col-md-10 { + flex: 0 0 auto; + width: 83.3333333333%; + } + + .col-md-11 { + flex: 0 0 auto; + width: 91.6666666667%; + } + + .col-md-12 { + flex: 0 0 auto; + width: 100%; + } + + .offset-md-0 { + margin-left: 0; + } + + .offset-md-1 { + margin-left: 8.3333333333%; + } + + .offset-md-2 { + margin-left: 16.6666666667%; + } + + .offset-md-3 { + margin-left: 25%; + } + + .offset-md-4 { + margin-left: 33.3333333333%; + } + + .offset-md-5 { + margin-left: 41.6666666667%; + } + + .offset-md-6 { + margin-left: 50%; + } + + .offset-md-7 { + margin-left: 58.3333333333%; + } + + .offset-md-8 { + margin-left: 66.6666666667%; + } + + .offset-md-9 { + margin-left: 75%; + } + + .offset-md-10 { + margin-left: 83.3333333333%; + } + + .offset-md-11 { + margin-left: 91.6666666667%; + } +} +@media (min-width: 62rem) { + .col-lg { + flex: 1 0 0%; + } + + .row-cols-lg-auto > * { + flex: 0 0 auto; + width: auto; + } + + .row-cols-lg-1 > * { + flex: 0 0 auto; + width: 100%; + } + + .row-cols-lg-2 > * { + flex: 0 0 auto; + width: 50%; + } + + .row-cols-lg-3 > * { + flex: 0 0 auto; + width: 33.3333333333%; + } + + .row-cols-lg-4 > * { + flex: 0 0 auto; + width: 25%; + } + + .row-cols-lg-5 > * { + flex: 0 0 auto; + width: 20%; + } + + .row-cols-lg-6 > * { + flex: 0 0 auto; + width: 16.6666666667%; + } + + .col-lg-auto { + flex: 0 0 auto; + width: auto; + } + + .col-lg-1 { + flex: 0 0 auto; + width: 8.3333333333%; + } + + .col-lg-2 { + flex: 0 0 auto; + width: 16.6666666667%; + } + + .col-lg-3 { + flex: 0 0 auto; + width: 25%; + } + + .col-lg-4 { + flex: 0 0 auto; + width: 33.3333333333%; + } + + .col-lg-5 { + flex: 0 0 auto; + width: 41.6666666667%; + } + + .col-lg-6 { + flex: 0 0 auto; + width: 50%; + } + + .col-lg-7 { + flex: 0 0 auto; + width: 58.3333333333%; + } + + .col-lg-8 { + flex: 0 0 auto; + width: 66.6666666667%; + } + + .col-lg-9 { + flex: 0 0 auto; + width: 75%; + } + + .col-lg-10 { + flex: 0 0 auto; + width: 83.3333333333%; + } + + .col-lg-11 { + flex: 0 0 auto; + width: 91.6666666667%; + } + + .col-lg-12 { + flex: 0 0 auto; + width: 100%; + } + + .offset-lg-0 { + margin-left: 0; + } + + .offset-lg-1 { + margin-left: 8.3333333333%; + } + + .offset-lg-2 { + margin-left: 16.6666666667%; + } + + .offset-lg-3 { + margin-left: 25%; + } + + .offset-lg-4 { + margin-left: 33.3333333333%; + } + + .offset-lg-5 { + margin-left: 41.6666666667%; + } + + .offset-lg-6 { + margin-left: 50%; + } + + .offset-lg-7 { + margin-left: 58.3333333333%; + } + + .offset-lg-8 { + margin-left: 66.6666666667%; + } + + .offset-lg-9 { + margin-left: 75%; + } + + .offset-lg-10 { + margin-left: 83.3333333333%; + } + + .offset-lg-11 { + margin-left: 91.6666666667%; + } +} +@media (min-width: 75rem) { + .col-xl { + flex: 1 0 0%; + } + + .row-cols-xl-auto > * { + flex: 0 0 auto; + width: auto; + } + + .row-cols-xl-1 > * { + flex: 0 0 auto; + width: 100%; + } + + .row-cols-xl-2 > * { + flex: 0 0 auto; + width: 50%; + } + + .row-cols-xl-3 > * { + flex: 0 0 auto; + width: 33.3333333333%; + } + + .row-cols-xl-4 > * { + flex: 0 0 auto; + width: 25%; + } + + .row-cols-xl-5 > * { + flex: 0 0 auto; + width: 20%; + } + + .row-cols-xl-6 > * { + flex: 0 0 auto; + width: 16.6666666667%; + } + + .col-xl-auto { + flex: 0 0 auto; + width: auto; + } + + .col-xl-1 { + flex: 0 0 auto; + width: 8.3333333333%; + } + + .col-xl-2 { + flex: 0 0 auto; + width: 16.6666666667%; + } + + .col-xl-3 { + flex: 0 0 auto; + width: 25%; + } + + .col-xl-4 { + flex: 0 0 auto; + width: 33.3333333333%; + } + + .col-xl-5 { + flex: 0 0 auto; + width: 41.6666666667%; + } + + .col-xl-6 { + flex: 0 0 auto; + width: 50%; + } + + .col-xl-7 { + flex: 0 0 auto; + width: 58.3333333333%; + } + + .col-xl-8 { + flex: 0 0 auto; + width: 66.6666666667%; + } + + .col-xl-9 { + flex: 0 0 auto; + width: 75%; + } + + .col-xl-10 { + flex: 0 0 auto; + width: 83.3333333333%; + } + + .col-xl-11 { + flex: 0 0 auto; + width: 91.6666666667%; + } + + .col-xl-12 { + flex: 0 0 auto; + width: 100%; + } + + .offset-xl-0 { + margin-left: 0; + } + + .offset-xl-1 { + margin-left: 8.3333333333%; + } + + .offset-xl-2 { + margin-left: 16.6666666667%; + } + + .offset-xl-3 { + margin-left: 25%; + } + + .offset-xl-4 { + margin-left: 33.3333333333%; + } + + .offset-xl-5 { + margin-left: 41.6666666667%; + } + + .offset-xl-6 { + margin-left: 50%; + } + + .offset-xl-7 { + margin-left: 58.3333333333%; + } + + .offset-xl-8 { + margin-left: 66.6666666667%; + } + + .offset-xl-9 { + margin-left: 75%; + } + + .offset-xl-10 { + margin-left: 83.3333333333%; + } + + .offset-xl-11 { + margin-left: 91.6666666667%; + } +} +@media (min-width: 87.5rem) { + .col-xxl { + flex: 1 0 0%; + } + + .row-cols-xxl-auto > * { + flex: 0 0 auto; + width: auto; + } + + .row-cols-xxl-1 > * { + flex: 0 0 auto; + width: 100%; + } + + .row-cols-xxl-2 > * { + flex: 0 0 auto; + width: 50%; + } + + .row-cols-xxl-3 > * { + flex: 0 0 auto; + width: 33.3333333333%; + } + + .row-cols-xxl-4 > * { + flex: 0 0 auto; + width: 25%; + } + + .row-cols-xxl-5 > * { + flex: 0 0 auto; + width: 20%; + } + + .row-cols-xxl-6 > * { + flex: 0 0 auto; + width: 16.6666666667%; + } + + .col-xxl-auto { + flex: 0 0 auto; + width: auto; + } + + .col-xxl-1 { + flex: 0 0 auto; + width: 8.3333333333%; + } + + .col-xxl-2 { + flex: 0 0 auto; + width: 16.6666666667%; + } + + .col-xxl-3 { + flex: 0 0 auto; + width: 25%; + } + + .col-xxl-4 { + flex: 0 0 auto; + width: 33.3333333333%; + } + + .col-xxl-5 { + flex: 0 0 auto; + width: 41.6666666667%; + } + + .col-xxl-6 { + flex: 0 0 auto; + width: 50%; + } + + .col-xxl-7 { + flex: 0 0 auto; + width: 58.3333333333%; + } + + .col-xxl-8 { + flex: 0 0 auto; + width: 66.6666666667%; + } + + .col-xxl-9 { + flex: 0 0 auto; + width: 75%; + } + + .col-xxl-10 { + flex: 0 0 auto; + width: 83.3333333333%; + } + + .col-xxl-11 { + flex: 0 0 auto; + width: 91.6666666667%; + } + + .col-xxl-12 { + flex: 0 0 auto; + width: 100%; + } + + .offset-xxl-0 { + margin-left: 0; + } + + .offset-xxl-1 { + margin-left: 8.3333333333%; + } + + .offset-xxl-2 { + margin-left: 16.6666666667%; + } + + .offset-xxl-3 { + margin-left: 25%; + } + + .offset-xxl-4 { + margin-left: 33.3333333333%; + } + + .offset-xxl-5 { + margin-left: 41.6666666667%; + } + + .offset-xxl-6 { + margin-left: 50%; + } + + .offset-xxl-7 { + margin-left: 58.3333333333%; + } + + .offset-xxl-8 { + margin-left: 66.6666666667%; + } + + .offset-xxl-9 { + margin-left: 75%; + } + + .offset-xxl-10 { + margin-left: 83.3333333333%; + } + + .offset-xxl-11 { + margin-left: 91.6666666667%; + } +} + +/* react carousle */ + +.react-carousle .slick-prev, +.react-carousle .slick-next { + position: absolute; + top: 0% !important; + display: block; + width: 2.5rem !important; + height: 9.375rem !important; + border-radius: .3125rem; + z-index: 99999 !important; + cursor: pointer; + color: black !important; + background: rgba(0, 0, 0, 0.619) !important; + /* border-radius: 50%; */ +} +.react-carousle .slick-prev { + left: 0 !important; +} +.slick-next { + right: 0 !important; +} +.react-carousle .slick-prev { + transform: translate(0%, 0%) !important; +} +.react-carousle .slick-next { + transform: translate(0%, 0%) !important; +} +.react-carousle button.slick-disabled { + opacity: 0.5; +} + +.react-carousle .slick-prev:before, +.react-carousle .slick-next:before { + font-size: 2.5rem !important; + position: absolute; + top: 57%; + left: 50%; + transform: translate(-50%, -50%); +} +.react-carousle .slick-list { + position: relative; + display: block; + overflow: unset !important; + margin: 0; + padding: 0; + /* overflow-x: visible !important; + overflow-y: scroll !important; */ +} +/* ::-webkit-scrollbar-track { + background-color: #f5f5f500; +} +::-webkit-scrollbar { + width: 0; + height: .625rem; + background-color: #821d1d00; +} +::-webkit-scrollbar-thumb { + background-color: rgba(245, 20, 20, 0); +} + +#react-carousle::-webkit-scrollbar { + width: 0; + height: 0rem; + background-color: #ce0f0ff2; +} */ + +#react-carousle .slick-dots { + top: -10% !important; + display: flex !important; + justify-content: flex-end !important; + height: .625rem; + text-align: end; +} +#react-carousle .slick-dots li button { + font-size: 0; + line-height: 0; + display: block; + width: 1.1875rem; + height: .1875rem !important; + margin: 0 0rem; + padding: 0 0 !important; + border-radius: 1.5rem !important; + padding: .3125rem; + cursor: pointer; + background: rgba(0, 0, 0, 0.346) !important; +} +#react-carousle .slick-dots li.slick-active button { + background: black !important; +} +#react-carousle .slick-dots li button:before { + opacity: 0 !important; +} +#react-carousle .slick-dots li { + margin: 0 .125rem !important; +} + +.react-calendar { + font-family: "General Sans" !important; + color: #344054; + border: .0625rem solid #eaecf0 !important; + width: 18.75rem; + z-index: 99; + position: relative; +} + +.react-calendar abbr:where([title]) { + text-decoration: none; + text-transform: none; +} + +.react-calendar__tile { + padding: .9375rem .5rem !important; + font-size: .875rem !important; +} + +.react-calendar__tile:enabled:hover { + background: none !important; +} + +.react-calendar__month-view__days__day--weekend { + color: #344054 !important; +} + +.react-calendar__tile--now { + background: none !important; + position: relative; +} + +.react-calendar__tile--now::after { + position: absolute; + bottom: .3125rem; + content: ""; + background-color: #00261c; + width: .3125rem; + height: .3125rem; + left: calc(50% - .1563rem); + border-radius: 50%; +} + +.react-calendar__tile--active { + background: linear-gradient( + 230.69deg, + #33d4b7 9.11%, + #0d9895 69.45% + ) !important; + color: white !important; +} + +.react-calendar__tile--active.react-calendar__tile--now::after { + background-color: white; +} + +.react-calendar__tile:enabled:hover.react-calendar__tile--active:hover { + background: linear-gradient( + 230.69deg, + #33d4b7 9.11%, + #0d9895 69.45% + ) !important; +} + +.react-calendar__navigation button:enabled:hover, +.react-calendar__navigation button:enabled:focus { + background: none !important; +} + +.react-calendar__month-view__days__day--neighboringMonth { + color: #98a2b3 !important; +} + +.custom-calendar .react-calendar_tile { + font-size: .75rem !important; + padding: .3125rem !important; + line-height: 1 !important; +} + +.custom-calendar .react-calendar__navigation { + margin-bottom: 0; +} + +.custom-calendar .react-calendar__tile:disabled { + /* position: relative; */ + background: transparent !important; + color: red !important; +} +.scheduling-calendar .react-calendar__tile abbr { + display: none; +} + +.scheduling-calendar .react-calendar__navigation { + display: grid !important; + grid-template-columns: 12.8125rem 2.5rem 15.625rem; + gap: .75rem; + align-items: center; + padding-inline: .3125rem; +} + +.scheduling-calendar .react-calendar__navigation__prev2-button { + display: none; +} + +.scheduling-calendar .react-calendar__navigation__next2-button { + display: none; +} + +.scheduling-calendar .react-calendar__navigation__label { + grid-column: 1/2; +} + +.scheduling-calendar .react-calendar__navigation__prev-button { + grid-column: 2/3; + border: .0625rem solid #d0d5dd; + grid-row: 1; + padding: .625rem 0; +} + +.scheduling-calendar .react-calendar__navigation__next-button { + grid-column: 3/4; +} +.react-calendar__navigation button.use-template:enabled:hover { + background: linear-gradient( + 230.69deg, + #33d4b7 9.11%, + #0d9895 69.45% + ) !important; +} + +.scheduling-calendar .react-calendar__month-view__weekdays { + display: grid !important; + grid-template-columns: repeat(7, 1fr); + border-bottom-width: .0625rem; +} + +.scheduling-calendar .react-calendar__month-view__weekdays__weekday { + justify-self: flex-start; + color: #475467; + font-size: 1rem; + font-weight: normal !important; +} + +.scheduling-calendar .react-calendar__tile { + padding: 0rem !important; + color: #667085 !important; +} + +.scheduling-calendar .react-calendar__month-view__days__day--neighboringMonth { + color: #98a2b3 !important; +} + +.scheduling-calendar .react-calendar__tile--active { + background: #f0f5f3 !important; + border-radius: unset !important; + border: .125rem solid #0d9895; + color: #667085 !important; + overflow: visible !important; +} + +.scheduling-calendar .react-calendar__tile:enabled:hover { + background: unset !important; +} + +.scheduling-calendar + .react-calendar__tile:enabled:hover.react-calendar__tile--active:hover { + background: #f0f5f3 !important; +} + +.scheduling-calendar .react-calendar__tile--now::after { + display: none !important; +} +h1 { + font-size: 2.5rem; + font-weight: 700; +} +h2 { + font-size: 1.875rem; + font-weight: 700; +} +h3 { + font-size: 1.5625rem; + font-weight: 700; +} +h4 { + font-size: 1.25rem; + font-weight: 700; +} +h5 { + font-size: 1.125rem; + font-weight: 700; +} +h6 { + font-size: 1rem; + font-weight: 700; +} + \ No newline at end of file diff --git a/day20/src/index.jsx b/day20/src/index.jsx new file mode 100644 index 0000000..fa12471 --- /dev/null +++ b/day20/src/index.jsx @@ -0,0 +1,26 @@ + + import React from "react"; + import ReactDOM from "react-dom/client"; + import "./output.css"; + import "./index.css"; + import "slick-carousel/slick/slick.css"; + import "slick-carousel/slick/slick-theme.css"; + import App from "./App"; + + import { library } from "@fortawesome/fontawesome-svg-core"; + import { fas } from "@fortawesome/free-solid-svg-icons"; + import { far } from "@fortawesome/free-regular-svg-icons"; + import { fab } from "@fortawesome/free-brands-svg-icons"; + + library.add(fas, far, fab); + + const root = ReactDOM.createRoot(document.getElementById("root")); + + root.render( + // + + // + ); + + + \ No newline at end of file diff --git a/day20/src/logo.svg b/day20/src/logo.svg new file mode 100644 index 0000000..2b2e4e5 --- /dev/null +++ b/day20/src/logo.svg @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/day20/src/output.css b/day20/src/output.css new file mode 100644 index 0000000..89886ee --- /dev/null +++ b/day20/src/output.css @@ -0,0 +1,5132 @@ + + * { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +code { + font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New", monospace; +} + +.scrollbar-hide::-webkit-scrollbar { + display: none; +} + +.scrollbar-hide { + -ms-overflow-style: none; + scrollbar-width: none; +} + +.sidebar-holder { + width: 100%; + min-width: 15rem; + max-width: 15rem; + position: relative; + background: #151515; + color: #fff; + z-index: 2; + transition: all 0.3s; + min-height: 100vh; + overflow: hidden; + transition: 0.2s; +} + +.open-nav { + min-width: 0rem !important; + max-width: 0rem !important; + width: 0 !important; + transition: 0.2s; + opacity: 0; +} + +.sidebar-list ul li a { + padding: .625rem; + display: block; + width: 100%; + font-size: 1.125rem; + font-weight: 600; + transition: 0.2s ease-in; + text-transform: capitalize; +} + +.sidebar-list ul li a:hover { + color: #151515; + background: white; +} + +.page-header { + width: 100%; + padding: 1.25rem; + background: white; +} + +.page-header span { + cursor: pointer; + display: block; + width: -webkit-fit-content; + width: -moz-fit-content; + width: fit-content; + font-size: 1.25rem; +} + +.center-svg { + aspect-ratio: 1/1; + align-items: center; + justify-content: center; + line-height: 1.2em !important; +} + +.uppy-Dashboard-inner { + width: 100% !important; +} + +/* +! tailwindcss v3.0.24 | MIT License | https://tailwindcss.com +*/ + +/* +1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) +2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) +*/ + +*, +::before, +::after { + box-sizing: border-box; + /* 1 */ + border-width: 0; + /* 2 */ + border-style: solid; + /* 2 */ + border-color: #e5e7eb; + /* 2 */ +} + +::before, +::after { + --tw-content: ""; +} + +/* +1. Use a consistent sensible line-height in all browsers. +2. Prevent adjustments of font size after orientation changes in iOS. +3. Use a more readable tab size. +4. Use the user's configured `sans` font-family by default. +*/ + +html { + line-height: 1.5; + /* 1 */ + -webkit-text-size-adjust: 100%; + /* 2 */ + -moz-tab-size: 4; + /* 3 */ + -o-tab-size: 4; + tab-size: 4; + /* 3 */ + font-family: Inter, sans-serif; + /* 4 */ +} + +/* +1. Remove the margin in all browsers. +2. Inherit line-height from `html` so users can set them as a class directly on the `html` element. +*/ + +body { + margin: 0; + /* 1 */ + line-height: inherit; + /* 2 */ +} + +/* +1. Add the correct height in Firefox. +2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) +3. Ensure horizontal rules are visible by default. +*/ + +hr { + height: 0; + /* 1 */ + color: inherit; + /* 2 */ + border-top-width: .0625rem; + /* 3 */ +} + +/* +Add the correct text decoration in Chrome, Edge, and Safari. +*/ + +abbr:where([title]) { + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; +} + +/* +Remove the default font size and weight for headings. +*/ + +h1, +h2, +h3, +h4, +h5, +h6 { + font-size: inherit; + font-weight: inherit; +} + +/* +Reset links to optimize for opt-in styling instead of opt-out. +*/ + +a { + color: inherit; + text-decoration: inherit; +} + +/* +Add the correct font weight in Edge and Safari. +*/ + +b, +strong { + font-weight: bolder; +} + +/* +1. Use the user's configured `mono` font family by default. +2. Correct the odd `em` font sizing in all browsers. +*/ + +code, +kbd, +samp, +pre { + font-family: ui-monospace, monospace; + /* 1 */ + font-size: 1em; + /* 2 */ +} + +/* +Add the correct font size in all browsers. +*/ + +small { + font-size: 80%; +} + +/* +Prevent `sub` and `sup` elements from affecting the line height in all browsers. +*/ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* +1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) +2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) +3. Remove gaps between table borders by default. +*/ + +table { + text-indent: 0; + /* 1 */ + border-color: inherit; + /* 2 */ + border-collapse: collapse; + /* 3 */ +} + +/* +1. Change the font styles in all browsers. +2. Remove the margin in Firefox and Safari. +3. Remove default padding in all browsers. +*/ + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; + /* 1 */ + font-size: 100%; + /* 1 */ + line-height: inherit; + /* 1 */ + color: inherit; + /* 1 */ + margin: 0; + /* 2 */ + padding: 0; + /* 3 */ +} + +/* +Remove the inheritance of text transform in Edge and Firefox. +*/ + +button, +select { + text-transform: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Remove default button styles. +*/ + +button, +[type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; + /* 1 */ + background-color: transparent; + /* 2 */ + background-image: none; + /* 2 */ +} + +/* +Use the modern Firefox focus style for all focusable elements. +*/ + +:-moz-focusring { + outline: auto; +} + +/* +Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) +*/ + +:-moz-ui-invalid { + box-shadow: none; +} + +/* +Add the correct vertical alignment in Chrome and Firefox. +*/ + +progress { + vertical-align: baseline; +} + +/* +Correct the cursor style of increment and decrement buttons in Safari. +*/ + +::-webkit-inner-spin-button, +::-webkit-outer-spin-button { + height: auto; +} + +/* +1. Correct the odd appearance in Chrome and Safari. +2. Correct the outline style in Safari. +*/ + +[type="search"] { + -webkit-appearance: textfield; + /* 1 */ + outline-offset: -0.125rem; + /* 2 */ +} + +/* +Remove the inner padding in Chrome and Safari on macOS. +*/ + +::-webkit-search-decoration { + -webkit-appearance: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Change font properties to `inherit` in Safari. +*/ + +::-webkit-file-upload-button { + -webkit-appearance: button; + /* 1 */ + font: inherit; + /* 2 */ +} + +/* +Add the correct display in Chrome and Safari. +*/ + +summary { + display: list-item; +} + +/* +Removes the default spacing and border for appropriate elements. +*/ + +blockquote, +dl, +dd, +h1, +h2, +h3, +h4, +h5, +h6, +hr, +figure, +p, +pre { + margin: 0; +} + +fieldset { + margin: 0; + padding: 0; +} + +legend { + padding: 0; +} + +ol, +ul, +menu { + list-style: none; + margin: 0; + padding: 0; +} + +/* +Prevent resizing textareas horizontally by default. +*/ + +textarea { + resize: vertical; +} + +/* +1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) +2. Set the default placeholder color to the user's configured gray 400 color. +*/ + +input::-moz-placeholder, +textarea::-moz-placeholder { + opacity: 1; + /* 1 */ + color: #9ca3af; + /* 2 */ +} + +input:-ms-input-placeholder, +textarea:-ms-input-placeholder { + opacity: 1; + /* 1 */ + color: #9ca3af; + /* 2 */ +} + +input::placeholder, +textarea::placeholder { + opacity: 1; + /* 1 */ + color: #9ca3af; + /* 2 */ +} + +/* +Set the default cursor for buttons. +*/ + +button, +[role="button"] { + cursor: pointer; +} + +/* +Make sure disabled buttons don't get the pointer cursor. +*/ + +:disabled { + cursor: default; +} + +/* +1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14) +2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) + This can trigger a poorly considered lint error in some tools but is included by design. +*/ + +img, +svg, +video, +canvas, +audio, +iframe, +embed, +object { + display: block; + /* 1 */ + vertical-align: middle; + /* 2 */ +} + +/* +Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) +*/ + +img, +video { + max-width: 100%; + height: auto; +} + +/* +Ensure the default browser behavior of the `hidden` attribute. +*/ + +[hidden] { + display: none; +} + +*, +::before, +::after { + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0rem; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; +} + +.container { + width: 100%; +} + +@media (min-width: 40rem) { + .container { + max-width: 40rem; + } +} + +@media (min-width: 48rem) { + .container { + max-width: 48rem; + } +} + +@media (min-width: 64rem) { + .container { + max-width: 64rem; + } +} + +@media (min-width: 80rem) { + .container { + max-width: 80rem; + } +} + +@media (min-width: 96rem) { + .container { + max-width: 96rem; + } +} + +:root { + --bs-blue: #0d6efd; + --bs-indigo: #6610f2; + --bs-purple: #6f42c1; + --bs-pink: #d63384; + --bs-red: #dc3545; + --bs-orange: #fd7e14; + --bs-yellow: #ffc107; + --bs-green: #198754; + --bs-teal: #20c997; + --bs-cyan: #0dcaf0; + --bs-white: #fff; + --bs-gray: #6c757d; + --bs-gray-dark: #343a40; + --bs-gray-100: #f8f9fa; + --bs-gray-200: #e9ecef; + --bs-gray-300: #dee2e6; + --bs-gray-400: #ced4da; + --bs-gray-500: #adb5bd; + --bs-gray-600: #6c757d; + --bs-gray-700: #495057; + --bs-gray-800: #343a40; + --bs-gray-900: #212529; + --bs-primary: #0d6efd; + --bs-secondary: #6c757d; + --bs-success: #198754; + --bs-info: #0dcaf0; + --bs-warning: #ffc107; + --bs-danger: #dc3545; + --bs-light: #f8f9fa; + --bs-dark: #212529; + --bs-primary-rgb: 13, 110, 253; + --bs-secondary-rgb: 108, 117, 125; + --bs-success-rgb: 25, 135, 84; + --bs-info-rgb: 13, 202, 240; + --bs-warning-rgb: 255, 193, 7; + --bs-danger-rgb: 220, 53, 69; + --bs-light-rgb: 248, 249, 250; + --bs-dark-rgb: 33, 37, 41; + --bs-white-rgb: 255, 255, 255; + --bs-black-rgb: 0, 0, 0; + --bs-body-color-rgb: 33, 37, 41; + --bs-body-bg-rgb: 255, 255, 255; + --bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", + "Noto Color Emoji"; + --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0)); + --bs-body-font-family: var(--bs-font-sans-serif); + --bs-body-font-size: 16px; + --bs-body-font-weight: 400; + --bs-body-line-height: 1.5; + --bs-body-color: #212529; + --bs-body-bg: #fff; +} + +.input-group:not(.has-validation) > .dropdown-toggle:nth-last-child(n + 3) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.input-group.has-validation > .dropdown-toggle:nth-last-child(n + 4) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.is-invalid ~ .invalid-feedback { + display: block; +} + +.is-invalid ~ .invalid-tooltip { + display: block; +} + +.form-control.is-invalid { + border-color: #dc3545; + padding-right: calc(1.5em + 12px); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: right calc(0.375em + 3px) center; + background-size: calc(0.75em + 6px) calc(0.75em + 6px); +} + +.form-control.is-invalid:focus { + border-color: #dc3545; + box-shadow: 0 0 0 4px rgba(220, 53, 69, 0.25); +} + +textarea.form-control.is-invalid { + padding-right: calc(1.5em + 12px); + background-position: top calc(0.375em + 3px) right calc(0.375em + 3px); +} + +.form-select.is-invalid { + border-color: #dc3545; +} + +.form-select.is-invalid:not([multiple]):not([size]) { + padding-right: 66px; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"), + url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e"); + background-position: right 12px center, center right 36px; + background-size: 1rem .75rem, calc(0.75em + 6px) calc(0.75em + 6px); +} + +.form-select.is-invalid:not([multiple])[size="1"] { + padding-right: 66px; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"), + url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e"); + background-position: right 12px center, center right 36px; + background-size: 1rem .75rem, calc(0.75em + 6px) calc(0.75em + 6px); +} + +.form-select.is-invalid:focus { + border-color: #dc3545; + box-shadow: 0 0 0 4px rgba(220, 53, 69, 0.25); +} + +.form-check-input.is-invalid { + border-color: #dc3545; +} + +.form-check-input.is-invalid:checked { + background-color: #dc3545; +} + +.form-check-input.is-invalid:focus { + box-shadow: 0 0 0 4px rgba(220, 53, 69, 0.25); +} + +.form-check-input.is-invalid ~ .form-check-label { + color: #dc3545; +} + +.input-group .form-control.is-invalid { + z-index: 2; +} + +.input-group .form-select.is-invalid { + z-index: 2; +} + +.input-group .form-control.is-invalid:focus { + z-index: 3; +} + +.input-group .form-select.is-invalid:focus { + z-index: 3; +} + +.btn.active { + box-shadow: none; +} + +.btn.active:focus { + box-shadow: none; +} + +.fade { + transition: opacity 0.15s linear; +} + +.fade:not(.show) { + opacity: 0; +} + +.collapse:not(.show) { + display: none; +} + +.collapsing { + height: 0; + overflow: hidden; + transition: height 0.35s ease; +} + +.collapsing.collapse-horizontal { + width: 0; + height: auto; + transition: width 0.35s ease; +} + +.dropdown-menu { + z-index: 1000; +} + +.dropdown-item.active { + color: #1f2937; + -webkit-text-decoration: none; + text-decoration: none; + background-color: #0d6efd; +} + +.dropdown-item:active { + color: #1f2937; + -webkit-text-decoration: none; + text-decoration: none; + background-color: #0d6efd; +} + +.dropdown-item:disabled { + color: #adb5bd; + pointer-events: none; + background-color: transparent; +} + +.dropdown-menu.show { + display: block; +} + +.dropdown-menu-dark .dropdown-item.active { + color: #fff; + background-color: #0d6efd; +} + +.dropdown-menu-dark .dropdown-item:active { + color: #fff; + background-color: #0d6efd; +} + +.dropdown-menu-dark .dropdown-item.disabled { + color: #adb5bd; +} + +.dropdown-menu-dark .dropdown-item:disabled { + color: #adb5bd; +} + +.nav-tabs .nav-link { + color: #4b5563; +} + +.nav-tabs .nav-link:hover { + isolation: isolate; +} + +.nav-tabs .nav-link:focus { + isolation: isolate; +} + +.nav-tabs .nav-link.disabled { + color: #9ca3af; + background-color: transparent; + border-color: transparent; +} + +.nav-tabs .nav-link.active { + color: #2563eb; + border-color: #2563eb; +} + +.nav-tabs .nav-item.show .nav-link { + color: #2563eb; + border-color: #2563eb; +} + +.nav-tabs .dropdown-menu { + margin-top: -0.0625rem; + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.nav-pills .nav-link { + background: #f3f4f6; + color: #4b5563; + box-shadow: none; +} + +.nav-pills .nav-link.active { + background: #2563eb; + color: #fff; + box-shadow: 0 .25rem .375rem -0.0625rem rgba(0, 0, 0, 0.1), 0 .125rem .25rem -0.0625rem rgba(0, 0, 0, 0.06); +} + +.nav-pills .show > .nav-link { + background: #2563eb; + color: #fff; + box-shadow: 0 .25rem .375rem -0.0625rem rgba(0, 0, 0, 0.1), 0 .125rem .25rem -0.0625rem rgba(0, 0, 0, 0.06); +} + +.nav-pills .disabled { + color: #9ca3af; + background-color: rgba(243, 244, 246, 0.5); +} + +.nav-pills.menu-sidebar .nav-link { + background-color: transparent; + box-shadow: none; + padding: 0 .3125rem; + border-radius: 0; +} + +.nav-pills.menu-sidebar .nav-link.active { + color: #1266f1; + font-weight: 600; + border-left: 2px solid #1266f1; +} + +.nav-justified > .nav-link { + -ms-flex-basis: 0; + flex-basis: 0; +} + +.nav-justified .nav-item { + -ms-flex-basis: 0; + flex-basis: 0; +} + +.tab-content > .active { + display: block; +} + +.navbar-expand .navbar-nav { + flex-direction: row; +} + +.navbar-expand .navbar-nav .dropdown-menu { + position: absolute; +} + +.navbar-expand .navbar-nav .nav-link { + padding-right: 8px; + padding-left: 8px; +} + +.navbar-expand .offcanvas { + position: inherit; + bottom: 0; + z-index: 1000; + -ms-flex-grow: 1; + flex-grow: 1; + visibility: visible !important; + background-color: transparent; + border-right: 0; + border-left: 0; + transition: none; + transform: none; +} + +.navbar-light .navbar-nav .nav-link.disabled { + color: rgba(0, 0, 0, 0.3); +} + +.navbar-light .navbar-nav .show > .nav-link { + color: rgba(0, 0, 0, 0.9); +} + +.navbar-light .navbar-nav .nav-link.active { + color: rgba(0, 0, 0, 0.9); +} + +.navbar-dark .navbar-nav .nav-link.disabled { + color: rgba(255, 255, 255, 0.25); +} + +.navbar-dark .navbar-nav .show > .nav-link { + color: #fff; +} + +.navbar-dark .navbar-nav .nav-link.active { + color: #fff; +} + +.accordion-item:last-of-type .accordion-button.collapsed { + border-bottom-right-radius: calc(8px - .0625rem); + border-bottom-left-radius: calc(8px - .0625rem); +} + +.btn-close.disabled { + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + opacity: 0.25; +} + +.modal { + z-index: 1055; +} + +.modal-dialog { + margin: 8px; +} + +.modal.fade .modal-dialog { + transition: transform 0.3s ease-out; + transform: translate(0, -3.125rem); +} + +.modal.show .modal-dialog { + transform: none; +} + +.modal.modal-static .modal-dialog { + transform: scale(1.02); +} + +.modal-dialog-scrollable .modal-body { + overflow-y: auto; +} + +.modal-backdrop { + position: fixed; + top: 0; + left: 0; + z-index: 1050; + width: 100vw; + height: 100vh; + background-color: #000; +} + +.modal-backdrop.fade { + opacity: 0; +} + +.modal-backdrop.show { + opacity: 0.5; +} + +.modal-body { + flex: 1 1 auto; +} + +.modal-fullscreen .modal-body { + overflow-y: auto; +} + +.tooltip { + position: absolute; + z-index: 1080; + display: block; + margin: 0; + font-family: var(--bs-font-sans-serif); + font-style: normal; + font-weight: 400; + line-height: 1.5; + -webkit-text-align: start; + text-align: start; + -webkit-text-decoration: none; + text-decoration: none; + -webkit-text-shadow: none; + text-shadow: none; + -webkit-text-transform: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + white-space: normal; + line-break: auto; + font-size: 14px; + word-wrap: break-word; + opacity: 0; +} + +.tooltip.show { + opacity: 1; +} + +.bs-tooltip-top .tooltip-arrow { + bottom: 0; +} + +.bs-tooltip-auto[data-popper-placement^="top"] .tooltip-arrow { + bottom: 0; +} + +.bs-tooltip-top .tooltip-arrow::before { + top: -0.0625rem; + border-width: 6.4px 6.4px 0; + border-top-color: #000; +} + +.bs-tooltip-auto[data-popper-placement^="top"] .tooltip-arrow::before { + top: -0.0625rem; + border-width: 6.4px 6.4px 0; + border-top-color: #000; +} + +.bs-tooltip-end .tooltip-arrow { + left: 0; + width: 6.4px; + height: 12.8px; +} + +.bs-tooltip-auto[data-popper-placement^="right"] .tooltip-arrow { + left: 0; + width: 6.4px; + height: 12.8px; +} + +.bs-tooltip-end .tooltip-arrow::before { + right: -0.0625rem; + border-width: 6.4px 6.4px 6.4px 0; + border-right-color: #000; +} + +.bs-tooltip-auto[data-popper-placement^="right"] .tooltip-arrow::before { + right: -0.0625rem; + border-width: 6.4px 6.4px 6.4px 0; + border-right-color: #000; +} + +.bs-tooltip-bottom .tooltip-arrow { + top: 0; +} + +.bs-tooltip-auto[data-popper-placement^="bottom"] .tooltip-arrow { + top: 0; +} + +.bs-tooltip-bottom .tooltip-arrow::before { + bottom: -0.0625rem; + border-width: 0 6.4px 6.4px; + border-bottom-color: #000; +} + +.bs-tooltip-auto[data-popper-placement^="bottom"] .tooltip-arrow::before { + bottom: -0.0625rem; + border-width: 0 6.4px 6.4px; + border-bottom-color: #000; +} + +.bs-tooltip-start .tooltip-arrow { + right: 0; + width: 6.4px; + height: 12.8px; +} + +.bs-tooltip-auto[data-popper-placement^="left"] .tooltip-arrow { + right: 0; + width: 6.4px; + height: 12.8px; +} + +.bs-tooltip-start .tooltip-arrow::before { + left: -0.0625rem; + border-width: 6.4px 0 6.4px 6.4px; + border-left-color: #000; +} + +.bs-tooltip-auto[data-popper-placement^="left"] .tooltip-arrow::before { + left: -0.0625rem; + border-width: 6.4px 0 6.4px 6.4px; + border-left-color: #000; +} + +.tooltip-inner { + max-width: 12.5rem; + font-size: .875rem; + padding: .375rem 1rem; + color: #fff; + -webkit-text-align: center; + text-align: center; + background-color: #6d6d6d; + border-radius: 4px; +} + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1070; + display: block; + max-width: 17.25rem; + font-family: var(--bs-font-sans-serif); + font-style: normal; + font-weight: 400; + line-height: 1.5; + -webkit-text-align: start; + text-align: start; + -webkit-text-decoration: none; + text-decoration: none; + -webkit-text-shadow: none; + text-shadow: none; + -webkit-text-transform: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + white-space: normal; + line-break: auto; + font-size: 14px; + word-wrap: break-word; + background-color: #fff; + background-clip: padding-box; + border: 0; + border-radius: 8px; + box-shadow: 0 .625rem .9375rem -0.1875rem rgba(0, 0, 0, 0.1), 0 .25rem .375rem -0.125rem rgba(0, 0, 0, 0.05); +} + +.bs-popover-top > .popover-arrow { + bottom: calc(-8px - .0625rem); +} + +.bs-popover-auto[data-popper-placement^="top"] > .popover-arrow { + bottom: calc(-8px - .0625rem); +} + +.bs-popover-top > .popover-arrow::before { + bottom: 0; + border-width: 8px 8px 0; + border-top-color: rgba(0, 0, 0, 0.25); +} + +.bs-popover-auto[data-popper-placement^="top"] > .popover-arrow::before { + bottom: 0; + border-width: 8px 8px 0; + border-top-color: rgba(0, 0, 0, 0.25); +} + +.bs-popover-top > .popover-arrow::after { + bottom: .0625rem; + border-width: 8px 8px 0; + border-top-color: #fff; +} + +.bs-popover-auto[data-popper-placement^="top"] > .popover-arrow::after { + bottom: .0625rem; + border-width: 8px 8px 0; + border-top-color: #fff; +} + +.bs-popover-end > .popover-arrow { + left: calc(-8px - .0625rem); + width: 8px; + height: 16px; +} + +.bs-popover-auto[data-popper-placement^="right"] > .popover-arrow { + left: calc(-8px - .0625rem); + width: 8px; + height: 16px; +} + +.bs-popover-end > .popover-arrow::before { + left: 0; + border-width: 8px 8px 8px 0; + border-right-color: rgba(0, 0, 0, 0.25); +} + +.bs-popover-auto[data-popper-placement^="right"] > .popover-arrow::before { + left: 0; + border-width: 8px 8px 8px 0; + border-right-color: rgba(0, 0, 0, 0.25); +} + +.bs-popover-end > .popover-arrow::after { + left: .0625rem; + border-width: 8px 8px 8px 0; + border-right-color: #fff; +} + +.bs-popover-auto[data-popper-placement^="right"] > .popover-arrow::after { + left: .0625rem; + border-width: 8px 8px 8px 0; + border-right-color: #fff; +} + +.bs-popover-bottom > .popover-arrow { + top: calc(-8px - .0625rem); +} + +.bs-popover-auto[data-popper-placement^="bottom"] > .popover-arrow { + top: calc(-8px - .0625rem); +} + +.bs-popover-bottom > .popover-arrow::before { + top: 0; + border-width: 0 8px 8px 8px; + border-bottom-color: rgba(0, 0, 0, 0.25); +} + +.bs-popover-auto[data-popper-placement^="bottom"] > .popover-arrow::before { + top: 0; + border-width: 0 8px 8px 8px; + border-bottom-color: rgba(0, 0, 0, 0.25); +} + +.bs-popover-bottom > .popover-arrow::after { + top: .0625rem; + border-width: 0 8px 8px 8px; + border-bottom-color: #fff; +} + +.bs-popover-auto[data-popper-placement^="bottom"] > .popover-arrow::after { + top: .0625rem; + border-width: 0 8px 8px 8px; + border-bottom-color: #fff; +} + +.bs-popover-bottom .popover-header::before { + position: absolute; + top: 0; + left: 50%; + display: block; + width: 16px; + margin-left: -8px; + content: ""; + border-bottom: .0625rem solid #f0f0f0; +} + +.bs-popover-auto[data-popper-placement^="bottom"] .popover-header::before { + position: absolute; + top: 0; + left: 50%; + display: block; + width: 16px; + margin-left: -8px; + content: ""; + border-bottom: .0625rem solid #f0f0f0; +} + +.bs-popover-start > .popover-arrow { + right: calc(-8px - .0625rem); + width: 8px; + height: 16px; +} + +.bs-popover-auto[data-popper-placement^="left"] > .popover-arrow { + right: calc(-8px - .0625rem); + width: 8px; + height: 16px; +} + +.bs-popover-start > .popover-arrow::before { + right: 0; + border-width: 8px 0 8px 8px; + border-left-color: rgba(0, 0, 0, 0.25); +} + +.bs-popover-auto[data-popper-placement^="left"] > .popover-arrow::before { + right: 0; + border-width: 8px 0 8px 8px; + border-left-color: rgba(0, 0, 0, 0.25); +} + +.bs-popover-start > .popover-arrow::after { + right: .0625rem; + border-width: 8px 0 8px 8px; + border-left-color: #fff; +} + +.bs-popover-auto[data-popper-placement^="left"] > .popover-arrow::after { + right: .0625rem; + border-width: 8px 0 8px 8px; + border-left-color: #fff; +} + +.popover-header { + padding: 8px 16px; + margin-bottom: 0; + font-size: 16px; + background-color: #fff; + border-bottom: .0625rem solid rgba(0, 0, 0, 0.2); + border-top-left-radius: 8px; + border-top-right-radius: 8px; + font-weight: 500; +} + +.popover-header:empty { + display: none; +} + +.popover-body { + padding: 16px 16px; + color: #212529; +} + +.carousel.pointer-event { + touch-action: pan-y; +} + +.carousel-item { + display: none; + margin-right: -100%; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + transition: transform 0.6s ease-in-out; +} + +.carousel-item.active { + display: block; +} + +.carousel-item-next { + display: block; +} + +.carousel-item-prev { + display: block; +} + +.carousel-item-next:not(.carousel-item-start) { + transform: translateX(100%); +} + +.active.carousel-item-end { + transform: translateX(100%); +} + +.carousel-item-prev:not(.carousel-item-end) { + transform: translateX(-100%); +} + +.active.carousel-item-start { + transform: translateX(-100%); +} + +.carousel-fade .carousel-item { + opacity: 0; + transition-property: opacity; + transform: none; +} + +.carousel-fade .carousel-item.active { + z-index: 1; + opacity: 1; +} + +.carousel-fade .carousel-item-next.carousel-item-start { + z-index: 1; + opacity: 1; +} + +.carousel-fade .carousel-item-prev.carousel-item-end { + z-index: 1; + opacity: 1; +} + +.carousel-fade .active.carousel-item-start { + z-index: 0; + opacity: 0; + transition: opacity 0s 0.6s; +} + +.carousel-fade .active.carousel-item-end { + z-index: 0; + opacity: 0; + transition: opacity 0s 0.6s; +} + +.carousel-indicators { + z-index: 2; + margin-right: 15%; + margin-left: 15%; + list-style: none; +} + +.carousel-indicators [data-bs-target] { + box-sizing: content-box; + flex: 0 1 auto; + width: 1.875rem; + height: .1875rem; + padding: 0; + margin-right: .1875rem; + margin-left: .1875rem; + -webkit-text-indent: -62.4375rem; + text-indent: -62.4375rem; + cursor: pointer; + background-color: #fff; + background-clip: padding-box; + border: 0; + border-top: .625rem solid transparent; + border-bottom: .625rem solid transparent; + opacity: 0.5; + transition: opacity 0.6s ease; +} + +.carousel-indicators .active { + opacity: 1; +} + +.carousel-dark .carousel-indicators [data-bs-target] { + background-color: #000; +} + +.offcanvas { + z-index: 1045; +} + +.offcanvas-backdrop { + position: fixed; + top: 0; + left: 0; + z-index: 1040; + width: 100vw; + height: 100vh; + background-color: #000; +} + +.offcanvas-backdrop.fade { + opacity: 0; +} + +.offcanvas-backdrop.show { + opacity: 0.5; +} + +.offcanvas.show { + transform: none; +} + +.sticky-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020; +} + +.vr { + display: inline-block; + align-self: stretch; + width: .0625rem; + min-height: 1em; + background-color: currentColor; + opacity: 0.25; +} + +.animation { + -webkit-animation-duration: 1s; + animation-duration: 1s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + padding: auto; +} + +.fade-in { + -webkit-animation-name: _fade-in; + animation-name: _fade-in; +} + +.fade-out { + -webkit-animation-name: _fade-out; + animation-name: _fade-out; +} + +.animation.infinite { + -webkit-animation-iteration-count: infinite; + animation-iteration-count: infinite; +} + +.animation.delay-1s { + -webkit-animation-delay: 1s; + animation-delay: 1s; +} + +.animation.delay-2s { + -webkit-animation-delay: 2s; + animation-delay: 2s; +} + +.animation.delay-3s { + -webkit-animation-delay: 3s; + animation-delay: 3s; +} + +.animation.delay-4s { + -webkit-animation-delay: 4s; + animation-delay: 4s; +} + +.animation.delay-5s { + -webkit-animation-delay: 5s; + animation-delay: 5s; +} + +.animation.fast { + -webkit-animation-duration: 800ms; + animation-duration: 800ms; +} + +.animation.faster { + -webkit-animation-duration: 500ms; + animation-duration: 500ms; +} + +.animation.slow { + -webkit-animation-duration: 2s; + animation-duration: 2s; +} + +.animation.slower { + -webkit-animation-duration: 3s; + animation-duration: 3s; +} + +.slide-in-left { + -webkit-animation-name: _slide-in-left; + animation-name: _slide-in-left; +} + +.slide-in-right { + -webkit-animation-name: _slide-in-right; + animation-name: _slide-in-right; +} + +.slide-out-left { + -webkit-animation-name: _slide-out-left; + animation-name: _slide-out-left; +} + +.slide-out-right { + -webkit-animation-name: _slide-out-right; + animation-name: _slide-out-right; +} + +.ripple-surface { + position: relative; + overflow: hidden; + display: inline-block; + vertical-align: bottom; +} + +.ripple-surface-unbound { + overflow: visible; +} + +.ripple-wave { + background-image: radial-gradient(circle, rgba(0, 0, 0, 0.2) 0, rgba(0, 0, 0, 0.3) 40%, rgba(0, 0, 0, 0.4) 50%, rgba(0, 0, 0, 0.5) 60%, transparent 70%); + border-radius: 50%; + opacity: 0.5; + pointer-events: none; + position: absolute; + touch-action: none; + transform: scale(0); + transition-property: transform, opacity; + transition-timing-function: cubic-bezier(0, 0, 0.15, 1), cubic-bezier(0, 0, 0.15, 1); + z-index: 999; +} + +.ripple-wave.active { + transform: scale(1); + opacity: 0; +} + +.btn .ripple-wave { + background-image: radial-gradient(circle, rgba(255, 255, 255, 0.2) 0, rgba(255, 255, 255, 0.3) 40%, rgba(255, 255, 255, 0.4) 50%, rgba(255, 255, 255, 0.5) 60%, rgba(255, 255, 255, 0) 70%); +} + +.ripple-surface-primary .ripple-wave { + background-image: radial-gradient(circle, rgba(18, 102, 241, 0.2) 0, rgba(18, 102, 241, 0.3) 40%, rgba(18, 102, 241, 0.4) 50%, rgba(18, 102, 241, 0.5) 60%, rgba(18, 102, 241, 0) 70%); +} + +.ripple-surface-secondary .ripple-wave { + background-image: radial-gradient(circle, rgba(178, 60, 253, 0.2) 0, rgba(178, 60, 253, 0.3) 40%, rgba(178, 60, 253, 0.4) 50%, rgba(178, 60, 253, 0.5) 60%, rgba(178, 60, 253, 0) 70%); +} + +.ripple-surface-success .ripple-wave { + background-image: radial-gradient(circle, rgba(0, 183, 74, 0.2) 0, rgba(0, 183, 74, 0.3) 40%, rgba(0, 183, 74, 0.4) 50%, rgba(0, 183, 74, 0.5) 60%, rgba(0, 183, 74, 0) 70%); +} + +.ripple-surface-info .ripple-wave { + background-image: radial-gradient(circle, rgba(57, 192, 237, 0.2) 0, rgba(57, 192, 237, 0.3) 40%, rgba(57, 192, 237, 0.4) 50%, rgba(57, 192, 237, 0.5) 60%, rgba(57, 192, 237, 0) 70%); +} + +.ripple-surface-warning .ripple-wave { + background-image: radial-gradient(circle, rgba(255, 169, 0, 0.2) 0, rgba(255, 169, 0, 0.3) 40%, rgba(255, 169, 0, 0.4) 50%, rgba(255, 169, 0, 0.5) 60%, rgba(255, 169, 0, 0) 70%); +} + +.ripple-surface-danger .ripple-wave { + background-image: radial-gradient(circle, rgba(249, 49, 84, 0.2) 0, rgba(249, 49, 84, 0.3) 40%, rgba(249, 49, 84, 0.4) 50%, rgba(249, 49, 84, 0.5) 60%, rgba(249, 49, 84, 0) 70%); +} + +.ripple-surface-light .ripple-wave { + background-image: radial-gradient(circle, rgba(251, 251, 251, 0.2) 0, rgba(251, 251, 251, 0.3) 40%, rgba(251, 251, 251, 0.4) 50%, rgba(251, 251, 251, 0.5) 60%, rgba(251, 251, 251, 0) 70%); +} + +.ripple-surface-dark .ripple-wave { + background-image: radial-gradient(circle, rgba(38, 38, 38, 0.2) 0, rgba(38, 38, 38, 0.3) 40%, rgba(38, 38, 38, 0.4) 50%, rgba(38, 38, 38, 0.5) 60%, rgba(38, 38, 38, 0) 70%); +} + +.ripple-surface-white .ripple-wave { + background-image: radial-gradient(circle, rgba(255, 255, 255, 0.2) 0, rgba(255, 255, 255, 0.3) 40%, rgba(255, 255, 255, 0.4) 50%, rgba(255, 255, 255, 0.5) 60%, rgba(255, 255, 255, 0) 70%); +} + +.ripple-surface-black .ripple-wave { + background-image: radial-gradient(circle, rgba(0, 0, 0, 0.2) 0, rgba(0, 0, 0, 0.3) 40%, rgba(0, 0, 0, 0.4) 50%, rgba(0, 0, 0, 0.5) 60%, transparent 70%); +} + +.datepicker-toggle-button { + position: absolute; + outline: none; + border: none; + background-color: transparent; + right: .625rem; + top: 50%; + transform: translate(-50%, -50%); +} + +.datepicker-toggle-button:focus { + color: #2979ff; +} + +.datepicker-toggle-button:hover { + color: #2979ff; +} + +.datepicker-backdrop { + width: 100%; + height: 100%; + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + background-color: rgba(0, 0, 0, 0.4); + z-index: 1065; +} + +.datepicker-dropdown-container { + width: 20.5rem; + height: 23.75rem; + background-color: #fff; + border-radius: 8px; + box-shadow: 0 .625rem .9375rem -0.1875rem rgba(0, 0, 0, 0.07), 0 .25rem .375rem -0.125rem rgba(0, 0, 0, 0.05); + z-index: 1066; +} + +.datepicker-modal-container { + display: flex; + flex-direction: column; + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 20.5rem; + height: 32rem; + background-color: #fff; + border-radius: 9.6px 9.6px 8px 8px; + box-shadow: 0 .625rem .9375rem -0.1875rem rgba(0, 0, 0, 0.07), 0 .25rem .375rem -0.125rem rgba(0, 0, 0, 0.05); + z-index: 1066; +} + +.datepicker-header { + height: 7.5rem; + padding-right: 1.5rem; + padding-left: 1.5rem; + background-color: #2979ff; + display: flex; + flex-direction: column; + border-radius: 8px 8px 0 0; +} + +.datepicker-title { + height: 2rem; + display: flex; + flex-direction: column; + justify-content: flex-end; +} + +.datepicker-title-text { + font-size: .625rem; + font-weight: 400; + -webkit-text-transform: uppercase; + text-transform: uppercase; + letter-spacing: .1062rem; + color: #fff; +} + +.datepicker-date { + height: 4.5rem; + display: flex; + flex-direction: column; + justify-content: flex-end; +} + +.datepicker-date-text { + font-size: 2.125rem; + font-weight: 400; + color: #fff; +} + +.datepicker-main { + position: relative; + height: 100%; +} + +.datepicker-date-controls { + padding: .625rem .75rem 0 .75rem; + display: flex; + justify-content: space-between; + color: rgba(0, 0, 0, 0.64); +} + +.datepicker-view-change-button { + padding: .625rem; + color: #666; + font-weight: 500; + font-size: 14.4px; + border-radius: .625rem; + box-shadow: none; + background-color: transparent; + margin: 0; + border: none; +} + +.datepicker-view-change-button:hover { + background-color: #eee; +} + +.datepicker-view-change-button:focus { + background-color: #eee; +} + +.datepicker-view-change-button:after { + content: ""; + display: inline-block; + width: 0; + height: 0; + border-left: .3125rem solid transparent; + border-right: .3125rem solid transparent; + border-top-width: .3125rem; + border-top-style: solid; + margin: 0 0 0 .3125rem; + vertical-align: middle; +} + +.datepicker-arrow-controls { + margin-top: .625rem; +} + +.datepicker-previous-button { + position: relative; + padding: 0; + width: 2.5rem; + height: 2.5rem; + line-height: 2.5rem; + border: none; + outline: none; + margin: 0; + color: rgba(0, 0, 0, 0.64); + background-color: transparent; + margin-right: 1.5rem; +} + +.datepicker-previous-button:hover { + background-color: #eee; + border-radius: 50%; +} + +.datepicker-previous-button:focus { + background-color: #eee; + border-radius: 50%; +} + +.datepicker-previous-button::after { + top: 0; + left: 0; + right: 0; + bottom: 0; + position: absolute; + content: ""; + margin: .9688rem; + border: 0 solid currentColor; + border-top-width: .125rem; + border-left-width: .125rem; + transform: translateX(.125rem) rotate(-45deg); +} + +.datepicker-next-button { + position: relative; + padding: 0; + width: 2.5rem; + height: 2.5rem; + line-height: 2.5rem; + border: none; + outline: none; + margin: 0; + color: rgba(0, 0, 0, 0.64); + background-color: transparent; +} + +.datepicker-next-button:hover { + background-color: #eee; + border-radius: 50%; +} + +.datepicker-next-button:focus { + background-color: #eee; + border-radius: 50%; +} + +.datepicker-next-button::after { + top: 0; + left: 0; + right: 0; + bottom: 0; + position: absolute; + content: ""; + margin: .9688rem; + border: 0 solid currentColor; + border-top-width: .125rem; + border-right-width: .125rem; + transform: translateX(-0.125rem) rotate(45deg); +} + +.datepicker-view { + padding-left: .75rem; + padding-right: .75rem; + outline: none; +} + +.datepicker-table { + margin-right: auto; + margin-left: auto; + width: 19rem; +} + +.datepicker-day-heading { + width: 2.5rem; + height: 2.5rem; + -webkit-text-align: center; + text-align: center; + font-size: .75rem; + font-weight: 400; +} + +.datepicker-cell { + -webkit-text-align: center; + text-align: center; +} + +.datepicker-cell.disabled { + color: #ccc; + cursor: default; + pointer-events: none; +} + +.datepicker-cell.disabled:hover { + cursor: default; +} + +.datepicker-cell:hover { + cursor: pointer; +} + +.datepicker-cell:not(.disabled):not(.selected):hover .datepicker-cell-content { + background-color: #d3d3d3; +} + +.datepicker-cell.selected .datepicker-cell-content { + background-color: #2979ff; + color: #fff; +} + +.datepicker-cell:not(.selected).focused .datepicker-cell-content { + background-color: #eee; +} + +.datepicker-cell.focused .datepicker-cell-content.selected { + background-color: #2979ff; +} + +.datepicker-cell.current .datepicker-cell-content { + border: .0625rem solid #000; +} + +.datepicker-small-cell { + width: 2.5rem; + height: 2.5rem; +} + +.datepicker-small-cell-content { + width: 2.25rem; + height: 2.25rem; + line-height: 2.25rem; + border-radius: 50%; + font-size: .8125rem; +} + +.datepicker-large-cell { + width: 4.75rem; + height: 2.625rem; +} + +.datepicker-large-cell-content { + width: 4.5rem; + height: 2.5rem; + line-height: 2.5rem; + padding: .0625rem .125rem; + border-radius: 62.4375rem; +} + +.datepicker-footer { + height: 3.5rem; + display: flex; + position: absolute; + width: 100%; + bottom: 0; + justify-content: flex-end; + align-items: center; + padding-left: .75rem; + padding-right: .75rem; +} + +.datepicker-footer-btn { + background-color: #fff; + color: #2979ff; + border: none; + cursor: pointer; + padding: 0 .625rem; + -webkit-text-transform: uppercase; + text-transform: uppercase; + font-size: 12.8px; + font-weight: 500; + height: 2.5rem; + line-height: 2.5rem; + letter-spacing: 1.6px; + border-radius: .625rem; + margin-bottom: .625rem; +} + +.datepicker-footer-btn:hover { + background-color: #eee; +} + +.datepicker-footer-btn:focus { + background-color: #eee; +} + +.datepicker-clear-btn { + margin-right: auto; +} + +.timepicker-wrapper { + touch-action: none; + z-index: 1065; + opacity: 0; + right: 0; + bottom: 0; + top: 0; + left: 0; + background-color: rgba(0, 0, 0, 0.4); +} + +.timepicker-elements { + min-width: 19.375rem; + min-height: 20.3125rem; + background: #fff; + border-top-right-radius: 9.6px; + border-top-left-radius: 9.6px; +} + +.timepicker-head { + background-color: #2979ff; + height: 6.25rem; + border-top-right-radius: 8px; + border-top-left-radius: 8px; + padding: .625rem 1.5rem .625rem 3.125rem; +} + +.timepicker-button { + font-size: 12.8px; + min-width: 4rem; + box-sizing: border-box; + font-weight: 500; + line-height: 2.5rem; + border-radius: .625rem; + letter-spacing: 1.6px; + -webkit-text-transform: uppercase; + text-transform: uppercase; + color: #2979ff; + border: none; + background-color: transparent; + transition: background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms, box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms, border 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; + outline: none; + padding: 0 .625rem; + height: 2.5rem; + margin-bottom: .625rem; +} + +.timepicker-button:hover { + background-color: rgba(0, 0, 0, 0.08); +} + +.timepicker-button:focus { + outline: none; + background-color: rgba(0, 0, 0, 0.08); +} + +.timepicker-current { + font-size: 60px; + font-weight: 300; + line-height: 1.2; + letter-spacing: -0.00833em; + color: #fff; + opacity: 0.54; + border: none; + background: transparent; + padding: 0; +} + +.timepicker-current.active { + opacity: 1; +} + +.timepicker-current-wrapper { + direction: ltr; +} + +.timepicker-mode-wrapper { + margin-left: 1.25rem; + font-size: 1.125rem; + color: rgba(255, 255, 255, 0.54); +} + +.timepicker-mode-wrapper.active { + opacity: 1; +} + +.timepicker-clock-wrapper { + min-width: 19.375rem; + max-width: 20.3125rem; + min-height: 19.0625rem; + overflow-x: hidden; + height: 100%; +} + +.timepicker-clock { + position: relative; + border-radius: 100%; + width: 16.25rem; + height: 16.25rem; + cursor: default; + margin: 0 auto; + background-color: rgba(0, 0, 0, 0.07); +} + +.timepicker-time-tips-minutes.active { + color: #fff; + background-color: #2979ff; + font-weight: 400; +} + +.timepicker-time-tips-inner.active { + color: #fff; + background-color: #2979ff; + font-weight: 400; +} + +.timepicker-time-tips-hours.active { + color: #fff; + background-color: #2979ff; + font-weight: 400; +} + +.timepicker-time-tips-minutes.disabled { + color: #b3afaf; + pointer-events: none; + background-color: transparent; +} + +.timepicker-time-tips-inner.disabled { + color: #b3afaf; + pointer-events: none; + background-color: transparent; +} + +.timepicker-time-tips-hours.disabled { + color: #b3afaf; + pointer-events: none; + background-color: transparent; +} + +.timepicker-dot { + font-weight: 300; + line-height: 1.2; + letter-spacing: -0.00833em; + color: #fff; + font-size: 60px; + opacity: 0.54; + border: none; + background: transparent; + padding: 0; +} + +.timepicker-middle-dot { + top: 50%; + left: 50%; + width: .375rem; + height: .375rem; + transform: translate(-50%, -50%); + border-radius: 50%; + background-color: #2979ff; +} + +.timepicker-hand-pointer { + background-color: #2979ff; + bottom: 50%; + height: 40%; + left: calc(50% - .0625rem); + transform-origin: center bottom 0; + width: .125rem; +} + +.timepicker-time-tips.active { + color: #fff; +} + +.timepicker-circle { + top: -1.3125rem; + left: -0.9375rem; + width: .25rem; + border: .875rem solid #2979ff; + height: .25rem; + box-sizing: content-box; + border-radius: 100%; +} + +.timepicker-hour-mode { + padding: 0; + background-color: transparent; + border: none; + color: #fff; + opacity: 0.54; + cursor: pointer; +} + +.timepicker-hour { + cursor: pointer; +} + +.timepicker-minute { + cursor: pointer; +} + +.timepicker-hour-mode:hover { + background-color: rgba(0, 0, 0, 0.15); + outline: none; +} + +.timepicker-hour-mode:focus { + background-color: rgba(0, 0, 0, 0.15); + outline: none; +} + +.timepicker-hour:hover { + background-color: rgba(0, 0, 0, 0.15); + outline: none; +} + +.timepicker-hour:focus { + background-color: rgba(0, 0, 0, 0.15); + outline: none; +} + +.timepicker-minute:hover { + background-color: rgba(0, 0, 0, 0.15); + outline: none; +} + +.timepicker-minute:focus { + background-color: rgba(0, 0, 0, 0.15); + outline: none; +} + +.timepicker-hour-mode.active { + color: #fff; + opacity: 1; +} + +.timepicker-hour.active { + color: #fff; + opacity: 1; +} + +.timepicker-minute.active { + color: #fff; + opacity: 1; +} + +.timepicker-footer { + border-bottom-left-radius: 8px; + border-bottom-right-radius: 8px; + display: flex; + justify-content: space-between; + align-items: center; + width: 100%; + height: 3.5rem; + padding-left: .75rem; + padding-right: .75rem; + background-color: #fff; +} + +.timepicker-container { + max-height: calc(100% - 4rem); + overflow-y: auto; + box-shadow: 0 .625rem .9375rem -0.1875rem rgba(0, 0, 0, 0.07), 0 .25rem .375rem -0.125rem rgba(0, 0, 0, 0.05); +} + +.timepicker-icon-up.active { + opacity: 1; +} + +.timepicker-icon-down.active { + opacity: 1; +} + +.timepicker-toggle-button { + position: absolute; + outline: none; + border: none; + background-color: transparent; + right: .625rem; + top: 50%; + transform: translate(-50%, -50%); + transition: all 0.3s ease; + cursor: pointer; +} + +.timepicker-toggle-button:hover { + color: #2979ff; +} + +.timepicker-toggle-button:focus { + color: #2979ff; +} + +.timepicker-input:focus + .timepicker-toggle-button { + color: #2979ff; +} + +.timepicker-input:focus + .timepicker-toggle-button i { + color: #2979ff; +} + +.timepicker a.timepicker-toggle-button { + right: .0625rem; +} + +.timepicker-toggle-button.timepicker-icon { + right: .0625rem; +} + +.timepicker-modal .fade.show { + opacity: 1; +} + +.stepper { + position: relative; + padding: 0; + margin: 0; + width: 100%; + list-style: none; + overflow: hidden; + transition: height 0.2s ease-in-out; +} + +.stepper:not(.stepper-vertical) { + display: flex; + justify-content: space-between; +} + +.stepper:not(.stepper-vertical) .stepper-content { + position: absolute; + width: 100%; + padding: 16px; +} + +.stepper:not(.stepper-vertical) .stepper-step { + flex: auto; + height: 72px; +} + +.stepper:not(.stepper-vertical) .stepper-step:first-child .stepper-head { + padding-left: 24px; +} + +.stepper:not(.stepper-vertical) .stepper-step:last-child .stepper-head { + padding-right: 24px; +} + +.stepper:not(.stepper-vertical) .stepper-step:not(:first-child) .stepper-head:before { + flex: 1; + height: .0625rem; + width: 100%; + margin-right: 8px; + content: ""; + background-color: rgba(0, 0, 0, 0.1); +} + +.stepper:not(.stepper-vertical) .stepper-step:not(:last-child) .stepper-head:after { + flex: 1; + height: .0625rem; + width: 100%; + margin-left: 8px; + content: ""; + background-color: rgba(0, 0, 0, 0.1); +} + +.stepper:not(.stepper-vertical) .stepper-head-icon { + margin: 24px 8px 24px 0; +} + +.stepper.stepper-mobile { + justify-content: center; + align-items: flex-end; +} + +.stepper.stepper-mobile.stepper-progress-bar .stepper-head-icon { + display: none; +} + +.stepper.stepper-mobile .stepper-step { + flex: unset; + height: -webkit-fit-content; + height: -moz-fit-content; + height: fit-content; + margin: 16px 0 16px 0; +} + +.stepper.stepper-mobile .stepper-step:not(:last-child) .stepper-head:after { + margin-left: 0; +} + +.stepper.stepper-mobile .stepper-step:not(:first-child) .stepper-head:before { + margin-right: 0; +} + +.stepper.stepper-mobile .stepper-step:not(:last-child):not(:first-child) .stepper-head { + padding-left: 4px; + padding-right: 4px; +} + +.stepper.stepper-mobile .stepper-head-icon { + font-size: 0; + margin: 0; + height: 8px; + width: 8px; + z-index: 1; +} + +.stepper.stepper-mobile .stepper-head-text { + display: none; +} + +.stepper.stepper-mobile .stepper-content { + top: 40.96px; +} + +@media (prefers-reduced-motion: reduce) { + .form-control::-webkit-file-upload-button { + -webkit-transition: none; + transition: none; + } + .form-control::file-selector-button { + transition: none; + } + + .form-control::-webkit-file-upload-button { + -webkit-transition: none; + transition: none; + } + + .form-switch .form-check-input { + transition: none; + } + + .form-range::-webkit-slider-thumb { + -webkit-transition: none; + transition: none; + } + + .form-range::-moz-range-thumb { + -moz-transition: none; + transition: none; + } + + .form-floating > label { + transition: none; + } + + .fade { + transition: none; + } + + .collapsing { + transition: none; + } + + .collapsing.collapse-horizontal { + transition: none; + } + + .accordion-button::after { + transition: none; + } + + .modal.fade .modal-dialog { + transition: none; + } + + .carousel-item { + transition: none; + } + + .carousel-fade .active.carousel-item-start { + transition: none; + } + + .carousel-fade .active.carousel-item-end { + transition: none; + } + + .carousel-control-prev { + transition: none; + } + + .carousel-control-next { + transition: none; + } + + .carousel-indicators [data-bs-target] { + transition: none; + } + + .spinner-border { + -webkit-animation-duration: 1.5s; + animation-duration: 1.5s; + } + + .spinner-grow { + -webkit-animation-duration: 1.5s; + animation-duration: 1.5s; + } +} + +@media (min-width: 36rem) { + .navbar-expand-sm { + flex-wrap: nowrap; + justify-content: flex-start; + } + + .navbar-expand-sm .navbar-nav { + flex-direction: row; + } + + .navbar-expand-sm .navbar-nav .dropdown-menu { + position: absolute; + } + + .navbar-expand-sm .navbar-nav .nav-link { + padding-right: 8px; + padding-left: 8px; + } + + .navbar-expand-sm .navbar-nav-scroll { + overflow: visible; + } + + .navbar-expand-sm .navbar-collapse { + display: flex !important; + -ms-flex-basis: auto; + flex-basis: auto; + } + + .navbar-expand-sm .navbar-toggler { + display: none; + } + + .navbar-expand-sm .offcanvas-header { + display: none; + } + + .navbar-expand-sm .offcanvas { + position: inherit; + bottom: 0; + z-index: 1000; + -ms-flex-grow: 1; + flex-grow: 1; + visibility: visible !important; + background-color: transparent; + border-right: 0; + border-left: 0; + transition: none; + transform: none; + } + + .navbar-expand-sm .offcanvas-top { + height: auto; + border-top: 0; + border-bottom: 0; + } + + .navbar-expand-sm .offcanvas-bottom { + height: auto; + border-top: 0; + border-bottom: 0; + } + + .navbar-expand-sm .offcanvas-body { + display: flex; + -ms-flex-grow: 0; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } + + .modal-dialog { + max-width: 31.25rem; + margin: 28px auto; + } + + .modal-dialog-scrollable { + height: calc(100% - 56px); + } + + .modal-dialog-centered { + min-height: calc(100% - 56px); + } + + .modal-sm { + max-width: 18.75rem; + } + + .sticky-sm-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020; + } +} + +@media (min-width: 48rem) { + .navbar-expand-md { + flex-wrap: nowrap; + justify-content: flex-start; + } + + .navbar-expand-md .navbar-nav { + flex-direction: row; + } + + .navbar-expand-md .navbar-nav .dropdown-menu { + position: absolute; + } + + .navbar-expand-md .navbar-nav .nav-link { + padding-right: 8px; + padding-left: 8px; + } + + .navbar-expand-md .navbar-nav-scroll { + overflow: visible; + } + + .navbar-expand-md .navbar-collapse { + display: flex !important; + -ms-flex-basis: auto; + flex-basis: auto; + } + + .navbar-expand-md .navbar-toggler { + display: none; + } + + .navbar-expand-md .offcanvas-header { + display: none; + } + + .navbar-expand-md .offcanvas { + position: inherit; + bottom: 0; + z-index: 1000; + -ms-flex-grow: 1; + flex-grow: 1; + visibility: visible !important; + background-color: transparent; + border-right: 0; + border-left: 0; + transition: none; + transform: none; + } + + .navbar-expand-md .offcanvas-top { + height: auto; + border-top: 0; + border-bottom: 0; + } + + .navbar-expand-md .offcanvas-bottom { + height: auto; + border-top: 0; + border-bottom: 0; + } + + .navbar-expand-md .offcanvas-body { + display: flex; + -ms-flex-grow: 0; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } + + .sticky-md-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020; + } +} + +@media (min-width: 62rem) { + .navbar-expand-lg { + flex-wrap: nowrap; + justify-content: flex-start; + } + + .navbar-expand-lg .navbar-nav { + flex-direction: row; + } + + .navbar-expand-lg .navbar-nav .dropdown-menu { + position: absolute; + } + + .navbar-expand-lg .navbar-nav .nav-link { + padding-right: 8px; + padding-left: 8px; + } + + .navbar-expand-lg .navbar-nav-scroll { + overflow: visible; + } + + .navbar-expand-lg .navbar-collapse { + display: flex !important; + -ms-flex-basis: auto; + flex-basis: auto; + } + + .navbar-expand-lg .navbar-toggler { + display: none; + } + + .navbar-expand-lg .offcanvas-header { + display: none; + } + + .navbar-expand-lg .offcanvas { + position: inherit; + bottom: 0; + z-index: 1000; + -ms-flex-grow: 1; + flex-grow: 1; + visibility: visible !important; + background-color: transparent; + border-right: 0; + border-left: 0; + transition: none; + transform: none; + } + + .navbar-expand-lg .offcanvas-top { + height: auto; + border-top: 0; + border-bottom: 0; + } + + .navbar-expand-lg .offcanvas-bottom { + height: auto; + border-top: 0; + border-bottom: 0; + } + + .navbar-expand-lg .offcanvas-body { + display: flex; + -ms-flex-grow: 0; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } + + .modal-lg { + max-width: 50rem; + } + + .modal-xl { + max-width: 50rem; + } + + .sticky-lg-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020; + } +} + +@media (min-width: 75rem) { + .navbar-expand-xl { + flex-wrap: nowrap; + justify-content: flex-start; + } + + .navbar-expand-xl .navbar-nav { + flex-direction: row; + } + + .navbar-expand-xl .navbar-nav .dropdown-menu { + position: absolute; + } + + .navbar-expand-xl .navbar-nav .nav-link { + padding-right: 8px; + padding-left: 8px; + } + + .navbar-expand-xl .navbar-nav-scroll { + overflow: visible; + } + + .navbar-expand-xl .navbar-collapse { + display: flex !important; + -ms-flex-basis: auto; + flex-basis: auto; + } + + .navbar-expand-xl .navbar-toggler { + display: none; + } + + .navbar-expand-xl .offcanvas-header { + display: none; + } + + .navbar-expand-xl .offcanvas { + position: inherit; + bottom: 0; + z-index: 1000; + -ms-flex-grow: 1; + flex-grow: 1; + visibility: visible !important; + background-color: transparent; + border-right: 0; + border-left: 0; + transition: none; + transform: none; + } + + .navbar-expand-xl .offcanvas-top { + height: auto; + border-top: 0; + border-bottom: 0; + } + + .navbar-expand-xl .offcanvas-bottom { + height: auto; + border-top: 0; + border-bottom: 0; + } + + .navbar-expand-xl .offcanvas-body { + display: flex; + -ms-flex-grow: 0; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } + + .modal-xl { + max-width: 71.25rem; + } + + .sticky-xl-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020; + } +} + +@media (min-width: 87.5rem) { + .navbar-expand-xxl { + flex-wrap: nowrap; + justify-content: flex-start; + } + + .navbar-expand-xxl .navbar-nav { + flex-direction: row; + } + + .navbar-expand-xxl .navbar-nav .dropdown-menu { + position: absolute; + } + + .navbar-expand-xxl .navbar-nav .nav-link { + padding-right: 8px; + padding-left: 8px; + } + + .navbar-expand-xxl .navbar-nav-scroll { + overflow: visible; + } + + .navbar-expand-xxl .navbar-collapse { + display: flex !important; + -ms-flex-basis: auto; + flex-basis: auto; + } + + .navbar-expand-xxl .navbar-toggler { + display: none; + } + + .navbar-expand-xxl .offcanvas-header { + display: none; + } + + .navbar-expand-xxl .offcanvas { + position: inherit; + bottom: 0; + z-index: 1000; + -ms-flex-grow: 1; + flex-grow: 1; + visibility: visible !important; + background-color: transparent; + border-right: 0; + border-left: 0; + transition: none; + transform: none; + } + + .navbar-expand-xxl .offcanvas-top { + height: auto; + border-top: 0; + border-bottom: 0; + } + + .navbar-expand-xxl .offcanvas-bottom { + height: auto; + border-top: 0; + border-bottom: 0; + } + + .navbar-expand-xxl .offcanvas-body { + display: flex; + -ms-flex-grow: 0; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } + + .sticky-xxl-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020; + } +} + +@media (max-width: 35.9988rem) { + .modal-fullscreen-sm-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + + .modal-fullscreen-sm-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + + .modal-fullscreen-sm-down .modal-header { + border-radius: 0; + } + + .modal-fullscreen-sm-down .modal-body { + overflow-y: auto; + } + + .modal-fullscreen-sm-down .modal-footer { + border-radius: 0; + } +} + +@media (max-width: 47.9988rem) { + .modal-fullscreen-md-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + + .modal-fullscreen-md-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + + .modal-fullscreen-md-down .modal-header { + border-radius: 0; + } + + .modal-fullscreen-md-down .modal-body { + overflow-y: auto; + } + + .modal-fullscreen-md-down .modal-footer { + border-radius: 0; + } +} + +@media (max-width: 61.9988rem) { + .modal-fullscreen-lg-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + + .modal-fullscreen-lg-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + + .modal-fullscreen-lg-down .modal-header { + border-radius: 0; + } + + .modal-fullscreen-lg-down .modal-body { + overflow-y: auto; + } + + .modal-fullscreen-lg-down .modal-footer { + border-radius: 0; + } +} + +@media (max-width: 74.9988rem) { + .modal-fullscreen-xl-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + + .modal-fullscreen-xl-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + + .modal-fullscreen-xl-down .modal-header { + border-radius: 0; + } + + .modal-fullscreen-xl-down .modal-body { + overflow-y: auto; + } + + .modal-fullscreen-xl-down .modal-footer { + border-radius: 0; + } +} + +@media (max-width: 87.4988rem) { + .modal-fullscreen-xxl-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + + .modal-fullscreen-xxl-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + + .modal-fullscreen-xxl-down .modal-header { + border-radius: 0; + } + + .modal-fullscreen-xxl-down .modal-body { + overflow-y: auto; + } + + .modal-fullscreen-xxl-down .modal-footer { + border-radius: 0; + } +} + +@media (prefers-reduced-motion) { + .animation { + transition: none !important; + -webkit-animation: unset !important; + animation: unset !important; + } +} + +@media screen and (min-width: 20rem) and (max-width: 51.25rem) and (orientation: landscape) { + .datepicker-modal-container .datepicker-header { + height: 100%; + } + + .datepicker-modal-container .datepicker-date { + margin-top: 6.25rem; + } + + .datepicker-modal-container .datepicker-day-cell { + width: 32x; + height: 32x; + } + + .datepicker-modal-container { + flex-direction: row; + width: 29.6875rem; + height: 22.5rem; + } + + .datepicker-modal-container.datepicker-day-cell { + width: 2.25rem; + height: 2.25rem; + } +} + +@media screen and (min-width: 20rem) and (max-width: 51.5625rem) and (orientation: landscape) { + .timepicker-elements { + flex-direction: row !important; + border-bottom-left-radius: 8px; + min-width: auto; + min-height: auto; + overflow-y: auto; + } + + .timepicker-head { + border-top-right-radius: 0; + border-bottom-left-radius: 0; + padding: .625rem; + padding-right: .625rem !important; + height: auto; + min-height: 19.0625rem; + } + + .timepicker-head-content { + flex-direction: column; + } + + .timepicker-mode-wrapper { + justify-content: space-around !important; + flex-direction: row !important; + } + + .timepicker-current { + font-size: 48px; + font-weight: 400; + } + + .timepicker-dot { + font-size: 48px; + font-weight: 400; + } +} + +@-webkit-keyframes _spinner-grow { + 0% { + transform: scale(0); + } + + 50% { + opacity: 1; + transform: none; + } +} + +@keyframes _spinner-grow { + 0% { + transform: scale(0); + } + + 50% { + opacity: 1; + transform: none; + } +} + +@-webkit-keyframes _fade-in { + from { + opacity: 0; + } + + to { + opacity: 1; + } +} + +@keyframes _fade-in { + from { + opacity: 0; + } + + to { + opacity: 1; + } +} + +@-webkit-keyframes _fade-out { + from { + opacity: 1; + } + + to { + opacity: 0; + } +} + +@keyframes _fade-out { + from { + opacity: 1; + } + + to { + opacity: 0; + } +} + +@-webkit-keyframes _fade-in-down { + from { + opacity: 0; + transform: translate3d(0, -100%, 0); + } + + to { + opacity: 1; + transform: translate3d(0, 0, 0); + } +} + +@keyframes _fade-in-down { + from { + opacity: 0; + transform: translate3d(0, -100%, 0); + } + + to { + opacity: 1; + transform: translate3d(0, 0, 0); + } +} + +@-webkit-keyframes _fade-in-left { + from { + opacity: 0; + transform: translate3d(-100%, 0, 0); + } + + to { + opacity: 1; + transform: translate3d(0, 0, 0); + } +} + +@keyframes _fade-in-left { + from { + opacity: 0; + transform: translate3d(-100%, 0, 0); + } + + to { + opacity: 1; + transform: translate3d(0, 0, 0); + } +} + +@-webkit-keyframes _fade-in-right { + from { + opacity: 0; + transform: translate3d(100%, 0, 0); + } + + to { + opacity: 1; + transform: translate3d(0, 0, 0); + } +} + +@keyframes _fade-in-right { + from { + opacity: 0; + transform: translate3d(100%, 0, 0); + } + + to { + opacity: 1; + transform: translate3d(0, 0, 0); + } +} + +@-webkit-keyframes _fade-in-up { + from { + opacity: 0; + transform: translate3d(0, 100%, 0); + } + + to { + opacity: 1; + transform: translate3d(0, 0, 0); + } +} + +@keyframes _fade-in-up { + from { + opacity: 0; + transform: translate3d(0, 100%, 0); + } + + to { + opacity: 1; + transform: translate3d(0, 0, 0); + } +} + +@-webkit-keyframes _fade-out-down { + from { + opacity: 1; + } + + to { + opacity: 0; + transform: translate3d(0, 100%, 0); + } +} + +@keyframes _fade-out-down { + from { + opacity: 1; + } + + to { + opacity: 0; + transform: translate3d(0, 100%, 0); + } +} + +@-webkit-keyframes _fade-out-left { + from { + opacity: 1; + } + + to { + opacity: 0; + transform: translate3d(-100%, 0, 0); + } +} + +@keyframes _fade-out-left { + from { + opacity: 1; + } + + to { + opacity: 0; + transform: translate3d(-100%, 0, 0); + } +} + +@-webkit-keyframes _fade-out-right { + from { + opacity: 1; + } + + to { + opacity: 0; + transform: translate3d(100%, 0, 0); + } +} + +@keyframes _fade-out-right { + from { + opacity: 1; + } + + to { + opacity: 0; + transform: translate3d(100%, 0, 0); + } +} + +@-webkit-keyframes _fade-out-up { + from { + opacity: 1; + } + + to { + opacity: 0; + transform: translate3d(0, -100%, 0); + } +} + +@keyframes _fade-out-up { + from { + opacity: 1; + } + + to { + opacity: 0; + transform: translate3d(0, -100%, 0); + } +} + +@-webkit-keyframes _slide-in-down { + from { + visibility: visible; + transform: translate3d(0, -100%, 0); + } + + to { + transform: translate3d(0, 0, 0); + } +} + +@keyframes _slide-in-down { + from { + visibility: visible; + transform: translate3d(0, -100%, 0); + } + + to { + transform: translate3d(0, 0, 0); + } +} + +@-webkit-keyframes _slide-in-left { + from { + visibility: visible; + transform: translate3d(-100%, 0, 0); + } + + to { + transform: translate3d(0, 0, 0); + } +} + +@keyframes _slide-in-left { + from { + visibility: visible; + transform: translate3d(-100%, 0, 0); + } + + to { + transform: translate3d(0, 0, 0); + } +} + +@-webkit-keyframes _slide-in-right { + from { + visibility: visible; + transform: translate3d(100%, 0, 0); + } + + to { + transform: translate3d(0, 0, 0); + } +} + +@keyframes _slide-in-right { + from { + visibility: visible; + transform: translate3d(100%, 0, 0); + } + + to { + transform: translate3d(0, 0, 0); + } +} + +@-webkit-keyframes _slide-in-up { + from { + visibility: visible; + transform: translate3d(0, 100%, 0); + } + + to { + transform: translate3d(0, 0, 0); + } +} + +@keyframes _slide-in-up { + from { + visibility: visible; + transform: translate3d(0, 100%, 0); + } + + to { + transform: translate3d(0, 0, 0); + } +} + +@-webkit-keyframes _slide-out-down { + from { + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + transform: translate3d(0, 100%, 0); + } +} + +@keyframes _slide-out-down { + from { + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + transform: translate3d(0, 100%, 0); + } +} + +@-webkit-keyframes _slide-out-left { + from { + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + transform: translate3d(-100%, 0, 0); + } +} + +@keyframes _slide-out-left { + from { + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + transform: translate3d(-100%, 0, 0); + } +} + +@-webkit-keyframes _slide-out-right { + from { + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + transform: translate3d(100%, 0, 0); + } +} + +@keyframes _slide-out-right { + from { + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + transform: translate3d(100%, 0, 0); + } +} + +@-webkit-keyframes _slide-out-up { + from { + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + transform: translate3d(0, -100%, 0); + } +} + +@keyframes _slide-out-up { + from { + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + transform: translate3d(0, -100%, 0); + } +} + +@-webkit-keyframes _slide-down { + from { + transform: translate3d(0, 0, 0); + } + + to { + transform: translate3d(0, 100%, 0); + } +} + +@keyframes _slide-down { + from { + transform: translate3d(0, 0, 0); + } + + to { + transform: translate3d(0, 100%, 0); + } +} + +@-webkit-keyframes _slide-left { + from { + transform: translate3d(0, 0, 0); + } + + to { + transform: translate3d(-100%, 0, 0); + } +} + +@keyframes _slide-left { + from { + transform: translate3d(0, 0, 0); + } + + to { + transform: translate3d(-100%, 0, 0); + } +} + +@-webkit-keyframes _slide-right { + from { + transform: translate3d(0, 0, 0); + } + + to { + transform: translate3d(100%, 0, 0); + } +} + +@keyframes _slide-right { + from { + transform: translate3d(0, 0, 0); + } + + to { + transform: translate3d(100%, 0, 0); + } +} + +@-webkit-keyframes _slide-up { + from { + transform: translate3d(0, 0, 0); + } + + to { + transform: translate3d(0, -100%, 0); + } +} + +@keyframes _slide-up { + from { + transform: translate3d(0, 0, 0); + } + + to { + transform: translate3d(0, -100%, 0); + } +} + +@-webkit-keyframes _zoom-in { + from { + opacity: 0; + transform: scale3d(0.3, 0.3, 0.3); + } + + 50% { + opacity: 1; + } +} + +@keyframes _zoom-in { + from { + opacity: 0; + transform: scale3d(0.3, 0.3, 0.3); + } + + 50% { + opacity: 1; + } +} + +@-webkit-keyframes _zoom-out { + from { + opacity: 1; + } + + 50% { + opacity: 0; + transform: scale3d(0.3, 0.3, 0.3); + } + + to { + opacity: 0; + } +} + +@keyframes _zoom-out { + from { + opacity: 1; + } + + 50% { + opacity: 0; + transform: scale3d(0.3, 0.3, 0.3); + } + + to { + opacity: 0; + } +} + +@-webkit-keyframes _tada { + from { + transform: scale3d(1, 1, 1); + } + + 10% { + transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg); + } + + 20% { + transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg); + } + + 30% { + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); + } + + 50% { + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); + } + + 70% { + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); + } + + 90% { + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); + } + + 40% { + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); + } + + 60% { + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); + } + + 80% { + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); + } + + to { + transform: scale3d(1, 1, 1); + } +} + +@keyframes _tada { + from { + transform: scale3d(1, 1, 1); + } + + 10% { + transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg); + } + + 20% { + transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg); + } + + 30% { + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); + } + + 50% { + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); + } + + 70% { + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); + } + + 90% { + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); + } + + 40% { + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); + } + + 60% { + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); + } + + 80% { + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); + } + + to { + transform: scale3d(1, 1, 1); + } +} + +@-webkit-keyframes _pulse { + from { + transform: scale3d(1, 1, 1); + } + + 50% { + transform: scale3d(1.05, 1.05, 1.05); + } + + to { + transform: scale3d(1, 1, 1); + } +} + +@keyframes _pulse { + from { + transform: scale3d(1, 1, 1); + } + + 50% { + transform: scale3d(1.05, 1.05, 1.05); + } + + to { + transform: scale3d(1, 1, 1); + } +} + +@-webkit-keyframes _show-up-clock { + 0% { + opacity: 0; + transform: scale(0.7); + } + + to { + opacity: 1; + transform: scale(1); + } +} + +@keyframes _show-up-clock { + 0% { + opacity: 0; + transform: scale(0.7); + } + + to { + opacity: 1; + transform: scale(1); + } +} + +.sr-only { + position: absolute; + width: .0625rem; + height: .0625rem; + padding: 0; + margin: -0.0625rem; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border-width: 0; +} + +.visible { + visibility: visible; +} + +.static { + position: static; +} + +.fixed { + position: fixed; +} + +.absolute { + position: absolute; +} + +.relative { + position: relative; +} + +.sticky { + position: -webkit-sticky; + position: sticky; +} + +.inset-0 { + top: 0rem; + right: 0rem; + bottom: 0rem; + left: 0rem; +} + +.top-0 { + top: 0rem; +} + +.right-0 { + right: 0rem; +} + +.bottom-0 { + bottom: 0rem; +} + +.top-5 { + top: 20px; +} + +.right-5 { + right: 20px; +} + +.z-10 { + z-index: 10; +} + +.m-auto { + margin: auto; +} + +.m-2 { + margin: 8px; +} + +.mx-auto { + margin-left: auto; + margin-right: auto; +} + +.my-auto { + margin-top: auto; + margin-bottom: auto; +} + +.my-2 { + margin-top: 8px; + margin-bottom: 8px; +} + +.my-4 { + margin-top: 16px; + margin-bottom: 16px; +} + +.mx-1 { + margin-left: 4px; + margin-right: 4px; +} + +.mb-4 { + margin-bottom: 16px; +} + +.mb-8 { + margin-bottom: 32px; +} + +.mr-4 { + margin-right: 16px; +} + +.ml-2 { + margin-left: 8px; +} + +.mt-3 { + margin-top: 12px; +} + +.mt-2 { + margin-top: 8px; +} + +.mt-4 { + margin-top: 16px; +} + +.ml-auto { + margin-left: auto; +} + +.mt-0 { + margin-top: 0rem; +} + +.mb-3 { + margin-bottom: 12px; +} + +.mb-2 { + margin-bottom: 8px; +} + +.mb-5 { + margin-bottom: 20px; +} + +.mb-10 { + margin-bottom: 40px; +} + +.mt-10 { + margin-top: 40px; +} + +.mt-8 { + margin-top: 32px; +} + +.mb-6 { + margin-bottom: 24px; +} + +.mr-2 { + margin-right: 8px; +} + +.ml-5 { + margin-left: 20px; +} + +.ml-6 { + margin-left: 24px; +} + +.block { + display: block; +} + +.inline-block { + display: inline-block; +} + +.flex { + display: flex; +} + +.inline-flex { + display: inline-flex; +} + +.table { + display: table; +} + +.hidden { + display: none; +} + +.h-full { + height: 100%; +} + +.h-7 { + height: 28px; +} + +.h-fit { + height: -webkit-fit-content; + height: -moz-fit-content; + height: fit-content; +} + +.h-10 { + height: 40px; +} + +.h-12 { + height: 48px; +} + +.h-6 { + height: 24px; +} + +.h-14 { + height: 56px; +} + +.h-4 { + height: 16px; +} + +.h-40 { + height: 160px; +} + +.h-[70vh] { + height: 70vh; +} + +.h-[50vh] { + height: 50vh; +} + +.h-8 { + height: 32px; +} + +.h-5 { + height: 20px; +} + +.h-screen { + height: 100vh; +} + +.h-16 { + height: 64px; +} + +.max-h-[70vh] { + max-height: 70vh; +} + +.max-h-[80vh] { + max-height: 80vh; +} + +.max-h-60 { + max-height: 240px; +} + +.min-h-[60vh] { + min-height: 60vh; +} + +.min-h-screen { + min-height: 100vh; +} + +.w-full { + width: 100%; +} + +.w-7 { + width: 28px; +} + +.w-11/12 { + width: 91.666667%; +} + +.w-10 { + width: 40px; +} + +.w-12 { + width: 48px; +} + +.w-32 { + width: 128px; +} + +.w-6 { + width: 24px; +} + +.w-14 { + width: 56px; +} + +.w-4 { + width: 16px; +} + +.w-8 { + width: 32px; +} + +.w-5 { + width: 20px; +} + +.w-16 { + width: 64px; +} + +.min-w-full { + min-width: 100%; +} + +.max-w-lg { + max-width: 512px; +} + +.max-w-xs { + max-width: 320px; +} + +.max-w-sm { + max-width: 384px; +} + +.flex-1 { + flex: 1 1 0%; +} + +.flex-auto { + flex: 1 1 auto; +} + +.transform { + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.cursor-pointer { + cursor: pointer; +} + +.resize { + resize: both; +} + +.list-none { + list-style-type: none; +} + +.appearance-none { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} + +.flex-row { + flex-direction: row; +} + +.flex-col { + flex-direction: column; +} + +.flex-wrap { + flex-wrap: wrap; +} + +.content-center { + align-content: center; +} + +.items-end { + align-items: flex-end; +} + +.items-center { + align-items: center; +} + +.justify-center { + justify-content: center; +} + +.justify-between { + justify-content: space-between; +} + +.justify-around { + justify-content: space-around; +} + +.justify-evenly { + justify-content: space-evenly; +} + +.gap-2 { + gap: 8px; +} + +.space-x-2 > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(8px * var(--tw-space-x-reverse)); + margin-left: calc(8px * calc(1 - var(--tw-space-x-reverse))); +} + +.divide-y > :not([hidden]) ~ :not([hidden]) { + --tw-divide-y-reverse: 0; + border-top-width: calc(.0625rem * calc(1 - var(--tw-divide-y-reverse))); + border-bottom-width: calc(.0625rem * var(--tw-divide-y-reverse)); +} + +.divide-gray-200 > :not([hidden]) ~ :not([hidden]) { + --tw-divide-opacity: 1; + border-color: rgb(229 231 235 / var(--tw-divide-opacity)); +} + +.overflow-hidden { + overflow: hidden; +} + +.overflow-x-auto { + overflow-x: auto; +} + +.overflow-y-auto { + overflow-y: auto; +} + +.overflow-x-hidden { + overflow-x: hidden; +} + +.overflow-y-scroll { + overflow-y: scroll; +} + +.truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.whitespace-nowrap { + white-space: nowrap; +} + +.whitespace-pre-line { + white-space: pre-line; +} + +.rounded-full { + border-radius: 624.9375rem; +} + +.rounded { + border-radius: 4px; +} + +.rounded-xl { + border-radius: 12px; +} + +.rounded-lg { + border-radius: 8px; +} + +.rounded-md { + border-radius: 6px; +} + +.rounded-t-lg { + border-top-left-radius: 8px; + border-top-right-radius: 8px; +} + +.border-2 { + border-width: .125rem; +} + +.border { + border-width: .0625rem; +} + +.border-b-2 { + border-bottom-width: .125rem; +} + +.border-b { + border-bottom-width: .0625rem; +} + +.border-t { + border-top-width: .0625rem; +} + +.border-gray-200 { + --tw-border-opacity: 1; + border-color: rgb(229 231 235 / var(--tw-border-opacity)); +} + +.border-white { + --tw-border-opacity: 1; + border-color: rgb(255 255 255 / var(--tw-border-opacity)); +} + +.border-gray-300 { + --tw-border-opacity: 1; + border-color: rgb(209 213 219 / var(--tw-border-opacity)); +} + +.border-red-500 { + --tw-border-opacity: 1; + border-color: rgb(239 68 68 / var(--tw-border-opacity)); +} + +.bg-blue-500 { + --tw-bg-opacity: 1; + background-color: rgb(59 130 246 / var(--tw-bg-opacity)); +} + +.bg-blue-900 { + --tw-bg-opacity: 1; + background-color: rgb(30 58 138 / var(--tw-bg-opacity)); +} + +.bg-gray-200 { + --tw-bg-opacity: 1; + background-color: rgb(229 231 235 / var(--tw-bg-opacity)); +} + +.bg-blue-400 { + --tw-bg-opacity: 1; + background-color: rgb(96 165 250 / var(--tw-bg-opacity)); +} + +.bg-transparent { + background-color: transparent; +} + +.bg-white { + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity)); +} + +.bg-green-500 { + --tw-bg-opacity: 1; + background-color: rgb(34 197 94 / var(--tw-bg-opacity)); +} + +.bg-gray-400 { + --tw-bg-opacity: 1; + background-color: rgb(156 163 175 / var(--tw-bg-opacity)); +} + +.bg-gray-300 { + --tw-bg-opacity: 1; + background-color: rgb(209 213 219 / var(--tw-bg-opacity)); +} + +.bg-blue-600 { + --tw-bg-opacity: 1; + background-color: rgb(37 99 235 / var(--tw-bg-opacity)); +} + +.bg-black { + --tw-bg-opacity: 1; + background-color: rgb(0 0 0 / var(--tw-bg-opacity)); +} + +.bg-slate-100 { + --tw-bg-opacity: 1; + background-color: rgb(241 245 249 / var(--tw-bg-opacity)); +} + +.bg-gray-50 { + --tw-bg-opacity: 1; + background-color: rgb(249 250 251 / var(--tw-bg-opacity)); +} + +.bg-red-600 { + --tw-bg-opacity: 1; + background-color: rgb(220 38 38 / var(--tw-bg-opacity)); +} + +.bg-slate-200 { + --tw-bg-opacity: 1; + background-color: rgb(226 232 240 / var(--tw-bg-opacity)); +} + +.bg-gray-800 { + --tw-bg-opacity: 1; + background-color: rgb(31 41 55 / var(--tw-bg-opacity)); +} + +.object-cover { + -o-object-fit: cover; + object-fit: cover; +} + +.p-4 { + padding: 16px; +} + +.p-2 { + padding: 8px; +} + +.p-2.5 { + padding: 10px; +} + +.p-1.5 { + padding: 6px; +} + +.p-1 { + padding: 4px; +} + +.p-5 { + padding: 20px; +} + +.p-6 { + padding: 24px; +} + +.py-10 { + padding-top: 40px; + padding-bottom: 40px; +} + +NaNrem-5 { + padding-left: 20px; + padding-right: 20px; +} + +NaNrem-2 { + padding-left: 8px; + padding-right: 8px; +} + +.py-2 { + padding-top: 8px; + padding-bottom: 8px; +} + +.py-1 { + padding-top: 4px; + padding-bottom: 4px; +} + +NaNrem-6 { + padding-left: 24px; + padding-right: 24px; +} + +.py-4 { + padding-top: 16px; + padding-bottom: 16px; +} + +NaNrem-4 { + padding-left: 16px; + padding-right: 16px; +} + +.py-8 { + padding-top: 32px; + padding-bottom: 32px; +} + +.py-2.5 { + padding-top: 10px; + padding-bottom: 10px; +} + +.py-3 { + padding-top: 12px; + padding-bottom: 12px; +} + +.py-5 { + padding-top: 20px; + padding-bottom: 20px; +} + +NaNrem-3 { + padding-left: 12px; + padding-right: 12px; +} + +NaNrem-8 { + padding-left: 32px; + padding-right: 32px; +} + +NaNrem-1 { + padding-left: 4px; + padding-right: 4px; +} + +.pt-4 { + padding-top: 16px; +} + +.pr-6 { + padding-right: 24px; +} + +.pb-6 { + padding-bottom: 24px; +} + +.pl-4 { + padding-left: 16px; +} + +.pb-10 { + padding-bottom: 40px; +} + +.pr-0 { + padding-right: 0rem; +} + +.pr-2 { + padding-right: 8px; +} + +.pl-2 { + padding-left: 8px; +} + +.pt-6 { + padding-top: 24px; +} + +.pb-8 { + padding-bottom: 32px; +} + +.text-left { + text-align: left; +} + +.text-center { + text-align: center; +} + +.text-right { + text-align: right; +} + +.align-baseline { + vertical-align: baseline; +} + +.align-text-bottom { + vertical-align: text-bottom; +} + +.text-2xl { + font-size: 24px; + line-height: 32px; +} + +.text-3xl { + font-size: 30px; + line-height: 36px; +} + +.text-xs { + font-size: 12px; + line-height: 16px; +} + +.text-xl { + font-size: 20px; + line-height: 28px; +} + +.text-7xl { + font-size: 72px; + line-height: 1; +} + +.text-sm { + font-size: 14px; + line-height: 20px; +} + +.text-lg { + font-size: 18px; + line-height: 28px; +} + +.text-base { + font-size: 16px; + line-height: 24px; +} + +.font-bold { + font-weight: 700; +} + +.font-medium { + font-weight: 500; +} + +.font-normal { + font-weight: 400; +} + +.uppercase { + text-transform: uppercase; +} + +.italic { + font-style: italic; +} + +.leading-6 { + line-height: 24px; +} + +.leading-tight { + line-height: 1.25; +} + +.tracking-wider { + letter-spacing: 0.05em; +} + +.text-white { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); +} + +.text-black { + --tw-text-opacity: 1; + color: rgb(0 0 0 / var(--tw-text-opacity)); +} + +.text-gray-700 { + --tw-text-opacity: 1; + color: rgb(55 65 81 / var(--tw-text-opacity)); +} + +.text-gray-800 { + --tw-text-opacity: 1; + color: rgb(31 41 55 / var(--tw-text-opacity)); +} + +.text-gray-500 { + --tw-text-opacity: 1; + color: rgb(107 114 128 / var(--tw-text-opacity)); +} + +.text-gray-400 { + --tw-text-opacity: 1; + color: rgb(156 163 175 / var(--tw-text-opacity)); +} + +.text-gray-900 { + --tw-text-opacity: 1; + color: rgb(17 24 39 / var(--tw-text-opacity)); +} + +.text-slate-500 { + --tw-text-opacity: 1; + color: rgb(100 116 139 / var(--tw-text-opacity)); +} + +.text-gray-600 { + --tw-text-opacity: 1; + color: rgb(75 85 99 / var(--tw-text-opacity)); +} + +.text-red-500 { + --tw-text-opacity: 1; + color: rgb(239 68 68 / var(--tw-text-opacity)); +} + +.text-blue-500 { + --tw-text-opacity: 1; + color: rgb(59 130 246 / var(--tw-text-opacity)); +} + +.text-red-400 { + --tw-text-opacity: 1; + color: rgb(248 113 113 / var(--tw-text-opacity)); +} + +.opacity-40 { + opacity: 0.4; +} + +.shadow-md { + --tw-shadow: 0 .25rem .375rem -0.0625rem rgb(0 0 0 / 0.1), 0 .125rem .25rem -0.125rem rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 .25rem .375rem -0.0625rem var(--tw-shadow-color), 0 .125rem .25rem -0.125rem var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow { + --tw-shadow: 0 .0625rem .1875rem 0 rgb(0 0 0 / 0.1), 0 .0625rem .125rem -0.0625rem rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 .0625rem .1875rem 0 var(--tw-shadow-color), 0 .0625rem .125rem -0.0625rem var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-lg { + --tw-shadow: 0 .625rem .9375rem -0.1875rem rgb(0 0 0 / 0.1), 0 .25rem .375rem -0.25rem rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 .625rem .9375rem -0.1875rem var(--tw-shadow-color), 0 .25rem .375rem -0.25rem var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-inner { + --tw-shadow: inset 0 .125rem .25rem 0 rgb(0 0 0 / 0.05); + --tw-shadow-colored: inset 0 .125rem .25rem 0 var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.outline-none { + outline: .125rem solid transparent; + outline-offset: .125rem; +} + +.outline { + outline-style: solid; +} + +.ring-blue-600 { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(37 99 235 / var(--tw-ring-opacity)); +} + +.ring-indigo-600 { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(79 70 229 / var(--tw-ring-opacity)); +} + +.ring-offset-2 { + --tw-ring-offset-width: .125rem; +} + +.blur { + --tw-blur: blur(.5rem); + filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); +} + +.filter { + filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); +} + +.transition-transform { + transition-property: transform; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.transition { + transition-property: color, background-color, border-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-text-decoration-color, -webkit-backdrop-filter; + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter; + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-text-decoration-color, + -webkit-backdrop-filter; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.duration-300 { + transition-duration: 300ms; +} + +.duration-150 { + transition-duration: 150ms; +} + +.ease-in-out { + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); +} + +@media screen and (max-width: 47.9375rem) { + .sidebar-holder { + width: 100%; + min-width: 12.5rem; + max-width: 12.5rem; + position: fixed; + top: 0; + left: 0; + } + + .page-header span { + margin-left: auto; + } +} + +.hover:scale-105:hover { + --tw-scale-x: 1.05; + --tw-scale-y: 1.05; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.hover:bg-blue-700:hover { + --tw-bg-opacity: 1; + background-color: rgb(29 78 216 / var(--tw-bg-opacity)); +} + +.hover:bg-gray-200:hover { + --tw-bg-opacity: 1; + background-color: rgb(229 231 235 / var(--tw-bg-opacity)); +} + +.hover:bg-gray-100:hover { + --tw-bg-opacity: 1; + background-color: rgb(243 244 246 / var(--tw-bg-opacity)); +} + +.hover:bg-green-600:hover { + --tw-bg-opacity: 1; + background-color: rgb(22 163 74 / var(--tw-bg-opacity)); +} + +.hover:bg-red-700:hover { + --tw-bg-opacity: 1; + background-color: rgb(185 28 28 / var(--tw-bg-opacity)); +} + +.hover:bg-gray-900:hover { + --tw-bg-opacity: 1; + background-color: rgb(17 24 39 / var(--tw-bg-opacity)); +} + +.hover:text-gray-800:hover { + --tw-text-opacity: 1; + color: rgb(31 41 55 / var(--tw-text-opacity)); +} + +.hover:text-gray-900:hover { + --tw-text-opacity: 1; + color: rgb(17 24 39 / var(--tw-text-opacity)); +} + +.hover:text-blue-800:hover { + --tw-text-opacity: 1; + color: rgb(30 64 175 / var(--tw-text-opacity)); +} + +.hover:shadow-lg:hover { + --tw-shadow: 0 .625rem .9375rem -0.1875rem rgb(0 0 0 / 0.1), 0 .25rem .375rem -0.25rem rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 .625rem .9375rem -0.1875rem var(--tw-shadow-color), 0 .25rem .375rem -0.25rem var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.focus:bg-blue-700:focus { + --tw-bg-opacity: 1; + background-color: rgb(29 78 216 / var(--tw-bg-opacity)); +} + +.focus:bg-green-600:focus { + --tw-bg-opacity: 1; + background-color: rgb(22 163 74 / var(--tw-bg-opacity)); +} + +.focus:bg-red-700:focus { + --tw-bg-opacity: 1; + background-color: rgb(185 28 28 / var(--tw-bg-opacity)); +} + +.focus:bg-gray-900:focus { + --tw-bg-opacity: 1; + background-color: rgb(17 24 39 / var(--tw-bg-opacity)); +} + +.focus:shadow-lg:focus { + --tw-shadow: 0 .625rem .9375rem -0.1875rem rgb(0 0 0 / 0.1), 0 .25rem .375rem -0.25rem rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 .625rem .9375rem -0.1875rem var(--tw-shadow-color), 0 .25rem .375rem -0.25rem var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.focus:outline-none:focus { + outline: .125rem solid transparent; + outline-offset: .125rem; +} + +.focus:ring-2:focus { + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(.125rem + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); +} + +.focus:ring-0:focus { + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0rem + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); +} + +.focus:ring-gray-300:focus { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(209 213 219 / var(--tw-ring-opacity)); +} + +.active:bg-blue-800:active { + --tw-bg-opacity: 1; + background-color: rgb(30 64 175 / var(--tw-bg-opacity)); +} + +.active:bg-green-700:active { + --tw-bg-opacity: 1; + background-color: rgb(21 128 61 / var(--tw-bg-opacity)); +} + +.active:bg-red-800:active { + --tw-bg-opacity: 1; + background-color: rgb(153 27 27 / var(--tw-bg-opacity)); +} + +.active:bg-gray-900:active { + --tw-bg-opacity: 1; + background-color: rgb(17 24 39 / var(--tw-bg-opacity)); +} + +.active:shadow-lg:active { + --tw-shadow: 0 .625rem .9375rem -0.1875rem rgb(0 0 0 / 0.1), 0 .25rem .375rem -0.25rem rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 .625rem .9375rem -0.1875rem var(--tw-shadow-color), 0 .25rem .375rem -0.25rem var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.disabled:cursor-not-allowed:disabled { + cursor: not-allowed; +} + +@media (prefers-color-scheme: dark) { + .dark:text-gray-400 { + --tw-text-opacity: 1; + color: rgb(156 163 175 / var(--tw-text-opacity)); + } + + .dark:text-gray-500 { + --tw-text-opacity: 1; + color: rgb(107 114 128 / var(--tw-text-opacity)); + } + + .dark:hover:bg-gray-700:hover { + --tw-bg-opacity: 1; + background-color: rgb(55 65 81 / var(--tw-bg-opacity)); + } + + .dark:hover:text-white:hover { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); + } +} + +.property-grid { + display: grid; + grid-template-columns: repeat(2, 15.625rem); + -moz-column-gap: 1.9375rem; + column-gap: 1.9375rem; + row-gap: 5rem; + padding-inline: 16px; + min-width: 37.5rem; +} + +@media (min-width: 40rem) { + .property-grid { + grid-template-columns: repeat(2, minmax(18.25rem, 1fr)); + padding-inline: 0; + } + + .sm:ml-4 { + margin-left: 16px; + } + + .sm:flex { + display: flex; + } + + .sm:w-1/2 { + width: 50%; + } + + .sm:px-6 { + padding-left: 24px; + padding-right: 24px; + } + + .sm:text-left { + text-align: left; + } +} + +@media (min-width: 48rem) { + .md:h-52 { + height: 208px; + } + + .md:w-1/2 { + width: 50%; + } +} + +@media (min-width: 64rem) { + .property-grid { + grid-template-columns: repeat(3, minmax(18.25rem, 1fr)); + } + + .lg:block { + display: block; + } + + .lg:flex { + display: flex; + } + + .lg:hidden { + display: none; + } + + .lg:h-80 { + height: 320px; + } + + .lg:max-h-[60vh] { + max-height: 60vh; + } + + .lg:w-1/3 { + width: 33.333333%; + } + + .lg:w-1/2 { + width: 50%; + } + + .lg:px-6 { + padding-left: 24px; + padding-right: 24px; + } +} + +@media (min-width: 80rem) { + .property-grid { + grid-template-columns: repeat(4, minmax(18.25rem, 1fr)); + } + + .xl:w-1/4 { + width: 25%; + } + + .xl:w-1/2 { + width: 50%; + } +} + + + \ No newline at end of file diff --git a/day20/src/pages/404/NotFoundPage.jsx b/day20/src/pages/404/NotFoundPage.jsx new file mode 100644 index 0000000..92f3dfd --- /dev/null +++ b/day20/src/pages/404/NotFoundPage.jsx @@ -0,0 +1,33 @@ + + import React from "react"; + import {Loader} from "Components/Loader"; + + const NotFoundPage = () => { + const [ loading, setLoading ] = React.useState( true ); + + console.log( loading ); + + React.useEffect( () => { + const interval = setTimeout( () => { + setLoading( false ); + }, 5000 ); + // return () => clearInterval(interval); + }, [] ); + + return ( + <> + { loading ? ( + + ) : ( +
    + Not Found +
    + ) } + + ); + }; + + export default NotFoundPage; + + + \ No newline at end of file diff --git a/day20/src/pages/404/index.js b/day20/src/pages/404/index.js new file mode 100644 index 0000000..83428ac --- /dev/null +++ b/day20/src/pages/404/index.js @@ -0,0 +1,4 @@ + + import {lazy} from 'react' + export const NotFoundPage = lazy( ()=> import('./NotFoundPage')) + \ No newline at end of file diff --git a/day20/src/pages/Admin/Add/AddAdminCmsPage.jsx b/day20/src/pages/Admin/Add/AddAdminCmsPage.jsx new file mode 100644 index 0000000..4660417 --- /dev/null +++ b/day20/src/pages/Admin/Add/AddAdminCmsPage.jsx @@ -0,0 +1,182 @@ + + import React from "react"; +import { useForm } from "react-hook-form"; +import { yupResolver } from "@hookform/resolvers/yup"; +import * as yup from "yup"; +import MkdSDK from "Utils/MkdSDK"; +import { useNavigate } from "react-router-dom"; +import { GlobalContext, showToast } from "Context/Global"; +import { tokenExpireError } from "Context/Auth"; +import { DynamicContentType } from "Components/DynamicContentType"; + +const AddAdminCmsPage = ({ setSidebar }) => { + const schema = yup + .object({ + page: yup.string().required(), + key: yup.string().required(), + type: yup.string().required(), + value: yup.string(), + }) + .required(); + + const selectType = [ + { key: "text", value: "Text" }, + { key: "image", value: "Image" }, + { key: "number", value: "Number" }, + { key: "kvp", value: "Key-Value Pair" }, + { key: "image-list", value: "Image List" }, + { key: "captioned-image-list", value: "Captioned Image List" }, + { key: "team-list", value: "Team List" }, + ]; + + const { dispatch } = React.useContext(GlobalContext); + const { dispatch: globalDispatch } = React.useContext(GlobalContext); + + const [contentType, setContentType] = React.useState(selectType[0]?.key); + const [contentValue, setContentValue] = React.useState(''); + const [isUpdating, setIsUpdating] = React.useState(false); + const navigate = useNavigate(); + const { + register, + handleSubmit, + setError, + formState: { errors }, + } = useForm({ + resolver: yupResolver(schema), + }); + + const onSubmit = async (data) => { + let sdk = new MkdSDK(); + setIsUpdating(true); + console.log(data); + try { + sdk.setTable("cms"); + + const result = await sdk.cmsAdd( + data.page, + data.key, + data.type, + contentValue + ); + if (!result.error) { + navigate("/admin/cms"); + showToast(globalDispatch, "Added"); + } else { + if (result.validation) { + const keys = Object.keys(result.validation); + for (let i = 0; i < keys.length; i++) { + const field = keys[i]; + setError(field, { + type: "manual", + message: result.validation[field], + }); + } + } + } + } catch (error) { + console.log("Error", error); + setError("page", { + type: "manual", + message: error.message, + }); + tokenExpireError(dispatch, error.message); + } + setIsUpdating(false); + }; + + React.useEffect(() => { + globalDispatch({ + type: "SETPATH", + payload: { + path: "cms", + }, + }); + }, []); + + return ( +
    +
    +
    + {/* setSidebar(false)} xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none"> + + */} + Add CMS Content +
    +
    + + +
    +
    + {/*

    Add CMS Content

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

    {errors.key?.message}

    +
    +
    + + +
    + + + {/* */} + +
    + ); +}; + +export default AddAdminCmsPage; + + \ No newline at end of file diff --git a/day20/src/pages/Admin/Add/AddAdminEmailPage.jsx b/day20/src/pages/Admin/Add/AddAdminEmailPage.jsx new file mode 100644 index 0000000..15cbc4f --- /dev/null +++ b/day20/src/pages/Admin/Add/AddAdminEmailPage.jsx @@ -0,0 +1,188 @@ + + import React from "react"; +import { useForm } from "react-hook-form"; +import { yupResolver } from "@hookform/resolvers/yup"; +import * as yup from "yup"; +import MkdSDK from "Utils/MkdSDK"; +import { useNavigate } from "react-router-dom"; +import { GlobalContext, showToast } from "Context/Global"; +import { tokenExpireError } from "Context/Auth"; +const AddAdminEmailPage = () => { + const [isUpdating, setIsUpdating] = React.useState(false); + + const schema = yup + .object({ + slug: yup.string().required(), + subject: yup.string().required(), + html: yup.string().required(), + tag: yup.string().required(), + }) + .required(); + + const { dispatch } = React.useContext(GlobalContext); + const { dispatch: globalDispatch } = React.useContext(GlobalContext); + + const navigate = useNavigate(); + const { + register, + handleSubmit, + setError, + formState: { errors }, + } = useForm({ + resolver: yupResolver(schema), + }); + + const onSubmit = async (data) => { + let sdk = new MkdSDK(); + setIsUpdating(true); + try { + sdk.setTable("email"); + + const result = await sdk.callRestAPI( + { + slug: data.slug, + subject: data.subject, + html: data.html, + tag: data.tag, + }, + "POST" + ); + if (!result.error) { + navigate("/admin/email"); + showToast(globalDispatch, "Added"); + } else { + if (result.validation) { + const keys = Object.keys(result.validation); + for (let i = 0; i < keys.length; i++) { + const field = keys[i]; + setError(field, { + type: "manual", + message: result.validation[field], + }); + } + } + } + } catch (error) { + console.log("Error", error); + setError("subject", { + type: "manual", + message: error.message, + }); + tokenExpireError(dispatch, error.message); + }; + setIsUpdating(false); + }; + + React.useEffect(() => { + globalDispatch({ + type: "SETPATH", + payload: { + path: "email", + }, + }); + }, []); + + return ( +
    +
    +
    + {/* setSidebar(false)} xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none"> + + */} + Add Email +
    +
    + + +
    +
    + {/*

    Add Email

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

    + {errors.subject?.message} +

    +
    +
    + + +

    {errors.tag?.message}

    +
    +
    + + +

    {errors.html?.message}

    +
    + {/* */} +
    +
    + ); +}; + +export default AddAdminEmailPage; + + \ No newline at end of file diff --git a/day20/src/pages/Admin/Add/AddAdminPhotoPage.jsx b/day20/src/pages/Admin/Add/AddAdminPhotoPage.jsx new file mode 100644 index 0000000..0adcb57 --- /dev/null +++ b/day20/src/pages/Admin/Add/AddAdminPhotoPage.jsx @@ -0,0 +1,86 @@ + + import React, { useState } from "react"; +import Uppy from "@uppy/core"; +import XHRUpload from "@uppy/xhr-upload"; +import { Dashboard, useUppy } from "@uppy/react"; +import "@uppy/core/dist/style.css"; +import "@uppy/drag-drop/dist/style.css"; + +import MkdSDK from "Utils/MkdSDK"; +import { GlobalContext, showToast } from "Context/Global"; +import { useNavigate } from "react-router"; +let sdk = new MkdSDK(); + +const AddAdminPhotoPage = ({ setSidebar }) => { + const { dispatch } = React.useContext(GlobalContext); + const navigate = useNavigate(); + const { dispatch: globalDispatch } = React.useContext(GlobalContext); + + const uppy = useUppy(() => { + let model = new Uppy(); + model.use(XHRUpload, { + id: "XHRUpload", + method: "post", + formData: true, + limit: 0, + fieldName: "file", + allowedMetaFields: ["caption", "size"], + headers: sdk.getHeader(), + endpoint: sdk.uploadUrl(), + }); + + model.on("file-added", (file) => { + model.setFileMeta(file.id, { + size: file.size, + caption: "", + }); + }); + + model.on("upload-success", async (file, response) => { + const httpStatus = response.status; // HTTP status code + const responseBody = response.body; + console.log("response", response); + showToast(globalDispatch, "Uploaded"); + navigate("/admin/photos"); + }); + + model.on("upload-error", (file, error, response) => { + const httpStatus = response.status; // HTTP status code + if (httpStatus == 401) { + tokenExpireError(dispatch, "TOKEN_EXPIRED"); + } + }); + return model; + }); + + React.useEffect(() => { + globalDispatch({ + type: "SETPATH", + payload: { + path: "photos", + }, + }); + }, []); + + return ( +
    +
    +
    + {/* setSidebar(false)} xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none"> + + */} + Add Photo +
    +
    + +
    +
    + {/*

    Add Photo

    */} + +
    + ); +}; + +export default AddAdminPhotoPage; + + \ No newline at end of file diff --git a/day20/src/pages/Admin/Add/AddAdminStripePricePage.jsx b/day20/src/pages/Admin/Add/AddAdminStripePricePage.jsx new file mode 100644 index 0000000..40d845d --- /dev/null +++ b/day20/src/pages/Admin/Add/AddAdminStripePricePage.jsx @@ -0,0 +1,394 @@ + + import React, { useState } from "react"; +import { useForm } from "react-hook-form"; +import { yupResolver } from "@hookform/resolvers/yup"; +import * as yup from "yup"; +import MkdSDK from "Utils/MkdSDK"; +import { useNavigate } from "react-router-dom"; +import { GlobalContext, showToast } from "Context/Global"; +import { tokenExpireError, AuthContext } from "Context/Auth"; + +const AddAdminStripePricePage = ({ setSidebar }) => { + const [priceType, setPriceType] = useState("one_time"); + const [selectProduct, setSelectProduct] = useState([]); + const [isUpdatingPrice, setIsUpdatingPrice] = useState(false); + + const schema = yup + .object({ + product_id: yup.string().required(), + name: yup.string().required(), + amount: yup.string().required(), + type: yup.string().required(), + interval: yup.string().when("type", { + is: "recurring", + then: (schema) => schema.required(), + otherwise: (schema) => schema.notRequired(), + }), + interval_count: yup.string(), + usage_type: yup.string().when("type", { + is: "recurring", + then: (schema) => schema.required(), + otherwise: (schema) => schema.notRequired(), + }), + usage_limit: yup.string(), + trial_days: yup.string(), + }) + .required(); + + const { dispatch } = React.useContext(AuthContext); + const { dispatch: globalDispatch } = React.useContext(GlobalContext); + + const navigate = useNavigate(); + const { + register, + handleSubmit, + setError, + setValue, + trigger, + resetField, + getValues, + formState: { errors }, + } = useForm({ + resolver: yupResolver(schema), + }); + + const selectType = [ + { key: 0, value: "", display: "Nothing Selected" }, + { key: 1, value: "one_time", display: "One Time" }, + { key: 2, value: "recurring", display: "Recurring" }, + ]; + + const selectUsageType = [ + { key: 0, value: "", display: "Nothing Selected" }, + { key: 1, value: "licenced", display: "Upfront" }, + { key: 2, value: "metered", display: "Metered" }, + ]; + + const selectInterval = [ + { key: 0, value: "", display: "Nothing Selected" }, + { key: 1, value: "day", display: "Day" }, + { key: 2, value: "week", display: "Week" }, + { key: 3, value: "month", display: "Month" }, + { key: 4, value: "year", display: "Year" }, + { key: 5, value: "lifetime", display: "Lifetime" }, + ]; + + const onSubmit = async (data) => { + let sdk = new MkdSDK(); + console.log(data); + setIsUpdatingPrice(true); + try { + const result = await sdk.addStripePrice(data); + if (!result.error) { + showToast(globalDispatch, "Price Added"); + navigate("/admin/prices"); + } else { + if (result.validation) { + const keys = Object.keys(result.validation); + for (let i = 0; i < keys.length; i++) { + const field = keys[i]; + console.log(field); + setError(field, { + type: "manual", + message: result.validation[field], + }); + } + } + } + } catch (error) { + console.log("Error", error); + + showToast(globalDispatch, error.message); + tokenExpireError(dispatch, error.message); + } + setIsUpdatingPrice(false); + }; + + React.useEffect(() => { + globalDispatch({ + type: "SETPATH", + payload: { + path: "prices", + }, + }); + (async () => { + let sdk = new MkdSDK(); + const { list, error } = await sdk.getStripeProducts({ limit: "all" }); + if (error) { + showToast( + dispatch, + "Something went wrong while fetching products list" + ); + return; + } + setSelectProduct(list); + })(); + }, []); + return ( +
    +
    +
    + (/* setSidebar(false)} + xmlns="http://www.w3.org/2000/svg" + width="24" + height="24" + viewBox="0 0 24 24" + fill="none" + > + + */) + Add Price +
    +
    + + +
    +
    +
    +
    + + +

    + {errors.product_id?.message} +

    +
    + +
    + + +

    {errors.name?.message}

    +
    + +
    + + +

    + {errors.amount?.message} +

    +
    + +
    + + +

    {errors.type?.message}

    +
    + {priceType === "recurring" ? ( +
    +
    + + +

    + {errors.interval?.message} +

    +
    +
    + + +

    + {errors.interval_count?.message} +

    +
    + +
    + + +

    + {errors.usage_type?.message} +

    +
    +
    + + +

    + {errors.trial_days?.message} +

    +
    +
    + + +

    + {errors.usage_limit?.message} +

    +
    +
    + ) : ( + "" + )} + + {/* */} +
    +
    + ); +}; + +export default AddAdminStripePricePage; + + \ No newline at end of file diff --git a/day20/src/pages/Admin/Add/AddAdminUserPage.jsx b/day20/src/pages/Admin/Add/AddAdminUserPage.jsx new file mode 100644 index 0000000..f0535f3 --- /dev/null +++ b/day20/src/pages/Admin/Add/AddAdminUserPage.jsx @@ -0,0 +1,193 @@ + + import React from "react"; +import { useForm } from "react-hook-form"; +import { yupResolver } from "@hookform/resolvers/yup"; +import * as yup from "yup"; +import MkdSDK from "Utils/MkdSDK"; +import { useNavigate } from "react-router-dom"; +import { GlobalContext, showToast } from "Context/Global"; +import { tokenExpireError } from "Context/Auth"; + +const AddAdminUserPage = ({ setSidebar }) => { + const schema = yup + .object({ + email: yup.string().email().required(), + password: yup.string().required(), + role: yup.string(), + }) + .required(); + + const { dispatch } = React.useContext(GlobalContext); + const { dispatch: globalDispatch } = React.useContext(GlobalContext); + const [isUpdating, setIsUpdating] = React.useState(false); + const navigate = useNavigate(); + const { + register, + handleSubmit, + setError, + formState: { errors }, + } = useForm({ + resolver: yupResolver(schema), + }); + + const selectRole = [ + { name: "role", value: "admin" }, + { name: "role", value: "employee" }, + ]; + + const onSubmit = async (data) => { + let sdk = new MkdSDK(); + setIsUpdating(true); + try { + const result = await sdk.register(data.email, data.password, data.role); + if (!result.error) { + showToast(dispatch, "Added"); + navigate("/admin/users"); + } else { + if (result.validation) { + const keys = Object.keys(result.validation); + for (let i = 0; i < keys.length; i++) { + const field = keys[i]; + setError(field, { + type: "manual", + message: result.validation[field], + }); + } + } + } + } catch (error) { + console.log("Error", error); + setError("email", { + type: "manual", + message: error.message, + }); + tokenExpireError(dispatch, error.message); + } + setIsUpdating(false); + }; + + React.useEffect(() => { + globalDispatch({ + type: "SETPATH", + payload: { + path: "users", + }, + }); + }, []); + return ( +
    +
    +
    + {/* setSidebar(false)} + xmlns="http://www.w3.org/2000/svg" + width="24" + height="24" + viewBox="0 0 24 24" + fill="none" + > + + */} + Add User +
    +
    + + +
    +
    +
    +
    + + +

    {errors.email?.message}

    +
    +
    + + +
    +
    + + +

    + {errors.password?.message} +

    +
    + {/* */} +
    +
    + ); +}; + +export default AddAdminUserPage; + + \ No newline at end of file diff --git a/day20/src/pages/Admin/Add/AdminAddDepartmentTablePage.jsx b/day20/src/pages/Admin/Add/AdminAddDepartmentTablePage.jsx new file mode 100644 index 0000000..5496481 --- /dev/null +++ b/day20/src/pages/Admin/Add/AdminAddDepartmentTablePage.jsx @@ -0,0 +1,147 @@ + + import React from "react"; + import { useForm } from "react-hook-form"; + import { yupResolver } from "@hookform/resolvers/yup"; + import * as yup from "yup"; + import MkdSDK from "Utils/MkdSDK"; + import { useNavigate } from "react-router-dom"; + import { tokenExpireError } from "Context/Auth"; + import { GlobalContext, showToast } from "Context/Global"; + import ReactQuill from 'react-quill'; + import 'react-quill/dist/quill.snow.css'; + import { isImage, empty, isVideo, isPdf } from "Utils/utils"; + import {MkdInput} from "Components/MkdInput"; + import {InteractiveButton} from "Components/InteractiveButton"; + import {SkeletonLoader }from"Components/Skeleton" + + const AddDepartmentPage = () => { + const { dispatch: globalDispatch } = React.useContext(GlobalContext); + const schema = yup + .object({ + + name: yup.string(), + }) + .required(); + + const { dispatch } = React.useContext(GlobalContext); + const [fileObj, setFileObj] = React.useState({}); + const [isSubmitLoading, setIsSubmitLoading] = React.useState(false); + + const navigate = useNavigate(); + const { + register, + handleSubmit, + setError, + setValue, + formState: { errors }, + } = useForm({ + resolver: yupResolver(schema), + }); + const [pageDetails, setPageDetails] = React.useState([]); + + const getPageDetails = async () => { + const result = await (new TreeSDK()).getList("table") + .catch(e => console.error(object)) + setPageDetails(result.list); + } + + const previewImage = (field, target) => { + let tempFileObj = fileObj; + tempFileObj[field] = { + file: target.files[0], + tempURL: URL.createObjectURL(target.files[0]), + }; + setFileObj({ ...tempFileObj }); + }; + + const onSubmit = async (_data) => { + let sdk = new MkdSDK(); + setIsSubmitLoading(true) + try { + for (let item in fileObj) { + let formData = new FormData(); + formData.append('file', fileObj[item].file); + let uploadResult = await sdk.uploadImage(formData); + _data[item] = uploadResult.url; + } + + sdk.setTable("department"); + + const result = await sdk.callRestAPI( + { + + name: _data.name, + + }, + "POST" + ); + if (!result.error) { + showToast(globalDispatch, "Added"); + navigate("/admin/department"); + } else { + if (result.validation) { + const keys = Object.keys(result.validation); + for (let i = 0; i < keys.length; i++) { + const field = keys[i]; + setError(field, { + type: "manual", + message: result.validation[field], + }); + } + } + } + setIsSubmitLoading(false) + } catch (error) { + setIsSubmitLoading(false) + console.log("Error", error); + setError("name", { + type: "manual", + message: error.message, + }); + tokenExpireError(dispatch, error.message); + } + }; + + React.useEffect(() => { + globalDispatch({ + type: "SETPATH", + payload: { + path: "department", + }, + }); + }, []); + + return ( +
    +

    Add Department

    +
    + + + + + + Submit + + +
    + ); + }; + + export default AddDepartmentPage; + + + \ No newline at end of file diff --git a/day20/src/pages/Admin/Add/AdminAddItemMovementHistoryTablePage.jsx b/day20/src/pages/Admin/Add/AdminAddItemMovementHistoryTablePage.jsx new file mode 100644 index 0000000..8589b21 --- /dev/null +++ b/day20/src/pages/Admin/Add/AdminAddItemMovementHistoryTablePage.jsx @@ -0,0 +1,190 @@ + + import React from "react"; + import { useForm } from "react-hook-form"; + import { yupResolver } from "@hookform/resolvers/yup"; + import * as yup from "yup"; + import MkdSDK from "Utils/MkdSDK"; + import { useNavigate } from "react-router-dom"; + import { tokenExpireError } from "Context/Auth"; + import { GlobalContext, showToast } from "Context/Global"; + import ReactQuill from 'react-quill'; + import 'react-quill/dist/quill.snow.css'; + import { isImage, empty, isVideo, isPdf } from "Utils/utils"; + import {MkdInput} from "Components/MkdInput"; + import {InteractiveButton} from "Components/InteractiveButton"; + import {SkeletonLoader }from"Components/Skeleton" + + const AddItemMovementHistoryPage = () => { + const { dispatch: globalDispatch } = React.useContext(GlobalContext); + const schema = yup + .object({ + + product_id: yup.string(), + moved_from: yup.string(), + moved_to: yup.string(), + date: yup.string(), + }) + .required(); + + const { dispatch } = React.useContext(GlobalContext); + const [fileObj, setFileObj] = React.useState({}); + const [isSubmitLoading, setIsSubmitLoading] = React.useState(false); + + const navigate = useNavigate(); + const { + register, + handleSubmit, + setError, + setValue, + formState: { errors }, + } = useForm({ + resolver: yupResolver(schema), + }); + const [pageDetails, setPageDetails] = React.useState([]); + + const getPageDetails = async () => { + const result = await (new TreeSDK()).getList("table") + .catch(e => console.error(object)) + setPageDetails(result.list); + } + + const previewImage = (field, target) => { + let tempFileObj = fileObj; + tempFileObj[field] = { + file: target.files[0], + tempURL: URL.createObjectURL(target.files[0]), + }; + setFileObj({ ...tempFileObj }); + }; + + const onSubmit = async (_data) => { + let sdk = new MkdSDK(); + setIsSubmitLoading(true) + try { + for (let item in fileObj) { + let formData = new FormData(); + formData.append('file', fileObj[item].file); + let uploadResult = await sdk.uploadImage(formData); + _data[item] = uploadResult.url; + } + + sdk.setTable("item_movement_history"); + + const result = await sdk.callRestAPI( + { + + product_id: _data.product_id, + moved_from: _data.moved_from, + moved_to: _data.moved_to, + date: _data.date, + + }, + "POST" + ); + if (!result.error) { + showToast(globalDispatch, "Added"); + navigate("/admin/item_movement_history"); + } else { + if (result.validation) { + const keys = Object.keys(result.validation); + for (let i = 0; i < keys.length; i++) { + const field = keys[i]; + setError(field, { + type: "manual", + message: result.validation[field], + }); + } + } + } + setIsSubmitLoading(false) + } catch (error) { + setIsSubmitLoading(false) + console.log("Error", error); + setError("product_id", { + type: "manual", + message: error.message, + }); + tokenExpireError(dispatch, error.message); + } + }; + + React.useEffect(() => { + globalDispatch({ + type: "SETPATH", + payload: { + path: "item_movement_history", + }, + }); + }, []); + + return ( +
    +

    Add Item Movement History

    +
    + + + + + + + + + + + + + + + + Submit + + +
    + ); + }; + + export default AddItemMovementHistoryPage; + + + \ No newline at end of file diff --git a/day20/src/pages/Admin/Add/AdminAddItemsTablePage.jsx b/day20/src/pages/Admin/Add/AdminAddItemsTablePage.jsx new file mode 100644 index 0000000..6499c05 --- /dev/null +++ b/day20/src/pages/Admin/Add/AdminAddItemsTablePage.jsx @@ -0,0 +1,218 @@ + + import React from "react"; + import { useForm } from "react-hook-form"; + import { yupResolver } from "@hookform/resolvers/yup"; + import * as yup from "yup"; + import MkdSDK from "Utils/MkdSDK"; + import { useNavigate } from "react-router-dom"; + import { tokenExpireError } from "Context/Auth"; + import { GlobalContext, showToast } from "Context/Global"; + import ReactQuill from 'react-quill'; + import 'react-quill/dist/quill.snow.css'; + import { isImage, empty, isVideo, isPdf } from "Utils/utils"; + import {MkdInput} from "Components/MkdInput"; + import {InteractiveButton} from "Components/InteractiveButton"; + import {SkeletonLoader }from"Components/Skeleton" + + const AddItemsPage = () => { + const { dispatch: globalDispatch } = React.useContext(GlobalContext); + const schema = yup + .object({ + + title: yup.string(), + quantity: yup.string(), + image: yup.string(), + price: yup.string(), + status: yup.string(), + location: yup.string(), + }) + .required(); + + const { dispatch } = React.useContext(GlobalContext); + const [fileObj, setFileObj] = React.useState({}); + const [isSubmitLoading, setIsSubmitLoading] = React.useState(false); + + const navigate = useNavigate(); + const { + register, + handleSubmit, + setError, + setValue, + formState: { errors }, + } = useForm({ + resolver: yupResolver(schema), + }); + const [pageDetails, setPageDetails] = React.useState([]); + + const getPageDetails = async () => { + const result = await (new TreeSDK()).getList("table") + .catch(e => console.error(object)) + setPageDetails(result.list); + } + + const previewImage = (field, target) => { + let tempFileObj = fileObj; + tempFileObj[field] = { + file: target.files[0], + tempURL: URL.createObjectURL(target.files[0]), + }; + setFileObj({ ...tempFileObj }); + }; + + const onSubmit = async (_data) => { + let sdk = new MkdSDK(); + setIsSubmitLoading(true) + try { + for (let item in fileObj) { + let formData = new FormData(); + formData.append('file', fileObj[item].file); + let uploadResult = await sdk.uploadImage(formData); + _data[item] = uploadResult.url; + } + + sdk.setTable("items"); + + const result = await sdk.callRestAPI( + { + + title: _data.title, + quantity: _data.quantity, + image: _data.image, + price: _data.price, + status: _data.status, + location: _data.location, + + }, + "POST" + ); + if (!result.error) { + showToast(globalDispatch, "Added"); + navigate("/admin/items"); + } else { + if (result.validation) { + const keys = Object.keys(result.validation); + for (let i = 0; i < keys.length; i++) { + const field = keys[i]; + setError(field, { + type: "manual", + message: result.validation[field], + }); + } + } + } + setIsSubmitLoading(false) + } catch (error) { + setIsSubmitLoading(false) + console.log("Error", error); + setError("title", { + type: "manual", + message: error.message, + }); + tokenExpireError(dispatch, error.message); + } + }; + + React.useEffect(() => { + globalDispatch({ + type: "SETPATH", + payload: { + path: "items", + }, + }); + }, []); + + return ( +
    +

    Add Items

    +
    + + + + + + + + + + + + + + + + + + + + + + Submit + + +
    + ); + }; + + export default AddItemsPage; + + + \ No newline at end of file diff --git a/day20/src/pages/Admin/Add/AdminAddLocationTablePage.jsx b/day20/src/pages/Admin/Add/AdminAddLocationTablePage.jsx new file mode 100644 index 0000000..8542333 --- /dev/null +++ b/day20/src/pages/Admin/Add/AdminAddLocationTablePage.jsx @@ -0,0 +1,147 @@ + + import React from "react"; + import { useForm } from "react-hook-form"; + import { yupResolver } from "@hookform/resolvers/yup"; + import * as yup from "yup"; + import MkdSDK from "Utils/MkdSDK"; + import { useNavigate } from "react-router-dom"; + import { tokenExpireError } from "Context/Auth"; + import { GlobalContext, showToast } from "Context/Global"; + import ReactQuill from 'react-quill'; + import 'react-quill/dist/quill.snow.css'; + import { isImage, empty, isVideo, isPdf } from "Utils/utils"; + import {MkdInput} from "Components/MkdInput"; + import {InteractiveButton} from "Components/InteractiveButton"; + import {SkeletonLoader }from"Components/Skeleton" + + const AddLocationPage = () => { + const { dispatch: globalDispatch } = React.useContext(GlobalContext); + const schema = yup + .object({ + + name: yup.string(), + }) + .required(); + + const { dispatch } = React.useContext(GlobalContext); + const [fileObj, setFileObj] = React.useState({}); + const [isSubmitLoading, setIsSubmitLoading] = React.useState(false); + + const navigate = useNavigate(); + const { + register, + handleSubmit, + setError, + setValue, + formState: { errors }, + } = useForm({ + resolver: yupResolver(schema), + }); + const [pageDetails, setPageDetails] = React.useState([]); + + const getPageDetails = async () => { + const result = await (new TreeSDK()).getList("table") + .catch(e => console.error(object)) + setPageDetails(result.list); + } + + const previewImage = (field, target) => { + let tempFileObj = fileObj; + tempFileObj[field] = { + file: target.files[0], + tempURL: URL.createObjectURL(target.files[0]), + }; + setFileObj({ ...tempFileObj }); + }; + + const onSubmit = async (_data) => { + let sdk = new MkdSDK(); + setIsSubmitLoading(true) + try { + for (let item in fileObj) { + let formData = new FormData(); + formData.append('file', fileObj[item].file); + let uploadResult = await sdk.uploadImage(formData); + _data[item] = uploadResult.url; + } + + sdk.setTable("location"); + + const result = await sdk.callRestAPI( + { + + name: _data.name, + + }, + "POST" + ); + if (!result.error) { + showToast(globalDispatch, "Added"); + navigate("/admin/location"); + } else { + if (result.validation) { + const keys = Object.keys(result.validation); + for (let i = 0; i < keys.length; i++) { + const field = keys[i]; + setError(field, { + type: "manual", + message: result.validation[field], + }); + } + } + } + setIsSubmitLoading(false) + } catch (error) { + setIsSubmitLoading(false) + console.log("Error", error); + setError("name", { + type: "manual", + message: error.message, + }); + tokenExpireError(dispatch, error.message); + } + }; + + React.useEffect(() => { + globalDispatch({ + type: "SETPATH", + payload: { + path: "location", + }, + }); + }, []); + + return ( +
    +

    Add Location

    +
    + + + + + + Submit + + +
    + ); + }; + + export default AddLocationPage; + + + \ No newline at end of file diff --git a/day20/src/pages/Admin/Add/AdminAddUserTablePage.jsx b/day20/src/pages/Admin/Add/AdminAddUserTablePage.jsx new file mode 100644 index 0000000..5a7e5d4 --- /dev/null +++ b/day20/src/pages/Admin/Add/AdminAddUserTablePage.jsx @@ -0,0 +1,370 @@ + + import React from "react"; + import { useForm } from "react-hook-form"; + import { yupResolver } from "@hookform/resolvers/yup"; + import * as yup from "yup"; + import MkdSDK from "Utils/MkdSDK"; + import { useNavigate } from "react-router-dom"; + import { tokenExpireError } from "Context/Auth"; + import { GlobalContext, showToast } from "Context/Global"; + import ReactQuill from 'react-quill'; + import 'react-quill/dist/quill.snow.css'; + import { isImage, empty, isVideo, isPdf } from "Utils/utils"; + import {MkdInput} from "Components/MkdInput"; + import {InteractiveButton} from "Components/InteractiveButton"; + import {SkeletonLoader }from"Components/Skeleton" + + const AddUserPage = () => { + const { dispatch: globalDispatch } = React.useContext(GlobalContext); + const schema = yup + .object({ + + oauth: yup.string(), + role: yup.string(), + first_name: yup.string(), + last_name: yup.string(), + email: yup.string(), + password: yup.string(), + type: yup.string(), + verify: yup.string(), + phone: yup.string(), + photo: yup.string(), + refer: yup.string(), + stripe_uid: yup.string(), + paypal_uid: yup.string(), + two_factor_authentication: yup.string(), + status: yup.string(), + department: yup.string(), + }) + .required(); + + const { dispatch } = React.useContext(GlobalContext); + const [fileObj, setFileObj] = React.useState({}); + const [isSubmitLoading, setIsSubmitLoading] = React.useState(false); + + const navigate = useNavigate(); + const { + register, + handleSubmit, + setError, + setValue, + formState: { errors }, + } = useForm({ + resolver: yupResolver(schema), + }); + const [pageDetails, setPageDetails] = React.useState([]); + + const getPageDetails = async () => { + const result = await (new TreeSDK()).getList("table") + .catch(e => console.error(object)) + setPageDetails(result.list); + } + + const previewImage = (field, target) => { + let tempFileObj = fileObj; + tempFileObj[field] = { + file: target.files[0], + tempURL: URL.createObjectURL(target.files[0]), + }; + setFileObj({ ...tempFileObj }); + }; + + const onSubmit = async (_data) => { + let sdk = new MkdSDK(); + setIsSubmitLoading(true) + try { + for (let item in fileObj) { + let formData = new FormData(); + formData.append('file', fileObj[item].file); + let uploadResult = await sdk.uploadImage(formData); + _data[item] = uploadResult.url; + } + + sdk.setTable("user"); + + const result = await sdk.callRestAPI( + { + + oauth: _data.oauth, + role: _data.role, + first_name: _data.first_name, + last_name: _data.last_name, + email: _data.email, + password: _data.password, + type: _data.type, + verify: _data.verify, + phone: _data.phone, + photo: _data.photo, + refer: _data.refer, + stripe_uid: _data.stripe_uid, + paypal_uid: _data.paypal_uid, + two_factor_authentication: _data.two_factor_authentication, + status: _data.status, + department: _data.department, + + }, + "POST" + ); + if (!result.error) { + showToast(globalDispatch, "Added"); + navigate("/admin/user"); + } else { + if (result.validation) { + const keys = Object.keys(result.validation); + for (let i = 0; i < keys.length; i++) { + const field = keys[i]; + setError(field, { + type: "manual", + message: result.validation[field], + }); + } + } + } + setIsSubmitLoading(false) + } catch (error) { + setIsSubmitLoading(false) + console.log("Error", error); + setError("oauth", { + type: "manual", + message: error.message, + }); + tokenExpireError(dispatch, error.message); + } + }; + + React.useEffect(() => { + globalDispatch({ + type: "SETPATH", + payload: { + path: "user", + }, + }); + }, []); + + return ( +
    +

    Add User

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +

    + {errors.photo?.message} +

    +
    + + + + + + + + + + + + + + + + + + + + + + + Submit + + +
    + ); + }; + + export default AddUserPage; + + + \ No newline at end of file diff --git a/day20/src/pages/Admin/Auth/AdminForgotPage.jsx b/day20/src/pages/Admin/Auth/AdminForgotPage.jsx new file mode 100644 index 0000000..d7b1865 --- /dev/null +++ b/day20/src/pages/Admin/Auth/AdminForgotPage.jsx @@ -0,0 +1,115 @@ + + import React, {useState } from "react"; + import { useForm } from "react-hook-form"; + import { yupResolver } from "@hookform/resolvers/yup"; + import * as yup from "yup"; + import { Link } from "react-router-dom"; + import MkdSDK from "Utils/MkdSDK"; + import { tokenExpireError } from "Context/Auth"; + import { GlobalContext, showToast } from "Context/Global"; + import { InteractiveButton } from "Components/InteractiveButton"; + +const AdminForgotPage = () => { + + const [submitLoading, setSubmitLoading] = useState(false); + + const schema = yup + .object({ + email: yup.string().email().required(), + }) + .required(); + + const { + register, + handleSubmit, + setError, + formState: { errors }, + } = useForm({ + resolver: yupResolver(schema), + }); + + const { dispatch } = React.useContext(GlobalContext); + + const onSubmit = async (data) => { + let sdk = new MkdSDK(); + try { + setSubmitLoading(true) + const result = await sdk.forgot(data.email, admin); + + if (!result.error) { + showToast(dispatch, "Reset Code Sent"); + } else { + if (result.validation) { + const keys = Object.keys(result.validation); + for (let i = 0; i < keys.length; i++) { + const field = keys[i]; + setError(field, { + type: "manual", + message: result.validation[field], + }); + } + } + } + setSubmitLoading(false) + } catch (error) { + setSubmitLoading(false) + console.log("Error", error); + setError("email", { + type: "manual", + message: error?.response?.data?.message?error?.response?.data?.message:error?.message, + }); + tokenExpireError(dispatch, error?.response?.data?.message?error?.response?.data?.message:error?.message); + } + } + + return ( + <> +
    +
    +
    + + +

    + {errors && errors.email?.message} +

    +
    + +
    + + Forgot Password + + + Login? + +
    +
    +

    + © {new Date().getFullYear()} manaknightdigital inc. All rights + reserved. +

    +
    + + ); +} + + export default AdminForgotPage; diff --git a/day20/src/pages/Admin/Auth/AdminResetPage.jsx b/day20/src/pages/Admin/Auth/AdminResetPage.jsx new file mode 100644 index 0000000..cabf6b2 --- /dev/null +++ b/day20/src/pages/Admin/Auth/AdminResetPage.jsx @@ -0,0 +1,168 @@ + + import React, {useState} from "react"; + import { useForm } from "react-hook-form"; + import { yupResolver } from "@hookform/resolvers/yup"; + import * as yup from "yup"; + import MkdSDK from "Utils/MkdSDK"; + import { Link } from "react-router-dom"; + import { useNavigate } from "react-router-dom"; + import { AuthContext, tokenExpireError } from "Context/Auth"; + import { showToast } from "Context/Global"; + import { InteractiveButton } from "Components/InteractiveButton"; + + const AdminResetPage = () => { + const { dispatch } = React.useContext(AuthContext); + const [submitLoading, setSubmitLoading] = useState(false); + const search = window.location.search; + const params = new URLSearchParams(search); + const token = params.get("token"); + + const schema = yup + .object({ + code: yup.string().required(), + password: yup.string().required(), + confirmPassword: yup + .string() + .oneOf([yup.ref("password"), null], "Passwords must match"), + }) + .required(); + + const navigate = useNavigate(); + + const { + register, + handleSubmit, + setError, + formState: { errors }, + } = useForm({ + resolver: yupResolver(schema), + }); + + const onSubmit = async (data) => { + let sdk = new MkdSDK(); + try { + setSubmitLoading(true) + const result = await sdk.reset(token, data.code, data.password); + if (!result.error) { + showToast(dispatch, "Password Reset"); + setTimeout(() => { + navigate(`/admin/login`); + }, 2000); + } else { + if (result.validation) { + const keys = Object.keys(result.validation); + for (let i = 0; i < keys.length; i++) { + const field = keys[i]; + setError(field, { + type: "manual", + message: result.validation[field], + }); + } + } + } + setSubmitLoading(false) + } catch (error) { + setSubmitLoading(false) + console.log("Error", error); + setError("code", { + type: "manual", + message: error?.response?.data?.message?error?.response?.data?.message:error?.message, + }); + tokenExpireError(dispatch, error?.response?.data?.message?error?.response?.data?.message:error?.message); + } + }; + + return ( + <> +
    +
    +
    + + +

    + {errors.code?.message} +

    +
    +
    + + +

    + {errors.password?.message} +

    +
    +
    + + +

    + {errors.confirmPassword?.message} +

    +
    +
    + + Reset Password + + + Login? + +
    +
    +

    + © {new Date().getFullYear()} manaknightdigital inc. All rights + reserved. +

    +
    + + ); + }; + + export default AdminResetPage; + + + \ No newline at end of file diff --git a/day20/src/pages/Admin/Auth/CustomAdminLoginPage.jsx b/day20/src/pages/Admin/Auth/CustomAdminLoginPage.jsx new file mode 100644 index 0000000..ddc94e3 --- /dev/null +++ b/day20/src/pages/Admin/Auth/CustomAdminLoginPage.jsx @@ -0,0 +1,184 @@ + + import React, { useState } from "react"; +import { useForm } from "react-hook-form"; +import { yupResolver } from "@hookform/resolvers/yup"; +import * as yup from "yup"; +import MkdSDK from "Utils/MkdSDK"; +import { Link, useLocation } from "react-router-dom"; +import { useNavigate } from "react-router-dom"; +import { InteractiveButton } from "Components/InteractiveButton"; +import { AuthContext } from "Context/Auth"; +import { GlobalContext, showToast } from "Context/Global"; +import { LoginBgNew } from "Assets/images"; + +let sdk = new MkdSDK(); + +const AdminLoginPage = () => { + const schema = yup + .object({ + email: yup.string().email().required(), + password: yup.string().required(), + }) + .required(); + + const { dispatch } = React.useContext(AuthContext); + const { dispatch: GlobalDispatch } = React.useContext(GlobalContext); + + const [submitLoading, setSubmitLoading] = useState(false); + const [showPassword, setShowPassword] = useState(false); + const location = useLocation(); + const searchParams = new URLSearchParams(location.search); + const redirect_uri = searchParams.get("redirect_uri"); + const navigate = useNavigate(); + const { + register, + handleSubmit, + setError, + formState: { errors }, + } = useForm({ + resolver: yupResolver(schema), + }); + + const onSubmit = async (data) => { + try { + setSubmitLoading(true); + const result = await sdk.login(data.email, data.password, "admin"); + if (!result.error) { + + dispatch({ + type: "LOGIN", + payload: result, + }); + showToast(GlobalDispatch, "Succesfully Logged In", 4000, "success"); + navigate(redirect_uri ?? "/admin/dashboard"); + + } else { + setSubmitLoading(false); + if (result.validation) { + const keys = Object.keys(result.validation); + for (let i = 0; i < keys.length; i++) { + const field = keys[i]; + setError(field, { + type: "manual", + message: result.validation[field], + }); + } + } + } + } catch (error) { + setSubmitLoading(false); + showToast( + GlobalDispatch, + error?.response?.data?.message + ? error?.response?.data?.message + : error?.message, + 4000, + "error" + ); + console.log("Error", error); + setError("email", { + type: "manual", + message: error?.response?.data?.message + ? error?.response?.data?.message + : error?.message, + }); + } + }; + + + + return ( +
    + +
    + +
    + + + + +
    Welcome Back
    +
    Don’t have account? Sign up here
    + +
    + + + + +
    + + + +
    +
    + + +

    + {errors?.email?.message} +

    +
    +
    + +
    + + setShowPassword(!showPassword)}> + { + showPassword ? ( + + + + ) : ( + + + + + ) + } + +
    +

    + {errors?.password?.message} +

    +
    +
    +
    + + Remember me +
    + Forgot password +
    + + Sign in + +
    + + + +
    + +
    +
    + ) +}; + +export default AdminLoginPage; + + \ No newline at end of file diff --git a/day20/src/pages/Admin/Auth/CustomAdminSignUpPage.jsx b/day20/src/pages/Admin/Auth/CustomAdminSignUpPage.jsx new file mode 100644 index 0000000..db0007b --- /dev/null +++ b/day20/src/pages/Admin/Auth/CustomAdminSignUpPage.jsx @@ -0,0 +1,156 @@ + +import React, { useState } from "react"; +import { useForm } from "react-hook-form"; +import { yupResolver } from "@hookform/resolvers/yup"; +import * as yup from "yup"; +import MkdSDK from "Utils/MkdSDK"; +import { Link, useLocation } from "react-router-dom"; +import { useNavigate } from "react-router-dom"; +import { InteractiveButton } from "Components/InteractiveButton"; +import { AuthContext } from "Context/Auth"; +import { GlobalContext, showToast } from "Context/Global"; +import { LoginBgNew } from "Assets/images"; + +let sdk = new MkdSDK(); + +const AdminSignUpPage = () => { + const schema = yup + .object({ + email: yup.string().email().required(), + password: yup.string().required(), + }) + .required(); + + const { dispatch } = React.useContext(AuthContext); + const { dispatch: GlobalDispatch } = React.useContext(GlobalContext); + + const [submitLoading, setSubmitLoading] = useState(false) + const location = useLocation() + const searchParams = new URLSearchParams(location.search) + const redirect_uri = searchParams.get('redirect_uri') + + const navigate = useNavigate(); + const { + register, + handleSubmit, + setError, + formState: { errors }, + } = useForm({ + resolver: yupResolver(schema), + }); + + const onSubmit = async (data) => { + try { + setSubmitLoading(true) + const result = await sdk.register(data.email, data.password, "admin"); + if (!result.error) { + dispatch({ + type: "LOGIN", + payload: result, + }); + showToast(GlobalDispatch, "Succesfully Registered", 4000, "success") + navigate(redirect_uri ?? "/admin/dashboard"); + + } else { + setSubmitLoading(false) + if (result.validation) { + const keys = Object.keys(result.validation); + for (let i = 0; i < keys.length; i++) { + const field = keys[i]; + setError(field, { + type: "manual", + message: result.validation[field], + }); + } + } + } + } catch (error) { + setSubmitLoading(false) + console.log("Error", error); + showToast(GlobalDispatch, error?.message, 4000, "error") + setError("email", { + type: "manual", + message: error?.response?.data?.message ? error?.response?.data?.message : error?.message, + }); + } + }; + + return ( +
    +
    +
    +
    +

    Register

    +
    + + + +

    {errors.email?.message}

    +
    + +
    + + + +

    {errors.password?.message}

    +
    + + {/* Forgot Password */} + + + Register + +
    + + {/*
    OR
    */} +
    +
    +

    Already have an account? Login

    +
    +
    + {/*
    */} +

    © {new Date().getFullYear()} manaknightdigital inc. All rights reserved.

    +
    +
    +
    +
    + + +
    + + ); +}; + +export default AdminSignUpPage; diff --git a/day20/src/pages/Admin/Custom/CustomAdminAdminDashboardPage.jsx b/day20/src/pages/Admin/Custom/CustomAdminAdminDashboardPage.jsx new file mode 100644 index 0000000..e54dd38 --- /dev/null +++ b/day20/src/pages/Admin/Custom/CustomAdminAdminDashboardPage.jsx @@ -0,0 +1,50 @@ + + import React, { useState, useContext } from "react"; + import { LazyLoad } from "Components/LazyLoad"; + import { tokenExpireError, AuthContext } from "Context/Auth"; + import { GlobalContext, showToast } from "Context/Global"; + + + + + + + + + + + + + + + + const AdminDashboardPage = () => { + + + + const {state, dispatch} = useContext(AuthContext); + const {state:globalState, dispatch:globalDispatch} = useContext(GlobalContext); + + + + + + React.useEffect(() => { + globalDispatch({ + type: "SETPATH", + payload: { + path: "{notes}", + }, + }); + }, []); + + + + return ( +
    + +
    + ); + }; + + export default AdminDashboardPage; \ No newline at end of file diff --git a/day20/src/pages/Admin/Edit/AdminEditDepartmentTablePage.jsx b/day20/src/pages/Admin/Edit/AdminEditDepartmentTablePage.jsx new file mode 100644 index 0000000..a1c7c93 --- /dev/null +++ b/day20/src/pages/Admin/Edit/AdminEditDepartmentTablePage.jsx @@ -0,0 +1,173 @@ + + import React, { useEffect, useState } from "react"; + import { useForm } from "react-hook-form"; + import { yupResolver } from "@hookform/resolvers/yup"; + import * as yup from "yup"; + import MkdSDK from "Utils/MkdSDK"; + import { useNavigate, useParams } from "react-router-dom"; + import { AuthContext, tokenExpireError } from "Context/Auth"; + import { GlobalContext, showToast } from "Context/Global"; + import ReactQuill from 'react-quill'; + import 'react-quill/dist/quill.snow.css'; + import { isImage, empty, isVideo, isPdf } from "Utils/utils"; + import {MkdInput} from "Components/MkdInput"; +import {InteractiveButton} from "Components/InteractiveButton" +import { SkeletonLoader } from "Components/Skeleton"; + + + let sdk = new MkdSDK(); + + const EditDepartmentPage = () => { + const { dispatch } = React.useContext(AuthContext); + const schema = yup + .object({ + + name: yup.string(), + }) + .required(); + const { dispatch: globalDispatch } = React.useContext(GlobalContext); + const [fileObj, setFileObj] = React.useState({}); + const [isLoading, setIsLoading] = React.useState(true) + const [loading, setLoading] = React.useState(false) + + const navigate = useNavigate(); + + const [name, setName] = useState(''); + // const [id, setId] = useState(0); + const { + register, + handleSubmit, + setError, + setValue, + formState: { errors }, + } = useForm({ + resolver: yupResolver(schema), + }); + + const params = useParams(); + + useEffect(function () { + (async function () { + try { + setLoading(true) + + sdk.setTable("department"); + const result = await sdk.callRestAPI({ id: Number(params?.id)}, "GET"); + if (!result.error) { + + setValue('name', result.model.name); + + + setName(result.model.name); + setId(result.model.id); + setLoading(false) + + } + } catch (error) { + setLoading(false) + + console.log("error", error); + tokenExpireError(dispatch, error.message); + } + })(); + }, []); + + const previewImage = (field, target) => { + let tempFileObj = fileObj; + tempFileObj[field] = { + file: target.files[0], + tempURL: URL.createObjectURL(target.files[0]), + }; + setFileObj({ ...tempFileObj }); + }; + + + const onSubmit = async (_data) => { + setIsLoading(true) + try { + sdk.setTable("department"); + for (let item in fileObj) { + let formData = new FormData(); + formData.append('file', fileObj[item].file); + let uploadResult = await sdk.uploadImage(formData); + _data[item] = uploadResult.url; + + } + const result = await sdk.callRestAPI( + { + id: id, + + name: _data.name, + + + }, + "PUT" + ); + + if (!result.error) { + showToast(globalDispatch, "Updated"); + navigate("/admin/department"); + } else { + if (result.validation) { + const keys = Object.keys(result.validation); + for (let i = 0; i < keys.length; i++) { + const field = keys[i]; + setError(field, { + type: "manual", + message: result.validation[field], + }); + } + } + } + setIsLoading(false) + } catch (error) { + setIsLoading(false) + console.log("Error", error); + setError("name", { + type: "manual", + message: error.message, + }); + } + }; + React.useEffect(() => { + globalDispatch({ + type: "SETPATH", + payload: { + path: "department", + }, + }); + }, []); + + return ( +
    +

    Edit Department

    + {loading? () : (
    + + + + + + Submit + + )} +
    + ); + }; + + export default EditDepartmentPage; + + \ No newline at end of file diff --git a/day20/src/pages/Admin/Edit/AdminEditItemMovementHistoryTablePage.jsx b/day20/src/pages/Admin/Edit/AdminEditItemMovementHistoryTablePage.jsx new file mode 100644 index 0000000..69af562 --- /dev/null +++ b/day20/src/pages/Admin/Edit/AdminEditItemMovementHistoryTablePage.jsx @@ -0,0 +1,225 @@ + + import React, { useEffect, useState } from "react"; + import { useForm } from "react-hook-form"; + import { yupResolver } from "@hookform/resolvers/yup"; + import * as yup from "yup"; + import MkdSDK from "Utils/MkdSDK"; + import { useNavigate, useParams } from "react-router-dom"; + import { AuthContext, tokenExpireError } from "Context/Auth"; + import { GlobalContext, showToast } from "Context/Global"; + import ReactQuill from 'react-quill'; + import 'react-quill/dist/quill.snow.css'; + import { isImage, empty, isVideo, isPdf } from "Utils/utils"; + import {MkdInput} from "Components/MkdInput"; +import {InteractiveButton} from "Components/InteractiveButton" +import { SkeletonLoader } from "Components/Skeleton"; + + + let sdk = new MkdSDK(); + + const EditItemMovementHistoryPage = () => { + const { dispatch } = React.useContext(AuthContext); + const schema = yup + .object({ + + product_id: yup.string(), + moved_from: yup.string(), + moved_to: yup.string(), + date: yup.string(), + }) + .required(); + const { dispatch: globalDispatch } = React.useContext(GlobalContext); + const [fileObj, setFileObj] = React.useState({}); + const [isLoading, setIsLoading] = React.useState(true) + const [loading, setLoading] = React.useState(false) + + const navigate = useNavigate(); + + const [product_id, setProductId] = useState(0); + const [moved_from, setMovedFrom] = useState(''); + const [moved_to, setMovedTo] = useState(''); + const [date, setDate] = useState(''); + // const [id, setId] = useState(0); + const { + register, + handleSubmit, + setError, + setValue, + formState: { errors }, + } = useForm({ + resolver: yupResolver(schema), + }); + + const params = useParams(); + + useEffect(function () { + (async function () { + try { + setLoading(true) + + sdk.setTable("item_movement_history"); + const result = await sdk.callRestAPI({ id: Number(params?.id)}, "GET"); + if (!result.error) { + + setValue('product_id', result.model.product_id); + setValue('moved_from', result.model.moved_from); + setValue('moved_to', result.model.moved_to); + setValue('date', result.model.date); + + + setProductId(result.model.product_id); + setMovedFrom(result.model.moved_from); + setMovedTo(result.model.moved_to); + setDate(result.model.date); + setId(result.model.id); + setLoading(false) + + } + } catch (error) { + setLoading(false) + + console.log("error", error); + tokenExpireError(dispatch, error.message); + } + })(); + }, []); + + const previewImage = (field, target) => { + let tempFileObj = fileObj; + tempFileObj[field] = { + file: target.files[0], + tempURL: URL.createObjectURL(target.files[0]), + }; + setFileObj({ ...tempFileObj }); + }; + + + const onSubmit = async (_data) => { + setIsLoading(true) + try { + sdk.setTable("item_movement_history"); + for (let item in fileObj) { + let formData = new FormData(); + formData.append('file', fileObj[item].file); + let uploadResult = await sdk.uploadImage(formData); + _data[item] = uploadResult.url; + + } + const result = await sdk.callRestAPI( + { + id: id, + + product_id: _data.product_id, + moved_from: _data.moved_from, + moved_to: _data.moved_to, + date: _data.date, + + + }, + "PUT" + ); + + if (!result.error) { + showToast(globalDispatch, "Updated"); + navigate("/admin/item_movement_history"); + } else { + if (result.validation) { + const keys = Object.keys(result.validation); + for (let i = 0; i < keys.length; i++) { + const field = keys[i]; + setError(field, { + type: "manual", + message: result.validation[field], + }); + } + } + } + setIsLoading(false) + } catch (error) { + setIsLoading(false) + console.log("Error", error); + setError("product_id", { + type: "manual", + message: error.message, + }); + } + }; + React.useEffect(() => { + globalDispatch({ + type: "SETPATH", + payload: { + path: "item_movement_history", + }, + }); + }, []); + + return ( +
    +

    Edit Item Movement History

    + {loading? () : (
    + + + + + + + + + + + + + + + + Submit + + )} +
    + ); + }; + + export default EditItemMovementHistoryPage; + + \ No newline at end of file diff --git a/day20/src/pages/Admin/Edit/AdminEditItemsTablePage.jsx b/day20/src/pages/Admin/Edit/AdminEditItemsTablePage.jsx new file mode 100644 index 0000000..b69c42b --- /dev/null +++ b/day20/src/pages/Admin/Edit/AdminEditItemsTablePage.jsx @@ -0,0 +1,259 @@ + + import React, { useEffect, useState } from "react"; + import { useForm } from "react-hook-form"; + import { yupResolver } from "@hookform/resolvers/yup"; + import * as yup from "yup"; + import MkdSDK from "Utils/MkdSDK"; + import { useNavigate, useParams } from "react-router-dom"; + import { AuthContext, tokenExpireError } from "Context/Auth"; + import { GlobalContext, showToast } from "Context/Global"; + import ReactQuill from 'react-quill'; + import 'react-quill/dist/quill.snow.css'; + import { isImage, empty, isVideo, isPdf } from "Utils/utils"; + import {MkdInput} from "Components/MkdInput"; +import {InteractiveButton} from "Components/InteractiveButton" +import { SkeletonLoader } from "Components/Skeleton"; + + + let sdk = new MkdSDK(); + + const EditItemsPage = () => { + const { dispatch } = React.useContext(AuthContext); + const schema = yup + .object({ + + title: yup.string(), + quantity: yup.string(), + image: yup.string(), + price: yup.string(), + status: yup.string(), + location: yup.string(), + }) + .required(); + const { dispatch: globalDispatch } = React.useContext(GlobalContext); + const [fileObj, setFileObj] = React.useState({}); + const [isLoading, setIsLoading] = React.useState(true) + const [loading, setLoading] = React.useState(false) + + const navigate = useNavigate(); + + const [title, setTitle] = useState(''); + const [quantity, setQuantity] = useState(0); + const [image, setImage] = useState(''); + const [price, setPrice] = useState(''); + const [status, setStatus] = useState(''); + const [location, setLocation] = useState(''); + // const [id, setId] = useState(0); + const { + register, + handleSubmit, + setError, + setValue, + formState: { errors }, + } = useForm({ + resolver: yupResolver(schema), + }); + + const params = useParams(); + + useEffect(function () { + (async function () { + try { + setLoading(true) + + sdk.setTable("items"); + const result = await sdk.callRestAPI({ id: Number(params?.id)}, "GET"); + if (!result.error) { + + setValue('title', result.model.title); + setValue('quantity', result.model.quantity); + setValue('image', result.model.image); + setValue('price', result.model.price); + setValue('status', result.model.status); + setValue('location', result.model.location); + + + setTitle(result.model.title); + setQuantity(result.model.quantity); + setImage(result.model.image); + setPrice(result.model.price); + setStatus(result.model.status); + setLocation(result.model.location); + setId(result.model.id); + setLoading(false) + + } + } catch (error) { + setLoading(false) + + console.log("error", error); + tokenExpireError(dispatch, error.message); + } + })(); + }, []); + + const previewImage = (field, target) => { + let tempFileObj = fileObj; + tempFileObj[field] = { + file: target.files[0], + tempURL: URL.createObjectURL(target.files[0]), + }; + setFileObj({ ...tempFileObj }); + }; + + + const onSubmit = async (_data) => { + setIsLoading(true) + try { + sdk.setTable("items"); + for (let item in fileObj) { + let formData = new FormData(); + formData.append('file', fileObj[item].file); + let uploadResult = await sdk.uploadImage(formData); + _data[item] = uploadResult.url; + + } + const result = await sdk.callRestAPI( + { + id: id, + + title: _data.title, + quantity: _data.quantity, + image: _data.image, + price: _data.price, + status: _data.status, + location: _data.location, + + + }, + "PUT" + ); + + if (!result.error) { + showToast(globalDispatch, "Updated"); + navigate("/admin/items"); + } else { + if (result.validation) { + const keys = Object.keys(result.validation); + for (let i = 0; i < keys.length; i++) { + const field = keys[i]; + setError(field, { + type: "manual", + message: result.validation[field], + }); + } + } + } + setIsLoading(false) + } catch (error) { + setIsLoading(false) + console.log("Error", error); + setError("title", { + type: "manual", + message: error.message, + }); + } + }; + React.useEffect(() => { + globalDispatch({ + type: "SETPATH", + payload: { + path: "items", + }, + }); + }, []); + + return ( +
    +

    Edit Items

    + {loading? () : (
    + + + + + + + + + + + + + + + + + + + + + + Submit + + )} +
    + ); + }; + + export default EditItemsPage; + + \ No newline at end of file diff --git a/day20/src/pages/Admin/Edit/AdminEditLocationTablePage.jsx b/day20/src/pages/Admin/Edit/AdminEditLocationTablePage.jsx new file mode 100644 index 0000000..bf24751 --- /dev/null +++ b/day20/src/pages/Admin/Edit/AdminEditLocationTablePage.jsx @@ -0,0 +1,173 @@ + + import React, { useEffect, useState } from "react"; + import { useForm } from "react-hook-form"; + import { yupResolver } from "@hookform/resolvers/yup"; + import * as yup from "yup"; + import MkdSDK from "Utils/MkdSDK"; + import { useNavigate, useParams } from "react-router-dom"; + import { AuthContext, tokenExpireError } from "Context/Auth"; + import { GlobalContext, showToast } from "Context/Global"; + import ReactQuill from 'react-quill'; + import 'react-quill/dist/quill.snow.css'; + import { isImage, empty, isVideo, isPdf } from "Utils/utils"; + import {MkdInput} from "Components/MkdInput"; +import {InteractiveButton} from "Components/InteractiveButton" +import { SkeletonLoader } from "Components/Skeleton"; + + + let sdk = new MkdSDK(); + + const EditLocationPage = () => { + const { dispatch } = React.useContext(AuthContext); + const schema = yup + .object({ + + name: yup.string(), + }) + .required(); + const { dispatch: globalDispatch } = React.useContext(GlobalContext); + const [fileObj, setFileObj] = React.useState({}); + const [isLoading, setIsLoading] = React.useState(true) + const [loading, setLoading] = React.useState(false) + + const navigate = useNavigate(); + + const [name, setName] = useState(''); + // const [id, setId] = useState(0); + const { + register, + handleSubmit, + setError, + setValue, + formState: { errors }, + } = useForm({ + resolver: yupResolver(schema), + }); + + const params = useParams(); + + useEffect(function () { + (async function () { + try { + setLoading(true) + + sdk.setTable("location"); + const result = await sdk.callRestAPI({ id: Number(params?.id)}, "GET"); + if (!result.error) { + + setValue('name', result.model.name); + + + setName(result.model.name); + setId(result.model.id); + setLoading(false) + + } + } catch (error) { + setLoading(false) + + console.log("error", error); + tokenExpireError(dispatch, error.message); + } + })(); + }, []); + + const previewImage = (field, target) => { + let tempFileObj = fileObj; + tempFileObj[field] = { + file: target.files[0], + tempURL: URL.createObjectURL(target.files[0]), + }; + setFileObj({ ...tempFileObj }); + }; + + + const onSubmit = async (_data) => { + setIsLoading(true) + try { + sdk.setTable("location"); + for (let item in fileObj) { + let formData = new FormData(); + formData.append('file', fileObj[item].file); + let uploadResult = await sdk.uploadImage(formData); + _data[item] = uploadResult.url; + + } + const result = await sdk.callRestAPI( + { + id: id, + + name: _data.name, + + + }, + "PUT" + ); + + if (!result.error) { + showToast(globalDispatch, "Updated"); + navigate("/admin/location"); + } else { + if (result.validation) { + const keys = Object.keys(result.validation); + for (let i = 0; i < keys.length; i++) { + const field = keys[i]; + setError(field, { + type: "manual", + message: result.validation[field], + }); + } + } + } + setIsLoading(false) + } catch (error) { + setIsLoading(false) + console.log("Error", error); + setError("name", { + type: "manual", + message: error.message, + }); + } + }; + React.useEffect(() => { + globalDispatch({ + type: "SETPATH", + payload: { + path: "location", + }, + }); + }, []); + + return ( +
    +

    Edit Location

    + {loading? () : (
    + + + + + + Submit + + )} +
    + ); + }; + + export default EditLocationPage; + + \ No newline at end of file diff --git a/day20/src/pages/Admin/Edit/AdminEditUserTablePage.jsx b/day20/src/pages/Admin/Edit/AdminEditUserTablePage.jsx new file mode 100644 index 0000000..e4dbf3c --- /dev/null +++ b/day20/src/pages/Admin/Edit/AdminEditUserTablePage.jsx @@ -0,0 +1,441 @@ + + import React, { useEffect, useState } from "react"; + import { useForm } from "react-hook-form"; + import { yupResolver } from "@hookform/resolvers/yup"; + import * as yup from "yup"; + import MkdSDK from "Utils/MkdSDK"; + import { useNavigate, useParams } from "react-router-dom"; + import { AuthContext, tokenExpireError } from "Context/Auth"; + import { GlobalContext, showToast } from "Context/Global"; + import ReactQuill from 'react-quill'; + import 'react-quill/dist/quill.snow.css'; + import { isImage, empty, isVideo, isPdf } from "Utils/utils"; + import {MkdInput} from "Components/MkdInput"; +import {InteractiveButton} from "Components/InteractiveButton" +import { SkeletonLoader } from "Components/Skeleton"; + + + let sdk = new MkdSDK(); + + const EditUserPage = () => { + const { dispatch } = React.useContext(AuthContext); + const schema = yup + .object({ + + oauth: yup.string(), + role: yup.string(), + first_name: yup.string(), + last_name: yup.string(), + email: yup.string(), + password: yup.string(), + type: yup.string(), + verify: yup.string(), + phone: yup.string(), + photo: yup.string(), + refer: yup.string(), + stripe_uid: yup.string(), + paypal_uid: yup.string(), + two_factor_authentication: yup.string(), + status: yup.string(), + department: yup.string(), + }) + .required(); + const { dispatch: globalDispatch } = React.useContext(GlobalContext); + const [fileObj, setFileObj] = React.useState({}); + const [isLoading, setIsLoading] = React.useState(true) + const [loading, setLoading] = React.useState(false) + + const navigate = useNavigate(); + + const [oauth, setOauth] = useState(''); + const [role, setRole] = useState(''); + const [first_name, setFirstName] = useState(''); + const [last_name, setLastName] = useState(''); + const [email, setEmail] = useState(''); + const [password, setPassword] = useState(''); + const [type, setType] = useState(0); + const [verify, setVerify] = useState(0); + const [phone, setPhone] = useState(''); + const [photo, setPhoto] = useState(''); + const [refer, setRefer] = useState(''); + const [stripe_uid, setStripeUid] = useState(''); + const [paypal_uid, setPaypalUid] = useState(''); + const [two_factor_authentication, setTwoFactorAuthentication] = useState(0); + const [status, setStatus] = useState(0); + const [department, setDepartment] = useState(''); + // const [id, setId] = useState(0); + const { + register, + handleSubmit, + setError, + setValue, + formState: { errors }, + } = useForm({ + resolver: yupResolver(schema), + }); + + const params = useParams(); + + useEffect(function () { + (async function () { + try { + setLoading(true) + + sdk.setTable("user"); + const result = await sdk.callRestAPI({ id: Number(params?.id)}, "GET"); + if (!result.error) { + + setValue('oauth', result.model.oauth); + setValue('role', result.model.role); + setValue('first_name', result.model.first_name); + setValue('last_name', result.model.last_name); + setValue('email', result.model.email); + setValue('password', result.model.password); + setValue('type', result.model.type); + setValue('verify', result.model.verify); + setValue('phone', result.model.phone); + setValue('photo', result.model.photo); + setValue('refer', result.model.refer); + setValue('stripe_uid', result.model.stripe_uid); + setValue('paypal_uid', result.model.paypal_uid); + setValue('two_factor_authentication', result.model.two_factor_authentication); + setValue('status', result.model.status); + setValue('department', result.model.department); + + + setOauth(result.model.oauth); + setRole(result.model.role); + setFirstName(result.model.first_name); + setLastName(result.model.last_name); + setEmail(result.model.email); + setPassword(result.model.password); + setType(result.model.type); + setVerify(result.model.verify); + setPhone(result.model.phone); + setPhoto(result.model.photo); + setRefer(result.model.refer); + setStripeUid(result.model.stripe_uid); + setPaypalUid(result.model.paypal_uid); + setTwoFactorAuthentication(result.model.two_factor_authentication); + setStatus(result.model.status); + setDepartment(result.model.department); + setId(result.model.id); + setLoading(false) + + } + } catch (error) { + setLoading(false) + + console.log("error", error); + tokenExpireError(dispatch, error.message); + } + })(); + }, []); + + const previewImage = (field, target) => { + let tempFileObj = fileObj; + tempFileObj[field] = { + file: target.files[0], + tempURL: URL.createObjectURL(target.files[0]), + }; + setFileObj({ ...tempFileObj }); + }; + + + const onSubmit = async (_data) => { + setIsLoading(true) + try { + sdk.setTable("user"); + for (let item in fileObj) { + let formData = new FormData(); + formData.append('file', fileObj[item].file); + let uploadResult = await sdk.uploadImage(formData); + _data[item] = uploadResult.url; + + } + const result = await sdk.callRestAPI( + { + id: id, + + oauth: _data.oauth, + role: _data.role, + first_name: _data.first_name, + last_name: _data.last_name, + email: _data.email, + password: _data.password, + type: _data.type, + verify: _data.verify, + phone: _data.phone, + photo: _data.photo, + refer: _data.refer, + stripe_uid: _data.stripe_uid, + paypal_uid: _data.paypal_uid, + two_factor_authentication: _data.two_factor_authentication, + status: _data.status, + department: _data.department, + + + }, + "PUT" + ); + + if (!result.error) { + showToast(globalDispatch, "Updated"); + navigate("/admin/user"); + } else { + if (result.validation) { + const keys = Object.keys(result.validation); + for (let i = 0; i < keys.length; i++) { + const field = keys[i]; + setError(field, { + type: "manual", + message: result.validation[field], + }); + } + } + } + setIsLoading(false) + } catch (error) { + setIsLoading(false) + console.log("Error", error); + setError("oauth", { + type: "manual", + message: error.message, + }); + } + }; + React.useEffect(() => { + globalDispatch({ + type: "SETPATH", + payload: { + path: "user", + }, + }); + }, []); + + return ( +
    +

    Edit User

    + {loading? () : (
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +

    + {errors.photo?.message} +

    +
    + + + + + + + + + + + + + + + + + + + + + + + Submit + + )} +
    + ); + }; + + export default EditUserPage; + + \ No newline at end of file diff --git a/day20/src/pages/Admin/Edit/EditAdminCmsPage.jsx b/day20/src/pages/Admin/Edit/EditAdminCmsPage.jsx new file mode 100644 index 0000000..8ca9fd5 --- /dev/null +++ b/day20/src/pages/Admin/Edit/EditAdminCmsPage.jsx @@ -0,0 +1,271 @@ + + import React, { useState } from "react"; +import { useForm } from "react-hook-form"; +import { yupResolver } from "@hookform/resolvers/yup"; +import * as yup from "yup"; +import MkdSDK from "Utils/MkdSDK"; +import { useNavigate, useParams } from "react-router-dom"; +import { AuthContext, tokenExpireError } from "Context/Auth"; +import { GlobalContext, showToast } from "Context/Global"; + +let sdk = new MkdSDK(); + +const EditAdminUserPage = ({ activeId, setSidebar }) => { + const schema = yup + .object({ + email: yup.string().email().required(), + password: yup.string(), + role: yup.string(), + }) + .required(); + + const { dispatch } = React.useContext(AuthContext); + const { dispatch: globalDispatch } = React.useContext(GlobalContext); + const navigate = useNavigate(); + const params = useParams(); + const [oldEmail, setOldEmail] = useState(""); + const [id, setId] = useState(0); + const [isEditing, setIsEditing] = useState(false); + + const { + register, + handleSubmit, + setError, + setValue, + formState: { errors }, + } = useForm({ + resolver: yupResolver(schema), + }); + + const selectRole = ["admin", "employee"]; + const selectStatus = [ + { key: "0", value: "Inactive" }, + { key: "2", value: "Suspend" }, + { key: "1", value: "Active" }, + ]; + + const onSubmit = async (data) => { + setIsEditing(true); + try { + if (oldEmail !== data.email) { + const emailresult = await sdk.updateEmailByAdmin(data.email, activeId); + if (!emailresult.error) { + showToast(globalDispatch, "Email Updated", 1000); + } else { + if (emailresult.validation) { + const keys = Object.keys(emailresult.validation); + for (let i = 0; i < keys.length; i++) { + const field = keys[i]; + setError(field, { + type: "manual", + message: emailresult.validation[field], + }); + } + } + } + } + + if (data.password.length > 0) { + const passwordresult = await sdk.updatePasswordByAdmin( + data.password, + activeId + ); + if (!passwordresult.error) { + showToast(globalDispatch, "Password Updated", 2000); + } else { + if (passwordresult.validation) { + const keys = Object.keys(passwordresult.validation); + for (let i = 0; i < keys.length; i++) { + const field = keys[i]; + setError(field, { + type: "manual", + message: passwordresult.validation[field], + }); + } + } + } + } + + sdk.setTable("user"); + + const result = await sdk.callRestAPI( + { activeId, email: data.email, role: data.role, status: data.status }, + "PUT" + ); + + if (!result.error) { + showToast(globalDispatch, "Added", 4000); + navigate("/admin/users"); + } else { + if (result.validation) { + const keys = Object.keys(result.validation); + for (let i = 0; i < keys.length; i++) { + const field = keys[i]; + setError(field, { + type: "manual", + message: result.validation[field], + }); + } + } + } + } catch (error) { + console.log("Error", error); + setError("email", { + type: "manual", + message: error.message, + }); + tokenExpireError(dispatch, error.message); + } + setIsEditing(false); + }; + + React.useEffect(() => { + globalDispatch({ + type: "SETPATH", + payload: { + path: "users", + }, + }); + + (async function () { + try { + sdk.setTable("user"); + const result = await sdk.callRestAPI({ id: activeId }, "GET"); + + if (!result.error) { + setValue("email", result.model.email); + setValue("role", result.model.role); + setValue("status", result.model.status); + setOldEmail(result.model.email); + setId(result.model.id); + } + } catch (error) { + console.log("Error", error); + tokenExpireError(dispatch, error.message); + } + })(); + }, [activeId]); + return ( +
    +
    +
    + {/* setSidebar(false)} + xmlns="http://www.w3.org/2000/svg" + width="24" + height="24" + viewBox="0 0 24 24" + fill="none" + > + + */} + Edit User +
    +
    + + +
    +
    +
    +
    + + +

    {errors.email?.message}

    +
    +
    + + +
    +
    + + +
    +
    + + +

    + {errors.password?.message} +

    +
    + {/* */} +
    +
    + ); +}; + +export default EditAdminUserPage; + + \ No newline at end of file diff --git a/day20/src/pages/Admin/Edit/EditAdminEmailPage.jsx b/day20/src/pages/Admin/Edit/EditAdminEmailPage.jsx new file mode 100644 index 0000000..2720238 --- /dev/null +++ b/day20/src/pages/Admin/Edit/EditAdminEmailPage.jsx @@ -0,0 +1,198 @@ + + + +import React, { useEffect, useState } from "react"; +import { useForm } from "react-hook-form"; +import { yupResolver } from "@hookform/resolvers/yup"; +import * as yup from "yup"; +import MkdSDK from "Utils/MkdSDK"; +import { GlobalContext, showToast } from "Context/Global"; +import { useNavigate, useParams } from "react-router-dom"; +import { AuthContext, tokenExpireError } from "Context/Auth"; + +let sdk = new MkdSDK(); + +const EditAdminEmailPage = ({ activeId, setSidebar }) => { + const schema = yup + .object({ + subject: yup.string().required(), + html: yup.string().required(), + tag: yup.string().required(), + }) + .required(); + const { dispatch } = React.useContext(AuthContext); + const { dispatch: globalDispatch } = React.useContext(GlobalContext); + const navigate = useNavigate(); + const [id, setId] = useState(0); + const [slug, setSlug] = useState(""); + const [isEditing, setIsEditing] = useState(false); + const { + register, + handleSubmit, + setError, + setValue, + formState: { errors }, + } = useForm({ + resolver: yupResolver(schema), + }); + + const params = useParams(); + + useEffect(function () { + globalDispatch({ + type: "SETPATH", + payload: { + path: "email", + }, + }); + + (async function () { + try { + sdk.setTable("email"); + const result = await sdk.callRestAPI({ id: activeId }, "GET"); + if (!result.error) { + setValue("subject", result.model.subject); + setValue("html", result.model.html); + setValue("tag", result.model.tag); + setSlug(result.model.slug); + setId(result.model.id); + } + } catch (error) { + console.log("error", error); + tokenExpireError(dispatch, error.message); + } + })(); + }, []); + + const onSubmit = async (data) => { + setIsEditing(true); + try { + const result = await sdk.callRestAPI( + { id, slug, subject: data.subject, html: data.html, tag: data.tag }, + "PUT" + ); + + if (!result.error) { + showToast(globalDispatch, "Updated"); + navigate("/admin/email"); + } else { + if (result.validation) { + const keys = Object.keys(result.validation); + for (let i = 0; i < keys.length; i++) { + const field = keys[i]; + setError(field, { + type: "manual", + message: result.validation[field], + }); + } + } + } + } catch (error) { + console.log("Error", error); + setError("html", { + type: "manual", + message: error.message, + }); + tokenExpireError(dispatch, error.message); + } + setIsEditing(true); + }; + + return ( +
    + {/*

    Edit Email

    */} +
    +
    + {/* setSidebar(false)} xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none"> + + */} + Edit Email +
    +
    + + +
    +
    +
    +
    + + +
    +
    + + +

    + {errors.subject?.message} +

    +
    +
    + + +

    {errors.tag?.message}

    +
    +
    + + +

    {errors.html?.message}

    +
    + +
    +
    + ); +}; + +export default EditAdminEmailPage; + + \ No newline at end of file diff --git a/day20/src/pages/Admin/Edit/EditAdminStripePricePage.jsx b/day20/src/pages/Admin/Edit/EditAdminStripePricePage.jsx new file mode 100644 index 0000000..f60c88f --- /dev/null +++ b/day20/src/pages/Admin/Edit/EditAdminStripePricePage.jsx @@ -0,0 +1,158 @@ + + import React, { useEffect, useState } from "react"; + import { useForm } from "react-hook-form"; + import { yupResolver } from "@hookform/resolvers/yup"; + import * as yup from "yup"; + import MkdSDK from "../../utils/MkdSDK"; + import { useNavigate, useParams } from "react-router-dom"; + import { AuthContext, tokenExpireError } from "Context/Auth"; + import { GlobalContext, showToast } from "Context/Global"; + import { FaLessThanEqual } from "react-icons/fa"; + + let sdk = new MkdSDK(); + + const EditAdminStripePricePage = ({ activeId, setSidebar }) => { + const schema = yup + .object({ + name: yup.string().required(), + status: yup.boolean().required(), + }) + .required(); + + const { dispatch } = React.useContext(AuthContext); + const { dispatch: globalDispatch } = React.useContext(GlobalContext); + const navigate = useNavigate(); + const params = useParams(); + const [id, setId] = useState(0); + const [isEditingPlan, setIsEditingPlan] = useState(false); + + const { + register, + handleSubmit, + setError, + setValue, + formState: { errors }, + } = useForm({ + resolver: yupResolver(schema), + }); + + const selectStatus = [ + { key: "0", value: "Inactive" }, + { key: "1", value: "Active" }, + ]; + + const onSubmit = async (data) => { + setIsEditingPlan(true) + try { + const result = await sdk.updateStripePrice(activeId, data); + if (!result.error) { + showToast(globalDispatch, "Edited", 4000); + // navigate("/admin/prices"); + } else { + if (result.validation) { + const keys = Object.keys(result.validation); + for (let i = 0; i < keys.length; i++) { + const field = keys[i]; + setError(field, { + type: "manual", + message: result.validation[field], + }); + } + } + } + } catch (error) { + console.log("Error", error); + showToast(globalDispatch, error.message, 4000); + tokenExpireError(dispatch, error.message); + } + setIsEditingPlan(false) + }; + + async function getPrices() { + try { + const result = await sdk.getStripePrice(activeId); + + if (!result.error) { + const price = result.model.object; + setValue("name", price.nickname); + setValue("status", result.model.status); + setId(result.model.id); //set local id + } + } catch (error) { + console.log("Error", error); + tokenExpireError(dispatch, error.message); + } + } + + React.useEffect(() => { + globalDispatch({ + type: "SETPATH", + payload: { + path: "prices", + }, + }); + + getPrices() + }, [activeId]); + + return ( +
    + {/* */} + {/*

    Edit Product

    */} +
    +
    + {/* setSidebar(false)} xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none"> + + */} + Edit Plan +
    +
    + + +
    +
    +
    +
    + + +

    {errors.name?.message}

    +
    + +
    + + +
    + + {/* */} +
    +
    + ); + }; + + export default EditAdminStripePricePage; + + \ No newline at end of file diff --git a/day20/src/pages/Admin/Edit/EditAdminUserPage.jsx b/day20/src/pages/Admin/Edit/EditAdminUserPage.jsx new file mode 100644 index 0000000..8ca9fd5 --- /dev/null +++ b/day20/src/pages/Admin/Edit/EditAdminUserPage.jsx @@ -0,0 +1,271 @@ + + import React, { useState } from "react"; +import { useForm } from "react-hook-form"; +import { yupResolver } from "@hookform/resolvers/yup"; +import * as yup from "yup"; +import MkdSDK from "Utils/MkdSDK"; +import { useNavigate, useParams } from "react-router-dom"; +import { AuthContext, tokenExpireError } from "Context/Auth"; +import { GlobalContext, showToast } from "Context/Global"; + +let sdk = new MkdSDK(); + +const EditAdminUserPage = ({ activeId, setSidebar }) => { + const schema = yup + .object({ + email: yup.string().email().required(), + password: yup.string(), + role: yup.string(), + }) + .required(); + + const { dispatch } = React.useContext(AuthContext); + const { dispatch: globalDispatch } = React.useContext(GlobalContext); + const navigate = useNavigate(); + const params = useParams(); + const [oldEmail, setOldEmail] = useState(""); + const [id, setId] = useState(0); + const [isEditing, setIsEditing] = useState(false); + + const { + register, + handleSubmit, + setError, + setValue, + formState: { errors }, + } = useForm({ + resolver: yupResolver(schema), + }); + + const selectRole = ["admin", "employee"]; + const selectStatus = [ + { key: "0", value: "Inactive" }, + { key: "2", value: "Suspend" }, + { key: "1", value: "Active" }, + ]; + + const onSubmit = async (data) => { + setIsEditing(true); + try { + if (oldEmail !== data.email) { + const emailresult = await sdk.updateEmailByAdmin(data.email, activeId); + if (!emailresult.error) { + showToast(globalDispatch, "Email Updated", 1000); + } else { + if (emailresult.validation) { + const keys = Object.keys(emailresult.validation); + for (let i = 0; i < keys.length; i++) { + const field = keys[i]; + setError(field, { + type: "manual", + message: emailresult.validation[field], + }); + } + } + } + } + + if (data.password.length > 0) { + const passwordresult = await sdk.updatePasswordByAdmin( + data.password, + activeId + ); + if (!passwordresult.error) { + showToast(globalDispatch, "Password Updated", 2000); + } else { + if (passwordresult.validation) { + const keys = Object.keys(passwordresult.validation); + for (let i = 0; i < keys.length; i++) { + const field = keys[i]; + setError(field, { + type: "manual", + message: passwordresult.validation[field], + }); + } + } + } + } + + sdk.setTable("user"); + + const result = await sdk.callRestAPI( + { activeId, email: data.email, role: data.role, status: data.status }, + "PUT" + ); + + if (!result.error) { + showToast(globalDispatch, "Added", 4000); + navigate("/admin/users"); + } else { + if (result.validation) { + const keys = Object.keys(result.validation); + for (let i = 0; i < keys.length; i++) { + const field = keys[i]; + setError(field, { + type: "manual", + message: result.validation[field], + }); + } + } + } + } catch (error) { + console.log("Error", error); + setError("email", { + type: "manual", + message: error.message, + }); + tokenExpireError(dispatch, error.message); + } + setIsEditing(false); + }; + + React.useEffect(() => { + globalDispatch({ + type: "SETPATH", + payload: { + path: "users", + }, + }); + + (async function () { + try { + sdk.setTable("user"); + const result = await sdk.callRestAPI({ id: activeId }, "GET"); + + if (!result.error) { + setValue("email", result.model.email); + setValue("role", result.model.role); + setValue("status", result.model.status); + setOldEmail(result.model.email); + setId(result.model.id); + } + } catch (error) { + console.log("Error", error); + tokenExpireError(dispatch, error.message); + } + })(); + }, [activeId]); + return ( +
    +
    +
    + {/* setSidebar(false)} + xmlns="http://www.w3.org/2000/svg" + width="24" + height="24" + viewBox="0 0 24 24" + fill="none" + > + + */} + Edit User +
    +
    + + +
    +
    +
    +
    + + +

    {errors.email?.message}

    +
    +
    + + +
    +
    + + +
    +
    + + +

    + {errors.password?.message} +

    +
    + {/* */} +
    +
    + ); +}; + +export default EditAdminUserPage; + + \ No newline at end of file diff --git a/day20/src/pages/Admin/List/AdminCmsListPage.jsx b/day20/src/pages/Admin/List/AdminCmsListPage.jsx new file mode 100644 index 0000000..8126618 --- /dev/null +++ b/day20/src/pages/Admin/List/AdminCmsListPage.jsx @@ -0,0 +1,515 @@ + + + import React from "react"; +import { useForm } from "react-hook-form"; +import { useNavigate } from "react-router-dom"; +import { yupResolver } from "@hookform/resolvers/yup"; +import * as yup from "yup"; +import { AuthContext, tokenExpireError } from "Context/Auth"; +import { GlobalContext } from "Context/Global"; +import { getNonNullValue } from "Utils/utils"; +import MkdSDK from "Utils/MkdSDK"; +import { ModalSidebar } from "Components/ModalSidebar"; +import { BiFilterAlt, BiSearch } from "react-icons/bi"; +import { AiOutlineClose, AiOutlinePlus } from "react-icons/ai"; +import { RiDeleteBin5Line } from "react-icons/ri"; +import EditAdminCmsPage from "../Edit/EditAdminCmsPage"; +import AddAdminCmsPage from "../Add/AddAdminCmsPage"; +import { AddButton } from "Components/AddButton"; +import SkeletonLoader from "Components/Skeleton/Skeleton"; +import { PaginationBar } from "Components/PaginationBar"; + +let sdk = new MkdSDK(); + +const columns = [ + { + header: "Page", + accessor: "page", + isSorted: false, + isSortedDesc: false, + mappingExist: false, + mappings: {}, + }, + { + header: "Identifier", + accessor: "content_key", + isSorted: false, + isSortedDesc: false, + mappingExist: false, + mappings: {}, + }, + { + header: "Content Type", + accessor: "content_type", + isSorted: false, + isSortedDesc: false, + mappingExist: false, + mappings: {}, + }, + { + header: "Action", + accessor: "", + }, +]; + +const AdminCmsListPage = () => { + const { dispatch } = React.useContext(AuthContext); + const { dispatch: globalDispatch } = React.useContext(GlobalContext); + const [query, setQuery] = React.useState(""); + const [data, setCurrentTableData] = React.useState([]); + const [pageSize, setPageSize] = React.useState(10); + const [pageCount, setPageCount] = React.useState(0); + const [dataTotal, setDataTotal] = React.useState(0); + const [currentPage, setPage] = React.useState(0); + const [canPreviousPage, setCanPreviousPage] = React.useState(false); + const [canNextPage, setCanNextPage] = React.useState(false); + const [showAddSidebar, setShowAddSidebar] = React.useState(false); + const [showEditSidebar, setShowEditSidebar] = React.useState(false); + const [isLoading, setIsLoading] = React.useState(false); + const [openFilter, setOpenFilter] = React.useState(false); + const [showFilterOptions, setShowFilterOptions] = React.useState(false); + const [selectedOptions, setSelectedOptions] = React.useState([]); + const [filterConditions, setFilterConditions] = React.useState([]); + const [searchValue, setSearchValue] = React.useState(""); + const [optionValue, setOptionValue] = React.useState("eq"); + const [activeEditId, setActiveEditId] = React.useState(); + const navigate = useNavigate(); + const dropdownFilterRef = React.useRef(null); + + const schema = yup.object({ + page: yup.string(), + key: yup.string(), + type: yup.string(), + }); + + const selectType = [ + { key: "", value: "All" }, + { key: "text", value: "Text" }, + { key: "image", value: "Image" }, + { key: "number", value: "Number" }, + ]; + + const { + register, + handleSubmit, + setError, + formState: { errors }, + } = useForm({ + resolver: yupResolver(schema), + }); + + function onSort(columnIndex) { + console.log(columns[columnIndex]); + if (columns[columnIndex].isSorted) { + columns[columnIndex].isSortedDesc = !columns[columnIndex].isSortedDesc; + } else { + columns.map((i) => (i.isSorted = false)); + columns.map((i) => (i.isSortedDesc = false)); + columns[columnIndex].isSorted = true; + }; + + (async function () { + await getData(0, pageSize); + })(); + + } + + function updatePageSize(limit) { + (async function () { + setPageSize(limit); + await getData(0, limit); + })(); + } + + function previousPage() { + (async function () { + await getData(currentPage - 1 > 0 ? currentPage - 1 : 0, pageSize); + })(); + } + + function nextPage() { + (async function () { + await getData( + currentPage + 1 <= pageCount ? currentPage + 1 : 0, + pageSize + ); + })(); + } + + const addFilterCondition = (option, selectedValue, inputValue) => { + const input = + selectedValue === "eq" && isNaN(inputValue) + ? `"${inputValue}"` + : inputValue; + const condition = `${option},${selectedValue},${input}`; + setFilterConditions((prevConditions) => { + const newConditions = prevConditions.filter( + (condition) => !condition.includes(option) + ); + return [...newConditions, condition]; + }); + setSearchValue(inputValue); + }; + + async function getData(pageNum, limitNum, data) { + // setIsLoading(true); + try { + sdk.setTable("cms"); + const result = await sdk.callRestAPI( + { + payload: { ...data }, + page: pageNum, + limit: limitNum, + // sortId: sortField.length ? sortField[0].accessor : "", + // direction: sortField.length + // ? sortField[0].isSortedDesc + // ? "DESC" + // : "ASC" + // : "", + }, + "PAGINATE" + ); + + const { list, total, limit, num_pages, page } = result; + + setCurrentTableData(list); + setPageSize(limit); + setPageCount(num_pages); + setPage(page); + setDataTotal(total); + setCanPreviousPage(page > 1); + setCanNextPage(page + 1 <= num_pages); + } catch (error) { + console.log("ERROR", error); + tokenExpireError(dispatch, error.message); + }; + // setIsLoading(false); + } + + const onSubmit = (data) => { + let page = getNonNullValue(data.page); + let key = getNonNullValue(data.key); + let type = getNonNullValue(data.type); + let filter = { page, content_key: key, content_type: type }; + getData(0, 10, filter); + }; + + React.useEffect(() => { + globalDispatch({ + type: "SETPATH", + payload: { + path: "cms", + }, + }); + + (async function () { + await getData(1, pageSize); + })(); + }, []); + + React.useEffect(() => { + if (!showAddSidebar) { + getData(1, pageSize, filterConditions) + } + }, [showAddSidebar]); + + const handleClickOutside = (event) => { + if (dropdownFilterRef.current && !dropdownFilterRef.current.contains(event.target)) { + setOpenFilter(false); + } + }; + + React.useEffect(() => { + document.addEventListener('mousedown', handleClickOutside); + return () => { + document.removeEventListener('mousedown', handleClickOutside); + }; + }, []); + + return ( +
    +
    +
    +
    +
    +
    setOpenFilter(!openFilter)} + > + + Filters + {selectedOptions.length > 0 && ( + + {selectedOptions.length} + + )} +
    + {openFilter && ( +
    +
    + {selectedOptions?.map((option, index) => ( +
    +
    + {option} +
    + + + + addFilterCondition( + option, + optionValue, + e.target.value + ) + } + /> + +
    + { + setSelectedOptions((prevOptions) => + prevOptions.filter((op) => op !== option) + ); + setFilterConditions((prevConditions) => { + return prevConditions.filter( + (condition) => !condition.includes(option) + ); + }); + }} + /> +
    + +
    + ))} + +
    +
    { + setShowFilterOptions(!showFilterOptions); + }} + > + + Add filter +
    + + {showFilterOptions && ( +
    +
      + {columns.slice(0, -1).map((column) => ( +
    • { + if (!selectedOptions.includes(column.header)) { + setSelectedOptions((prev) => [ + ...prev, + column.header, + ]); + } + setShowFilterOptions(false); + }} + > + {column.header} +
    • + ))} +
    +
    + )} + {selectedOptions.length > 0 && ( +
    { + setSelectedOptions([]); + setFilterConditions([]); + }} + className="inline-block cursor-pointer rounded px-6 py-2.5 font-medium leading-tight text-gray-600 transition duration-150 ease-in-out" + > + Clear all filter +
    + )} +
    +
    +
    + )} +
    +
    + + addFilterCondition("name", "cs", e.target?.value)} + /> + +
    +
    +
    + {/*
    +

    CMS Search

    +
    +
    + + +

    {errors.page?.message}

    +
    +
    + + +

    {errors.key?.message}

    +
    + +
    + + +

    +
    +
    + + +
    */} + setShowAddSidebar(true)} /> +
    + + {isLoading ? ( + + ) : ( +
    +
    + + + + {columns.map((column, i) => ( + + ))} + + + + {data?.length === 0 && ( +
    No data
    + )} + {data.map((row, i) => { + return ( + + {columns.map((cell, index) => { + if (cell.accessor == "") { + return ( + + ); + } + if (cell.mapping) { + return ( + + ); + } + return ( + + ); + })} + + ); + })} + +
    onSort(i)} > + {column.header} + {column.isSorted ? (column.isSortedDesc ? " ▼" : " ▲") : ""} +
    + + + {cell.mapping[row[cell.accessor]]} + + {row[cell.accessor]} +
    +
    +
    + )} + + setShowAddSidebar(false)} + > + + + setShowEditSidebar(false)} + > + + +
    + ); +}; + +export default AdminCmsListPage; + + \ No newline at end of file diff --git a/day20/src/pages/Admin/List/AdminEmailListPage.jsx b/day20/src/pages/Admin/List/AdminEmailListPage.jsx new file mode 100644 index 0000000..29d94ab --- /dev/null +++ b/day20/src/pages/Admin/List/AdminEmailListPage.jsx @@ -0,0 +1,393 @@ + + import React from "react"; +import { AuthContext, tokenExpireError } from "Context/Auth"; +import MkdSDK from "Utils/MkdSDK"; +import { useNavigate } from "react-router-dom"; +import { GlobalContext } from "Context/Global"; +import Skeleton from "react-loading-skeleton"; +import { ModalSidebar } from "Components/ModalSidebar"; +import * as yup from "yup"; +import { useForm } from "react-hook-form"; +import { yupResolver } from "@hookform/resolvers/yup"; +import { BiFilterAlt, BiSearch } from "react-icons/bi"; +import { AiOutlineClose, AiOutlinePlus } from "react-icons/ai"; +import { RiDeleteBin5Line } from "react-icons/ri"; +import AddAdminEmailPage from "../Add/AddAdminEmailPage"; +import EditAdminEmailPage from "../Edit/EditAdminEmailPage"; +import { AddButton } from "Components/AddButton"; + + +let sdk = new MkdSDK(); + +const columns = [ + { + header: "ID", + accessor: "id", + }, + { + header: "Email Type", + accessor: "slug", + }, + { + header: "Subject", + accessor: "subject", + }, + { + header: "Tags", + accessor: "tag", + }, + { + header: "Action", + accessor: "", + }, + +]; + +const AdminEmailListPage = () => { + const { dispatch } = React.useContext(AuthContext); + const [data, setCurrentTableData] = React.useState([]); + const [loadingData, setLoadingData] = React.useState(false); + const [showAddSidebar, setShowAddSidebar] = React.useState(false); + const [showEditSidebar, setShowEditSidebar] = React.useState(false); + const [activeEditId, setActiveEditId] = React.useState(); + const [openFilter, setOpenFilter] = React.useState(false); + const [showFilterOptions, setShowFilterOptions] = React.useState(false); + const [selectedOptions, setSelectedOptions] = React.useState([]); + const [filterConditions, setFilterConditions] = React.useState([]); + const [searchValue, setSearchValue] = React.useState(""); + const [optionValue, setOptionValue] = React.useState("eq"); + const dropdownFilterRef = React.useRef(null); + + const navigate = useNavigate(); + + const { dispatch: globalDispatch } = React.useContext(GlobalContext); + + const schema = yup.object({ + page: yup.string(), + key: yup.string(), + type: yup.string(), + }); + + const { + handleSubmit, + formState: { errors }, + } = useForm({ + resolver: yupResolver(schema), + }); + + const onSubmit = (data) => { + let page = getNonNullValue(data.page); + let key = getNonNullValue(data.key); + let type = getNonNullValue(data.type); + let filter = { page, content_key: key, content_type: type }; + getData(0, 10, filter); + }; + + const addFilterCondition = (option, selectedValue, inputValue) => { + const input = + selectedValue === "eq" && isNaN(inputValue) + ? `"${inputValue}"` + : inputValue; + const condition = `${option},${selectedValue},${input}`; + setFilterConditions((prevConditions) => { + const newConditions = prevConditions.filter( + (condition) => !condition.includes(option) + ); + return [...newConditions, condition]; + }); + setSearchValue(inputValue); + }; + + async function getData() { + try { + sdk.setTable("email"); + const result = await sdk.callRestAPI({}, "GETALL"); + + const { list } = result; + + setCurrentTableData(list); + } catch (error) { + console.log("ERROR", error); + tokenExpireError(dispatch, error.message); + } + } + + React.useEffect(() => { + globalDispatch({ + type: "SETPATH", + payload: { + path: "email", + }, + }); + + (async function () { + setLoadingData(true); + await getData(); + setLoadingData(false); + })(); + }, []); + + const handleClickOutside = (event) => { + if (dropdownFilterRef.current && !dropdownFilterRef.current.contains(event.target)) { + setOpenFilter(false); + } + }; + + React.useEffect(() => { + document.addEventListener('mousedown', handleClickOutside); + return () => { + document.removeEventListener('mousedown', handleClickOutside); + }; + }, []); + + return ( + <> +
    +
    + {/*

    Emails

    */} +
    +
    +
    +
    setOpenFilter(!openFilter)} + > + + Filters + {selectedOptions.length > 0 && ( + + {selectedOptions.length} + + )} +
    + {openFilter && ( +
    +
    + {selectedOptions?.map((option, index) => ( +
    +
    + {option} +
    + + + + addFilterCondition( + option, + optionValue, + e.target.value + ) + } + /> + +
    + { + setSelectedOptions((prevOptions) => + prevOptions.filter((op) => op !== option) + ); + setFilterConditions((prevConditions) => { + return prevConditions.filter( + (condition) => !condition.includes(option) + ); + }); + }} + /> +
    + +
    + ))} + +
    +
    { + setShowFilterOptions(!showFilterOptions); + }} + > + + Add filter +
    + + {showFilterOptions && ( +
    +
      + {columns.slice(0, -1).map((column) => ( +
    • { + if (!selectedOptions.includes(column.header)) { + setSelectedOptions((prev) => [ + ...prev, + column.header, + ]); + } + setShowFilterOptions(false); + }} + > + {column.header} +
    • + ))} +
    +
    + )} + {selectedOptions.length > 0 && ( +
    { + setSelectedOptions([]); + setFilterConditions([]); + }} + className="inline-block cursor-pointer rounded px-6 py-2.5 font-medium leading-tight text-gray-600 transition duration-150 ease-in-out" + > + Clear all filter +
    + )} +
    +
    +
    + )} +
    +
    + + addFilterCondition("name", "cs", e.target?.value)} + /> + +
    +
    +
    + setShowAddSidebar(true)} /> +
    +
    + + + + {columns.map((column, i) => ( + + ))} + + + + {data.length == 0 ? ( + + + + ) : null} + {data.map((row, i) => { + return ( + + {columns.map((cell, index) => { + if (cell.accessor == "") { + return ( + + ); + } + if (cell.mapping) { + return ( + + ); + } + return ( + + ); + })} + + ); + })} + +
    + {column.header} + + {column.isSorted + ? column.isSortedDesc + ? " ▼" + : " ▲" + : ""} + +
    + {loadingData && } +
    + + + {cell.mapping[row[cell.accessor]]} + + {row[cell.accessor]} +
    +
    +
    + setShowAddSidebar(false)} + > + + + setShowEditSidebar(false)} + > + + + + ); +}; + +export default AdminEmailListPage; + + \ No newline at end of file diff --git a/day20/src/pages/Admin/List/AdminListDepartmentTablePage.jsx b/day20/src/pages/Admin/List/AdminListDepartmentTablePage.jsx new file mode 100644 index 0000000..4e75b41 --- /dev/null +++ b/day20/src/pages/Admin/List/AdminListDepartmentTablePage.jsx @@ -0,0 +1,146 @@ + + import React, { useRef } from "react"; + import MkdSDK from "Utils/MkdSDK"; + import { AuthContext } from "Context/Auth"; + import { GlobalContext } from "Context/Global"; + import { useNavigate } from "react-router-dom"; + import { LazyLoad } from "Components/LazyLoad"; + import { ModalSidebar } from "Components/ModalSidebar"; + import { MkdListTableV2 } from "Components/MkdListTable";; + + let sdk = new MkdSDK(); + + const columns = [ + + + + { + header: 'Id', + accessor: 'id', + isSorted: false, + isSortedDesc: false, + mappingExist : false, + mappings: { } + }, + + { + header: 'Create At', + accessor: 'create_at', + isSorted: false, + isSortedDesc: false, + mappingExist : false, + mappings: { } + }, + + { + header: 'Update At', + accessor: 'update_at', + isSorted: false, + isSortedDesc: false, + mappingExist : false, + mappings: { } + }, + + { + header: 'Name', + accessor: 'name', + isSorted: false, + isSortedDesc: false, + mappingExist : false, + mappings: { } + }, + { + header: "Action", + accessor: "", + }, + ]; + + const DepartmentListPage = () => { + const { dispatch } = React.useContext(AuthContext); + const { dispatch: globalDispatch } = React.useContext(GlobalContext); + const navigate = useNavigate(); + + const [showAddSidebar, setShowAddSidebar] = React.useState(false); + const [showEditSidebar, setShowEditSidebar] = React.useState(false); + const [activeEditId, setActiveEditId] = React.useState(); + const refreshRef = useRef(null); + + const [selectedItems, setSelectedItems] = React.useState([]); + + const onToggleModal = (modal, toggle, ids = []) => { + switch (modal) { + case "add": + setShowAddSidebar(toggle); + // setSelectedItems(ids); + break; + case "edit": + setShowEditSidebar(toggle); + setSelectedItems(ids); + setActiveEditId(ids[0]); + break; + } + }; + + return ( + <> + <> +
    + + onToggleModal("edit", true, ids), + multiple: false, + }, + delete: { show: false, action: null, multiple: false }, + select: { show: false, action: null, multiple: false }, + add: { + show: true, + action: () => onToggleModal("add", true), + multiple: false, + children: "Add New", + showChildren: true, + }, + export: { show: false, action: null, multiple: true }, + }} + actionPostion={`ontable`} + refreshRef={refreshRef} + /> + +
    + + + {/* + setShowAddSidebar(false)} + > + + + + + + setShowEditSidebar(false)} + > + + + */} + + ); + }; + + export default DepartmentListPage; + + \ No newline at end of file diff --git a/day20/src/pages/Admin/List/AdminListItemMovementHistoryTablePage.jsx b/day20/src/pages/Admin/List/AdminListItemMovementHistoryTablePage.jsx new file mode 100644 index 0000000..14bccd7 --- /dev/null +++ b/day20/src/pages/Admin/List/AdminListItemMovementHistoryTablePage.jsx @@ -0,0 +1,173 @@ + + import React, { useRef } from "react"; + import MkdSDK from "Utils/MkdSDK"; + import { AuthContext } from "Context/Auth"; + import { GlobalContext } from "Context/Global"; + import { useNavigate } from "react-router-dom"; + import { LazyLoad } from "Components/LazyLoad"; + import { ModalSidebar } from "Components/ModalSidebar"; + import { MkdListTableV2 } from "Components/MkdListTable";; + + let sdk = new MkdSDK(); + + const columns = [ + + + + { + header: 'Id', + accessor: 'id', + isSorted: false, + isSortedDesc: false, + mappingExist : false, + mappings: { } + }, + + { + header: 'Create At', + accessor: 'create_at', + isSorted: false, + isSortedDesc: false, + mappingExist : false, + mappings: { } + }, + + { + header: 'Update At', + accessor: 'update_at', + isSorted: false, + isSortedDesc: false, + mappingExist : false, + mappings: { } + }, + + { + header: 'Product Id', + accessor: 'product_id', + isSorted: false, + isSortedDesc: false, + mappingExist : false, + mappings: { } + }, + + { + header: 'Moved From', + accessor: 'moved_from', + isSorted: false, + isSortedDesc: false, + mappingExist : false, + mappings: { } + }, + + { + header: 'Moved To', + accessor: 'moved_to', + isSorted: false, + isSortedDesc: false, + mappingExist : false, + mappings: { } + }, + + { + header: 'Date', + accessor: 'date', + isSorted: false, + isSortedDesc: false, + mappingExist : false, + mappings: { } + }, + { + header: "Action", + accessor: "", + }, + ]; + + const ItemMovementHistoryListPage = () => { + const { dispatch } = React.useContext(AuthContext); + const { dispatch: globalDispatch } = React.useContext(GlobalContext); + const navigate = useNavigate(); + + const [showAddSidebar, setShowAddSidebar] = React.useState(false); + const [showEditSidebar, setShowEditSidebar] = React.useState(false); + const [activeEditId, setActiveEditId] = React.useState(); + const refreshRef = useRef(null); + + const [selectedItems, setSelectedItems] = React.useState([]); + + const onToggleModal = (modal, toggle, ids = []) => { + switch (modal) { + case "add": + setShowAddSidebar(toggle); + // setSelectedItems(ids); + break; + case "edit": + setShowEditSidebar(toggle); + setSelectedItems(ids); + setActiveEditId(ids[0]); + break; + } + }; + + return ( + <> + <> +
    + + onToggleModal("edit", true, ids), + multiple: false, + }, + delete: { show: false, action: null, multiple: false }, + select: { show: false, action: null, multiple: false }, + add: { + show: true, + action: () => onToggleModal("add", true), + multiple: false, + children: "Add New", + showChildren: true, + }, + export: { show: false, action: null, multiple: true }, + }} + actionPostion={`ontable`} + refreshRef={refreshRef} + /> + +
    + + + {/* + setShowAddSidebar(false)} + > + + + + + + setShowEditSidebar(false)} + > + + + */} + + ); + }; + + export default ItemMovementHistoryListPage; + + \ No newline at end of file diff --git a/day20/src/pages/Admin/List/AdminListItemsTablePage.jsx b/day20/src/pages/Admin/List/AdminListItemsTablePage.jsx new file mode 100644 index 0000000..563ca06 --- /dev/null +++ b/day20/src/pages/Admin/List/AdminListItemsTablePage.jsx @@ -0,0 +1,191 @@ + + import React, { useRef } from "react"; + import MkdSDK from "Utils/MkdSDK"; + import { AuthContext } from "Context/Auth"; + import { GlobalContext } from "Context/Global"; + import { useNavigate } from "react-router-dom"; + import { LazyLoad } from "Components/LazyLoad"; + import { ModalSidebar } from "Components/ModalSidebar"; + import { MkdListTableV2 } from "Components/MkdListTable";; + + let sdk = new MkdSDK(); + + const columns = [ + + + + { + header: 'Id', + accessor: 'id', + isSorted: false, + isSortedDesc: false, + mappingExist : false, + mappings: { } + }, + + { + header: 'Create At', + accessor: 'create_at', + isSorted: false, + isSortedDesc: false, + mappingExist : false, + mappings: { } + }, + + { + header: 'Update At', + accessor: 'update_at', + isSorted: false, + isSortedDesc: false, + mappingExist : false, + mappings: { } + }, + + { + header: 'Title', + accessor: 'title', + isSorted: false, + isSortedDesc: false, + mappingExist : false, + mappings: { } + }, + + { + header: 'Quantity', + accessor: 'quantity', + isSorted: false, + isSortedDesc: false, + mappingExist : false, + mappings: { } + }, + + { + header: 'Image', + accessor: 'image', + isSorted: false, + isSortedDesc: false, + mappingExist : false, + mappings: { } + }, + + { + header: 'Price', + accessor: 'price', + isSorted: false, + isSortedDesc: false, + mappingExist : false, + mappings: { } + }, + + { + header: 'Status', + accessor: 'status', + isSorted: false, + isSortedDesc: false, + mappingExist : false, + mappings: { } + }, + + { + header: 'Location', + accessor: 'location', + isSorted: false, + isSortedDesc: false, + mappingExist : false, + mappings: { } + }, + { + header: "Action", + accessor: "", + }, + ]; + + const ItemsListPage = () => { + const { dispatch } = React.useContext(AuthContext); + const { dispatch: globalDispatch } = React.useContext(GlobalContext); + const navigate = useNavigate(); + + const [showAddSidebar, setShowAddSidebar] = React.useState(false); + const [showEditSidebar, setShowEditSidebar] = React.useState(false); + const [activeEditId, setActiveEditId] = React.useState(); + const refreshRef = useRef(null); + + const [selectedItems, setSelectedItems] = React.useState([]); + + const onToggleModal = (modal, toggle, ids = []) => { + switch (modal) { + case "add": + setShowAddSidebar(toggle); + // setSelectedItems(ids); + break; + case "edit": + setShowEditSidebar(toggle); + setSelectedItems(ids); + setActiveEditId(ids[0]); + break; + } + }; + + return ( + <> + <> +
    + + onToggleModal("edit", true, ids), + multiple: false, + }, + delete: { show: false, action: null, multiple: false }, + select: { show: false, action: null, multiple: false }, + add: { + show: true, + action: () => onToggleModal("add", true), + multiple: false, + children: "Add New", + showChildren: true, + }, + export: { show: false, action: null, multiple: true }, + }} + actionPostion={`ontable`} + refreshRef={refreshRef} + /> + +
    + + + {/* + setShowAddSidebar(false)} + > + + + + + + setShowEditSidebar(false)} + > + + + */} + + ); + }; + + export default ItemsListPage; + + \ No newline at end of file diff --git a/day20/src/pages/Admin/List/AdminListLocationTablePage.jsx b/day20/src/pages/Admin/List/AdminListLocationTablePage.jsx new file mode 100644 index 0000000..6033f7d --- /dev/null +++ b/day20/src/pages/Admin/List/AdminListLocationTablePage.jsx @@ -0,0 +1,146 @@ + + import React, { useRef } from "react"; + import MkdSDK from "Utils/MkdSDK"; + import { AuthContext } from "Context/Auth"; + import { GlobalContext } from "Context/Global"; + import { useNavigate } from "react-router-dom"; + import { LazyLoad } from "Components/LazyLoad"; + import { ModalSidebar } from "Components/ModalSidebar"; + import { MkdListTableV2 } from "Components/MkdListTable";; + + let sdk = new MkdSDK(); + + const columns = [ + + + + { + header: 'Id', + accessor: 'id', + isSorted: false, + isSortedDesc: false, + mappingExist : false, + mappings: { } + }, + + { + header: 'Create At', + accessor: 'create_at', + isSorted: false, + isSortedDesc: false, + mappingExist : false, + mappings: { } + }, + + { + header: 'Update At', + accessor: 'update_at', + isSorted: false, + isSortedDesc: false, + mappingExist : false, + mappings: { } + }, + + { + header: 'Name', + accessor: 'name', + isSorted: false, + isSortedDesc: false, + mappingExist : false, + mappings: { } + }, + { + header: "Action", + accessor: "", + }, + ]; + + const LocationListPage = () => { + const { dispatch } = React.useContext(AuthContext); + const { dispatch: globalDispatch } = React.useContext(GlobalContext); + const navigate = useNavigate(); + + const [showAddSidebar, setShowAddSidebar] = React.useState(false); + const [showEditSidebar, setShowEditSidebar] = React.useState(false); + const [activeEditId, setActiveEditId] = React.useState(); + const refreshRef = useRef(null); + + const [selectedItems, setSelectedItems] = React.useState([]); + + const onToggleModal = (modal, toggle, ids = []) => { + switch (modal) { + case "add": + setShowAddSidebar(toggle); + // setSelectedItems(ids); + break; + case "edit": + setShowEditSidebar(toggle); + setSelectedItems(ids); + setActiveEditId(ids[0]); + break; + } + }; + + return ( + <> + <> +
    + + onToggleModal("edit", true, ids), + multiple: false, + }, + delete: { show: false, action: null, multiple: false }, + select: { show: false, action: null, multiple: false }, + add: { + show: true, + action: () => onToggleModal("add", true), + multiple: false, + children: "Add New", + showChildren: true, + }, + export: { show: false, action: null, multiple: true }, + }} + actionPostion={`ontable`} + refreshRef={refreshRef} + /> + +
    + + + {/* + setShowAddSidebar(false)} + > + + + + + + setShowEditSidebar(false)} + > + + + */} + + ); + }; + + export default LocationListPage; + + \ No newline at end of file diff --git a/day20/src/pages/Admin/List/AdminListUserTablePage.jsx b/day20/src/pages/Admin/List/AdminListUserTablePage.jsx new file mode 100644 index 0000000..5c8dce0 --- /dev/null +++ b/day20/src/pages/Admin/List/AdminListUserTablePage.jsx @@ -0,0 +1,281 @@ + + import React, { useRef } from "react"; + import MkdSDK from "Utils/MkdSDK"; + import { AuthContext } from "Context/Auth"; + import { GlobalContext } from "Context/Global"; + import { useNavigate } from "react-router-dom"; + import { LazyLoad } from "Components/LazyLoad"; + import { ModalSidebar } from "Components/ModalSidebar"; + import { MkdListTableV2 } from "Components/MkdListTable";; + + let sdk = new MkdSDK(); + + const columns = [ + + + + { + header: 'Id', + accessor: 'id', + isSorted: false, + isSortedDesc: false, + mappingExist : false, + mappings: { } + }, + + { + header: 'Oauth', + accessor: 'oauth', + isSorted: false, + isSortedDesc: false, + mappingExist : false, + mappings: { } + }, + + { + header: 'Role', + accessor: 'role', + isSorted: false, + isSortedDesc: false, + mappingExist : false, + mappings: { } + }, + + { + header: 'First Name', + accessor: 'first_name', + isSorted: false, + isSortedDesc: false, + mappingExist : false, + mappings: { } + }, + + { + header: 'Last Name', + accessor: 'last_name', + isSorted: false, + isSortedDesc: false, + mappingExist : false, + mappings: { } + }, + + { + header: 'Email', + accessor: 'email', + isSorted: false, + isSortedDesc: false, + mappingExist : false, + mappings: { } + }, + + { + header: 'Password', + accessor: 'password', + isSorted: false, + isSortedDesc: false, + mappingExist : false, + mappings: { } + }, + + { + header: 'Type', + accessor: 'type', + isSorted: false, + isSortedDesc: false, + mappingExist : false, + mappings: { } + }, + + { + header: 'Verify', + accessor: 'verify', + isSorted: false, + isSortedDesc: false, + mappingExist : false, + mappings: { } + }, + + { + header: 'Phone', + accessor: 'phone', + isSorted: false, + isSortedDesc: false, + mappingExist : false, + mappings: { } + }, + + { + header: 'Photo', + accessor: 'photo', + isSorted: false, + isSortedDesc: false, + mappingExist : false, + mappings: { } + }, + + { + header: 'Refer', + accessor: 'refer', + isSorted: false, + isSortedDesc: false, + mappingExist : false, + mappings: { } + }, + + { + header: 'Stripe Uid', + accessor: 'stripe_uid', + isSorted: false, + isSortedDesc: false, + mappingExist : false, + mappings: { } + }, + + { + header: 'Paypal Uid', + accessor: 'paypal_uid', + isSorted: false, + isSortedDesc: false, + mappingExist : false, + mappings: { } + }, + + { + header: 'Two Factor Authentication', + accessor: 'two_factor_authentication', + isSorted: false, + isSortedDesc: false, + mappingExist : false, + mappings: { } + }, + + { + header: 'Status', + accessor: 'status', + isSorted: false, + isSortedDesc: false, + mappingExist : false, + mappings: { } + }, + + { + header: 'Create At', + accessor: 'create_at', + isSorted: false, + isSortedDesc: false, + mappingExist : false, + mappings: { } + }, + + { + header: 'Update At', + accessor: 'update_at', + isSorted: false, + isSortedDesc: false, + mappingExist : false, + mappings: { } + }, + + { + header: 'Department', + accessor: 'department', + isSorted: false, + isSortedDesc: false, + mappingExist : false, + mappings: { } + }, + { + header: "Action", + accessor: "", + }, + ]; + + const UserListPage = () => { + const { dispatch } = React.useContext(AuthContext); + const { dispatch: globalDispatch } = React.useContext(GlobalContext); + const navigate = useNavigate(); + + const [showAddSidebar, setShowAddSidebar] = React.useState(false); + const [showEditSidebar, setShowEditSidebar] = React.useState(false); + const [activeEditId, setActiveEditId] = React.useState(); + const refreshRef = useRef(null); + + const [selectedItems, setSelectedItems] = React.useState([]); + + const onToggleModal = (modal, toggle, ids = []) => { + switch (modal) { + case "add": + setShowAddSidebar(toggle); + // setSelectedItems(ids); + break; + case "edit": + setShowEditSidebar(toggle); + setSelectedItems(ids); + setActiveEditId(ids[0]); + break; + } + }; + + return ( + <> + <> +
    + + onToggleModal("edit", true, ids), + multiple: false, + }, + delete: { show: false, action: null, multiple: false }, + select: { show: false, action: null, multiple: false }, + add: { + show: true, + action: () => onToggleModal("add", true), + multiple: false, + children: "Add New", + showChildren: true, + }, + export: { show: false, action: null, multiple: true }, + }} + actionPostion={`ontable`} + refreshRef={refreshRef} + /> + +
    + + + {/* + setShowAddSidebar(false)} + > + + + + + + setShowEditSidebar(false)} + > + + + */} + + ); + }; + + export default UserListPage; + + \ No newline at end of file diff --git a/day20/src/pages/Admin/List/AdminPhotoListPage.jsx b/day20/src/pages/Admin/List/AdminPhotoListPage.jsx new file mode 100644 index 0000000..b36e447 --- /dev/null +++ b/day20/src/pages/Admin/List/AdminPhotoListPage.jsx @@ -0,0 +1,450 @@ + + import React from "react"; +import { AuthContext, tokenExpireError } from "Context/Auth"; +import { yupResolver } from "@hookform/resolvers/yup"; +import * as yup from "yup"; +import { useForm } from "react-hook-form"; +import { useNavigate } from "react-router-dom"; +import MkdSDK from "Utils/MkdSDK"; +import { GlobalContext, showToast } from "Context/Global"; +import { getNonNullValue } from "Utils/utils"; +import { PaginationBar } from "Components/PaginationBar"; +import Skeleton from "react-loading-skeleton"; +import { ModalSidebar } from "Components/ModalSidebar"; +import { BiFilterAlt, BiSearch } from "react-icons/bi"; +import { AiOutlineClose, AiOutlinePlus } from "react-icons/ai"; +import { RiDeleteBin5Line } from "react-icons/ri"; +import AddAdminPhotoPage from "../Add/AddAdminPhotoPage"; +import { AddButton } from "Components/AddButton"; + +let sdk = new MkdSDK(); + +const columns = [ + { + header: "Photos", + accessor: "url", + }, + { + header: "Create at", + accessor: "create_at", + }, + { + header: "Action", + accessor: "", + }, + +]; + +const filterColumns = [ + { + header: "Date", + accessor: "create_at", + }, + { + header: "ID", + accessor: "id", + }, + { + header: "User ID", + accessor: "user_id", + }, + { + header: "Action", + accessor: "", + }, +] + +const AdminPhotoListPage = () => { + const { dispatch } = React.useContext(AuthContext); + const { dispatch: globalDispatch } = React.useContext(GlobalContext); + const [query, setQuery] = React.useState(""); + const [data, setCurrentTableData] = React.useState([]); + const [pageSize, setPageSize] = React.useState(3); + const [pageCount, setPageCount] = React.useState(0); + const [dataTotal, setDataTotal] = React.useState(0); + const [currentPage, setPage] = React.useState(0); + const [canPreviousPage, setCanPreviousPage] = React.useState(false); + const [canNextPage, setCanNextPage] = React.useState(false); + const [loadingData, setLoadingData] = React.useState(false); + const [showAddSidebar, setShowAddSidebar] = React.useState(false); + const [openFilter, setOpenFilter] = React.useState(false); + const [showFilterOptions, setShowFilterOptions] = React.useState(false); + const [selectedOptions, setSelectedOptions] = React.useState([]); + const [filterConditions, setFilterConditions] = React.useState([]); + const [searchValue, setSearchValue] = React.useState(""); + const [optionValue, setOptionValue] = React.useState("eq"); + const navigate = useNavigate(); + const globalContext = React.useContext(GlobalContext); + const dropdownFilterRef = React.useRef(null); + + const schema = yup.object({ + date: yup.string(), + id: yup.string(), + user_id: yup.string(), + }); + const { + register, + handleSubmit, + setError, + formState: { errors }, + } = useForm({ + resolver: yupResolver(schema), + }); + + function updatePageSize(limit) { + (async function () { + setPageSize(limit); + await getData(0, limit); + })(); + } + function previousPage() { + (async function () { + await getData(currentPage - 1 > 0 ? currentPage - 1 : 0, pageSize); + })(); + } + function nextPage() { + (async function () { + await getData( + currentPage + 1 <= pageCount ? currentPage + 1 : 0, + pageSize + ); + })(); + } + + async function getData(pageNum, limitNum, data) { + try { + sdk.setTable("photo"); + const result = await sdk.callRestAPI( + { + payload: { ...data }, + page: pageNum, + limit: limitNum, + }, + "PAGINATE" + ); + + const { list, total, limit, num_pages, page } = result; + + setCurrentTableData(list); + setPageSize(limit); + setPageCount(num_pages); + setPage(page); + setDataTotal(total); + setCanPreviousPage(page > 1); + setCanNextPage(page + 1 <= num_pages); + } catch (error) { + console.log("ERROR", error); + tokenExpireError(dispatch, error.message); + } + }; + + const addFilterCondition = (option, selectedValue, inputValue) => { + const input = + selectedValue === "eq" && isNaN(inputValue) + ? `"${inputValue}"` + : inputValue; + const condition = `${option},${selectedValue},${input}`; + setFilterConditions((prevConditions) => { + const newConditions = prevConditions.filter( + (condition) => !condition.includes(option) + ); + return [...newConditions, condition]; + }); + setSearchValue(inputValue); + }; + + const onSubmit = (data) => { + let create_at = getNonNullValue(data.date); + let id = getNonNullValue(data.id); + let user_id = getNonNullValue(data.user_id); + let filter = { create_at, id, user_id }; + getData(0, 50, filter); + }; + + React.useEffect(() => { + globalDispatch({ + type: "SETPATH", + payload: { + path: "photos", + }, + }); + + (async function () { + setLoadingData(true); + await getData(0, 50); + setLoadingData(false); + })(); + }, []); + + async function deleteImage(id) { + sdk.setTable("photo"); + const result = await sdk.callRestAPI({ id }, "DELETE"); + showToast(globalDispatch, "Deleted"); + await getData(0, 50); + } + + const handleClickOutside = (event) => { + if (dropdownFilterRef.current && !dropdownFilterRef.current.contains(event.target)) { + setOpenFilter(false); + } + }; + + React.useEffect(() => { + document.addEventListener('mousedown', handleClickOutside); + return () => { + document.removeEventListener('mousedown', handleClickOutside); + }; + }, []); + + return ( +
    +
    +
    +
    +
    +
    setOpenFilter(!openFilter)} + > + + Filters + {selectedOptions.length > 0 && ( + + {selectedOptions.length} + + )} +
    + {openFilter && ( +
    +
    + {selectedOptions?.map((option, index) => ( +
    +
    + {option} +
    + + + + addFilterCondition( + option, + optionValue, + e.target.value + ) + } + /> + +
    + { + setSelectedOptions((prevOptions) => + prevOptions.filter((op) => op !== option) + ); + setFilterConditions((prevConditions) => { + return prevConditions.filter( + (condition) => !condition.includes(option) + ); + }); + }} + /> +
    + +
    + ))} + +
    +
    { + setShowFilterOptions(!showFilterOptions); + }} + > + + Add filter +
    + + {showFilterOptions && ( +
    +
      + {columns.slice(0, -1).map((column) => ( +
    • { + if (!selectedOptions.includes(column.header)) { + setSelectedOptions((prev) => [ + ...prev, + column.header, + ]); + } + setShowFilterOptions(false); + }} + > + {column.header} +
    • + ))} +
    +
    + )} + {selectedOptions.length > 0 && ( +
    { + setSelectedOptions([]); + setFilterConditions([]); + }} + className="inline-block cursor-pointer rounded px-6 py-2.5 font-medium leading-tight text-gray-600 transition duration-150 ease-in-out" + > + Clear all filter +
    + )} +
    +
    +
    + )} +
    +
    + + addFilterCondition("name", "cs", e.target?.value)} + /> + +
    +
    +
    + {/*

    Photos

    */} + setShowAddSidebar(true)} /> +
    + +
    +
    + + + + {columns.map((column, index) => ( + + ))} + + + + {data.length == 0 ? ( + + + + ) : null} + {data.map((row, i) => { + return ( + + {columns.map((cell, index) => { + if (cell.accessor == "") { + return ( + + ); + } + if (cell.mapping) { + return ( + + ); + } + return ( + + ); + })} + + ); + })} + +
    + {column.header} + + {column.isSorted + ? column.isSortedDesc + ? " ▼" + : " ▲" + : ""} + +
    + {loadingData && } +
    + + + {cell.mapping[row[cell.accessor]]} + + {cell.accessor == "url" ? : row[cell.accessor]} +
    +
    +
    + + setShowAddSidebar(false)} + > + + +
    + ); +}; + +export default AdminPhotoListPage; + + \ No newline at end of file diff --git a/day20/src/pages/Admin/List/AdminStripeInvoicesListPageV2.jsx b/day20/src/pages/Admin/List/AdminStripeInvoicesListPageV2.jsx new file mode 100644 index 0000000..eb44ea2 --- /dev/null +++ b/day20/src/pages/Admin/List/AdminStripeInvoicesListPageV2.jsx @@ -0,0 +1,477 @@ + + import React from "react"; + import { AuthContext, tokenExpireError } from "Context/Auth"; + import MkdSDK from "Utils/MkdSDK"; + import { useNavigate } from "react-router-dom"; + import { GlobalContext } from "Context/Global"; + import { yupResolver } from "@hookform/resolvers/yup"; + import { useForm } from "react-hook-form"; + import * as yup from "yup"; + import { getNonNullValue } from "Utils/utils"; + import { PaginationBar } from "Components/PaginationBar"; + import { BiFilterAlt, BiSearch } from "react-icons/bi"; + import { AiOutlineClose, AiOutlinePlus } from "react-icons/ai"; + import { RiDeleteBin5Line } from "react-icons/ri"; + import { SkeletonLoader } from "Components/Skeleton"; + + const columns = [ + { + header: "Status", + accessor: "status", + }, + { + header: "Currency", + accessor: "currency", + }, + { + header: "Amount due", + accessor: "amount_due", + type: "currency", + }, + { + header: "Amount paid", + accessor: "amount_paid", + type: "currency", + }, + { + header: "Amount remaining", + accessor: "amount_remaining", + type: "currency", + }, + { + header: "Created at", + accessor: "created_at", + type: "timestamp", + }, + ]; + + const AdminStripeInvoicesListPageV2 = () => { + const sdk = new MkdSDK(); + + const { dispatch: globalDispatch } = React.useContext(GlobalContext); + const { dispatch } = React.useContext(AuthContext); + const [query, setQuery] = React.useState(""); + const [data, setCurrentTableData] = React.useState([]); + const [pageSize, setPageSize] = React.useState(10); + const [pageCount, setPageCount] = React.useState(0); + const [dataTotal, setDataTotal] = React.useState(0); + const [currentPage, setPage] = React.useState(0); + const [canPreviousPage, setCanPreviousPage] = React.useState(false); + const [canNextPage, setCanNextPage] = React.useState(false); + const [openFilter, setOpenFilter] = React.useState(false); + const [showFilterOptions, setShowFilterOptions] = React.useState(false); + const [selectedOptions, setSelectedOptions] = React.useState([]); + const [filterConditions, setFilterConditions] = React.useState([]); + const [searchValue, setSearchValue] = React.useState(""); + const [optionValue, setOptionValue] = React.useState("eq"); + const [isLoading, setIsLoading] = React.useState(false); + const navigate = useNavigate(); + const dropdownFilterRef = React.useRef(null); + + const schema = yup.object({ + customer_email: yup.string(), + }); + + const { + register, + handleSubmit, + formState: { errors }, + } = useForm({ + resolver: yupResolver(schema), + }); + + const selectStatus = [{ key: "", value: "All" }]; + + const addFilterCondition = (option, selectedValue, inputValue) => { + const input = + selectedValue === "eq" && isNaN(inputValue) + ? `"${inputValue}"` + : inputValue; + const condition = `${option},${selectedValue},${input}`; + setFilterConditions((prevConditions) => { + const newConditions = prevConditions.filter( + (condition) => !condition.includes(option) + ); + return [...newConditions, condition]; + }); + setSearchValue(inputValue); + }; + + function updatePageSize(limit) { + (async function () { + setPageSize(limit); + await getData(1, limit); + })(); + } + function previousPage() { + (async function () { + await getData(currentPage - 1 > 1 ? currentPage - 1 : 1, pageSize); + })(); + } + + function nextPage() { + (async function () { + await getData( + currentPage + 1 <= pageCount ? currentPage + 1 : 1, + pageSize + ); + })(); + } + + async function getData(pageNum, limitNum, filterParams) { + setIsLoading(true); + try { + const { list, total, limit, num_pages, page, error, message } = + await sdk.getStripeInvoicesV2( + { page: pageNum, limit: limitNum }, + `filter=${filterParams.toString()}` + ); + + if (error) { + showToast(globalDispatch, message, 5000); + return; + } + + setCurrentTableData(list); + setPageSize(+limit); + setPageCount(+num_pages); + setPage(+page); + setDataTotal(+total); + setCanPreviousPage(+page > 1); + setCanNextPage(+page + 1 <= +num_pages); + } catch (error) { + console.log("ERROR", error); + tokenExpireError(dispatch, error.message); + } + setIsLoading(false); + } + + const onSubmit = (data) => { + const customer_email = getNonNullValue(data.customer_email); + getData(1, pageSize, { customer_email, product_name }); + }; + + React.useEffect(() => { + globalDispatch({ + type: "SETPATH", + payload: { + path: "invoices", + }, + }); + + const delay = 700; + const timeoutId = setTimeout(async () => { + await getData(1, pageSize, filterConditions); + }, delay); + + return () => { + clearTimeout(timeoutId); + }; + }, [searchValue, filterConditions, optionValue]); + + const handleClickOutside = (event) => { + if (dropdownFilterRef.current && !dropdownFilterRef.current.contains(event.target)) { + setOpenFilter(false); + } + }; + + React.useEffect(() => { + document.addEventListener('mousedown', handleClickOutside); + return () => { + document.removeEventListener('mousedown', handleClickOutside); + }; + }, []); + + return ( + <> + {/*
    +

    Search

    +
    +
    + + +

    { errors.customer_email?.message }

    +
    +
    +
    + + + +
    +
    */} +
    +
    +
    +
    +
    setOpenFilter(!openFilter)} + > + + Filters + {selectedOptions.length > 0 && ( + + {selectedOptions.length} + + )} +
    + {openFilter && ( +
    +
    + {selectedOptions?.map((option, index) => ( +
    +
    + {option} +
    + + + + addFilterCondition( + option, + optionValue, + e.target.value + ) + } + /> + +
    + { + setSelectedOptions((prevOptions) => + prevOptions.filter((op) => op !== option) + ); + setFilterConditions((prevConditions) => { + return prevConditions.filter( + (condition) => !condition.includes(option) + ); + }); + }} + /> +
    + +
    + ))} + +
    +
    { + setShowFilterOptions(!showFilterOptions); + }} + > + + Add filter +
    + + {showFilterOptions && ( +
    +
      + {columns.slice(0, -1).map((column) => ( +
    • { + if (!selectedOptions.includes(column.header)) { + setSelectedOptions((prev) => [ + ...prev, + column.header, + ]); + } + setShowFilterOptions(false); + }} + > + {column.header} +
    • + ))} +
    +
    + )} + {selectedOptions.length > 0 && ( +
    { + setSelectedOptions([]); + setFilterConditions([]); + }} + className="inline-block cursor-pointer rounded px-6 py-2.5 font-medium leading-tight text-gray-600 transition duration-150 ease-in-out" + > + Clear all filter +
    + )} +
    +
    +
    + )} +
    +
    + + addFilterCondition("name", "cs", e.target?.value)} + /> + +
    +
    +
    +
    + {isLoading ? ( + + ) : ( +
    + + + + {columns.map((column, index) => ( + + ))} + + + + {data.map((row, i) => { + return ( + + {columns.map((cell, index) => { + if (cell.accessor == "") { + return ( + + ); + } + if (cell.mapping) { + return ( + + ); + } + if (cell.type === "timestamp") { + return ( + + ); + } else if (cell.type === "currency") { + return ( + + ); + } else if (cell.type === "metadata") { + return ( + + ); + } + return ( + + ); + })} + + ); + })} + +
    + {column.header} + + {column.isSorted + ? column.isSortedDesc + ? " ▼" + : " ▲" + : ""} + +
    + {cell.mapping[row[cell.accessor]]} + + {new Date(row[cell.accessor] * 1000).toLocaleString( + "en-US" + )} + + ${Number(row[cell.accessor] / 100).toFixed(2)} + + {row[cell.pre_accessor][cell.accessor] ?? "n/a"} + + {row[cell.accessor]} +
    +
    + )} + + + + ); + }; + + export default AdminStripeInvoicesListPageV2; + + \ No newline at end of file diff --git a/day20/src/pages/Admin/List/AdminStripePricesListPage.jsx b/day20/src/pages/Admin/List/AdminStripePricesListPage.jsx new file mode 100644 index 0000000..27b78aa --- /dev/null +++ b/day20/src/pages/Admin/List/AdminStripePricesListPage.jsx @@ -0,0 +1,538 @@ + + import React, { useEffect, useState } from "react"; + import { AuthContext, tokenExpireError } from "Context/Auth"; + import MkdSDK from "Utils/MkdSDK"; + import { useNavigate } from "react-router-dom"; + import { GlobalContext, showToast } from "Context/Global"; + import { yupResolver } from "@hookform/resolvers/yup"; + import { useForm } from "react-hook-form"; + import * as yup from "yup"; + import { getNonNullValue } from "Utils/utils"; + import { PaginationBar } from "Components/PaginationBar"; + import { AddButton } from "Components/AddButton"; + import { BiFilterAlt, BiSearch } from "react-icons/bi"; + import { AiOutlineClose, AiOutlinePlus } from "react-icons/ai"; + import { RiDeleteBin5Line } from "react-icons/ri"; + import { SkeletonLoader } from "Components/Skeleton"; + import { ModalSidebar } from "Components/ModalSidebar"; + import { + AddAdminStripePricePage, + } from "Pages/Admin/Add"; + import { + EditAdminStripePricePage, + } from "Pages/Admin/Edit"; + + let sdk = new MkdSDK(); + + const columns = [ + { + header: "Stripe Id", + accessor: "stripe_id", + }, + { + header: "Product", + accessor: "product_name", + }, + { + header: "Nickname", + accessor: "name", + }, + { + header: "Type", + accessor: "type", + mapping: { + one_time: "One Time", + recurring: "Recurring", + lifetime: "Lifetime", + }, + }, + { + header: "Price", + accessor: "amount", + }, + { + header: "Trial", + accessor: "trial_days", + }, + { + header: "Status", + accessor: "status", + mapping: { + 0: "Inactive", + 1: "Active", + }, + }, + { + header: "Action", + accessor: "", + }, + ]; + + const AdminStripePricesListPage = () => { + const { dispatch: globalDispatch } = React.useContext(GlobalContext); + const { dispatch } = React.useContext(AuthContext); + const [query, setQuery] = React.useState(""); + const [data, setCurrentTableData] = React.useState([]); + const [pageSize, setPageSize] = React.useState(10); + const [pageCount, setPageCount] = React.useState(0); + const [dataTotal, setDataTotal] = React.useState(0); + const [currentPage, setPage] = React.useState(0); + const [canPreviousPage, setCanPreviousPage] = React.useState(false); + const [canNextPage, setCanNextPage] = React.useState(false); + const [openFilter, setOpenFilter] = React.useState(false); + const [showFilterOptions, setShowFilterOptions] = React.useState(false); + const [selectedOptions, setSelectedOptions] = React.useState([]); + const [filterConditions, setFilterConditions] = React.useState([]); + const [searchValue, setSearchValue] = React.useState(""); + const [optionValue, setOptionValue] = React.useState("eq"); + const [isLoading, setIsLoading] = React.useState(false); + const [showEditSidebar, setShowEditSidebar] = useState(false); + const [showAddSidebar, setShowAddSidebar] = useState(false); + const [activeEditId, setActiveEditId] = useState(); + const navigate = useNavigate(); + const dropdownFilterRef = React.useRef(null); + + const schema = yup.object({ + stripe_id: yup.string(), + name: yup.string(), + status: yup.string(), + product_name: yup.string(), + amount: yup.string(), + type: yup.string(), + }); + + const { + register, + handleSubmit, + formState: { errors }, + } = useForm({ + resolver: yupResolver(schema), + }); + + const selectStatus = [ + { key: "", value: "All" }, + { key: 0, value: "Archived" }, + { key: 1, value: "Active" }, + ]; + const typeStatus = [ + { key: "", value: "All" }, + { key: "one_time", value: "One time" }, + { key: "recurring", value: "Recurring" }, + ]; + + function copyToClipboard(text) { + navigator.clipboard.writeText(text); + showToast(globalDispatch, "Copied to clipboard"); + } + + const addFilterCondition = (option, selectedValue, inputValue) => { + const input = + selectedValue === "eq" && isNaN(inputValue) + ? `"${inputValue}"` + : inputValue; + const condition = `${option},${selectedValue},${input}`; + setFilterConditions((prevConditions) => { + const newConditions = prevConditions.filter( + (condition) => !condition.includes(option) + ); + return [...newConditions, condition]; + }); + setSearchValue(inputValue); + }; + + function updatePageSize(limit) { + (async function () { + setPageSize(limit); + await getData(1, limit); + })(); + } + function previousPage() { + (async function () { + await getData(currentPage - 1 > 1 ? currentPage - 1 : 1, pageSize); + })(); + } + + function nextPage() { + (async function () { + await getData( + currentPage + 1 <= pageCount ? currentPage + 1 : 1, + pageSize + ); + })(); + } + + async function getData(pageNum, limitNum, filterParams) { + setIsLoading(true); + try { + const result = await sdk.getStripePrices( + { page: pageNum, limit: limitNum }, + `filter=${filterParams.toString()}` + ); + const { list, total, limit, num_pages, page } = result; + + setCurrentTableData(list); + setPageSize(+limit); + setPageCount(+num_pages); + setPage(+page); + setDataTotal(+total); + setCanPreviousPage(+page > 1); + setCanNextPage(+page + 1 <= +num_pages); + } catch (error) { + console.log("ERROR", error); + tokenExpireError(dispatch, error.message); + } + setIsLoading(false); + } + + const onSubmit = (data) => { + const stripe_id = getNonNullValue(data.stripe_id); + const product_name = getNonNullValue(data.product_name); + const name = getNonNullValue(data.name); + const amount = getNonNullValue(data.amount); + const type = getNonNullValue(data.type); + const status = getNonNullValue(data.status); + getData(1, pageSize, { + stripe_id, + product_name, + name, + amount, + type, + status, + }); + }; + + React.useEffect(() => { + globalDispatch({ + type: "SETPATH", + payload: { + path: "prices", + }, + }); + + const delay = 700; + const timeoutId = setTimeout(async () => { + await getData(1, pageSize, filterConditions); + }, delay); + + return () => { + clearTimeout(timeoutId); + }; + }, [searchValue, filterConditions, optionValue]); + + useEffect(() => { + if (!showEditSidebar) { + getData(1, pageSize, filterConditions); + } + }, [showEditSidebar, activeEditId, showAddSidebar]); + + const handleClickOutside = (event) => { + if (dropdownFilterRef.current && !dropdownFilterRef.current.contains(event.target)) { + setOpenFilter(false); + } + }; + + React.useEffect(() => { + document.addEventListener('mousedown', handleClickOutside); + return () => { + document.removeEventListener('mousedown', handleClickOutside); + }; + }, []); + + return ( + <> +
    +
    +
    +
    +
    setOpenFilter(!openFilter)} + > + + Filters + {selectedOptions.length > 0 && ( + + {selectedOptions.length} + + )} +
    + {openFilter && ( +
    +
    + {selectedOptions?.map((option, index) => ( +
    +
    + {option} +
    + + + + addFilterCondition( + option, + optionValue, + e.target.value + ) + } + /> + +
    + { + setSelectedOptions((prevOptions) => + prevOptions.filter((op) => op !== option) + ); + setFilterConditions((prevConditions) => { + return prevConditions.filter( + (condition) => !condition.includes(option) + ); + }); + }} + /> +
    + +
    + ))} + +
    +
    { + setShowFilterOptions(!showFilterOptions); + }} + > + + Add filter +
    + + {showFilterOptions && ( +
    +
      + {columns.slice(0, -1).map((column) => ( +
    • { + if (!selectedOptions.includes(column.header)) { + setSelectedOptions((prev) => [ + ...prev, + column.header, + ]); + } + setShowFilterOptions(false); + }} + > + {column.header} +
    • + ))} +
    +
    + )} + {selectedOptions.length > 0 && ( +
    { + setSelectedOptions([]); + setFilterConditions([]); + }} + className="inline-block cursor-pointer rounded px-6 py-2.5 font-medium leading-tight text-gray-600 transition duration-150 ease-in-out" + > + Clear all filter +
    + )} +
    +
    +
    + )} +
    +
    + + addFilterCondition("name", "cs", e.target?.value)} + /> + +
    +
    +
    + setShowAddSidebar(true)} /> +
    + {isLoading ? ( + + ) : ( +
    + + + + {columns.map((column, index) => ( + + ))} + + + + {data.map((row, i) => { + return ( + + {columns.map((cell, index) => { + if (cell.accessor == "") { + return ( + + ); + } + if (cell.accessor === "stripe_id") { + return ( + + ); + } + if (cell.mapping && cell.accessor === "status") { + return ( + + ); + } + if (cell.mapping) { + return ( + + ); + } + return ( + + ); + })} + + ); + })} + +
    + {column.header} + + {column.isSorted + ? column.isSortedDesc + ? " ▼" + : " ▲" + : ""} + +
    + + +
    + {row[cell.accessor]} + copyToClipboard(row[cell.accessor])}> + + + + + + + + + + + +
    +
    + {row[cell.accessor] === 1 ? ( + + {cell.mapping[row[cell.accessor]]} + + ) : ( + + {cell.mapping[row[cell.accessor]]} + + )} + + {cell.mapping[row[cell.accessor]]} + + {row[cell.accessor]} +
    +
    + )} + + setShowEditSidebar(false)} + > + + + + setShowAddSidebar(false)} + > + + + + ); + }; + + export default AdminStripePricesListPage; + + \ No newline at end of file diff --git a/day20/src/pages/Admin/List/AdminStripeSubscriptionsListPage.jsx b/day20/src/pages/Admin/List/AdminStripeSubscriptionsListPage.jsx new file mode 100644 index 0000000..ea36c20 --- /dev/null +++ b/day20/src/pages/Admin/List/AdminStripeSubscriptionsListPage.jsx @@ -0,0 +1,642 @@ + + import React from "react"; +import { AuthContext, tokenExpireError } from "Context/Auth"; +import MkdSDK from "Utils/MkdSDK"; +import { useNavigate } from "react-router-dom"; +import { GlobalContext, showToast } from "Context/Global"; +import { yupResolver } from "@hookform/resolvers/yup"; +import { useForm } from "react-hook-form"; +import * as yup from "yup"; +import { getNonNullValue } from "Utils/utils"; +import { PaginationBar } from "Components/PaginationBar"; +// import {AddButton} from "Components/AddButton"; +import { BiFilterAlt, BiSearch } from "react-icons/bi"; +import { AiOutlineClose, AiOutlinePlus } from "react-icons/ai"; +import { RiDeleteBin5Line } from "react-icons/ri"; +import { SkeletonLoader } from "Components/Skeleton"; + +let sdk = new MkdSDK(); + +const columns = [ + { + header: "Customer", + accessor: "userEmail", + }, + { + header: "Plan", + accessor: "planName", + }, + { + header: "Starts", + accessor: "currentPeriodStart", + type: "timestamp", + }, + { + header: "Ends", + accessor: "currentPeriodEnd", + type: "timestamp", + }, + { + header: "type", + accessor: "planType", + mapping: { + recurring: "Recurring", + life_time: "Lifetime", + }, + }, + { + header: "Usage Type", + accessor: "isMetered", + mapping: { + 0: "Upfront", + 1: "Metered", + }, + }, + { + header: "Price", + accessor: "planAmount", + type: "currency", + }, + { + header: "Has Trial", + accessor: "trialDays", + }, + { + header: "Status", + accessor: "status", + }, + { + header: "Action", + accessor: "", + }, +]; +const AdminStripeSubscriptionsListPage = () => { + const { dispatch: globalDispatch } = React.useContext(GlobalContext); + const { dispatch } = React.useContext(AuthContext); + const [query, setQuery] = React.useState(""); + const [data, setCurrentTableData] = React.useState([]); + const [pageSize, setPageSize] = React.useState(10); + const [pageCount, setPageCount] = React.useState(0); + const [dataTotal, setDataTotal] = React.useState(0); + const [currentPage, setPage] = React.useState(0); + const [canPreviousPage, setCanPreviousPage] = React.useState(false); + const [canNextPage, setCanNextPage] = React.useState(false); + const [openFilter, setOpenFilter] = React.useState(false); + const [showFilterOptions, setShowFilterOptions] = React.useState(false); + const [selectedOptions, setSelectedOptions] = React.useState([]); + const [filterConditions, setFilterConditions] = React.useState([]); + const [searchValue, setSearchValue] = React.useState(""); + const [optionValue, setOptionValue] = React.useState("eq"); + const [isLoading, setIsLoading] = React.useState(false); + const navigate = useNavigate(); + const dropdownFilterRef = React.useRef(null); + + const schema = yup.object({ + customer_email: yup.string(), + plan_name: yup.string(), + sub_status: yup.string(), + plan_type: yup.string(), + }); + + const { + register, + handleSubmit, + formState: { errors }, + } = useForm({ + resolver: yupResolver(schema), + }); + + const selectStatus = [ + { key: "", value: "All" }, + { key: "active", value: "Active" }, + { key: "trialing", value: "Trialing" }, + { key: "canceled", value: "Canceled" }, + ]; + + const typeStatus = [ + { key: "", value: "All" }, + { key: "recurring", value: "Recurring" }, + { key: "lifetime", value: "Lifetime" }, + ]; + + const addFilterCondition = (option, selectedValue, inputValue) => { + const input = + selectedValue === "eq" && isNaN(inputValue) + ? `"${inputValue}"` + : inputValue; + const condition = `${option},${selectedValue},${input}`; + setFilterConditions((prevConditions) => { + const newConditions = prevConditions.filter( + (condition) => !condition.includes(option) + ); + return [...newConditions, condition]; + }); + setSearchValue(inputValue); + }; + + function updatePageSize(limit) { + (async function () { + setPageSize(limit); + await getData(1, limit); + })(); + } + function previousPage() { + (async function () { + await getData(currentPage - 1 > 1 ? currentPage - 1 : 1, pageSize); + })(); + } + + function nextPage() { + (async function () { + await getData( + currentPage + 1 <= pageCount ? currentPage + 1 : 1, + pageSize + ); + })(); + } + + async function getData(pageNum, limitNum, filterParams) { + setIsLoading(true); + + try { + const result = await sdk.getStripeSubscriptions( + { page: pageNum, limit: limitNum }, + `filter=${filterParams.toString()}` + ); + const { list, total, limit, num_pages, page } = result; + + setCurrentTableData(list); + setPageSize(+limit); + setPageCount(+num_pages); + setPage(+page); + setDataTotal(+total); + setCanPreviousPage(+page > 1); + setCanNextPage(+page + 1 <= +num_pages); + } catch (error) { + console.log("ERROR", error); + tokenExpireError(dispatch, error.message); + } + setIsLoading(false); + } + + const onSubmit = (data) => { + const customer_email = getNonNullValue(data.customer_email); + const plan_name = getNonNullValue(data.plan_name); + const sub_status = getNonNullValue(data.sub_status); + const plan_type = getNonNullValue(data.plan_type); + getData(1, pageSize, { + customer_email, + plan_name, + sub_status, + plan_type, + }); + }; + + const cancelCustomerSubscription = async (id) => { + console.log(id); + try { + const result = await sdk.adminCancelStripeSubscription(id, {}); + showToast(globalDispatch, result.message, 3000); + getData(1, pageSize); + } catch (error) { + console.log("ERROR", error); + showToast(globalDispatch, error.message); + tokenExpireError(dispatch, error.message); + } + }; + + const createCharge = async (subId, quantity) => { + console.log(subId); + try { + const result = await sdk.adminCreateUsageCharge(subId, quantity); + showToast(globalDispatch, result.message, 3000); + getData(1, pageSize); + } catch (error) { + console.log("ERROR", error); + showToast(globalDispatch, error.message); + tokenExpireError(dispatch, error.message); + } + }; + + React.useEffect(() => { + globalDispatch({ + type: "SETPATH", + payload: { + path: "subscriptions", + }, + }); + + const delay = 700; + const timeoutId = setTimeout(async () => { + await getData(1, pageSize, filterConditions); + }, delay); + + return () => { + clearTimeout(timeoutId); + }; + }, [searchValue, filterConditions, optionValue]); + + const handleClickOutside = (event) => { + if (dropdownFilterRef.current && !dropdownFilterRef.current.contains(event.target)) { + setOpenFilter(false); + } + }; + + React.useEffect(() => { + document.addEventListener('mousedown', handleClickOutside); + return () => { + document.removeEventListener('mousedown', handleClickOutside); + }; + }, []); + + return ( + <> + {/*
    +

    Search

    +
    +
    + + +

    {errors.customer_email?.message}

    +
    + +
    + + +

    {errors.plan_name?.message}

    +
    + +
    + + +

    +
    + +
    + + +

    +
    +
    + +
    + + + +
    +
    */} +
    +
    +
    +
    +
    setOpenFilter(!openFilter)} + > + + Filters + {selectedOptions.length > 0 && ( + + {selectedOptions.length} + + )} +
    + {openFilter && ( +
    +
    + {selectedOptions?.map((option, index) => ( +
    +
    + {option} +
    + + + + addFilterCondition( + option, + optionValue, + e.target.value + ) + } + /> + +
    + { + setSelectedOptions((prevOptions) => + prevOptions.filter((op) => op !== option) + ); + setFilterConditions((prevConditions) => { + return prevConditions.filter( + (condition) => !condition.includes(option) + ); + }); + }} + /> +
    + +
    + ))} + +
    +
    { + setShowFilterOptions(!showFilterOptions); + }} + > + + Add filter +
    + + {showFilterOptions && ( +
    +
      + {columns.slice(0, -1).map((column) => ( +
    • { + if (!selectedOptions.includes(column.header)) { + setSelectedOptions((prev) => [ + ...prev, + column.header, + ]); + } + setShowFilterOptions(false); + }} + > + {column.header} +
    • + ))} +
    +
    + )} + {selectedOptions.length > 0 && ( +
    { + setSelectedOptions([]); + setFilterConditions([]); + }} + className="inline-block cursor-pointer rounded px-6 py-2.5 font-medium leading-tight text-gray-600 transition duration-150 ease-in-out" + > + Clear all filter +
    + )} +
    +
    +
    + )} +
    +
    + + addFilterCondition("name", "cs", e.target?.value)} + /> + +
    +
    +
    +
    + + {isLoading ? ( + + ) : ( +
    + + + + {columns.map((column, index) => ( + + ))} + + + + {data.map((row, i) => { + return ( + + {columns.map((cell, index) => { + if (cell.accessor == "") { + return ( + + ); + } + if (cell.mapping) { + return ( + + ); + } + if ( + row.planType === "recurring" && + cell.type === "timestamp" + ) { + return ( + + ); + } else if ( + row.planType === "lifetime" && + cell.type === "timestamp" + ) { + if (cell.accessor === "currentPeriodStart") { + return ( + + ); + } else if (cell.accessor === "currentPeriodEnd") { + return ( + + ); + } + } else if (cell.type == "currency") { + return ( + + ); + } + return ( + + ); + })} + + ); + })} + +
    + {column.header} + + {column.isSorted + ? column.isSortedDesc + ? " ▼" + : " ▲" + : ""} + +
    + {row.status !== "canceled" ? ( + + ) : ( + "" + )} + {row.isMetered === 1 ? ( + + ) : ( + "" + )} + + {cell.mapping[row[cell.accessor]]} + + {new Date( + row[cell.accessor] * 1000 + ).toLocaleDateString("en-US", { + dateStyle: "medium", + })} + + {new Date( + row.createdAt * 1000 + ).toLocaleDateString("en-US", { + dateStyle: "medium", + })} + + Infinity + + ${+(row[cell.accessor] ?? 0)} + + {row[cell.accessor]} +
    +
    + )} + + + ); +}; + +export default AdminStripeSubscriptionsListPage; + + \ No newline at end of file diff --git a/day20/src/pages/Admin/List/AdminUserListPage.jsx b/day20/src/pages/Admin/List/AdminUserListPage.jsx new file mode 100644 index 0000000..a58c955 --- /dev/null +++ b/day20/src/pages/Admin/List/AdminUserListPage.jsx @@ -0,0 +1,473 @@ + + import React from "react"; + import MkdSDK from "Utils/MkdSDK"; + import { useNavigate } from "react-router-dom"; + import { AuthContext, tokenExpireError } from "Context/Auth"; + import { GlobalContext } from "Context/Global"; + import { yupResolver } from "@hookform/resolvers/yup"; + import { useForm } from "react-hook-form"; + import * as yup from "yup"; + import { getNonNullValue } from "Utils/utils"; + import { PaginationBar } from "Components/PaginationBar"; + import { AddButton } from "Components/AddButton"; + import { SkeletonLoader } from "Components/Skeleton"; + import { BiFilterAlt, BiSearch } from "react-icons/bi"; + import { AiOutlineClose, AiOutlinePlus } from "react-icons/ai"; + import { RiDeleteBin5Line } from "react-icons/ri"; + import { ModalSidebar } from "Components/ModalSidebar"; + import { AddAdminUserPage, EditAdminUserPage } from "Src/routes/LazyLoad"; + + let sdk = new MkdSDK(); + + const columns = [ + { + header: "Email", + accessor: "email", + }, + { + header: "Role", + accessor: "role", + }, + { + header: "Status", + accessor: "status", + mapping: ["Inactive", "Active", "Suspend"], + }, + { + header: "Action", + accessor: "", + }, + ]; + const AdminUserListPage = () => { + const { dispatch: globalDispatch } = React.useContext(GlobalContext); + const { dispatch } = React.useContext(AuthContext); + const [query, setQuery] = React.useState(""); + const [data, setCurrentTableData] = React.useState([]); + const [pageSize, setPageSize] = React.useState(10); + const [pageCount, setPageCount] = React.useState(0); + const [dataTotal, setDataTotal] = React.useState(0); + const [currentPage, setPage] = React.useState(0); + const [canPreviousPage, setCanPreviousPage] = React.useState(false); + const [canNextPage, setCanNextPage] = React.useState(false); + const [openFilter, setOpenFilter] = React.useState(false); + const [showFilterOptions, setShowFilterOptions] = React.useState(false); + const [selectedOptions, setSelectedOptions] = React.useState([]); + const [filterConditions, setFilterConditions] = React.useState([]); + const [searchValue, setSearchValue] = React.useState(""); + const [optionValue, setOptionValue] = React.useState("eq"); + const [loading, setLoading] = React.useState(true); + const [showEditSidebar, setShowEditSidebar] = React.useState(false); + const [showAddSidebar, setShowAddSidebar] = React.useState(false); + const [activeEditId, setActiveEditId] = React.useState(); + const navigate = useNavigate(); + const dropdownFilterRef = React.useRef(null); + + const schema = yup.object({ + id: yup.string(), + email: yup.string(), + role: yup.string(), + status: yup.string(), + }); + + const { + register, + handleSubmit, + formState: { errors }, + } = useForm({ + resolver: yupResolver(schema), + }); + + const selectRole = ["", "admin", "employee"]; + const selectStatus = [ + { key: "", value: "All" }, + { key: "0", value: "Inactive" }, + { key: "1", value: "Active" }, + { key: "2", value: "Suspend" }, + ]; + + function updatePageSize(limit) { + (async function () { + setPageSize(limit); + await getData(0, limit); + })(); + } + function previousPage() { + (async function () { + await getData(currentPage - 1 > 0 ? currentPage - 1 : 0, pageSize); + })(); + } + + function nextPage() { + (async function () { + await getData( + currentPage + 1 <= pageCount ? currentPage + 1 : 0, + pageSize + ); + })(); + } + + const addFilterCondition = (option, selectedValue, inputValue) => { + const input = + selectedValue === "eq" && isNaN(inputValue) + ? `"${inputValue}"` + : inputValue; + const condition = `${option},${selectedValue},${input}`; + setFilterConditions((prevConditions) => { + const newConditions = prevConditions.filter( + (condition) => !condition.includes(option) + ); + return [...newConditions, condition]; + }); + setSearchValue(inputValue); + }; + + async function getData(pageNum, limitNum, data) { + setLoading(true); + try { + sdk.setTable("user"); + const result = await sdk.callRestAPI( + { + payload: { + ...data, + }, + page: pageNum, + limit: limitNum, + filter: [...filterConditions], + }, + "PAGINATE" + ); + if (result) { + setLoading(false); + } + const { list, total, limit, num_pages, page } = result; + + setCurrentTableData(list); + setPageSize(limit); + setPageCount(num_pages); + setPage(page); + setDataTotal(total); + setCanPreviousPage(page > 1); + setCanNextPage(page + 1 <= num_pages); + } catch (error) { + setLoading(false); + console.log("ERROR", error); + tokenExpireError(dispatch, error.message); + } + } + + const onSubmit = (data) => { + const email = getNonNullValue(data.email); + const role = getNonNullValue(data.role); + const status = getNonNullValue(data.status); + const id = getNonNullValue(data.id); + getData(0, pageSize, { email, role, status, id }); + }; + + React.useEffect(() => { + globalDispatch({ + type: "SETPATH", + payload: { + path: "users", + }, + }); + + const delay = 700; + const timeoutId = setTimeout(async () => { + await getData(1, pageSize); + }, delay); + + return () => { + clearTimeout(timeoutId); + }; + }, [searchValue, filterConditions, optionValue]); + + const handleClickOutside = (event) => { + if (dropdownFilterRef.current && !dropdownFilterRef.current.contains(event.target)) { + setOpenFilter(false); + } + }; + + React.useEffect(() => { + document.addEventListener('mousedown', handleClickOutside); + return () => { + document.removeEventListener('mousedown', handleClickOutside); + }; + }, []); + + return ( +
    +
    +
    +
    +
    +
    setOpenFilter(!openFilter)} + > + + Filters + {selectedOptions.length > 0 && ( + + {selectedOptions.length} + + )} +
    + {openFilter && ( +
    +
    + {selectedOptions?.map((option, index) => ( +
    +
    + {option} +
    + + + + addFilterCondition( + option, + optionValue, + e.target.value + ) + } + /> + +
    + { + setSelectedOptions((prevOptions) => + prevOptions.filter((op) => op !== option) + ); + setFilterConditions((prevConditions) => { + return prevConditions.filter( + (condition) => !condition.includes(option) + ); + }); + }} + /> +
    + +
    + ))} + +
    +
    { + setShowFilterOptions(!showFilterOptions); + }} + > + + Add filter +
    + + {showFilterOptions && ( +
    +
      + {columns.slice(0, -1).map((column) => ( +
    • { + if (!selectedOptions.includes(column.header)) { + setSelectedOptions((prev) => [ + ...prev, + column.header, + ]); + } + setShowFilterOptions(false); + }} + > + {column.header} +
    • + ))} +
    +
    + )} + {selectedOptions.length > 0 && ( +
    { + setSelectedOptions([]); + setFilterConditions([]); + }} + className="inline-block cursor-pointer rounded px-6 py-2.5 font-medium leading-tight text-gray-600 transition duration-150 ease-in-out" + > + Clear all filter +
    + )} +
    +
    +
    + )} +
    +
    + + addFilterCondition("name", "cs", e.target?.value)} + /> + +
    +
    +
    + setShowAddSidebar(true)} /> +
    + {loading ? ( + + ) : ( +
    + + + + {columns.map((column, index) => ( + + ))} + + + + {data.map((row, i) => { + return ( + + {columns.map((cell, index) => { + if (cell.accessor == "") { + return ( + + ); + } + if (cell.mapping && cell.accessor === "status") { + return ( + + ); + } + if (cell.mapping) { + return ( + + ); + } + return ( + + ); + })} + + ); + })} + +
    + {column.header} + + {column.isSorted + ? column.isSortedDesc + ? " ▼" + : " ▲" + : ""} + +
    + + + {row[cell.accessor] === 1 ? ({cell.mapping[row[cell.accessor]]}) : ({cell.mapping[row[cell.accessor]]})} + + {cell.mapping[row[cell.accessor]]} + + {row[cell.accessor]} +
    + {loading && ( + <> +

    Loading...

    + + )} + {!loading && data.length === 0 && ( + <> +

    + You Don't have any User +

    + + )} +
    + )} + + setShowAddSidebar(false)} + > + + + setShowEditSidebar(false)} + > + + +
    + ); + }; + + export default AdminUserListPage; + + \ No newline at end of file diff --git a/day20/src/pages/Admin/View/AdminDashboardPage.jsx b/day20/src/pages/Admin/View/AdminDashboardPage.jsx new file mode 100644 index 0000000..81729c5 --- /dev/null +++ b/day20/src/pages/Admin/View/AdminDashboardPage.jsx @@ -0,0 +1,28 @@ + + import React from "react"; + import { AuthContext } from "Context/Auth"; + import { GlobalContext } from "Context/Global"; + + const AdminDashboardPage = () => { + const { dispatch } = React.useContext(AuthContext); + const { dispatch: globalDispatch } = React.useContext(GlobalContext); + + React.useEffect(() => { + globalDispatch({ + type: "SETPATH", + payload: { + path: "admin", + }, + }); + }, []); + return ( + <> +
    + Dashboard +
    + + ); + }; + + export default AdminDashboardPage; + \ No newline at end of file diff --git a/day20/src/pages/Admin/View/AdminViewDepartmentTablePage.jsx b/day20/src/pages/Admin/View/AdminViewDepartmentTablePage.jsx new file mode 100644 index 0000000..aa40bf5 --- /dev/null +++ b/day20/src/pages/Admin/View/AdminViewDepartmentTablePage.jsx @@ -0,0 +1,72 @@ + + import React from "react"; + import { useForm } from "react-hook-form"; + import { yupResolver } from "@hookform/resolvers/yup"; + import * as yup from "yup"; + import MkdSDK from "Utils/MkdSDK"; + import { useNavigate, useParams } from "react-router-dom"; + import { tokenExpireError } from "Context/Auth"; + import { GlobalContext, showToast } from "Context/Global"; + import { isImage, empty, isVideo } from "Utils/utils"; + import {MkdInput} from "Components/MkdInput"; + import {SkeletonLoader} from "Components/Skeleton" + + let sdk = new MkdSDK(); + + const ViewDepartmentPage = () => { + const { dispatch: globalDispatch } = React.useContext(GlobalContext); + + const { dispatch } = React.useContext(GlobalContext); + const [viewModel, setViewModel] = React.useState({}); + const [loading, setLoading] = React.useState(true) + + + + const params = useParams(); + + React.useEffect(function () { + (async function () { + try { + setLoading(true) + sdk.setTable("department"); + const result = await sdk.callRestAPI({ id: Number(params?.id), join: "", }, "GET"); + if (!result.error) { + + setViewModel(result.model); + setLoading(false) + + } + } catch (error) { + setLoading(false) + + console.log("error", error); + tokenExpireError(dispatch, error.message); + } + })(); + }, []); + return ( +
    + {loading ? () :( + <> +

    View Department

    + + + +
    +
    +
    Name
    +
    {viewModel?.name}
    +
    +
    + + + + ) + } +
    + ); + }; + + export default ViewDepartmentPage; + + \ No newline at end of file diff --git a/day20/src/pages/Admin/View/AdminViewItemMovementHistoryTablePage.jsx b/day20/src/pages/Admin/View/AdminViewItemMovementHistoryTablePage.jsx new file mode 100644 index 0000000..6bb00c2 --- /dev/null +++ b/day20/src/pages/Admin/View/AdminViewItemMovementHistoryTablePage.jsx @@ -0,0 +1,99 @@ + + import React from "react"; + import { useForm } from "react-hook-form"; + import { yupResolver } from "@hookform/resolvers/yup"; + import * as yup from "yup"; + import MkdSDK from "Utils/MkdSDK"; + import { useNavigate, useParams } from "react-router-dom"; + import { tokenExpireError } from "Context/Auth"; + import { GlobalContext, showToast } from "Context/Global"; + import { isImage, empty, isVideo } from "Utils/utils"; + import {MkdInput} from "Components/MkdInput"; + import {SkeletonLoader} from "Components/Skeleton" + + let sdk = new MkdSDK(); + + const ViewItemMovementHistoryPage = () => { + const { dispatch: globalDispatch } = React.useContext(GlobalContext); + + const { dispatch } = React.useContext(GlobalContext); + const [viewModel, setViewModel] = React.useState({}); + const [loading, setLoading] = React.useState(true) + + + + const params = useParams(); + + React.useEffect(function () { + (async function () { + try { + setLoading(true) + sdk.setTable("item_movement_history"); + const result = await sdk.callRestAPI({ id: Number(params?.id), join: "", }, "GET"); + if (!result.error) { + + setViewModel(result.model); + setLoading(false) + + } + } catch (error) { + setLoading(false) + + console.log("error", error); + tokenExpireError(dispatch, error.message); + } + })(); + }, []); + return ( +
    + {loading ? () :( + <> +

    View Item Movement History

    + + + +
    +
    +
    Product Id
    +
    {viewModel?.product_id}
    +
    +
    + + + +
    +
    +
    Moved From
    +
    {viewModel?.moved_from}
    +
    +
    + + + +
    +
    +
    Moved To
    +
    {viewModel?.moved_to}
    +
    +
    + + + +
    +
    +
    Date
    +
    {viewModel?.date}
    +
    +
    + + + + ) + } +
    + ); + }; + + export default ViewItemMovementHistoryPage; + + \ No newline at end of file diff --git a/day20/src/pages/Admin/View/AdminViewItemsTablePage.jsx b/day20/src/pages/Admin/View/AdminViewItemsTablePage.jsx new file mode 100644 index 0000000..f483fe6 --- /dev/null +++ b/day20/src/pages/Admin/View/AdminViewItemsTablePage.jsx @@ -0,0 +1,117 @@ + + import React from "react"; + import { useForm } from "react-hook-form"; + import { yupResolver } from "@hookform/resolvers/yup"; + import * as yup from "yup"; + import MkdSDK from "Utils/MkdSDK"; + import { useNavigate, useParams } from "react-router-dom"; + import { tokenExpireError } from "Context/Auth"; + import { GlobalContext, showToast } from "Context/Global"; + import { isImage, empty, isVideo } from "Utils/utils"; + import {MkdInput} from "Components/MkdInput"; + import {SkeletonLoader} from "Components/Skeleton" + + let sdk = new MkdSDK(); + + const ViewItemsPage = () => { + const { dispatch: globalDispatch } = React.useContext(GlobalContext); + + const { dispatch } = React.useContext(GlobalContext); + const [viewModel, setViewModel] = React.useState({}); + const [loading, setLoading] = React.useState(true) + + + + const params = useParams(); + + React.useEffect(function () { + (async function () { + try { + setLoading(true) + sdk.setTable("items"); + const result = await sdk.callRestAPI({ id: Number(params?.id), join: "", }, "GET"); + if (!result.error) { + + setViewModel(result.model); + setLoading(false) + + } + } catch (error) { + setLoading(false) + + console.log("error", error); + tokenExpireError(dispatch, error.message); + } + })(); + }, []); + return ( +
    + {loading ? () :( + <> +

    View Items

    + + + +
    +
    +
    Title
    +
    {viewModel?.title}
    +
    +
    + + + +
    +
    +
    Quantity
    +
    {viewModel?.quantity}
    +
    +
    + + + +
    +
    +
    Image
    +
    {viewModel?.image}
    +
    +
    + + + +
    +
    +
    Price
    +
    {viewModel?.price}
    +
    +
    + + + +
    +
    +
    Status
    +
    {viewModel?.status}
    +
    +
    + + + +
    +
    +
    Location
    +
    {viewModel?.location}
    +
    +
    + + + + ) + } +
    + ); + }; + + export default ViewItemsPage; + + \ No newline at end of file diff --git a/day20/src/pages/Admin/View/AdminViewLocationTablePage.jsx b/day20/src/pages/Admin/View/AdminViewLocationTablePage.jsx new file mode 100644 index 0000000..0c7e5da --- /dev/null +++ b/day20/src/pages/Admin/View/AdminViewLocationTablePage.jsx @@ -0,0 +1,72 @@ + + import React from "react"; + import { useForm } from "react-hook-form"; + import { yupResolver } from "@hookform/resolvers/yup"; + import * as yup from "yup"; + import MkdSDK from "Utils/MkdSDK"; + import { useNavigate, useParams } from "react-router-dom"; + import { tokenExpireError } from "Context/Auth"; + import { GlobalContext, showToast } from "Context/Global"; + import { isImage, empty, isVideo } from "Utils/utils"; + import {MkdInput} from "Components/MkdInput"; + import {SkeletonLoader} from "Components/Skeleton" + + let sdk = new MkdSDK(); + + const ViewLocationPage = () => { + const { dispatch: globalDispatch } = React.useContext(GlobalContext); + + const { dispatch } = React.useContext(GlobalContext); + const [viewModel, setViewModel] = React.useState({}); + const [loading, setLoading] = React.useState(true) + + + + const params = useParams(); + + React.useEffect(function () { + (async function () { + try { + setLoading(true) + sdk.setTable("location"); + const result = await sdk.callRestAPI({ id: Number(params?.id), join: "", }, "GET"); + if (!result.error) { + + setViewModel(result.model); + setLoading(false) + + } + } catch (error) { + setLoading(false) + + console.log("error", error); + tokenExpireError(dispatch, error.message); + } + })(); + }, []); + return ( +
    + {loading ? () :( + <> +

    View Location

    + + + +
    +
    +
    Name
    +
    {viewModel?.name}
    +
    +
    + + + + ) + } +
    + ); + }; + + export default ViewLocationPage; + + \ No newline at end of file diff --git a/day20/src/pages/Admin/View/AdminViewUserTablePage.jsx b/day20/src/pages/Admin/View/AdminViewUserTablePage.jsx new file mode 100644 index 0000000..ed98ec3 --- /dev/null +++ b/day20/src/pages/Admin/View/AdminViewUserTablePage.jsx @@ -0,0 +1,207 @@ + + import React from "react"; + import { useForm } from "react-hook-form"; + import { yupResolver } from "@hookform/resolvers/yup"; + import * as yup from "yup"; + import MkdSDK from "Utils/MkdSDK"; + import { useNavigate, useParams } from "react-router-dom"; + import { tokenExpireError } from "Context/Auth"; + import { GlobalContext, showToast } from "Context/Global"; + import { isImage, empty, isVideo } from "Utils/utils"; + import {MkdInput} from "Components/MkdInput"; + import {SkeletonLoader} from "Components/Skeleton" + + let sdk = new MkdSDK(); + + const ViewUserPage = () => { + const { dispatch: globalDispatch } = React.useContext(GlobalContext); + + const { dispatch } = React.useContext(GlobalContext); + const [viewModel, setViewModel] = React.useState({}); + const [loading, setLoading] = React.useState(true) + + + + const params = useParams(); + + React.useEffect(function () { + (async function () { + try { + setLoading(true) + sdk.setTable("user"); + const result = await sdk.callRestAPI({ id: Number(params?.id), join: "", }, "GET"); + if (!result.error) { + + setViewModel(result.model); + setLoading(false) + + } + } catch (error) { + setLoading(false) + + console.log("error", error); + tokenExpireError(dispatch, error.message); + } + })(); + }, []); + return ( +
    + {loading ? () :( + <> +

    View User

    + + + +
    +
    +
    Oauth
    +
    {viewModel?.oauth}
    +
    +
    + + + +
    +
    +
    Role
    +
    {viewModel?.role}
    +
    +
    + + + +
    +
    +
    First Name
    +
    {viewModel?.first_name}
    +
    +
    + + + +
    +
    +
    Last Name
    +
    {viewModel?.last_name}
    +
    +
    + + + +
    +
    +
    Email
    +
    {viewModel?.email}
    +
    +
    + + + +
    +
    +
    Password
    +
    {viewModel?.password}
    +
    +
    + + + +
    +
    +
    Type
    +
    {viewModel?.type}
    +
    +
    + + + +
    +
    +
    Verify
    +
    {viewModel?.verify}
    +
    +
    + + + +
    +
    +
    Phone
    +
    {viewModel?.phone}
    +
    +
    + + + +
    +
    +
    Photo
    +
    {viewModel?.photo}
    +
    +
    + + + +
    +
    +
    Refer
    +
    {viewModel?.refer}
    +
    +
    + + + +
    +
    +
    Stripe Uid
    +
    {viewModel?.stripe_uid}
    +
    +
    + + + +
    +
    +
    Paypal Uid
    +
    {viewModel?.paypal_uid}
    +
    +
    + + + +
    +
    +
    Two Factor Authentication
    +
    {viewModel?.two_factor_authentication}
    +
    +
    + + + +
    +
    +
    Status
    +
    {viewModel?.status}
    +
    +
    + + + +
    +
    +
    Department
    +
    {viewModel?.department}
    +
    +
    + + + + ) + } +
    + ); + }; + + export default ViewUserPage; + + \ No newline at end of file diff --git a/day20/src/pages/Admin/View/CustomAdminProfilePage.jsx b/day20/src/pages/Admin/View/CustomAdminProfilePage.jsx new file mode 100644 index 0000000..b9cff20 --- /dev/null +++ b/day20/src/pages/Admin/View/CustomAdminProfilePage.jsx @@ -0,0 +1,696 @@ + +import React, { useState } from "react"; +import { useForm } from "react-hook-form"; +import { yupResolver } from "@hookform/resolvers/yup"; +import * as yup from "yup"; +import MkdSDK from "Utils/MkdSDK"; +import { GlobalContext, showToast } from "Context/Global"; +import { AuthContext, tokenExpireError } from "Context/Auth"; +import { InteractiveButton } from "Components/InteractiveButton"; +import ModalPrompt from "Components/Modal/ModalPrompt"; +import { SkeletonLoader } from "Components/Skeleton"; +import { FaCloudUploadAlt, FaEye, FaEyeSlash } from "react-icons/fa"; + +let sdk = new MkdSDK(); +const AdminProfilePage = () => { + const schema = yup + .object({ + email: yup.string().email().required(), + }) + .required(); + + const { dispatch } = React.useContext(AuthContext); + const [oldEmail, setOldEmail] = useState(""); + const [fileObj, setFileObj] = React.useState({}); + const [isModalOpen, setIsModalOpen] = useState(false); + const [isEditModalOpen, setIsEditModalOpen] = useState(false); + const [oldPhoto, setOldPhoto] = useState(""); + const [isUploadedPhoto, setIsUploadedPhoto] = useState(false); + const [submitLoading, setSubmitLoading] = useState(false); + const [activeTab, setActiveTab] = useState("Profile"); + const [defaultValues, setDefaultValues] = useState({}); + const [loading, setLoading] = useState(true); + const [showPassword, setShowPassword] = useState(false); + const { dispatch: globalDispatch } = React.useContext(GlobalContext); + const { + register, + handleSubmit, + setError, + setValue, + formState: { errors }, + } = useForm({ + resolver: yupResolver(schema), + }); + + const togglePasswordVisibility = () => { + setShowPassword(!showPassword); + }; + + const previewImage = (field, target, multiple = false) => { + setIsUploadedPhoto(true); + let tempFileObj = fileObj; + if (multiple) { + if (tempFileObj[field]) { + tempFileObj[field] = [ + ...tempFileObj[field], + { + file: target.files[0], + tempFile: { + url: URL.createObjectURL(target.files[0]), + name: target.files[0].name, + type: target.files[0].type, + }, + }, + ]; + } else { + tempFileObj[field] = [ + { + file: target.files[0], + tempFile: { + url: URL.createObjectURL(target.files[0]), + name: target.files[0].name, + type: target.files[0].type, + }, + }, + ]; + } + } else { + tempFileObj[field] = { + file: target.files[0], + tempURL: URL.createObjectURL(target.files[0]), + }; + } + setFileObj({ ...tempFileObj }); + }; + + async function fetchData() { + setLoading(true); + try { + const result = await sdk.getProfile(); + if (!result.error) { + setDefaultValues(result); + setValue("email", result?.email); + setValue("first_name", result?.first_name); + setValue("last_name", result?.last_name); + setOldEmail(result?.email); + setOldPhoto(result?.photo); + dispatch({ + type: "UPDATE_PROFILE", + payload: result, + }); + setLoading(false); + } + } catch (error) { + tokenExpireError( + dispatch, + error.response.data.message + ? error.response.data.message + : error.message + ); + } + } + + const onSubmit = async (data) => { + if ( + defaultValues.email === data.email && + defaultValues.first_name === data.first_name && + defaultValues.last_name === data.last_name && + !isUploadedPhoto && + !data.password + ) { + closeModal(); + return showToast(globalDispatch, "No Changes Available", 1000); + } + + setDefaultValues(data); + try { + setSubmitLoading(true); + if (fileObj && fileObj["photo"] && fileObj["photo"]?.file) { + let formData = new FormData(); + formData.append("file", fileObj["photo"]?.file); + let uploadResult = await sdk.uploadImage(formData); + data["photo"] = uploadResult.url; + showToast(globalDispatch, "Profile Photo Updated", 1000); + } + + const result = await sdk.updateProfile({ + first_name: data.first_name || defaultValues?.first_name, + last_name: data.last_name || defaultValues?.last_name, + photo: data.photo || oldPhoto, + }); + + if (!result.error) { + showToast(globalDispatch, "Profile Updated", 4000); + closeModal(); + fetchData(); + } else { + if (result.validation) { + const keys = Object.keys(result.validation); + for (let i = 0; i < keys.length; i++) { + const field = keys[i]; + setError(field, { + type: "manual", + message: result.validation[field], + }); + } + } + closeModal(); + } + if (oldEmail !== data.email) { + const emailresult = await sdk.updateEmail(data.email); + if (!emailresult.error) { + showToast(globalDispatch, "Email Updated", 1000); + } else { + if (emailresult.validation) { + const keys = Object.keys(emailresult.validation); + for (let i = 0; i < keys.length; i++) { + const field = keys[i]; + setError(field, { + type: "manual", + message: emailresult.validation[field], + }); + } + } + } + closeModal(); + } + + if (data.password?.length > 0) { + const passwordresult = await sdk.updatePassword(data.password); + if (!passwordresult.error) { + showToast(globalDispatch, "Password Updated", 2000); + } else { + if (passwordresult.validation) { + const keys = Object.keys(passwordresult.validation); + for (let i = 0; i < keys.length; i++) { + const field = keys[i]; + setError(field, { + type: "manual", + message: passwordresult.validation[field], + }); + } + } + } + } + data.photo = ""; + await fetchData(); + setSubmitLoading(false); + } catch (error) { + setSubmitLoading(false); + setError("email", { + type: "manual", + message: error.response.data.message + ? error.response.data.message + : error.message, + }); + tokenExpireError( + dispatch, + error.response.data.message + ? error.response.data.message + : error.message + ); + } + }; + + const onDeleteProfile = async () => { + setFileObj({}); + setOldPhoto(""); + setIsUploadedPhoto(true); + }; + + React.useEffect(() => { + globalDispatch({ + type: "SETPATH", + payload: { + path: "profile", + }, + }); + + fetchData(); + }, []); + + const openModalEdit = () => { + setIsEditModalOpen(true); + }; + + const closeModal = () => { + setIsModalOpen(false); + setIsEditModalOpen(false); + setOldPhoto(defaultValues?.photo); + setFileObj({}); + setIsUploadedPhoto(false); + }; + + return ( +
    +
    +
    +
    setActiveTab("Profile")} + > + Profile +
    +
    setActiveTab("Security")} + > + Security +
    +
    +
    +
    + {/* Profile Tab */} + {activeTab === "Profile" && ( +
    +
    +

    + {errors.photo?.message} +

    +
    +
    +

    + Personal Details +

    + {!loading ? ( +

    + Edit +

    + ) : ( +
    + +
    + )} +
    + +
    +
    +

    + Profile Picture +

    + + {loading ? ( +
    +
    + +
    +
    + ) : defaultValues?.photo ? ( +
    + +
    + ) : ( +
    +
    + No Image +
    +
    + )} +
    +
    + +
    +
    +

    + First Name +

    +

    + {defaultValues?.first_name} +

    +
    +
    + +
    +
    +

    + Last Name +

    +

    + {defaultValues?.last_name} +

    +
    +
    +
    +
    +

    Email

    +

    + {oldEmail} +

    +
    +
    +
    +
    +
    + )} + + {/* Security tab */} + {activeTab === "Security" && ( +
    +
    +
    +
    + +
    + +
    + {showPassword ? () : ()} +
    +
    +

    + {errors.password?.message} +

    +
    +
    + + Update + +
    +
    +
    +
    + )} + + {isModalOpen && ( + + )} + + {isEditModalOpen && ( + + )} +
    +
    + ); +}; + +export const EditInfoModal = (props) => { + const { + title, + isOpen, + onClose, + handleSubmit, + onSubmit, + register, + submitLoading, + errors, + oldPhoto, + fileObj, + onDeleteProfile, + previewImage, + oldEmail, + } = props; + const [emailConfirm, setEmailConfirm] = useState(false); + const [values, setValues] = useState({ + email: "", + }); + + React.useEffect(() => { + setValues({ ...values, email: oldEmail }); + setEmailConfirm(false); + }, []); + + const handleChange = (prop) => (event) => { + if (prop === "email") { + setValues({ ...values, [prop]: event.target.value }); + } + }; + + return ( +
    +
    +
    +
    +
    +
    + +
    +
    +
    + {title} +
    + +
    +
    +
    + + {oldPhoto ? ( +
    +
    + + +
    + + X + +
    +
    +
    + ) : ( +
    +
    + {fileObj["photo"]?.tempURL ? ( + + ) : ( + + )} +
    +
    + )} +
    + + +

    + {errors?.id?.message} +

    +
    +
    + + +

    + {errors?.id?.message} +

    +
    + {emailConfirm && oldEmail !== values.email ? ( +
    +
    + + + +
    +
    +

    + We've send an email to: {values?.email} +

    +

    +

    + In order to complete the email update click the + confirmation link. +

    +

    + (the link expires in 24 hours) +

    +
    +
    + ) : ( +
    + + +

    + {errors?.id?.message} +

    +
    + )} +
    + +
    + + + setEmailConfirm(true)} + > + Save + +
    +
    +
    +
    +
    +
    + ); +}; + +export default AdminProfilePage; + diff --git a/day20/src/pages/MagicLogin/MagicLoginVerifyPage.jsx b/day20/src/pages/MagicLogin/MagicLoginVerifyPage.jsx new file mode 100644 index 0000000..a03f7a7 --- /dev/null +++ b/day20/src/pages/MagicLogin/MagicLoginVerifyPage.jsx @@ -0,0 +1,61 @@ + +import React from "react"; +import MkdSDK from "Utils/MkdSDK"; +import { Link, useParams, useSearchParams } from "react-router-dom"; +import { useNavigate } from "react-router-dom"; +import { AuthContext } from "Context/Auth"; +import { GlobalContext, showToast } from "Context/Global"; + +const MagicLoginVerifyPage = () => { + + + const { dispatch } = React.useContext(AuthContext); + const { dispatch:GlobalDispatch } = React.useContext(GlobalContext); + + const navigate = useNavigate(); + const [search, setSearch] = useSearchParams(); + + + const login = async () => { + let sdk = new MkdSDK(); + try { + let token = search.get('token') ?? null; + const result = await sdk.magicLoginVerify(token); + if (!result.error) { + dispatch({ + type: "LOGIN", + payload: result, + }); + navigate(`/${result.role}/dashboard`); + } else { + navigate('/user/login') + } + } catch (error) { + navigate('/user/login') + // console.log("Error", error); + // setError("email", { + // type: "manual", + // message: error.message, + // }); + } + }; + + React.useEffect(() => { + ( async () => { + await login(); + })() + }); + + return ( + <> +
    + + + + +
    + + ); +}; + +export default MagicLoginVerifyPage; diff --git a/day20/src/pages/MagicLogin/UserMagicLoginPage.jsx b/day20/src/pages/MagicLogin/UserMagicLoginPage.jsx new file mode 100644 index 0000000..a1acb31 --- /dev/null +++ b/day20/src/pages/MagicLogin/UserMagicLoginPage.jsx @@ -0,0 +1,107 @@ + +import React, {useContext} from "react"; +import { useForm } from "react-hook-form"; +import { yupResolver } from "@hookform/resolvers/yup"; +import * as yup from "yup"; +import MkdSDK from "Utils/MkdSDK"; +import { Link, useParams } from "react-router-dom"; +import { useNavigate } from "react-router-dom"; +import { AuthContext } from "Context/Auth"; +import { GlobalContext, showToast } from "Context/Global"; + +const UserMagicLoginPage = () => { + const schema = yup + .object({ + email: yup.string().email().required(), + }) + .required(); + + const { dispatch } = React.useContext(AuthContext); + const { dispatch:GlobalDispatch } = React.useContext(GlobalContext); + + const [attemptingLogin, setAttemptingLogin] = React.useState(false) + + const params = useParams(); + + const navigate = useNavigate(); + const { + register, + handleSubmit, + setError, + formState: { errors }, + } = useForm({ + resolver: yupResolver(schema), + }); + + const onSubmit = async (data) => { + let sdk = new MkdSDK(); + try { + setAttemptingLogin(true) + const result = await sdk.magicLoginAttempt(data.email, params?.role); + + if (!result.error) { + setAttemptingLogin(false) + console.log(result); + showToast(GlobalDispatch, 'Please check your mail to complete login attempt') + + // dispatch({ + // type: "LOGIN", + // payload: result, + // }); + // navigate("/user/dashboard"); + } + + + } catch (error) { + setAttemptingLogin(false) + console.log("Error", error); + setError("email", { + type: "manual", + message: error.message, + }); + } + }; + + return ( +
    +
    +
    + + +

    {errors.email?.message}

    +
    + + +
    + + +
    +
    +

    + © {new Date().getFullYear()} manaknightdigital inc. All rights + reserved. +

    +
    + ); +}; + +export default UserMagicLoginPage; diff --git a/day20/src/pages/Member/Auth/CustomMemberLoginPage.jsx b/day20/src/pages/Member/Auth/CustomMemberLoginPage.jsx new file mode 100644 index 0000000..5a4f76c --- /dev/null +++ b/day20/src/pages/Member/Auth/CustomMemberLoginPage.jsx @@ -0,0 +1,184 @@ + + import React, { useState } from "react"; +import { useForm } from "react-hook-form"; +import { yupResolver } from "@hookform/resolvers/yup"; +import * as yup from "yup"; +import MkdSDK from "Utils/MkdSDK"; +import { Link, useLocation } from "react-router-dom"; +import { useNavigate } from "react-router-dom"; +import { InteractiveButton } from "Components/InteractiveButton"; +import { AuthContext } from "Context/Auth"; +import { GlobalContext, showToast } from "Context/Global"; +import { LoginBgNew } from "Assets/images"; + +let sdk = new MkdSDK(); + +const MemberLoginPage = () => { + const schema = yup + .object({ + email: yup.string().email().required(), + password: yup.string().required(), + }) + .required(); + + const { dispatch } = React.useContext(AuthContext); + const { dispatch: GlobalDispatch } = React.useContext(GlobalContext); + + const [submitLoading, setSubmitLoading] = useState(false); + const [showPassword, setShowPassword] = useState(false); + const location = useLocation(); + const searchParams = new URLSearchParams(location.search); + const redirect_uri = searchParams.get("redirect_uri"); + const navigate = useNavigate(); + const { + register, + handleSubmit, + setError, + formState: { errors }, + } = useForm({ + resolver: yupResolver(schema), + }); + + const onSubmit = async (data) => { + try { + setSubmitLoading(true); + const result = await sdk.login(data.email, data.password, "member"); + if (!result.error) { + + dispatch({ + type: "LOGIN", + payload: result, + }); + showToast(GlobalDispatch, "Succesfully Logged In", 4000, "success"); + navigate(redirect_uri ?? "/member/dashboard"); + + } else { + setSubmitLoading(false); + if (result.validation) { + const keys = Object.keys(result.validation); + for (let i = 0; i < keys.length; i++) { + const field = keys[i]; + setError(field, { + type: "manual", + message: result.validation[field], + }); + } + } + } + } catch (error) { + setSubmitLoading(false); + showToast( + GlobalDispatch, + error?.response?.data?.message + ? error?.response?.data?.message + : error?.message, + 4000, + "error" + ); + console.log("Error", error); + setError("email", { + type: "manual", + message: error?.response?.data?.message + ? error?.response?.data?.message + : error?.message, + }); + } + }; + + + + return ( +
    + +
    + +
    + + + + +
    Welcome Back
    +
    Don’t have account? Sign up here
    + +
    + + + + +
    + + + +
    +
    + + +

    + {errors?.email?.message} +

    +
    +
    + +
    + + setShowPassword(!showPassword)}> + { + showPassword ? ( + + + + ) : ( + + + + + ) + } + +
    +

    + {errors?.password?.message} +

    +
    +
    +
    + + Remember me +
    + Forgot password +
    + + Sign in + +
    + + + +
    + +
    +
    + ) +}; + +export default MemberLoginPage; + + \ No newline at end of file diff --git a/day20/src/pages/Member/Auth/CustomMemberSignUpPage.jsx b/day20/src/pages/Member/Auth/CustomMemberSignUpPage.jsx new file mode 100644 index 0000000..d332ac4 --- /dev/null +++ b/day20/src/pages/Member/Auth/CustomMemberSignUpPage.jsx @@ -0,0 +1,156 @@ + +import React, { useState } from "react"; +import { useForm } from "react-hook-form"; +import { yupResolver } from "@hookform/resolvers/yup"; +import * as yup from "yup"; +import MkdSDK from "Utils/MkdSDK"; +import { Link, useLocation } from "react-router-dom"; +import { useNavigate } from "react-router-dom"; +import { InteractiveButton } from "Components/InteractiveButton"; +import { AuthContext } from "Context/Auth"; +import { GlobalContext, showToast } from "Context/Global"; +import { LoginBgNew } from "Assets/images"; + +let sdk = new MkdSDK(); + +const MemberSignUpPage = () => { + const schema = yup + .object({ + email: yup.string().email().required(), + password: yup.string().required(), + }) + .required(); + + const { dispatch } = React.useContext(AuthContext); + const { dispatch: GlobalDispatch } = React.useContext(GlobalContext); + + const [submitLoading, setSubmitLoading] = useState(false) + const location = useLocation() + const searchParams = new URLSearchParams(location.search) + const redirect_uri = searchParams.get('redirect_uri') + + const navigate = useNavigate(); + const { + register, + handleSubmit, + setError, + formState: { errors }, + } = useForm({ + resolver: yupResolver(schema), + }); + + const onSubmit = async (data) => { + try { + setSubmitLoading(true) + const result = await sdk.register(data.email, data.password, "member"); + if (!result.error) { + dispatch({ + type: "LOGIN", + payload: result, + }); + showToast(GlobalDispatch, "Succesfully Registered", 4000, "success") + navigate(redirect_uri ?? "/member/dashboard"); + + } else { + setSubmitLoading(false) + if (result.validation) { + const keys = Object.keys(result.validation); + for (let i = 0; i < keys.length; i++) { + const field = keys[i]; + setError(field, { + type: "manual", + message: result.validation[field], + }); + } + } + } + } catch (error) { + setSubmitLoading(false) + console.log("Error", error); + showToast(GlobalDispatch, error?.message, 4000, "error") + setError("email", { + type: "manual", + message: error?.response?.data?.message ? error?.response?.data?.message : error?.message, + }); + } + }; + + return ( +
    +
    +
    +
    +

    Register

    +
    + + + +

    {errors.email?.message}

    +
    + +
    + + + +

    {errors.password?.message}

    +
    + + {/* Forgot Password */} + + + Register + +
    + + {/*
    OR
    */} +
    +
    +

    Already have an account? Login

    +
    +
    + {/*
    */} +

    © {new Date().getFullYear()} manaknightdigital inc. All rights reserved.

    +
    +
    +
    +
    + + +
    + + ); +}; + +export default MemberSignUpPage; diff --git a/day20/src/pages/Member/Auth/MemberForgotPage.jsx b/day20/src/pages/Member/Auth/MemberForgotPage.jsx new file mode 100644 index 0000000..b906c68 --- /dev/null +++ b/day20/src/pages/Member/Auth/MemberForgotPage.jsx @@ -0,0 +1,115 @@ + + import React, {useState } from "react"; + import { useForm } from "react-hook-form"; + import { yupResolver } from "@hookform/resolvers/yup"; + import * as yup from "yup"; + import { Link } from "react-router-dom"; + import MkdSDK from "Utils/MkdSDK"; + import { tokenExpireError } from "Context/Auth"; + import { GlobalContext, showToast } from "Context/Global"; + import { InteractiveButton } from "Components/InteractiveButton"; + +const MemberForgotPage = () => { + + const [submitLoading, setSubmitLoading] = useState(false); + + const schema = yup + .object({ + email: yup.string().email().required(), + }) + .required(); + + const { + register, + handleSubmit, + setError, + formState: { errors }, + } = useForm({ + resolver: yupResolver(schema), + }); + + const { dispatch } = React.useContext(GlobalContext); + + const onSubmit = async (data) => { + let sdk = new MkdSDK(); + try { + setSubmitLoading(true) + const result = await sdk.forgot(data.email, member); + + if (!result.error) { + showToast(dispatch, "Reset Code Sent"); + } else { + if (result.validation) { + const keys = Object.keys(result.validation); + for (let i = 0; i < keys.length; i++) { + const field = keys[i]; + setError(field, { + type: "manual", + message: result.validation[field], + }); + } + } + } + setSubmitLoading(false) + } catch (error) { + setSubmitLoading(false) + console.log("Error", error); + setError("email", { + type: "manual", + message: error?.response?.data?.message?error?.response?.data?.message:error?.message, + }); + tokenExpireError(dispatch, error?.response?.data?.message?error?.response?.data?.message:error?.message); + } + } + + return ( + <> +
    +
    +
    + + +

    + {errors && errors.email?.message} +

    +
    + +
    + + Forgot Password + + + Login? + +
    +
    +

    + © {new Date().getFullYear()} manaknightdigital inc. All rights + reserved. +

    +
    + + ); +} + + export default MemberForgotPage; diff --git a/day20/src/pages/Member/Auth/MemberResetPage.jsx b/day20/src/pages/Member/Auth/MemberResetPage.jsx new file mode 100644 index 0000000..abd5144 --- /dev/null +++ b/day20/src/pages/Member/Auth/MemberResetPage.jsx @@ -0,0 +1,168 @@ + + import React, {useState} from "react"; + import { useForm } from "react-hook-form"; + import { yupResolver } from "@hookform/resolvers/yup"; + import * as yup from "yup"; + import MkdSDK from "Utils/MkdSDK"; + import { Link } from "react-router-dom"; + import { useNavigate } from "react-router-dom"; + import { AuthContext, tokenExpireError } from "Context/Auth"; + import { showToast } from "Context/Global"; + import { InteractiveButton } from "Components/InteractiveButton"; + + const MemberResetPage = () => { + const { dispatch } = React.useContext(AuthContext); + const [submitLoading, setSubmitLoading] = useState(false); + const search = window.location.search; + const params = new URLSearchParams(search); + const token = params.get("token"); + + const schema = yup + .object({ + code: yup.string().required(), + password: yup.string().required(), + confirmPassword: yup + .string() + .oneOf([yup.ref("password"), null], "Passwords must match"), + }) + .required(); + + const navigate = useNavigate(); + + const { + register, + handleSubmit, + setError, + formState: { errors }, + } = useForm({ + resolver: yupResolver(schema), + }); + + const onSubmit = async (data) => { + let sdk = new MkdSDK(); + try { + setSubmitLoading(true) + const result = await sdk.reset(token, data.code, data.password); + if (!result.error) { + showToast(dispatch, "Password Reset"); + setTimeout(() => { + navigate(`/member/login`); + }, 2000); + } else { + if (result.validation) { + const keys = Object.keys(result.validation); + for (let i = 0; i < keys.length; i++) { + const field = keys[i]; + setError(field, { + type: "manual", + message: result.validation[field], + }); + } + } + } + setSubmitLoading(false) + } catch (error) { + setSubmitLoading(false) + console.log("Error", error); + setError("code", { + type: "manual", + message: error?.response?.data?.message?error?.response?.data?.message:error?.message, + }); + tokenExpireError(dispatch, error?.response?.data?.message?error?.response?.data?.message:error?.message); + } + }; + + return ( + <> +
    +
    +
    + + +

    + {errors.code?.message} +

    +
    +
    + + +

    + {errors.password?.message} +

    +
    +
    + + +

    + {errors.confirmPassword?.message} +

    +
    +
    + + Reset Password + + + Login? + +
    +
    +

    + © {new Date().getFullYear()} manaknightdigital inc. All rights + reserved. +

    +
    + + ); + }; + + export default MemberResetPage; + + + \ No newline at end of file diff --git a/day20/src/pages/Member/View/CustomMemberProfilePage.jsx b/day20/src/pages/Member/View/CustomMemberProfilePage.jsx new file mode 100644 index 0000000..c9ae972 --- /dev/null +++ b/day20/src/pages/Member/View/CustomMemberProfilePage.jsx @@ -0,0 +1,696 @@ + +import React, { useState } from "react"; +import { useForm } from "react-hook-form"; +import { yupResolver } from "@hookform/resolvers/yup"; +import * as yup from "yup"; +import MkdSDK from "Utils/MkdSDK"; +import { GlobalContext, showToast } from "Context/Global"; +import { AuthContext, tokenExpireError } from "Context/Auth"; +import { InteractiveButton } from "Components/InteractiveButton"; +import ModalPrompt from "Components/Modal/ModalPrompt"; +import { SkeletonLoader } from "Components/Skeleton"; +import { FaCloudUploadAlt, FaEye, FaEyeSlash } from "react-icons/fa"; + +let sdk = new MkdSDK(); +const MemberProfilePage = () => { + const schema = yup + .object({ + email: yup.string().email().required(), + }) + .required(); + + const { dispatch } = React.useContext(AuthContext); + const [oldEmail, setOldEmail] = useState(""); + const [fileObj, setFileObj] = React.useState({}); + const [isModalOpen, setIsModalOpen] = useState(false); + const [isEditModalOpen, setIsEditModalOpen] = useState(false); + const [oldPhoto, setOldPhoto] = useState(""); + const [isUploadedPhoto, setIsUploadedPhoto] = useState(false); + const [submitLoading, setSubmitLoading] = useState(false); + const [activeTab, setActiveTab] = useState("Profile"); + const [defaultValues, setDefaultValues] = useState({}); + const [loading, setLoading] = useState(true); + const [showPassword, setShowPassword] = useState(false); + const { dispatch: globalDispatch } = React.useContext(GlobalContext); + const { + register, + handleSubmit, + setError, + setValue, + formState: { errors }, + } = useForm({ + resolver: yupResolver(schema), + }); + + const togglePasswordVisibility = () => { + setShowPassword(!showPassword); + }; + + const previewImage = (field, target, multiple = false) => { + setIsUploadedPhoto(true); + let tempFileObj = fileObj; + if (multiple) { + if (tempFileObj[field]) { + tempFileObj[field] = [ + ...tempFileObj[field], + { + file: target.files[0], + tempFile: { + url: URL.createObjectURL(target.files[0]), + name: target.files[0].name, + type: target.files[0].type, + }, + }, + ]; + } else { + tempFileObj[field] = [ + { + file: target.files[0], + tempFile: { + url: URL.createObjectURL(target.files[0]), + name: target.files[0].name, + type: target.files[0].type, + }, + }, + ]; + } + } else { + tempFileObj[field] = { + file: target.files[0], + tempURL: URL.createObjectURL(target.files[0]), + }; + } + setFileObj({ ...tempFileObj }); + }; + + async function fetchData() { + setLoading(true); + try { + const result = await sdk.getProfile(); + if (!result.error) { + setDefaultValues(result); + setValue("email", result?.email); + setValue("first_name", result?.first_name); + setValue("last_name", result?.last_name); + setOldEmail(result?.email); + setOldPhoto(result?.photo); + dispatch({ + type: "UPDATE_PROFILE", + payload: result, + }); + setLoading(false); + } + } catch (error) { + tokenExpireError( + dispatch, + error.response.data.message + ? error.response.data.message + : error.message + ); + } + } + + const onSubmit = async (data) => { + if ( + defaultValues.email === data.email && + defaultValues.first_name === data.first_name && + defaultValues.last_name === data.last_name && + !isUploadedPhoto && + !data.password + ) { + closeModal(); + return showToast(globalDispatch, "No Changes Available", 1000); + } + + setDefaultValues(data); + try { + setSubmitLoading(true); + if (fileObj && fileObj["photo"] && fileObj["photo"]?.file) { + let formData = new FormData(); + formData.append("file", fileObj["photo"]?.file); + let uploadResult = await sdk.uploadImage(formData); + data["photo"] = uploadResult.url; + showToast(globalDispatch, "Profile Photo Updated", 1000); + } + + const result = await sdk.updateProfile({ + first_name: data.first_name || defaultValues?.first_name, + last_name: data.last_name || defaultValues?.last_name, + photo: data.photo || oldPhoto, + }); + + if (!result.error) { + showToast(globalDispatch, "Profile Updated", 4000); + closeModal(); + fetchData(); + } else { + if (result.validation) { + const keys = Object.keys(result.validation); + for (let i = 0; i < keys.length; i++) { + const field = keys[i]; + setError(field, { + type: "manual", + message: result.validation[field], + }); + } + } + closeModal(); + } + if (oldEmail !== data.email) { + const emailresult = await sdk.updateEmail(data.email); + if (!emailresult.error) { + showToast(globalDispatch, "Email Updated", 1000); + } else { + if (emailresult.validation) { + const keys = Object.keys(emailresult.validation); + for (let i = 0; i < keys.length; i++) { + const field = keys[i]; + setError(field, { + type: "manual", + message: emailresult.validation[field], + }); + } + } + } + closeModal(); + } + + if (data.password?.length > 0) { + const passwordresult = await sdk.updatePassword(data.password); + if (!passwordresult.error) { + showToast(globalDispatch, "Password Updated", 2000); + } else { + if (passwordresult.validation) { + const keys = Object.keys(passwordresult.validation); + for (let i = 0; i < keys.length; i++) { + const field = keys[i]; + setError(field, { + type: "manual", + message: passwordresult.validation[field], + }); + } + } + } + } + data.photo = ""; + await fetchData(); + setSubmitLoading(false); + } catch (error) { + setSubmitLoading(false); + setError("email", { + type: "manual", + message: error.response.data.message + ? error.response.data.message + : error.message, + }); + tokenExpireError( + dispatch, + error.response.data.message + ? error.response.data.message + : error.message + ); + } + }; + + const onDeleteProfile = async () => { + setFileObj({}); + setOldPhoto(""); + setIsUploadedPhoto(true); + }; + + React.useEffect(() => { + globalDispatch({ + type: "SETPATH", + payload: { + path: "profile", + }, + }); + + fetchData(); + }, []); + + const openModalEdit = () => { + setIsEditModalOpen(true); + }; + + const closeModal = () => { + setIsModalOpen(false); + setIsEditModalOpen(false); + setOldPhoto(defaultValues?.photo); + setFileObj({}); + setIsUploadedPhoto(false); + }; + + return ( +
    +
    +
    +
    setActiveTab("Profile")} + > + Profile +
    +
    setActiveTab("Security")} + > + Security +
    +
    +
    +
    + {/* Profile Tab */} + {activeTab === "Profile" && ( +
    +
    +

    + {errors.photo?.message} +

    +
    +
    +

    + Personal Details +

    + {!loading ? ( +

    + Edit +

    + ) : ( +
    + +
    + )} +
    + +
    +
    +

    + Profile Picture +

    + + {loading ? ( +
    +
    + +
    +
    + ) : defaultValues?.photo ? ( +
    + +
    + ) : ( +
    +
    + No Image +
    +
    + )} +
    +
    + +
    +
    +

    + First Name +

    +

    + {defaultValues?.first_name} +

    +
    +
    + +
    +
    +

    + Last Name +

    +

    + {defaultValues?.last_name} +

    +
    +
    +
    +
    +

    Email

    +

    + {oldEmail} +

    +
    +
    +
    +
    +
    + )} + + {/* Security tab */} + {activeTab === "Security" && ( +
    +
    +
    +
    + +
    + +
    + {showPassword ? () : ()} +
    +
    +

    + {errors.password?.message} +

    +
    +
    + + Update + +
    +
    +
    +
    + )} + + {isModalOpen && ( + + )} + + {isEditModalOpen && ( + + )} +
    +
    + ); +}; + +export const EditInfoModal = (props) => { + const { + title, + isOpen, + onClose, + handleSubmit, + onSubmit, + register, + submitLoading, + errors, + oldPhoto, + fileObj, + onDeleteProfile, + previewImage, + oldEmail, + } = props; + const [emailConfirm, setEmailConfirm] = useState(false); + const [values, setValues] = useState({ + email: "", + }); + + React.useEffect(() => { + setValues({ ...values, email: oldEmail }); + setEmailConfirm(false); + }, []); + + const handleChange = (prop) => (event) => { + if (prop === "email") { + setValues({ ...values, [prop]: event.target.value }); + } + }; + + return ( +
    +
    +
    +
    +
    +
    + +
    +
    +
    + {title} +
    + +
    +
    +
    + + {oldPhoto ? ( +
    +
    + + +
    + + X + +
    +
    +
    + ) : ( +
    +
    + {fileObj["photo"]?.tempURL ? ( + + ) : ( + + )} +
    +
    + )} +
    + + +

    + {errors?.id?.message} +

    +
    +
    + + +

    + {errors?.id?.message} +

    +
    + {emailConfirm && oldEmail !== values.email ? ( +
    +
    + + + +
    +
    +

    + We've send an email to: {values?.email} +

    +

    +

    + In order to complete the email update click the + confirmation link. +

    +

    + (the link expires in 24 hours) +

    +
    +
    + ) : ( +
    + + +

    + {errors?.id?.message} +

    +
    + )} +
    + +
    + + + setEmailConfirm(true)} + > + Save + +
    +
    +
    +
    +
    +
    + ); +}; + +export default MemberProfilePage; + diff --git a/day20/src/pages/Member/View/MemberDashboardPage.jsx b/day20/src/pages/Member/View/MemberDashboardPage.jsx new file mode 100644 index 0000000..f77e2a6 --- /dev/null +++ b/day20/src/pages/Member/View/MemberDashboardPage.jsx @@ -0,0 +1,28 @@ + + import React from "react"; + import { AuthContext } from "Context/Auth"; + import { GlobalContext } from "Context/Global"; + + const MemberDashboardPage = () => { + const { dispatch } = React.useContext(AuthContext); + const { dispatch: globalDispatch } = React.useContext(GlobalContext); + + React.useEffect(() => { + globalDispatch({ + type: "SETPATH", + payload: { + path: "member", + }, + }); + }, []); + return ( + <> +
    + Dashboard +
    + + ); + }; + + export default MemberDashboardPage; + \ No newline at end of file diff --git a/day20/src/pages/Public/Auth/CustomPublicLoginPage.jsx b/day20/src/pages/Public/Auth/CustomPublicLoginPage.jsx new file mode 100644 index 0000000..4623b37 --- /dev/null +++ b/day20/src/pages/Public/Auth/CustomPublicLoginPage.jsx @@ -0,0 +1,184 @@ + + import React, { useState } from "react"; +import { useForm } from "react-hook-form"; +import { yupResolver } from "@hookform/resolvers/yup"; +import * as yup from "yup"; +import MkdSDK from "Utils/MkdSDK"; +import { Link, useLocation } from "react-router-dom"; +import { useNavigate } from "react-router-dom"; +import { InteractiveButton } from "Components/InteractiveButton"; +import { AuthContext } from "Context/Auth"; +import { GlobalContext, showToast } from "Context/Global"; +import { LoginBgNew } from "Assets/images"; + +let sdk = new MkdSDK(); + +const PublicLoginPage = () => { + const schema = yup + .object({ + email: yup.string().email().required(), + password: yup.string().required(), + }) + .required(); + + const { dispatch } = React.useContext(AuthContext); + const { dispatch: GlobalDispatch } = React.useContext(GlobalContext); + + const [submitLoading, setSubmitLoading] = useState(false); + const [showPassword, setShowPassword] = useState(false); + const location = useLocation(); + const searchParams = new URLSearchParams(location.search); + const redirect_uri = searchParams.get("redirect_uri"); + const navigate = useNavigate(); + const { + register, + handleSubmit, + setError, + formState: { errors }, + } = useForm({ + resolver: yupResolver(schema), + }); + + const onSubmit = async (data) => { + try { + setSubmitLoading(true); + const result = await sdk.login(data.email, data.password, "public"); + if (!result.error) { + + dispatch({ + type: "LOGIN", + payload: result, + }); + showToast(GlobalDispatch, "Succesfully Logged In", 4000, "success"); + navigate(redirect_uri ?? "/public/dashboard"); + + } else { + setSubmitLoading(false); + if (result.validation) { + const keys = Object.keys(result.validation); + for (let i = 0; i < keys.length; i++) { + const field = keys[i]; + setError(field, { + type: "manual", + message: result.validation[field], + }); + } + } + } + } catch (error) { + setSubmitLoading(false); + showToast( + GlobalDispatch, + error?.response?.data?.message + ? error?.response?.data?.message + : error?.message, + 4000, + "error" + ); + console.log("Error", error); + setError("email", { + type: "manual", + message: error?.response?.data?.message + ? error?.response?.data?.message + : error?.message, + }); + } + }; + + + + return ( +
    + +
    + +
    + + + + +
    Welcome Back
    +
    Don’t have account? Sign up here
    + +
    + + + + +
    + + + +
    +
    + + +

    + {errors?.email?.message} +

    +
    +
    + +
    + + setShowPassword(!showPassword)}> + { + showPassword ? ( + + + + ) : ( + + + + + ) + } + +
    +

    + {errors?.password?.message} +

    +
    +
    +
    + + Remember me +
    + Forgot password +
    + + Sign in + +
    + + + +
    + +
    +
    + ) +}; + +export default PublicLoginPage; + + \ No newline at end of file diff --git a/day20/src/pages/Public/Auth/CustomPublicSignUpPage.jsx b/day20/src/pages/Public/Auth/CustomPublicSignUpPage.jsx new file mode 100644 index 0000000..ac84751 --- /dev/null +++ b/day20/src/pages/Public/Auth/CustomPublicSignUpPage.jsx @@ -0,0 +1,156 @@ + +import React, { useState } from "react"; +import { useForm } from "react-hook-form"; +import { yupResolver } from "@hookform/resolvers/yup"; +import * as yup from "yup"; +import MkdSDK from "Utils/MkdSDK"; +import { Link, useLocation } from "react-router-dom"; +import { useNavigate } from "react-router-dom"; +import { InteractiveButton } from "Components/InteractiveButton"; +import { AuthContext } from "Context/Auth"; +import { GlobalContext, showToast } from "Context/Global"; +import { LoginBgNew } from "Assets/images"; + +let sdk = new MkdSDK(); + +const PublicSignUpPage = () => { + const schema = yup + .object({ + email: yup.string().email().required(), + password: yup.string().required(), + }) + .required(); + + const { dispatch } = React.useContext(AuthContext); + const { dispatch: GlobalDispatch } = React.useContext(GlobalContext); + + const [submitLoading, setSubmitLoading] = useState(false) + const location = useLocation() + const searchParams = new URLSearchParams(location.search) + const redirect_uri = searchParams.get('redirect_uri') + + const navigate = useNavigate(); + const { + register, + handleSubmit, + setError, + formState: { errors }, + } = useForm({ + resolver: yupResolver(schema), + }); + + const onSubmit = async (data) => { + try { + setSubmitLoading(true) + const result = await sdk.register(data.email, data.password, "public"); + if (!result.error) { + dispatch({ + type: "LOGIN", + payload: result, + }); + showToast(GlobalDispatch, "Succesfully Registered", 4000, "success") + navigate(redirect_uri ?? "/public/dashboard"); + + } else { + setSubmitLoading(false) + if (result.validation) { + const keys = Object.keys(result.validation); + for (let i = 0; i < keys.length; i++) { + const field = keys[i]; + setError(field, { + type: "manual", + message: result.validation[field], + }); + } + } + } + } catch (error) { + setSubmitLoading(false) + console.log("Error", error); + showToast(GlobalDispatch, error?.message, 4000, "error") + setError("email", { + type: "manual", + message: error?.response?.data?.message ? error?.response?.data?.message : error?.message, + }); + } + }; + + return ( +
    +
    +
    +
    +

    Register

    +
    + + + +

    {errors.email?.message}

    +
    + +
    + + + +

    {errors.password?.message}

    +
    + + {/* Forgot Password */} + + + Register + +
    + + {/*
    OR
    */} +
    +
    +

    Already have an account? Login

    +
    +
    + {/*
    */} +

    © {new Date().getFullYear()} manaknightdigital inc. All rights reserved.

    +
    +
    +
    +
    + + +
    + + ); +}; + +export default PublicSignUpPage; diff --git a/day20/src/pages/Public/View/CustomPublicProfilePage.jsx b/day20/src/pages/Public/View/CustomPublicProfilePage.jsx new file mode 100644 index 0000000..e66a0a3 --- /dev/null +++ b/day20/src/pages/Public/View/CustomPublicProfilePage.jsx @@ -0,0 +1,696 @@ + +import React, { useState } from "react"; +import { useForm } from "react-hook-form"; +import { yupResolver } from "@hookform/resolvers/yup"; +import * as yup from "yup"; +import MkdSDK from "Utils/MkdSDK"; +import { GlobalContext, showToast } from "Context/Global"; +import { AuthContext, tokenExpireError } from "Context/Auth"; +import { InteractiveButton } from "Components/InteractiveButton"; +import ModalPrompt from "Components/Modal/ModalPrompt"; +import { SkeletonLoader } from "Components/Skeleton"; +import { FaCloudUploadAlt, FaEye, FaEyeSlash } from "react-icons/fa"; + +let sdk = new MkdSDK(); +const PublicProfilePage = () => { + const schema = yup + .object({ + email: yup.string().email().required(), + }) + .required(); + + const { dispatch } = React.useContext(AuthContext); + const [oldEmail, setOldEmail] = useState(""); + const [fileObj, setFileObj] = React.useState({}); + const [isModalOpen, setIsModalOpen] = useState(false); + const [isEditModalOpen, setIsEditModalOpen] = useState(false); + const [oldPhoto, setOldPhoto] = useState(""); + const [isUploadedPhoto, setIsUploadedPhoto] = useState(false); + const [submitLoading, setSubmitLoading] = useState(false); + const [activeTab, setActiveTab] = useState("Profile"); + const [defaultValues, setDefaultValues] = useState({}); + const [loading, setLoading] = useState(true); + const [showPassword, setShowPassword] = useState(false); + const { dispatch: globalDispatch } = React.useContext(GlobalContext); + const { + register, + handleSubmit, + setError, + setValue, + formState: { errors }, + } = useForm({ + resolver: yupResolver(schema), + }); + + const togglePasswordVisibility = () => { + setShowPassword(!showPassword); + }; + + const previewImage = (field, target, multiple = false) => { + setIsUploadedPhoto(true); + let tempFileObj = fileObj; + if (multiple) { + if (tempFileObj[field]) { + tempFileObj[field] = [ + ...tempFileObj[field], + { + file: target.files[0], + tempFile: { + url: URL.createObjectURL(target.files[0]), + name: target.files[0].name, + type: target.files[0].type, + }, + }, + ]; + } else { + tempFileObj[field] = [ + { + file: target.files[0], + tempFile: { + url: URL.createObjectURL(target.files[0]), + name: target.files[0].name, + type: target.files[0].type, + }, + }, + ]; + } + } else { + tempFileObj[field] = { + file: target.files[0], + tempURL: URL.createObjectURL(target.files[0]), + }; + } + setFileObj({ ...tempFileObj }); + }; + + async function fetchData() { + setLoading(true); + try { + const result = await sdk.getProfile(); + if (!result.error) { + setDefaultValues(result); + setValue("email", result?.email); + setValue("first_name", result?.first_name); + setValue("last_name", result?.last_name); + setOldEmail(result?.email); + setOldPhoto(result?.photo); + dispatch({ + type: "UPDATE_PROFILE", + payload: result, + }); + setLoading(false); + } + } catch (error) { + tokenExpireError( + dispatch, + error.response.data.message + ? error.response.data.message + : error.message + ); + } + } + + const onSubmit = async (data) => { + if ( + defaultValues.email === data.email && + defaultValues.first_name === data.first_name && + defaultValues.last_name === data.last_name && + !isUploadedPhoto && + !data.password + ) { + closeModal(); + return showToast(globalDispatch, "No Changes Available", 1000); + } + + setDefaultValues(data); + try { + setSubmitLoading(true); + if (fileObj && fileObj["photo"] && fileObj["photo"]?.file) { + let formData = new FormData(); + formData.append("file", fileObj["photo"]?.file); + let uploadResult = await sdk.uploadImage(formData); + data["photo"] = uploadResult.url; + showToast(globalDispatch, "Profile Photo Updated", 1000); + } + + const result = await sdk.updateProfile({ + first_name: data.first_name || defaultValues?.first_name, + last_name: data.last_name || defaultValues?.last_name, + photo: data.photo || oldPhoto, + }); + + if (!result.error) { + showToast(globalDispatch, "Profile Updated", 4000); + closeModal(); + fetchData(); + } else { + if (result.validation) { + const keys = Object.keys(result.validation); + for (let i = 0; i < keys.length; i++) { + const field = keys[i]; + setError(field, { + type: "manual", + message: result.validation[field], + }); + } + } + closeModal(); + } + if (oldEmail !== data.email) { + const emailresult = await sdk.updateEmail(data.email); + if (!emailresult.error) { + showToast(globalDispatch, "Email Updated", 1000); + } else { + if (emailresult.validation) { + const keys = Object.keys(emailresult.validation); + for (let i = 0; i < keys.length; i++) { + const field = keys[i]; + setError(field, { + type: "manual", + message: emailresult.validation[field], + }); + } + } + } + closeModal(); + } + + if (data.password?.length > 0) { + const passwordresult = await sdk.updatePassword(data.password); + if (!passwordresult.error) { + showToast(globalDispatch, "Password Updated", 2000); + } else { + if (passwordresult.validation) { + const keys = Object.keys(passwordresult.validation); + for (let i = 0; i < keys.length; i++) { + const field = keys[i]; + setError(field, { + type: "manual", + message: passwordresult.validation[field], + }); + } + } + } + } + data.photo = ""; + await fetchData(); + setSubmitLoading(false); + } catch (error) { + setSubmitLoading(false); + setError("email", { + type: "manual", + message: error.response.data.message + ? error.response.data.message + : error.message, + }); + tokenExpireError( + dispatch, + error.response.data.message + ? error.response.data.message + : error.message + ); + } + }; + + const onDeleteProfile = async () => { + setFileObj({}); + setOldPhoto(""); + setIsUploadedPhoto(true); + }; + + React.useEffect(() => { + globalDispatch({ + type: "SETPATH", + payload: { + path: "profile", + }, + }); + + fetchData(); + }, []); + + const openModalEdit = () => { + setIsEditModalOpen(true); + }; + + const closeModal = () => { + setIsModalOpen(false); + setIsEditModalOpen(false); + setOldPhoto(defaultValues?.photo); + setFileObj({}); + setIsUploadedPhoto(false); + }; + + return ( +
    +
    +
    +
    setActiveTab("Profile")} + > + Profile +
    +
    setActiveTab("Security")} + > + Security +
    +
    +
    +
    + {/* Profile Tab */} + {activeTab === "Profile" && ( +
    +
    +

    + {errors.photo?.message} +

    +
    +
    +

    + Personal Details +

    + {!loading ? ( +

    + Edit +

    + ) : ( +
    + +
    + )} +
    + +
    +
    +

    + Profile Picture +

    + + {loading ? ( +
    +
    + +
    +
    + ) : defaultValues?.photo ? ( +
    + +
    + ) : ( +
    +
    + No Image +
    +
    + )} +
    +
    + +
    +
    +

    + First Name +

    +

    + {defaultValues?.first_name} +

    +
    +
    + +
    +
    +

    + Last Name +

    +

    + {defaultValues?.last_name} +

    +
    +
    +
    +
    +

    Email

    +

    + {oldEmail} +

    +
    +
    +
    +
    +
    + )} + + {/* Security tab */} + {activeTab === "Security" && ( +
    +
    +
    +
    + +
    + +
    + {showPassword ? () : ()} +
    +
    +

    + {errors.password?.message} +

    +
    +
    + + Update + +
    +
    +
    +
    + )} + + {isModalOpen && ( + + )} + + {isEditModalOpen && ( + + )} +
    +
    + ); +}; + +export const EditInfoModal = (props) => { + const { + title, + isOpen, + onClose, + handleSubmit, + onSubmit, + register, + submitLoading, + errors, + oldPhoto, + fileObj, + onDeleteProfile, + previewImage, + oldEmail, + } = props; + const [emailConfirm, setEmailConfirm] = useState(false); + const [values, setValues] = useState({ + email: "", + }); + + React.useEffect(() => { + setValues({ ...values, email: oldEmail }); + setEmailConfirm(false); + }, []); + + const handleChange = (prop) => (event) => { + if (prop === "email") { + setValues({ ...values, [prop]: event.target.value }); + } + }; + + return ( +
    +
    +
    +
    +
    +
    + +
    +
    +
    + {title} +
    + +
    +
    +
    + + {oldPhoto ? ( +
    +
    + + +
    + + X + +
    +
    +
    + ) : ( +
    +
    + {fileObj["photo"]?.tempURL ? ( + + ) : ( + + )} +
    +
    + )} +
    + + +

    + {errors?.id?.message} +

    +
    +
    + + +

    + {errors?.id?.message} +

    +
    + {emailConfirm && oldEmail !== values.email ? ( +
    +
    + + + +
    +
    +

    + We've send an email to: {values?.email} +

    +

    +

    + In order to complete the email update click the + confirmation link. +

    +

    + (the link expires in 24 hours) +

    +
    +
    + ) : ( +
    + + +

    + {errors?.id?.message} +

    +
    + )} +
    + +
    + + + setEmailConfirm(true)} + > + Save + +
    +
    +
    +
    +
    +
    + ); +}; + +export default PublicProfilePage; + diff --git a/day20/src/routes/AdminRoutes.jsx b/day20/src/routes/AdminRoutes.jsx new file mode 100644 index 0000000..bd00ec3 --- /dev/null +++ b/day20/src/routes/AdminRoutes.jsx @@ -0,0 +1,32 @@ + +import React, { memo, useContext } from "react"; +import { Navigate } from "react-router"; +import { AuthContext } from "Context/Auth"; +import metadataJSON from "Utils/metadata.json"; + +const AdminRoute = ({ path, children }) => { + const Auth = useContext(AuthContext); + + const { isAuthenticated, role } = Auth?.state; + React.useEffect(() => { + const metadata = metadataJSON[path ?? "/"]; + if (metadata !== undefined) { + document.title = metadata?.title?metadata?.title:"inventorylynx"; + } else { + document.title = "inventorylynx"; + } + }, [path]); + + return ( + <> + {isAuthenticated ? ( + <>{children} + ) : ( + + )} + + ); +}; + + +export default memo(AdminRoute); diff --git a/day20/src/routes/LazyLoad.js b/day20/src/routes/LazyLoad.js new file mode 100644 index 0000000..5eb6cb9 --- /dev/null +++ b/day20/src/routes/LazyLoad.js @@ -0,0 +1,382 @@ + + import {lazy} from 'react' + + + export const AddAdminCmsPage = lazy(() => { + const __import = import("../pages/Admin/Add/AddAdminCmsPage"); + __import.finally(() => {}); + return __import; + }); + + + export const AddAdminEmailPage = lazy(() => { + const __import = import("../pages/Admin/Add/AddAdminEmailPage"); + __import.finally(() => {}); + return __import; + }); + + + export const AddAdminPhotoPage = lazy(() => { + const __import = import("../pages/Admin/Add/AddAdminPhotoPage"); + __import.finally(() => {}); + return __import; + }); + + + export const AdminCmsListPage = lazy(() => { + const __import = import("../pages/Admin/List/AdminCmsListPage"); + __import.finally(() => {}); + return __import; + }); + + + export const AdminEmailListPage = lazy(() => { + const __import = import("../pages/Admin/List/AdminEmailListPage"); + __import.finally(() => {}); + return __import; + }); + + + export const AdminStripePricesListPage = lazy(() => { + const __import = import("../pages/Admin/List/AdminStripePricesListPage"); + __import.finally(() => {}); + return __import; + }); + + + export const AdminStripeSubscriptionsListPage = lazy(() => { + const __import = import("../pages/Admin/List/AdminStripeSubscriptionsListPage"); + __import.finally(() => {}); + return __import; + }); + + + export const AdminStripeInvoicesListPageV2 = lazy(() => { + const __import = import("../pages/Admin/List/AdminStripeInvoicesListPageV2"); + __import.finally(() => {}); + return __import; + }); + + + export const AdminPhotoListPage = lazy(() => { + const __import = import("../pages/Admin/List/AdminPhotoListPage"); + __import.finally(() => {}); + return __import; + }); + + + export const EditAdminCmsPage = lazy(() => { + const __import = import("../pages/Admin/Edit/EditAdminCmsPage"); + __import.finally(() => {}); + return __import; + }); + + + export const EditAdminEmailPage = lazy(() => { + const __import = import("../pages/Admin/Edit/EditAdminEmailPage"); + __import.finally(() => {}); + return __import; + }); + + + export const UserMagicLoginPage = lazy(() => { + const __import = import("../pages/MagicLogin/UserMagicLoginPage"); + __import.finally(() => {}); + return __import; + }); + + + export const MagicLoginVerifyPage = lazy(() => { + const __import = import("../pages/MagicLogin/MagicLoginVerifyPage"); + __import.finally(() => {}); + return __import; + }); + + + export const CustomAdminLoginPage = lazy(() => { + const __import = import("../pages/Admin/Auth/CustomAdminLoginPage"); + __import.finally(() => {}); + return __import; + }); + + + export const CustomAdminSignUpPage = lazy(() => { + const __import = import("../pages/Admin/Auth/CustomAdminSignUpPage"); + __import.finally(() => {}); + return __import; + }); + + + export const CustomAdminProfilePage = lazy(() => { + const __import = import("../pages/Admin/View/CustomAdminProfilePage"); + __import.finally(() => {}); + return __import; + }); + + + export const CustomPublicLoginPage = lazy(() => { + const __import = import("../pages/Public/Auth/CustomPublicLoginPage"); + __import.finally(() => {}); + return __import; + }); + + + export const CustomPublicSignUpPage = lazy(() => { + const __import = import("../pages/Public/Auth/CustomPublicSignUpPage"); + __import.finally(() => {}); + return __import; + }); + + + export const CustomPublicProfilePage = lazy(() => { + const __import = import("../pages/Public/View/CustomPublicProfilePage"); + __import.finally(() => {}); + return __import; + }); + + + export const CustomMemberLoginPage = lazy(() => { + const __import = import("../pages/Member/Auth/CustomMemberLoginPage"); + __import.finally(() => {}); + return __import; + }); + + + export const CustomMemberSignUpPage = lazy(() => { + const __import = import("../pages/Member/Auth/CustomMemberSignUpPage"); + __import.finally(() => {}); + return __import; + }); + + + export const CustomMemberProfilePage = lazy(() => { + const __import = import("../pages/Member/View/CustomMemberProfilePage"); + __import.finally(() => {}); + return __import; + }); + + + export const CustomAdminAdminDashboardPage = lazy(() => { + const __import = import("../pages/Admin/Custom/CustomAdminAdminDashboardPage"); + __import.finally(() => {}); + return __import; + }); + + + export const AdminListDepartmentTablePage = lazy(() => { + const __import = import("../pages/Admin/List/AdminListDepartmentTablePage"); + __import.finally(() => {}); + return __import; + }); + + + export const AdminAddDepartmentTablePage = lazy(() => { + const __import = import("../pages/Admin/Add/AdminAddDepartmentTablePage"); + __import.finally(() => {}); + return __import; + }); + + + export const AdminEditDepartmentTablePage = lazy(() => { + const __import = import("../pages/Admin/Edit/AdminEditDepartmentTablePage"); + __import.finally(() => {}); + return __import; + }); + + + export const AdminViewDepartmentTablePage = lazy(() => { + const __import = import("../pages/Admin/View/AdminViewDepartmentTablePage"); + __import.finally(() => {}); + return __import; + }); + + + export const AdminListLocationTablePage = lazy(() => { + const __import = import("../pages/Admin/List/AdminListLocationTablePage"); + __import.finally(() => {}); + return __import; + }); + + + export const AdminAddLocationTablePage = lazy(() => { + const __import = import("../pages/Admin/Add/AdminAddLocationTablePage"); + __import.finally(() => {}); + return __import; + }); + + + export const AdminEditLocationTablePage = lazy(() => { + const __import = import("../pages/Admin/Edit/AdminEditLocationTablePage"); + __import.finally(() => {}); + return __import; + }); + + + export const AdminViewLocationTablePage = lazy(() => { + const __import = import("../pages/Admin/View/AdminViewLocationTablePage"); + __import.finally(() => {}); + return __import; + }); + + + export const AdminListItemsTablePage = lazy(() => { + const __import = import("../pages/Admin/List/AdminListItemsTablePage"); + __import.finally(() => {}); + return __import; + }); + + + export const AdminAddItemsTablePage = lazy(() => { + const __import = import("../pages/Admin/Add/AdminAddItemsTablePage"); + __import.finally(() => {}); + return __import; + }); + + + export const AdminEditItemsTablePage = lazy(() => { + const __import = import("../pages/Admin/Edit/AdminEditItemsTablePage"); + __import.finally(() => {}); + return __import; + }); + + + export const AdminViewItemsTablePage = lazy(() => { + const __import = import("../pages/Admin/View/AdminViewItemsTablePage"); + __import.finally(() => {}); + return __import; + }); + + + export const AdminListItemMovementHistoryTablePage = lazy(() => { + const __import = import("../pages/Admin/List/AdminListItemMovementHistoryTablePage"); + __import.finally(() => {}); + return __import; + }); + + + export const AdminAddItemMovementHistoryTablePage = lazy(() => { + const __import = import("../pages/Admin/Add/AdminAddItemMovementHistoryTablePage"); + __import.finally(() => {}); + return __import; + }); + + + export const AdminEditItemMovementHistoryTablePage = lazy(() => { + const __import = import("../pages/Admin/Edit/AdminEditItemMovementHistoryTablePage"); + __import.finally(() => {}); + return __import; + }); + + + export const AdminViewItemMovementHistoryTablePage = lazy(() => { + const __import = import("../pages/Admin/View/AdminViewItemMovementHistoryTablePage"); + __import.finally(() => {}); + return __import; + }); + + + export const AdminListUserTablePage = lazy(() => { + const __import = import("../pages/Admin/List/AdminListUserTablePage"); + __import.finally(() => {}); + return __import; + }); + + + export const AdminAddUserTablePage = lazy(() => { + const __import = import("../pages/Admin/Add/AdminAddUserTablePage"); + __import.finally(() => {}); + return __import; + }); + + + export const AdminEditUserTablePage = lazy(() => { + const __import = import("../pages/Admin/Edit/AdminEditUserTablePage"); + __import.finally(() => {}); + return __import; + }); + + + export const AdminViewUserTablePage = lazy(() => { + const __import = import("../pages/Admin/View/AdminViewUserTablePage"); + __import.finally(() => {}); + return __import; + }); + + + export const MemberForgotPage = lazy(() => { + const __import = import("../pages/Member/Auth/MemberForgotPage"); + __import.finally(() => {}); + return __import; + }); + + + export const MemberResetPage = lazy(() => { + const __import = import("../pages/Member/Auth/MemberResetPage"); + __import.finally(() => {}); + return __import; + }); + + + export const MemberDashboardPage = lazy(() => { + const __import = import("../pages/Member/View/MemberDashboardPage"); + __import.finally(() => {}); + return __import; + }); + + + export const AdminForgotPage = lazy(() => { + const __import = import("../pages/Admin/Auth/AdminForgotPage"); + __import.finally(() => {}); + return __import; + }); + + + export const AdminResetPage = lazy(() => { + const __import = import("../pages/Admin/Auth/AdminResetPage"); + __import.finally(() => {}); + return __import; + }); + + + export const AdminDashboardPage = lazy(() => { + const __import = import("../pages/Admin/View/AdminDashboardPage"); + __import.finally(() => {}); + return __import; + }); + + + export const AdminUserListPage = lazy(() => { + const __import = import("../pages/Admin/List/AdminUserListPage"); + __import.finally(() => {}); + return __import; + }); + + + export const AddAdminUserPage = lazy(() => { + const __import = import("../pages/Admin/Add/AddAdminUserPage"); + __import.finally(() => {}); + return __import; + }); + + + export const AddAdminStripePricePage = lazy(() => { + const __import = import("../pages/Admin/Add/AddAdminStripePricePage"); + __import.finally(() => {}); + return __import; + }); + + + export const EditAdminUserPage = lazy(() => { + const __import = import("../pages/Admin/Edit/EditAdminUserPage"); + __import.finally(() => {}); + return __import; + }); + + + export const EditAdminStripePricePage = lazy(() => { + const __import = import("../pages/Admin/Edit/EditAdminStripePricePage"); + __import.finally(() => {}); + return __import; + }); + + \ No newline at end of file diff --git a/day20/src/routes/MemberRoutes.jsx b/day20/src/routes/MemberRoutes.jsx new file mode 100644 index 0000000..3e7d587 --- /dev/null +++ b/day20/src/routes/MemberRoutes.jsx @@ -0,0 +1,32 @@ + +import React, { memo, useContext } from "react"; +import { Navigate } from "react-router"; +import { AuthContext } from "Context/Auth"; +import metadataJSON from "Utils/metadata.json"; + +const MemberRoute = ({ path, children }) => { + const Auth = useContext(AuthContext); + + const { isAuthenticated, role } = Auth?.state; + React.useEffect(() => { + const metadata = metadataJSON[path ?? "/"]; + if (metadata !== undefined) { + document.title = metadata?.title?metadata?.title:"inventorylynx"; + } else { + document.title = "inventorylynx"; + } + }, [path]); + + return ( + <> + {isAuthenticated ? ( + <>{children} + ) : ( + + )} + + ); +}; + + +export default memo(MemberRoute); diff --git a/day20/src/routes/PrivateRoutes.jsx b/day20/src/routes/PrivateRoutes.jsx new file mode 100644 index 0000000..708930d --- /dev/null +++ b/day20/src/routes/PrivateRoutes.jsx @@ -0,0 +1,30 @@ + +import React, { memo, useContext } from "react"; +import { Navigate } from "react-router-dom"; +import { AuthContext } from "Context/Auth"; +import { NotFound } from "./Routes"; +import PublicRoute from "./PublicRoutes"; +import MemberRoute from "./MemberRoutes"; +import AdminRoute from "./AdminRoutes"; + + +const PrivateRoute = ({ path, element, access }) => { + const Auth = useContext(AuthContext); + + if (Auth?.state?.isAuthenticated) { + switch (true) { + case Auth?.state?.role === "member" && access === "member": + return {element} +case Auth?.state?.role === "admin" && access === "admin": + return {element} + + default: + return } />; + } + } + if (!Auth?.state?.isAuthenticated) { + return } />; + } +}; + +export default memo(PrivateRoute); diff --git a/day20/src/routes/PublicRoutes.jsx b/day20/src/routes/PublicRoutes.jsx new file mode 100644 index 0000000..3659c41 --- /dev/null +++ b/day20/src/routes/PublicRoutes.jsx @@ -0,0 +1,22 @@ + + import React, { memo } from "react"; + import metadataJSON from "Utils/metadata.json"; + +function PublicRoute({ element, path }) { + React.useEffect(() => { + const metadata = metadataJSON[path ?? "/"]; + if (!(metadata == null)) { + document.title = metadata.title; + } else { + document.title = "inventorylynx"; + } + }, [path]); + + return ( + <> + {element} + + ); +} + +export default memo(PublicRoute); diff --git a/day20/src/routes/Routes.jsx b/day20/src/routes/Routes.jsx new file mode 100644 index 0000000..b36060e --- /dev/null +++ b/day20/src/routes/Routes.jsx @@ -0,0 +1,967 @@ + +import React, { useEffect, useContext, useState } from "react"; +import { Routes, Route } from "react-router-dom"; +import { AuthContext } from "Context/Auth"; +import { GlobalContext } from "Context/Global"; + +import PrivateRoute from "./PrivateRoutes"; +import PublicRoute from "./PublicRoutes"; +import {PublicWrapper} from "Components/PublicWrapper"; +import { NotFoundPage } from "Pages/404"; +import {SnackBar} from "Components/SnackBar"; +import { SessionExpiredModal } from "Components/SessionExpiredModal"; + +// generatePagesRoutes +import { MemberWrapper } from "Components/MemberWrapper"; +import { AdminWrapper } from "Components/AdminWrapper"; + + +import { +AddAdminCmsPage, +AddAdminEmailPage, +AddAdminPhotoPage, +AdminCmsListPage, +AdminEmailListPage, +AdminStripePricesListPage, +AdminStripeSubscriptionsListPage, +AdminStripeInvoicesListPageV2, +AdminPhotoListPage, +EditAdminCmsPage, +EditAdminEmailPage, +UserMagicLoginPage, +MagicLoginVerifyPage, +CustomAdminLoginPage, +CustomAdminSignUpPage, +CustomAdminProfilePage, +CustomPublicLoginPage, +CustomPublicSignUpPage, +CustomPublicProfilePage, +CustomMemberLoginPage, +CustomMemberSignUpPage, +CustomMemberProfilePage, +CustomAdminAdminDashboardPage, +AdminListDepartmentTablePage, +AdminAddDepartmentTablePage, +AdminEditDepartmentTablePage, +AdminViewDepartmentTablePage, +AdminListLocationTablePage, +AdminAddLocationTablePage, +AdminEditLocationTablePage, +AdminViewLocationTablePage, +AdminListItemsTablePage, +AdminAddItemsTablePage, +AdminEditItemsTablePage, +AdminViewItemsTablePage, +AdminListItemMovementHistoryTablePage, +AdminAddItemMovementHistoryTablePage, +AdminEditItemMovementHistoryTablePage, +AdminViewItemMovementHistoryTablePage, +AdminListUserTablePage, +AdminAddUserTablePage, +AdminEditUserTablePage, +AdminViewUserTablePage, +MemberForgotPage, +MemberResetPage, +MemberDashboardPage, +AdminForgotPage, +AdminResetPage, +AdminDashboardPage, +AdminUserListPage, +AddAdminUserPage, +AddAdminStripePricePage, +EditAdminUserPage, +EditAdminStripePricePage +} from "./LazyLoad"; + +export const DynamicWrapper = ({ isAuthenticated, role, children }) => { + if (!isAuthenticated) { + return {children}; + } + if (isAuthenticated) { + +if (role === "member") { + return {children}; + } + +if (role === "admin") { + return {children}; + } + + } +}; + +export const NotFound = ({ isAuthenticated, role }) => { + if (!isAuthenticated) { + return ( + + + + ); + } + if (isAuthenticated) { + +if (role === "member") { + return ( + + + + ); +} + +if (role === "admin") { + return ( + + + + ); +} + + } +}; + + +export default () => { + const { state } = useContext(AuthContext); + const { + state: { isOpen }, + dispatch, + } = useContext(GlobalContext); + const [screenSize, setScreenSize] = useState(window.innerWidth); + + function setDimension(e) { + if (e.currentTarget.innerWidth >= 1024) { + toggleSideBar(true); + } else toggleSideBar(false); + setScreenSize(e.currentTarget.innerWidth); + } + + // const toTop = () => { + // containerRef.current.scrollTo(0, 0); + // }; + + const toggleSideBar = (open) => { + if (isOpen && screenSize < 1024) { + dispatch({ + type: "OPEN_SIDEBAR", + payload: { isOpen: open }, + }); + } else if (!isOpen && screenSize >= 1024) { + dispatch({ + type: "OPEN_SIDEBAR", + payload: { isOpen: open }, + }); + } + }; + + useEffect(() => { + window.addEventListener("resize", setDimension); + + return () => { + window.removeEventListener("resize", setDimension); + }; + }, [screenSize]); + + return ( +
    { + isOpen ? toggleSideBar(false) : null; + }} + className={`h-screen overflow-x-hidden bg-gradient-to-br from-[#FCF3F9] to-[#EAF8FB]`} + > + + + + + + } + /> + } + /> + + + + + } + /> + } + /> + + + + + } + /> + } + /> + + + + + } + /> + } + /> + + + + + } + /> + } + /> + + + + + } + /> + } + /> + + + + + } + /> + } + /> + + + + + } + /> + } + /> + + + + + } + /> + + } + /> + + + + + + } + /> + + } + /> + + + + + + } + /> + + } + /> + + + + + + } + /> + + } + /> + + + + + + } + /> + } + /> + + + + + } + /> + + } + /> + + + + + + } + /> + + } + /> + + + + + + } + /> + + } + /> + + + + + + } + /> + + } + /> + + + + + + } + /> + + } + /> + + + + + + } + /> + } + /> + + + + + } + /> + } + /> + + + + + } + /> + } + /> + + + + + } + /> + } + /> + + + + + } + /> + } + /> + + + + + } + /> + } + /> + + + + + } + /> + } + /> + + + + + } + /> + } + /> + + + + + } + /> + } + /> + + + + + } + /> + } + /> + + + + + } + /> + } + /> + + + + + } + /> + } + /> + + + + + } + /> + } + /> + + + + + } + /> + } + /> + + + + + } + /> + } + /> + + + + + } + /> + } + /> + + + + + } + /> + } + /> + + + + + } + /> + } + /> + + + + + } + /> + } + /> + + + + + } + /> + } + /> + + + + + } + /> + } + /> + + + + + } + /> + } + /> + + + + + } + /> + + } + /> + + + + + + } + /> + + } + /> + + + + + + } + /> + } + /> + + + + + } + /> + + } + /> + + + + + + } + /> + + } + /> + + + + + + } + /> + } + /> + + + + + } + /> + } + /> + + + + + } + /> + } + /> + + + + + } + /> + } + /> + + + } />} + /> + + + +
    + ); +}; diff --git a/day20/src/utils/EcomSDK.jsx b/day20/src/utils/EcomSDK.jsx new file mode 100644 index 0000000..f339c03 --- /dev/null +++ b/day20/src/utils/EcomSDK.jsx @@ -0,0 +1,529 @@ + + +export default function EcomSDK() { + + this._baseurl = "https://inventorylynx.mkdlabs.com"; + this._project_id = "inventorylynx"; + this._secret = "1qrhpud67j4jpda5zrdm7oi5ugjo8h3c9"; + this._table = ""; + + const raw = this._project_id + ":" + this._secret; + let base64Encode = btoa(raw); + + this.getHeader = function () { + return { + Authorization: "Bearer " + localStorage.getItem("token"), + "x-project": base64Encode, + "Content-Type": "application/json", + }; + }; + + this.baseUrl = function () { + return this._baseurl; + }; + + this.generateUniqueNumber = function () { //length 11 + const array = new Uint32Array(1); + crypto.getRandomValues(array); + return array[0] % 1000000000; + } + + this.routes = { + store: "/products" + } + + this.fetch = async function (resource, options = {}) { + // fire event + return new Request(resource, options) + } + + + + this.getProducts = async function (payload) { + const result = await fetch(this._baseurl + "/v2/api/lambda/ecom/product", { + method: "post", + headers: this.getHeader(), + body: JSON.stringify(payload), + }); + const json = await result.json(); + + if (json.status === 401) { + throw new Error(json.message); + } + + if (json.status === 403) { + throw new Error(json.message); + } + return json; + } + + this.getFilteredProducts = async function (payload = {}) { + let url = `type = product` + payload.hasOwnProperty('price') ? url = `${ url }& price=${ payload.price } ` : null; + payload.hasOwnProperty('category') ? url = `${ url }& category_id=${ payload.category } ` : null; + payload.hasOwnProperty('is_featured') ? url = `${ url }& is_featured=${ payload.is_featured } ` : null; + payload.hasOwnProperty('name') ? url = `${ url }& name=${ payload.name } ` : null; + payload.hasOwnProperty('page') ? url = `${ url }& page=${ payload.page } ` : null; + payload.hasOwnProperty('limit') ? url = `${ url }& limit=${ payload.limit } ` : `${ url }& limit=${ 16 } `; + payload.hasOwnProperty('direction') ? url = `${ url }& direction=${ payload.direction } ` : `${ url }& direction=ASC`; + payload.hasOwnProperty('order') ? url = `${ url }& orderBy=${ payload.order } ` : `${ url }& orderBy=id`; + + const result = await fetch(this._baseurl + "/v2/api/lambda/ecom/filters/?" + url, { + method: "get", + headers: this.getHeader(), + }); + const json = await result.json(); + + if (json.status === 401) { + throw new Error(json.message); + } + + if (json.status === 403) { + throw new Error(json.message); + } + return json; + } + + this.getFilteredProductsByCategory = async function (category_id) { + const result = await fetch(this._baseurl + `/ v2 / api / lambda / ecom / filters /? type = category & id=${ category_id } `, { + method: "get", + headers: this.getHeader(), + // body: JSON.stringify(payload), + }); + const json = await result.json(); + + if (json.status === 401) { + throw new Error(json.message); + } + + if (json.status === 403) { + throw new Error(json.message); + } + return json; + } + + this.getSingleProduct = async function (id) { + const result = await fetch(this._baseurl + "/v2/api/lambda/ecom/product/" + id, { + method: "get", + headers: this.getHeader(), + }); + const json = await result.json(); + + if (json.status === 401) { + throw new Error(json.message); + } + + if (json.status === 403) { + throw new Error(json.message); + } + return json; + } + + this.getCountries = async function () { + const result = await fetch(this._baseurl + "/v2/api/lambda/ecom/country", { + method: "get", + headers: this.getHeader(), + }); + const json = await result.json(); + + if (json.status === 401) { + throw new Error(json.message); + } + + if (json.status === 403) { + throw new Error(json.message); + } + return json; + } + + this.getStates = async function (country = 0) { + const result = await fetch(this._baseurl + "/v2/api/lambda/ecom/state/" + country, { + method: "get", + headers: this.getHeader(), + }); + const json = await result.json(); + + if (json.status === 401) { + throw new Error(json.message); + } + + if (json.status === 403) { + throw new Error(json.message); + } + return json; + } + + this.getCities = async function (state = 0) { + const result = await fetch(this._baseurl + "/v2/api/lambda/ecom/city/" + state, { + method: "get", + headers: this.getHeader(), + }); + const json = await result.json(); + + if (json.status === 401) { + throw new Error(json.message); + } + + if (json.status === 403) { + throw new Error(json.message); + } + return json; + } + + this.getTax = async function (country = 0) { + const result = await fetch(this._baseurl + "/v2/api/lambda/ecom/tax/", { + method: "post", + headers: this.getHeader(), + body: JSON.stringify({ countryId: country }) + }); + const json = await result.json(); + + if (json.status === 401) { + throw new Error(json.message); + } + + if (json.status === 403) { + throw new Error(json.message); + } + return json; + } + + this.getCategories = async function () { + const result = await fetch(this._baseurl + "/v2/api/lambda/ecom/category", { + method: "get", + headers: this.getHeader(), + }); + const json = await result.json(); + + if (json.status === 401) { + throw new Error(json.message); + } + + if (json.status === 403) { + throw new Error(json.message); + } + return json; + } + + this.getReviews = async function (payload) { + const result = await fetch(this._baseurl + "/v2/api/lambda/ecom/product/review", { + method: "post", + headers: this.getHeader(), + body: JSON.stringify(payload), + }); + const json = await result.json(); + + if (json.status === 401) { + throw new Error(json.message); + } + + if (json.status === 403) { + throw new Error(json.message); + } + return json; + } + this.getUserReviews = async function (userId) { + const result = await fetch(this._baseurl + "/v2/api/lambda/ecom/product/user-review/" + userId, { + method: "get", + headers: this.getHeader(), + }); + const json = await result.json(); + + if (json.status === 401) { + throw new Error(json.message); + } + + if (json.status === 403) { + throw new Error(json.message); + } + return json; + } + + this.addReview = async function (payload) { + // review, user_id, status, product_id + payload.user_id = localStorage.getItem("user"); + payload.status = 1; + const result = await fetch(this._baseurl + "/v2/api/lambda/ecom/product/review/add", { + method: "post", + headers: this.getHeader(), + body: JSON.stringify(payload), + }); + const json = await result.json(); + + if (json.status === 401) { + throw new Error(json.message); + } + + if (json.status === 403) { + throw new Error(json.message); + } + return json; + } + + this.getCart = async function () { + let params = localStorage.hasOwnProperty('user') ? `user_id = ${ localStorage.getItem('user') } ` + : `session_id = ${ localStorage.getItem('cart-session') }`; + const result = await fetch(this._baseurl + "/v2/api/lambda/ecom/cart?" + params, { + method: "get", + headers: this.getHeader(), + }); + const json = await result.json(); + + if (result.status === 401) { + throw new Error(json.message); + } + + if (result.status === 403) { + throw new Error(json.message); + } + + return json; + } + + this.addCartItem = async function (productId, quantity) { + let payload = { + status: 0 + }; + if (localStorage.hasOwnProperty('user')) { + payload.user_id = localStorage.getItem('user'); + // payload.session_id = false + } else { + // payload.user_id = false; + if (localStorage.hasOwnProperty('cart-session')) { + payload.session_id = Number(localStorage.getItem('cart-session')); + } else { + let session_id = this.generateUniqueNumber(); + localStorage.setItem('cart-session', session_id); + payload.session_id = Number(session_id); + } + } + + // payload.data = [ + // {productId: productId, quantity: quantity} + // ] + payload.productId = productId; + payload.quantity = Number(quantity); + const result = await fetch(this._baseurl + "/v2/api/lambda/ecom/cart/item", { + method: "post", + headers: this.getHeader(), + body: JSON.stringify(payload), + }); + const json = await result.json(); + + if (json.status === 401) { + throw new Error(json.message); + } + + if (json.status === 403) { + throw new Error(json.message); + } + return json; + } + + this.updateCart = async function (data) { + let payload = { + status: 0 + }; + if (localStorage.hasOwnProperty('user')) { + payload.user_id = localStorage.getItem('user'); + payload.session_id = false + } else { + payload.user_id = false; + if (localStorage.hasOwnProperty('cart-session')) { + payload.session_id = localStorage.getItem('cart-session'); + } else { + let session_id = this.generateUniqueNumber(); + localStorage.setItem('cart-session', session_id); + payload.session_id = session_id; + } + } + + payload.data = data; + const result = await fetch(this._baseurl + "/v2/api/lambda/ecom/cart/update", { + method: "post", + headers: this.getHeader(), + body: JSON.stringify(payload), + }); + const json = await result.json(); + + if (json.status === 401) { + throw new Error(json.message); + } + + if (json.status === 403) { + throw new Error(json.message); + } + return json; + } + + this.createCheckout = async function (data) { + + const result = await fetch(this._baseurl + "/v2/api/lambda/ecom/create-checkout", { + method: "post", + headers: this.getHeader(), + body: JSON.stringify(data), + }); + const json = await result.json(); + + if (json.status === 401) { + throw new Error(json.message); + } + + if (json.status === 403) { + throw new Error(json.message); + } + return json; + } + + this.getShippingRates = async function () { + + const result = await fetch(this._baseurl + "/v2/api/lambda/ecom/shipping-rates", { + method: "get", + headers: this.getHeader(), + }); + const json = await result.json(); + + if (result.status === 401) { + throw new Error(json.message); + } + + if (result.status === 403) { + throw new Error(json.message); + } + + return json; + } + + + + this.applyCoupon = async function (coupon) { + + const result = await fetch(this._baseurl + "/v2/api/lambda/ecom/product/coupon/apply", { + method: "post", + headers: this.getHeader(), + body: JSON.stringify({ coupon_code: coupon }) + }); + const json = await result.json(); + + if (result.status === 401) { + throw new Error(json.message); + } + + if (result.status === 403) { + throw new Error(json.message); + } + + return json; + } + + this.getOrderItems = async function (checkoutId) { + + const result = await fetch(this._baseurl + "/v2/api/lambda/ecom/order-item/" + checkoutId, { + method: "get", + headers: this.getHeader(), + }); + const json = await result.json(); + + if (result.status === 401) { + throw new Error(json.message); + } + + if (result.status === 403) { + throw new Error(json.message); + } + + return json; + } + + this.generatePaymentIntent = async function (payload) { + + const result = await fetch(this._baseurl + "/v2/api/lambda/ecom/checkout", { + method: "post", + headers: this.getHeader(), + body: JSON.stringify(payload) + }); + const json = await result.json(); + + if (result.status === 401) { + throw new Error(json.message); + } + + if (result.status === 403) { + throw new Error(json.message); + } + + return json; + } + + this.verifyPayment = async function (paymentIntent) { + + const result = await fetch(this._baseurl + "/v2/api/lambda/ecom/checkout-success", { + method: "post", + headers: this.getHeader(), + body: JSON.stringify({ + paymentIntentId: paymentIntent + }) + }); + const json = await result.json(); + + if (result.status === 401) { + throw new Error(json.message); + } + + if (result.status === 403) { + throw new Error(json.message); + } + + return json; + } + + this.getOrders = async function (payload) { + payload.direction = 'desc'; + payload.sortId = 'id'; + const result = await fetch(this._baseurl + "/v2/api/lambda/ecom/order-history/user", { + method: "post", + headers: this.getHeader(), + body: JSON.stringify(payload) + }); + const json = await result.json(); + + if (result.status === 401) { + throw new Error(json.message); + } + + if (result.status === 403) { + throw new Error(json.message); + } + + return json; + } + + this.addProduct = async function (payload) { + const result = await fetch(this._baseurl + "/v2/api/lambda/ecom/product/add", { + method: "post", + headers: this.getHeader(), + body: JSON.stringify(payload) + }); + const json = await result.json(); + + if (result.status === 401) { + throw new Error(json.message); + } + + if (result.status === 403) { + throw new Error(json.message); + } + + return json; + } + + + // this.notes + // this.getcity + // this.getsettings + // this.search + // this.getAbandonCart + +} + + \ No newline at end of file diff --git a/day20/src/utils/MkdSDK.jsx b/day20/src/utils/MkdSDK.jsx new file mode 100644 index 0000000..f625468 --- /dev/null +++ b/day20/src/utils/MkdSDK.jsx @@ -0,0 +1,2810 @@ +import TreeSDK from "./TreeSDK"; +export default function MkdSDK() { + // this._baseurl = "https://inventorylynx.mkdlabs.com"; + this._baseurl = "https://localhost:3048"; + this._project_id = "inventorylynx"; + this._secret = "1qrhpud67j4jpda5zrdm7oi5ugjo8h3c9"; + this._table = ""; + this._GOOGLE_CAPTCHA_SITEKEY = "6LfmBc8jAAAAAKfz4zIiX1HoAwuH-9kcx68-7hhd"; + + const raw = this._project_id + ":" + this._secret; + let base64Encode = btoa(raw); + + this.login = async function (email, password, role) { + const result = await fetch(this._baseurl + "/v2/api/lambda/login", { + method: "post", + headers: { + "Content-Type": "application/json", + "x-project": base64Encode, + }, + body: JSON.stringify({ + email, + password, + role, + }), + }); + const json = await result.json(); + + if (result.status === 401) { + throw new Error(json.message); + } + + if (result.status === 403) { + throw new Error(json.message); + } + return json; + }; + this.oauthLoginApi = async function (type, role) { + const socialLogin = await fetch( + `${this._baseurl}/v2/api/lambda/${type}/login?role=${role}`, + { + headers: { + "x-project": base64Encode, + }, + } + ); + const socialLink = await socialLogin.text(); + console.log(socialLink); + + if (socialLogin.status === 401) { + throw new Error(socialLink.message); + } + + if (socialLogin.status === 403) { + throw new Error(socialLink.message); + } + return socialLink; + }; + + this.getHeader = function () { + return { + Authorization: "Bearer " + localStorage.getItem("token"), + "x-project": base64Encode, + }; + }; + + this.baseUrl = function () { + return this._baseurl; + }; + this.uploadUrl = function () { + return this._baseurl + "/v2/api/lambda/upload"; + }; + + this.updateProfile = async function (payload) { + const result = await fetch(this._baseurl + "/v2/api/lambda/profile", { + method: "post", + headers: { + "Content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }, + body: JSON.stringify({ + ...payload, + }), + }); + const json = await result.json(); + + if (result.status === 401) { + throw new Error(json.message); + } + + if (result.status === 403) { + throw new Error(json.message); + } + return json; + }; + + this.upload = async function (file) { + let formData = new FormData(); + formData.append("file", file); + + const header = { + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }; + + const uploadResult = await fetch(this._baseurl + `/v2/api/lambda/upload`, { + method: "post", + headers: header, + body: formData, + }).then((res) => res.json()); + return uploadResult; + }; + + this.getProfile = async function () { + const result = await fetch(this._baseurl + "/v2/api/lambda/profile", { + method: "get", + headers: { + "Content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }, + }); + const json = await result.json(); + + if (result.status === 401) { + throw new Error(json.message); + } + + if (result.status === 403) { + throw new Error(json.message); + } + return json; + }; + + this.check = async function (role) { + const result = await fetch(this._baseurl + "/v2/api/lambda/check", { + method: "post", + headers: { + "Content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }, + body: JSON.stringify({ + role, + }), + }); + const json = await result.json(); + + if (result.status === 401) { + throw new Error(json.message); + } + return json; + }; + + this.getSession = async function () { + const result = await fetch( + this._baseurl + "/v2/api/lambda/user-sessions/data", + { + method: "get", + headers: { + "Content-Type": "application/json", + "x-project": base64Encode, + }, + } + ); + const json = await result.json(); + + if (result.status === 401) { + throw new Error(json.message); + } + + if (result.status === 403) { + throw new Error(json.message); + } + return json; + }; + + this.sessionPost = async function (reqObj) { + const { + user_id, + session_id, + status, + events, + screen_width, + screen_height, + screen_size, + start_time, + end_time, + html_copy, + } = reqObj; + + const result = await fetch( + this._baseurl + "/v2/api/lambda/analytics/user-sessions/", + { + method: "post", + headers: { + "Content-Type": "application/json", + "x-project": base64Encode, + }, + body: JSON.stringify({ + user_id, + session_id, + status, + events, + screen_width, + screen_height, + screen_size, + start_time, + end_time, + html_copy, + }), + } + ); + const json = await result.json(); + + if (result.status === 401) { + throw new Error(json.message); + } + + if (result.status === 403) { + throw new Error(json.message); + } + return json; + }; + + this.enable2FA = async function (reqObj = {}) { + const result = await fetch(this._baseurl + "/v2/api/lambda/2fa/enable", { + method: "post", + headers: { + "Content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }, + body: JSON.stringify({ ...reqObj }), + }); + const json = await result.json(); + + if (result.status === 401) { + throw new Error(json.message); + } + + if (result.status === 403) { + throw new Error(json.message); + } + return json; + }; + + this.disable2FA = async function (reqObj = {}) { + const result = await fetch(this._baseurl + "/v2/api/lambda/2fa/disable", { + method: "post", + headers: { + "Content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }, + body: JSON.stringify({ ...reqObj }), + }); + const json = await result.json(); + + if (result.status === 401) { + throw new Error(json.message); + } + + if (result.status === 403) { + throw new Error(json.message); + } + return json; + }; + + this.verify2FA = async function (access_token, token) { + const result = await fetch(this._baseurl + "/v2/api/lambda/2fa/verify", { + method: "post", + headers: { + "Content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + access_token, + }, + body: JSON.stringify({ + access_token: access_token, + token: token, + }), + }); + const json = await result.json(); + + if (result.status === 401) { + throw new Error(json.message); + } + + if (result.status === 403) { + throw new Error(json.message); + } + return json; + }; + + this.authorize2FA = async function (access_token) { + const result = await fetch(this._baseurl + "/v2/api/lambda/2fa/authorize", { + method: "post", + headers: { + "Content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + access_token, + }, + }); + const json = await result.json(); + + if (result.status === 401) { + throw new Error(json.message); + } + + if (result.status === 403) { + throw new Error(json.message); + } + return json; + }; + + this.captchaValidation = async function (captchaToken) { + const result = await fetch( + this._baseurl + "/v2/api/lambda/google-captcha", + { + method: "post", + headers: { + "Content-Type": "application/json", + "x-project": base64Encode, + }, + body: JSON.stringify({ captchaToken }), + } + ); + const json = await result.json(); + + if (result.status === 401) { + throw new Error(json.message); + } + + if (result.status === 403) { + throw new Error(json.message); + } + return json; + }; + + this.magicLoginAttempt = async function (email, role) { + const result = await fetch( + this._baseurl + "/v2/api/lambda/magic-login/generate", + { + method: "post", + headers: { + "Content-Type": "application/json", + "x-project": base64Encode, + }, + body: JSON.stringify({ + email, + role, + url: this._baseurl + "/magic-login/verify", + }), + } + ); + const json = await result.json(); + + if (result.status === 401) { + throw new Error(json.message); + } + + if (result.status === 403) { + throw new Error(json.message); + } + return json; + }; + + this.magicLoginVerify = async function (token = "") { + const result = await fetch(this._baseurl + "/v2/api/lambda/magic-login", { + method: "post", + headers: { + "Content-Type": "application/json", + "x-project": base64Encode, + }, + body: JSON.stringify({ + token, + }), + }); + const json = await result.json(); + + if (result.status === 401) { + throw new Error(json.message); + } + + if (result.status === 403) { + throw new Error(json.message); + } + return json; + }; + + this.exportCSV = async function () { + const header = { + "content-type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }; + const getResult = await fetch( + this._baseurl + `/rest/${this._table}/EXPORT`, + { + method: "post", + headers: header, + } + ); + const res = await getResult.text(); + let hiddenElement = document.createElement("a"); + hiddenElement.href = "data:text/csv;charset=utf-8," + encodeURI(res); + hiddenElement.target = "_blank"; + + hiddenElement.download = this._table + ".csv"; + hiddenElement.click(); + + if (getResult.status === 401) { + throw new Error(res.message); + } + + if (getResult.status === 403) { + throw new Error(res.message); + } + }; + + this.analyticsPost = async function (uri, payload, method) { + const header = { + "Content-Type": "application/json", + "x-project": base64Encode, + }; + + const result = await fetch(uri, { + method: method, + headers: header, + body: JSON.stringify(payload), + }); + + const jsonResult = await result.json(); + + if (result.status === 401) { + throw new Error(jsonResult.message); + } + + if (result.status === 403) { + throw new Error(jsonResult.message); + } + return jsonResult; + }; + + this.getProfilePreference = async function () { + const result = await fetch(this._baseurl + "/v2/api/lambda/preference", { + method: "get", + headers: { + "Content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }, + }); + const json = await result.json(); + + if (result.status === 401) { + throw new Error(json.message); + } + + if (result.status === 403) { + throw new Error(json.message); + } + return json; + }; + + // update email + this.updateEmail = async function (email) { + const result = await fetch(this._baseurl + "/v2/api/lambda/update/email", { + method: "post", + headers: { + "Content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }, + body: JSON.stringify({ + email, + }), + }); + const json = await result.json(); + + if (result.status === 401) { + throw new Error(json.message); + } + + if (result.status === 403) { + throw new Error(json.message); + } + return json; + }; + + // update password + this.updatePassword = async function (password) { + const result = await fetch( + this._baseurl + "/v2/api/lambda/update/password", + { + method: "post", + headers: { + "Content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }, + body: JSON.stringify({ + password, + }), + } + ); + const json = await result.json(); + + if (result.status === 401) { + throw new Error(json.message); + } + + if (result.status === 403) { + throw new Error(json.message); + } + return json; + }; + + // update email + this.updateEmailByAdmin = async function (email, id) { + const result = await fetch( + this._baseurl + "/v2/api/lambda/admin/update/email", + { + method: "post", + headers: { + "Content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }, + body: JSON.stringify({ + email, + id, + }), + } + ); + const json = await result.json(); + + if (result.status === 401) { + throw new Error(json.message); + } + + if (result.status === 403) { + throw new Error(json.message); + } + return json; + }; + + // update password + this.updatePasswordByAdmin = async function (password, id) { + const result = await fetch( + this._baseurl + "/v2/api/lambda/admin/update/password", + { + method: "post", + headers: { + "Content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }, + body: JSON.stringify({ + password, + id, + }), + } + ); + const json = await result.json(); + + if (result.status === 401) { + throw new Error(json.message); + } + + if (result.status === 403) { + throw new Error(json.message); + } + return json; + }; + + this.sendEmailVerification = function () {}; + this.updateEmailVerification = function () {}; + + this.setTable = function (table) { + this._table = table; + }; + + this.getProjectId = function () { + return this._project_id; + }; + + this.logout = function () { + window.localStorage.clear(); + }; + + this.register = async function (email, password, role) { + const result = await fetch(this._baseurl + "/v2/api/lambda/register", { + method: "post", + headers: { + "Content-Type": "application/json", + "x-project": base64Encode, + }, + body: JSON.stringify({ + email, + password, + role, + }), + }); + const json = await result.json(); + + if (result.status === 401) { + throw new Error(json.message); + } + + if (result.status === 403) { + throw new Error(json.message); + } + return json; + }; + + this.verifyUser = async function (user_id) { + const result = await fetch(this._baseurl + "/v2/api/lambda/verify/user", { + method: "post", + headers: { + "Content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }, + body: JSON.stringify({ + user_id, + }), + }); + const json = await result.json(); + + if (result.status === 401) { + throw new Error(json.message); + } + + if (result.status === 403) { + throw new Error(json.message); + } + return json; + }; + + this.createUser = async function (email, password, role) { + const result = await fetch(this._baseurl + "/v2/api/lambda/register", { + method: "post", + headers: { + "Content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }, + body: JSON.stringify({ + email, + password, + role, + }), + }); + const json = await result.json(); + + if (result.status === 401) { + throw new Error(json.message); + } + + if (result.status === 403) { + throw new Error(json.message); + } + return json; + }; + + this.forgot = async function (email, role) { + const result = await fetch(this._baseurl + "/v2/api/lambda/forgot", { + method: "post", + headers: { + "Content-Type": "application/json", + "x-project": base64Encode, + }, + body: JSON.stringify({ + email, + role, + }), + }); + const json = await result.json(); + + if (result.status === 401) { + throw new Error(json.message); + } + + if (result.status === 403) { + throw new Error(json.message); + } + return json; + }; + + this.reset = async function (token, code, password) { + const result = await fetch(this._baseurl + "/v2/api/lambda/reset", { + method: "post", + headers: { + "Content-Type": "application/json", + "x-project": base64Encode, + }, + body: JSON.stringify({ + token, + code, + password, + }), + }); + const json = await result.json(); + + if (result.status === 401) { + throw new Error(json.message); + } + + if (result.status === 403) { + throw new Error(json.message); + } + return json; + }; + + this.callRestAPI = async function (payload, method) { + const header = { + "Content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }; + const tdk = new TreeSDK(); + switch (method) { + case "GET": + let getOptions = {}; + + //TreeSDK compatibility fields + + getOptions.join = payload.join; + return await tdk.getOne(this._table, payload.id, getOptions); + + case "POST": + return await tdk.create(this._table, payload); + + case "PUT": + return tdk.update(this._table, payload.id, payload); + + // Part: Update Table Without Using ID + case "PUTWHERE": + const updateWhereRes = await fetch( + this._baseurl + `/v1/api/rest/${this._table}/${method}`, + { + method: "post", + headers: header, + body: JSON.stringify(payload), // Note: payload: {set: {[string]: any}, where: {[string]: any}} + } + ); + const jsonUpdateWhereRes = await updateWhereRes.json(); + + if (updateWhereRes.status === 401) { + throw new Error(jsonUpdateWhereRes.message); + } + + return jsonUpdateWhereRes; + + case "DELETE": + return tdk.delete(this._table, payload.id); + + case "DELETEALL": + const deleteAllResult = await fetch( + this._baseurl + `/v1/api/rest/${this._table}/${method}`, + { + method: "post", + headers: header, + body: JSON.stringify(payload), + } + ); + const jsonDeleteAll = await deleteAllResult.json(); + + if (deleteAllResult.status === 401) { + throw new Error(jsonDeleteAll.message); + } + + if (deleteAllResult.status === 403) { + throw new Error(jsonDeleteAll.message); + } + return jsonDeleteAll; + case "GETALL": + payload.order = payload.orderBy; + return await tdk.getList(this._table, payload); + case "PAGINATE": + let options = {}; + if (!payload.page) { + payload.page = 1; + } + if (!payload.limit) { + payload.limit = 10; + } + //TreeSDK compatibility fields + options.size = payload.limit; + options.order = payload.sortId; + options.direction = payload.direction; + options.page = payload.page; + options.join = payload.join; + + let filters = payload.payload; + options.filter = Object.keys(filters).map((col) => { + if (typeof filters[col] !== "undefined" && col === "id") + return `${col},eq,${filters[col]}`; + if (typeof filters[col] !== "undefined") + return `${col},cs,${filters[col]}`; + }); + return await tdk.getPaginate(this._table, options); + + case "AUTOCOMPLETE": + const autocompleteResult = await fetch( + this._baseurl + `/v1/api/rest/${this._table}/${method}`, + { + method: "post", + headers: header, + body: JSON.stringify(payload), + } + ); + const jsonAutocomplete = await autocompleteResult.json(); + + if (autocompleteResult.status === 401) { + throw new Error(jsonAutocomplete.message); + } + + if (autocompleteResult.status === 403) { + throw new Error(jsonAutocomplete.message); + } + return jsonAutocomplete; + default: + break; + } + }; + + this.callRawAPI = async function (uri, payload, method) { + const header = { + "Content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }; + + let result; + + if (method === "GET") { + result = await fetch(this._baseurl + uri, { + method: method, + headers: header, + }); + } else { + result = await fetch(this._baseurl + uri, { + method: method, + headers: header, + body: JSON.stringify(payload), + }); + } + + const jsonResult = await result.json(); + + if (result.status === 401) { + throw new Error(jsonResult.message); + } + + if (result.status === 403) { + throw new Error(jsonResult.message); + } + return jsonResult; + }; + + // Part: Get All Data by Joining Two Columns + this.callJoinRestAPI = async function ( + table1, + table2, + join_id_1, + join_id_2, + select, + where, + method, + page, + limit + ) { + const header = { + "Content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }; + + switch (method) { + case "GETALL": + const result = await fetch( + this._baseurl + `/v1/api/join/${table1}/${table2}/${method}`, + { + method: "post", + headers: header, + body: JSON.stringify({ + join_id_1, // "tableName1" + join_id_2, // "tableName2" + select, // "tableName1.field1, tableName2.field2" + where: where || "", // where: ["status=2424", "id=1"] + }), + } + ); + const jsonResult = await result.json(); + + if (result.status === 401) { + throw new Error(jsonResult.message); + } + + if (result.status === 403) { + throw new Error(jsonResult.message); + } + return jsonResult; + + case "PAGINATE": + if (!page) { + page = 1; + } + if (!limit) { + limit = 10; + } + const paginateResult = await fetch( + this._baseurl + `/v1/api/join/${table1}/${table2}/${method}`, + { + method: "post", + headers: header, + body: JSON.stringify({ + join_id_1, // "tableName1" + join_id_2, // "tableName2" + select, // "tableName1.field1, tableName2.field2" + where: where || "", // where: ["status=2424", "id=1"] + page, + limit, + }), + } + ); + const jsonPaginate = await paginateResult.json(); + + if (paginateResult.status === 401) { + throw new Error(jsonPaginate.message); + } + + if (paginateResult.status === 403) { + throw new Error(jsonPaginate.message); + } + return jsonPaginate; + + default: + break; + } + }; + + // Part: Get Data by Joining Multiple Columns with Pagination + this.callMultiJoinRestAPI = async function ( + tables, + joinIds, + selectStr, + where, + page, + limit, + method + ) { + const header = { + "Content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }; + + if (!page) { + page = 1; + } + if (!limit) { + limit = 10; + } + const paginateResult = await fetch( + this._baseurl + `/v1/api/multi-join/${method}`, + { + method: "post", + headers: header, + body: JSON.stringify({ + tables, // ["tableName1", "tableName2"] + joinIds, // ["tableName1.id", "tableName2.id"] + selectStr, // "tableName1.field1, tableName2.field2" + where, // ["status=2424", "id=1"] + page, + limit, + }), + } + ); + const jsonPaginate = await paginateResult.json(); + + if (paginateResult.status === 401) { + throw new Error(jsonPaginate.message); + } + + if (paginateResult.status === 403) { + throw new Error(jsonPaginate.message); + } + return jsonPaginate; + }; + + this.subscribe = function (payload) {}; + this.subscribe = function (payload) {}; + + // subscribe to a channel if it exists, or create if it doesn't + this.subscribeChannel = async function (channel) { + const result = await fetch( + this._baseurl + "/v2/api/lambda/subscription/channel/room", + { + method: "post", + headers: { + "Content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }, + body: JSON.stringify({ + room: channel, + }), + } + ); + + const json = await result.json(); + + if (result.status === 401) { + throw new Error(json.message); + } + + if (result.status === 403) { + throw new Error(json.message); + } + return json; + }; + + // Listen on a channel and wait for response + this.subscribeListen = async function (channel) { + const result = await fetch( + this._baseurl + + "/v2/api/lambda/subscription/channel/poll?room=" + + channel, + { + method: "GET", + headers: { + "Content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }, + } + ); + + const json = await result.json(); + + if (result.status === 401) { + throw new Error(json.message); + } + + if (result.status === 403) { + throw new Error(json.message); + } + return json; + }; + this.unSubscribeChannel = async function (channel) { + const result = await fetch( + this._baseurl + + "/v2/api/lambda/subscription/channel/unsubscribe?room=" + + channel, + { + method: "GET", + headers: { + "Content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }, + } + ); + + const json = await result.json(); + + if (result.status === 401) { + throw new Error(json.message); + } + + if (result.status === 403) { + throw new Error(json.message); + } + return json; + }; + + // check if channel exist + this.channelOnline = async function (channel) { + const result = await fetch( + this._baseurl + + "/v2/api/lambda/subscription/channel/online?room=" + + channel, + { + method: "GET", + headers: { + "Content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }, + } + ); + + const json = await result.json(); + + if (result.status === 401) { + throw new Error(json.message); + } + + if (result.status === 403) { + throw new Error(json.message); + } + return json; + }; + + // Publish to the specified channel + this.broadcast = async function (payload, channel) { + const result = await fetch( + this._baseurl + "/v2/api/lambda/subscription/channel/send", + { + method: "post", + headers: { + "Content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }, + body: JSON.stringify({ + payload: payload, + room: channel, + }), + } + ); + + const json = await result.json(); + + if (result.status === 401) { + throw new Error(json.message); + } + + if (result.status === 403) { + throw new Error(json.message); + } + return json; + }; + + this.cmsAdd = async function (page, key, type, value) { + const header = { + "Content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }; + + const insertResult = await fetch(this._baseurl + `/v2/api/lambda/cms`, { + method: "post", + headers: header, + body: JSON.stringify({ + page, + key, + type, + value, + }), + }); + const jsonInsert = await insertResult.json(); + + if (insertResult.status === 401) { + throw new Error(jsonInsert.message); + } + + if (insertResult.status === 403) { + throw new Error(jsonInsert.message); + } + return jsonInsert; + }; + + this.cmsEdit = async function (id, page, key, type, value) { + const header = { + "Content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }; + + const updateResult = await fetch( + this._baseurl + `/v2/api/lambda/cms/` + id, + { + method: "put", + headers: header, + body: JSON.stringify({ + page, + key, + type, + value, + }), + } + ); + const jsonInsert = await updateResult.json(); + + if (updateResult.status === 401) { + throw new Error(jsonInsert.message); + } + + if (updateResult.status === 403) { + throw new Error(jsonInsert.message); + } + return jsonInsert; + }; + + this.getToken = function () { + return window.localStorage.getItem("token"); + }; + + // get chat room + this.getMyRoom = async function () { + const result = await fetch( + this._baseurl + "/v3/api/lambda/realtime/room/my", + { + method: "GET", + headers: { + "Content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }, + } + ); + + const json = await result.json(); + + if (result.status === 401) { + throw new Error(json.message); + } + + if (result.status === 403) { + throw new Error(json.message); + } + return json; + }; + + // get chat id + this.getChatId = async function (room_id) { + const result = await fetch( + this._baseurl + `/v2/api/lambda/room?room_id=${room_id}`, + { + method: "get", + headers: { + "Content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }, + } + ); + const json = await result.json(); + + if (result.status === 401) { + throw new Error(json.message); + } + + if (result.status === 403) { + throw new Error(json.message); + } + return json; + }; + + // post chat + this.getChats = async function (room_id, chat_id, date) { + const result = await fetch(this._baseurl + `/v3/api/lambda/realtime/chat`, { + method: "post", + headers: { + "Content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }, + body: JSON.stringify({ + room_id, + chat_id, + date, + }), + }); + const json = await result.json(); + + if (result.status === 401) { + throw new Error(json.message); + } + + if (result.status === 403) { + throw new Error(json.message); + } + return json; + }; + + this.restoreChat = async function (room_id) { + await fetch( + this._baseurl + `/v2/api/lambda/v2/api/lambda/room/poll?room=${room_id}`, + { + method: "get", + headers: { + "Content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }, + } + ); + }; + + // post a new message + this.postMessage = async function (messageDetails) { + const result = await fetch(this._baseurl + `/v3/api/lambda/realtime/send`, { + method: "post", + headers: { + "Content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }, + body: JSON.stringify(messageDetails), + }); + const json = await result.json(); + + if (result.status === 401) { + throw new Error(json.message); + } + + if (result.status === 403) { + throw new Error(json.message); + } + return json; + }; + + this.uploadImage = async function (file) { + const result = await fetch(this._baseurl + `/v2/api/lambda/s3/upload`, { + method: "post", + headers: { + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }, + body: file, + }); + + const json = await result.json(); + + if (result.status === 401) { + throw new Error(json.message); + } + + if (result.status === 403) { + throw new Error(json.message); + } + return json; + }; + this.editorUploadImage = async function (file) { + let formData = new FormData(); + formData.append("file", file); + const result = await fetch(this._baseurl + `/v2/api/lambda/s3/upload`, { + method: "post", + headers: { + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }, + body: formData, + }); + + const json = await result.json(); + + if (result.status === 401) { + throw new Error(json.message); + } + + if (result.status === 403) { + throw new Error(json.message); + } + return json; + }; + + this.createRoom = async function (roomDetails) { + const result = await fetch(this._baseurl + `/v3/api/lambda/realtime/room`, { + method: "post", + headers: { + "Content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }, + body: JSON.stringify(roomDetails), + }); + const json = await result.json(); + + if (result.status === 401) { + throw new Error(json.message); + } + + if (result.status === 403) { + throw new Error(json.message); + } + return json; + }; + + this.getAllUsers = async function () { + const result = await fetch(this._baseurl + `/v1/api/rest/user/GETALL`, { + method: "POST", + headers: { + "Content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }, + }); + const json = await result.json(); + + if (result.status === 401) { + throw new Error(json.message); + } + + if (result.status === 403) { + throw new Error(json.message); + } + return json; + }; + + // start pooling + this.startPooling = async function (user_id, signal) { + const result = await fetch( + this._baseurl + `/v3/api/lambda/realtime/room/poll?user_id=${user_id}`, + { + method: "GET", + headers: { + "Content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }, + signal, + } + ); + + const json = await result.json(); + + if (result.status === 401) { + throw new Error(json.message); + } + + if (result.status === 403) { + throw new Error(json.message); + } + return json; + }; + + /** + * start stripe functions + */ + + this.addStripeProduct = async function (data) { + const result = await fetch( + this._baseurl + "/v2/api/lambda/stripe/product", + { + method: "post", + headers: { + "content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }, + body: JSON.stringify(data), + } + ); + + const json = await result.json(); + if ([401, 403, 500].includes(result.status)) { + throw new Error(json.message); + } + return json; + }; + + this.getStripeProducts = async function (paginationParams, filterParams) { + const header = { + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }; + const paginationQuery = new URLSearchParams(paginationParams); + // const filterQuery = new URLSearchParams(filterParams); + const getResult = await fetch( + this._baseurl + + `/v2/api/lambda/stripe/products?${paginationQuery}&${filterParams}`, + { + method: "get", + headers: header, + } + ); + const jsonGet = await getResult.json(); + + if ([401, 403, 500].includes(getResult.status)) { + throw new Error(jsonGet.message); + } + + return jsonGet; + }; + + this.getStripeProduct = async function (id) { + const header = { + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }; + const getResult = await fetch( + this._baseurl + `/v2/api/lambda/stripe/product/${id}`, + { + method: "get", + headers: header, + } + ); + const jsonGet = await getResult.json(); + + if ([401, 403, 500].includes(getResult.status)) { + throw new Error(jsonGet.message); + } + + return jsonGet; + }; + + this.updateStripeProduct = async function (id, payload) { + const header = { + "content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }; + const getResult = await fetch( + this._baseurl + `/v2/api/lambda/stripe/product/${id}`, + { + method: "put", + headers: header, + body: JSON.stringify(payload), + } + ); + const jsonGet = await getResult.json(); + + if ([401, 403, 500].includes(getResult.status)) { + throw new Error(jsonGet.message); + } + + return jsonGet; + }; + + this.addStripePrice = async function (data) { + const result = await fetch(this._baseurl + "/v2/api/lambda/stripe/price", { + method: "post", + headers: { + "content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }, + body: JSON.stringify(data), + }); + + const json = await result.json(); + if ([401, 403, 500].includes(result.status)) { + throw new Error(json.message); + } + return json; + }; + + this.getStripePrices = async function (paginationParams, filterParams) { + const header = { + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }; + const paginationQuery = new URLSearchParams(paginationParams); + // const filterQuery = new URLSearchParams(filterParams); + const getResult = await fetch( + this._baseurl + + `/v2/api/lambda/stripe/prices?${paginationQuery}&${filterParams}`, + { + method: "get", + headers: header, + } + ); + const jsonGet = await getResult.json(); + + if ([401, 403, 500].includes(getResult.status)) { + throw new Error(jsonGet.message); + } + + return jsonGet; + }; + + this.getStripePaymentLinks = async function () { + const header = { + "x-project": base64Encode, + // Authorization: "Bearer " + localStorage.getItem("token") + }; + + const getResult = await fetch( + this._baseurl + `/v2/api/lambda/stripe/paymentlinks`, + { + method: "get", + headers: header, + } + ); + const jsonGet = await getResult.json(); + + if ([401, 403, 500].includes(getResult.status)) { + throw new Error(jsonGet.message); + } + + return jsonGet; + }; + + this.getStripePrice = async function (id) { + const header = { + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }; + const getResult = await fetch( + this._baseurl + `/v2/api/lambda/stripe/price/${id}`, + { + method: "get", + headers: header, + } + ); + const jsonGet = await getResult.json(); + + if ([401, 403, 500].includes(getResult.status)) { + throw new Error(jsonGet.message); + } + + return jsonGet; + }; + + this.updateStripePrice = async function (id, payload) { + const header = { + "content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }; + const getResult = await fetch( + this._baseurl + `/v2/api/lambda/stripe/price/${id}`, + { + method: "put", + headers: header, + body: JSON.stringify(payload), + } + ); + const jsonGet = await getResult.json(); + + if ([401, 403, 500].includes(getResult.status)) { + throw new Error(jsonGet.message); + } + + return jsonGet; + }; + + this.getStripeSubscriptions = async function ( + paginationParams, + filterParams + ) { + const header = { + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }; + const paginationQuery = new URLSearchParams(paginationParams); + // const filterQuery = new URLSearchParams(filterParams); + const getResult = await fetch( + this._baseurl + + `/v2/api/lambda/stripe/subscriptions?${paginationQuery}&${filterParams}`, + { + method: "get", + headers: header, + } + ); + const jsonGet = await getResult.json(); + + if ([401, 403, 500].includes(getResult.status)) { + throw new Error(jsonGet.message); + } + + return jsonGet; + }; + + this.adminCancelStripeSubscription = async function (subId, data) { + const result = await fetch( + this._baseurl + `/v2/api/lambda/stripe/subscription/${subId}`, + { + method: "delete", + headers: { + "content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }, + body: JSON.stringify(data), + } + ); + + const json = await result.json(); + if ([401, 403, 500].includes(result.status)) { + throw new Error(json.message); + } + + return json; + }; + + this.adminCreateUsageCharge = async function (subId, quantity) { + const result = await fetch( + this._baseurl + `/v2/api/lambda/stripe/subscription/usage-charge`, + { + method: "post", + headers: { + "content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }, + body: JSON.stringify({ + subId, + quantity, + }), + } + ); + + const json = await result.json(); + if ([401, 403, 500].includes(result.status)) { + throw new Error(json.message); + } + + return json; + }; + + this.getStripeInvoices = async function (paginationParams, filterParams) { + const header = { + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }; + const paginationQuery = new URLSearchParams(paginationParams); + const filterQuery = new URLSearchParams(filterParams); + const getResult = await fetch( + this._baseurl + `/v2/api/lambda/stripe/invoices?${paginationQuery}`, + { + method: "get", + headers: header, + } + ); + + const jsonGet = await getResult.json(); + + if ([401, 403, 500].includes(getResult.status)) { + throw new Error(jsonGet.message); + } + + return jsonGet; + }; + this.getStripeInvoicesV2 = async function (paginationParams, filterParams) { + const header = { + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }; + const paginationQuery = new URLSearchParams(paginationParams); + // const filterQuery = new URLSearchParams(filterParams); + const getResult = await fetch( + this._baseurl + + `/v2/api/lambda/stripe/invoices-v2?${paginationQuery}&${filterParams}`, + { + method: "get", + headers: header, + } + ); + + const jsonGet = await getResult.json(); + + if ([401, 403, 500].includes(getResult.status)) { + throw new Error(jsonGet.message); + } + + return jsonGet; + }; + + this.getStripeOrders = async function (paginationParams, filterParams) { + const header = { + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }; + const paginationQuery = new URLSearchParams(paginationParams); + const filterQuery = new URLSearchParams(filterParams); + const getResult = await fetch( + this._baseurl + + `/v2/api/lambda/stripe/orders?${paginationQuery}&${filterQuery}`, + { + method: "get", + headers: header, + } + ); + + const jsonGet = await getResult.json(); + + if ([401, 403, 500].includes(getResult.status)) { + throw new Error(jsonGet.message); + } + + return jsonGet; + }; + + /** + * ------------------------------------------------------- + */ + + this.initCheckoutSession = async function (data) { + const result = await fetch( + this._baseurl + "/v2/api/lambda/stripe/checkout", + { + method: "post", + headers: { + "content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }, + body: JSON.stringify(data), + } + ); + + const json = await result.json(); + if ([401, 403, 500].includes(result.status)) { + throw new Error(json.message); + } + return json; + }; + + this.registerAndSubscribe = async function (data) { + /** + * + * @param {object} data {email, password, cardToken, planId} + * @returns + */ + const result = await fetch( + this._baseurl + "/v2/api/lambda/stripe/customer/register-subscribe", + { + method: "post", + headers: { + "content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }, + body: JSON.stringify(data), + } + ); + + const json = await result.json(); + if ([401, 403, 500].includes(result.status)) { + throw new Error(json.message); + } + return json; + }; + + this.createStripeCustomer = async function (payload) { + const header = { + "content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }; + + const getResult = await fetch( + this._baseurl + `/v2/api/lambda/stripe/customer`, + { + method: "post", + headers: header, + body: JSON.stringify(payload), + } + ); + const jsonGet = await getResult.json(); + + if ([401, 403, 500].includes(getResult.status)) { + throw new Error(jsonGet.message); + } + + return jsonGet; + }; + + this.createCustomerStripeCard = async function (payload) { + const header = { + "content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }; + + const getResult = await fetch( + this._baseurl + `/v2/api/lambda/stripe/customer/card`, + { + method: "post", + headers: header, + body: JSON.stringify(payload), + } + ); + + const jsonGet = await getResult.json(); + + if ([401, 403, 500].includes(getResult.status)) { + throw new Error(jsonGet.message); + } + + return jsonGet; + }; + + this.createStripeSubscription = async function (data) { + const result = await fetch( + this._baseurl + "/v2/api/lambda/stripe/customer/subscription", + { + method: "post", + headers: { + "content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }, + body: JSON.stringify(data), + } + ); + + const json = await result.json(); + if ([401, 403, 500].includes(result.status)) { + throw new Error(json.message); + } + return json; + }; + + this.getCustomerStripeSubscription = async function (userId) { + const header = { + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }; + + const getResult = await fetch( + this._baseurl + `/v2/api/lambda/stripe/customer/subscription`, + { + method: "get", + headers: header, + } + ); + const jsonGet = await getResult.json(); + + if ([401, 403, 500].includes(getResult.status)) { + throw new Error(jsonGet.message); + } + + return jsonGet; + }; + + this.getCustomerStripeSubscriptions = async function ( + paginationParams, + filterParams + ) { + const header = { + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }; + const paginationQuery = new URLSearchParams(paginationParams); + const filterQuery = new URLSearchParams(filterParams); + const getResult = await fetch( + this._baseurl + + `/v2/api/lambda/stripe/customer/subscriptions?${paginationQuery}&${filterQuery}`, + { + method: "get", + headers: header, + } + ); + const jsonGet = await getResult.json(); + + if ([401, 403, 500].includes(getResult.status)) { + throw new Error(jsonGet.message); + } + + return jsonGet; + }; + + this.changeStripeSubscription = async function (data) { + const result = await fetch( + this._baseurl + "/v2/api/lambda/stripe/customer/subscription", + { + method: "put", + headers: { + "content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }, + body: JSON.stringify(data), + } + ); + + const json = await result.json(); + if ([401, 403, 500].includes(result.status)) { + throw new Error(json.message); + } + return json; + }; + + this.cancelStripeSubscription = async function (subId, data) { + const result = await fetch( + this._baseurl + `/v2/api/lambda/stripe/customer/subscription/${subId}`, + { + method: "delete", + headers: { + "content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }, + body: JSON.stringify(data), + } + ); + + const json = await result.json(); + if ([401, 403, 500].includes(result.status)) { + throw new Error(json.message); + } + return json; + }; + + this.getCustomerStripeDetails = async function () { + const header = { + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }; + + const getResult = await fetch( + this._baseurl + `/v2/api/lambda/stripe/customer`, + { + method: "get", + headers: header, + } + ); + + const jsonGet = await getResult.json(); + + if ([401, 403, 500].includes(getResult.status)) { + throw new Error(jsonGet.message); + } + + return jsonGet; + }; + + this.getCustomerStripeCards = async function (paginationParams) { + const header = { + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }; + const paginationQuery = new URLSearchParams(paginationParams); + const getResult = await fetch( + this._baseurl + `/v2/api/lambda/stripe/customer/cards?${paginationQuery}`, + { + method: "get", + headers: header, + } + ); + + const jsonGet = await getResult.json(); + + if ([401, 403, 500].includes(getResult.status)) { + throw new Error(jsonGet.message); + } + + return jsonGet; + }; + + this.getCustomerStripeInvoices = async function (paginationParams) { + const header = { + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }; + const paginationQuery = new URLSearchParams(paginationParams); + const getResult = await fetch( + this._baseurl + + `/v2/api/lambda/stripe/customer/invoices?${paginationQuery}`, + { + method: "get", + headers: header, + } + ); + + const jsonGet = await getResult.json(); + + if ([401, 403, 500].includes(getResult.status)) { + throw new Error(jsonGet.message); + } + + return jsonGet; + }; + + this.getCustomerStripeCharges = async function (paginationParams) { + const header = { + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }; + const paginationQuery = new URLSearchParams(paginationParams); + const getResult = await fetch( + this._baseurl + + `/v2/api/lambda/stripe/customer/charges?${paginationQuery}`, + { + method: "get", + headers: header, + } + ); + + const jsonGet = await getResult.json(); + + if ([401, 403, 500].includes(getResult.status)) { + throw new Error(jsonGet.message); + } + + return jsonGet; + }; + + this.getCustomerStripeOrders = async function (paginationParams) { + const header = { + Authorization: "Bearer " + localStorage.getItem("token"), + "x-project": base64Encode, + }; + const paginationQuery = new URLSearchParams(paginationParams); + const getResult = await fetch( + this._baseurl + + `/v2/api/lambda/stripe/customer/orders?${paginationQuery}`, + { + method: "get", + headers: header, + } + ); + + const jsonGet = await getResult.json(); + + if ([401, 403, 500].includes(getResult.status)) { + throw new Error(jsonGet.message); + } + + return jsonGet; + }; + + this.setStripeCustomerDefaultCard = async function (cardId) { + const header = { + "content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }; + const getResult = await fetch( + this._baseurl + + `/v2/api/lambda/stripe/customer/card/${cardId}/set-default`, + { + method: "put", + headers: header, + } + ); + const jsonGet = await getResult.json(); + + if ([401, 403, 500].includes(getResult.status)) { + throw new Error(jsonGet.message); + } + + return jsonGet; + }; + + this.deleteCustomerStripeCard = async function (cardId) { + const header = { + "content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }; + const getResult = await fetch( + this._baseurl + `/v2/api/lambda/stripe/customer/card/${cardId}`, + { + method: "delete", + headers: header, + } + ); + const jsonGet = await getResult.json(); + + if ([401, 403, 500].includes(getResult.status)) { + throw new Error(jsonGet.message); + } + + return jsonGet; + }; + + /** end stripe functions */ + + // Chapter: Scheduling + // Part: Get Unavailable Scheduling Dates + this.getUnavailableDates = async function (userId, date) { + const result = await fetch( + this._baseurl + "/v2/api/lambda/scheduling/dates", + { + method: "post", + headers: { + "Content-Type": "application/json", + "x-project": base64Encode, + }, + body: JSON.stringify({ + userId, + date, + }), + } + ); + const json = await result.json(); + + if (result.status === 401) { + throw new Error(json.message); + } + + if (result.status === 403) { + throw new Error(json.message); + } + return json; + }; + + this.getSchedules = async function (userId, date) { + const result = await fetch( + this._baseurl + "/v2/api/lambda/scheduling/schedules", + { + method: "post", + headers: { + "Content-Type": "application/json", + "x-project": base64Encode, + }, + body: JSON.stringify({ + userId, + date, + }), + } + ); + const json = await result.json(); + + if (result.status === 401) { + throw new Error(json.message); + } + + if (result.status === 403) { + throw new Error(json.message); + } + return json; + }; + + this.getSchedulesWithTZ = async function (rangeStart, rangeEnd, userId, tz) { + const result = await fetch( + this._baseurl + "/v2/api/lambda/scheduling/tz-month-schedules", + { + method: "post", + headers: { + "Content-Type": "application/json", + "x-project": base64Encode, + }, + body: JSON.stringify({ + rangeStart, + rangeEnd, + userId, + tz, + }), + } + ); + const json = await result.json(); + + if (result.status === 401) { + throw new Error(json.message); + } + + if (result.status === 403) { + throw new Error(json.message); + } + return json; + }; + + this.createScheduling = async function ( + user_id, + meeting_start, + meeting_end, + meeting_details + ) { + const result = await fetch( + this._baseurl + "/v2/api/lambda/scheduling/POST", + { + method: "POST", + headers: { + "Content-Type": "application/json", + "x-project": + "bWFuYWtuaWdodDo1ZmNoeG41bThoYm82amN4aXEzeGRkb2ZvZG9hY3NreWUx", // Note: manaknight + }, + body: JSON.stringify({ + user_id, + meeting_start, + meeting_end, + meeting_details, + }), + } + ); + const json = await result.json(); + + if (result.status === 401) { + throw new Error(json.message); + } + + if (result.status === 403) { + throw new Error(json.message); + } + return json; + }; + + this.addEventToGC = async function ( + access_token, + expires_in, + refresh_token, + scope, + token_type, + summary, + location, + description, + startTime, + endTime, + attendees + ) { + const result = await fetch( + this._baseurl + "/v2/api/lambda/scheduling/google-calendar-event", + { + method: "POST", + headers: { + "Content-Type": "application/json", + "x-project": + "bWFuYWtuaWdodDo1ZmNoeG41bThoYm82amN4aXEzeGRkb2ZvZG9hY3NreWUx", // Note: manaknight + }, + body: JSON.stringify({ + access_token, + expires_in, + refresh_token, + scope, + token_type, + summary, + location, + description, + startTime, + endTime, + attendees, + }), + } + ); + const json = await result.json(); + + if (result.status === 401) { + throw new Error(json.message); + } + + if (result.status === 403) { + throw new Error(json.message); + } + return json; + }; + + /** + * + * @param {number[]|undefined} tags + * @param {number[]|undefined} categories + * @param {"or"| 'and' | undefined} rule + * @returns + */ + this.getFilteredBlogs = async function ( + tags = [], + categories = [], + rule = undefined + ) { + let endpoint = "/v2/api/lambda/blog/filter?"; + if (tags && tags.length) { + if (endpoint.endsWith("?")) { + endpoint += `tags=${tags}`; + } else { + endpoint += `&tags=${tags}`; + } + } + if (categories && categories.length) { + if (endpoint.endsWith("?")) { + endpoint += `categories=${categories}`; + } else { + endpoint += `&categories=${categories}`; + } + // endpoint += `tags=[1]&categories=[4]&rule=or` + } + if (rule) { + if (endpoint.endsWith("?")) { + endpoint += `rule=${rule}`; + } else { + endpoint += `&rule=${rule}`; + } + // endpoint += `tags=[1]&categories=[4]&rule=or` + } + + const result = await fetch(this._baseurl + `${endpoint}`, { + headers: { + "Content-Type": "application/json", + "x-project": base64Encode, + }, + }); + const json = await result.json(); + + if ([401, 402, 403, 404, 500, 502, 501].includes(result.status)) { + throw new Error(json.message); + } + + return json; + }; + + this.getAllBlogs = async function () { + const result = await fetch(this._baseurl + `/v2/api/lambda/blog/all `, { + headers: { + "Content-Type": "application/json", + "x-project": base64Encode, + }, + }); + const json = await result.json(); + + if ([401, 402, 403, 404, 500, 502, 501].includes(result.status)) { + throw new Error(json.message); + } + + return json; + }; + + this.createBlog = async function (payload) { + const result = await fetch(this._baseurl + `/v2/api/lambda/blog/create`, { + method: "POST", + headers: { + "Content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }, + body: JSON.stringify(payload), + }); + const json = await result.json(); + + if ([401, 402, 403, 404, 500, 502, 501].includes(result.status)) { + throw new Error(json.message); + } + + return json; + }; + this.getSingleBlog = async function (id) { + const result = await fetch( + this._baseurl + `/v2/api/lambda/blog/single/${id}`, + { + headers: { + "Content-Type": "application/json", + "x-project": base64Encode, + // Authorization: "Bearer " + localStorage.getItem( "token" ) + }, + // body: JSON.stringify( payload ) + } + ); + const json = await result.json(); + + if ([401, 402, 403, 404, 500, 502, 501].includes(result.status)) { + throw new Error(json.message); + } + + return json; + }; + this.editBlog = async function (id, payload) { + const result = await fetch( + this._baseurl + `/v2/api/lambda/blog/edit/${id}`, + { + method: "POST", + headers: { + "Content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }, + body: JSON.stringify(payload), + } + ); + const json = await result.json(); + + if ([401, 402, 403, 404, 500, 502, 501].includes(result.status)) { + throw new Error(json.message); + } + + return json; + }; + this.deleteBlog = async function (id) { + const result = await fetch( + this._baseurl + `/v2/api/lambda/blog/delete/${id}`, + { + method: "DELETE", + headers: { + "Content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }, + } + ); + const json = await result.json(); + + if ([401, 402, 403, 404, 500, 502, 501].includes(result.status)) { + throw new Error(json.message); + } + + return json; + }; + + // BLOG CATEFORY + this.getallBlogCategories = async function () { + const result = await fetch(this._baseurl + `/v2/api/lambda/blog/category`, { + headers: { + "Content-Type": "application/json", + "x-project": base64Encode, + // Authorization: "Bearer " + localStorage.getItem( "token" ) + }, + }); + const json = await result.json(); + + if ([401, 402, 403, 404, 500, 502, 501].includes(result.status)) { + throw new Error(json.message); + } + + return json; + }; + this.createBlogCategory = async function (payload) { + const result = await fetch(this._baseurl + `/v2/api/lambda/blog/category`, { + method: "POST", + headers: { + "Content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }, + body: JSON.stringify(payload), + }); + const json = await result.json(); + + if ([401, 402, 403, 404, 500, 502, 501].includes(result.status)) { + throw new Error(json.message); + } + + return json; + }; + this.deleteBlogCategory = async function (id) { + const result = await fetch( + this._baseurl + `/v2/api/lambda/blog/category/${id}`, + { + method: "DELETE", + headers: { + "Content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }, + } + ); + const json = await result.json(); + + if ([401, 402, 403, 404, 500, 502, 501].includes(result.status)) { + throw new Error(json.message); + } + + return json; + }; + + // BLOG TAG + this.getallBlogTags = async function () { + const result = await fetch(this._baseurl + `/v2/api/lambda/blog/tags`, { + headers: { + "Content-Type": "application/json", + "x-project": base64Encode, + // Authorization: "Bearer " + localStorage.getItem( "token" ) + }, + }); + const json = await result.json(); + + if ([401, 402, 403, 404, 500, 502, 501].includes(result.status)) { + throw new Error(json.message); + } + + return json; + }; + this.createBlogTag = async function (payload) { + const result = await fetch(this._baseurl + `/v2/api/lambda/blog/tags`, { + method: "POST", + headers: { + "Content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }, + body: JSON.stringify(payload), + }); + const json = await result.json(); + + if ([401, 402, 403, 404, 500, 502, 501].includes(result.status)) { + throw new Error(json.message); + } + + return json; + }; + this.deleteBlogTag = async function (id) { + const result = await fetch(this._baseurl + `/v2/api/lambda/blog/tags`, { + method: "DELETE", + headers: { + "Content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }, + }); + const json = await result.json(); + + if ([401, 402, 403, 404, 500, 502, 501].includes(result.status)) { + throw new Error(json.message); + } + + return json; + }; + + // Trello Requests + + this.getAllWorkspaces = async function () { + const result = await fetch( + this._baseurl + `/v2/api/lambda/pm/workspaces?limit=99999`, + { + method: "get", + headers: { + "Content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }, + } + ); + const json = await result.json(); + + if (result.status === 401) { + throw new Error(json.message); + } + + if (result.status === 403) { + throw new Error(json.message); + } + return json; + }; + + this.getWorkspace = async function (id) { + const result = await fetch( + this._baseurl + `/v2/api/lambda/pm/workspaces/${id}`, + { + method: "get", + headers: { + "Content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }, + } + ); + const json = await result.json(); + + if (result.status === 401) { + throw new Error(json.message); + } + + if (result.status === 403) { + throw new Error(json.message); + } + return json; + }; + + this.createWorkspace = async function (obj) { + const result = await fetch(this._baseurl + `/v2/api/lambda/pm/workspaces`, { + method: "post", + headers: { + "Content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }, + body: JSON.stringify(obj), + }); + const json = await result.json(); + + if (result.status === 401) { + throw new Error(json.message); + } + + if (result.status === 403) { + throw new Error(json.message); + } + return json; + }; + + this.createUserBoards = async function (workspaceId, reqObj) { + const result = await fetch( + this._baseurl + `/v2/api/lambda/pm/workspaces/${workspaceId}/boards`, + { + method: "post", + headers: { + "Content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }, + body: JSON.stringify({ ...reqObj, workspace_id: workspaceId }), + } + ); + const json = await result.json(); + + if (result.status === 401) { + throw new Error(json.message); + } + + if (result.status === 403) { + throw new Error(json.message); + } + return json; + }; + + this.getUserBoards = async function ( + workspaceId, + page = 1, + limit = 10, + id = "id", + direction = "desc" + ) { + const result = await fetch( + this._baseurl + + `/v2/api/lambda/pm/workspaces/${workspaceId}/boards?page=${page}&limit=${limit}&sortId=${id}&direction=${direction}`, + { + method: "get", + headers: { + "Content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }, + } + ); + const json = await result.json(); + + if (result.status === 401) { + throw new Error(json.message); + } + + if (result.status === 403) { + throw new Error(json.message); + } + return json; + }; + + this.chatGPT = async function (message) { + const result = await fetch(this._baseurl + "/v2/api/qna/query", { + method: "post", + headers: { + "Content-Type": "application/json", + Authorization: "Bearer " + localStorage.getItem("token"), + "x-project": base64Encode, + }, + body: JSON.stringify({ + user_prompt: message, + }), + }); + const json = await result.json(); + + if (result.status === 401) { + throw new Error(json.message); + } + + if (result.status === 403) { + throw new Error(json.message); + } + return json; + }; + + this.gptTranscribe = async function (file) { + const result = await fetch( + this._baseurl + `/v5/api/deployments/sow/gpt-transcribe`, + { + method: "post", + headers: { + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }, + body: file, + } + ); + + const json = await result.json(); + + if (result.status === 401) { + throw new Error(json.message); + } + + if (result.status === 403) { + throw new Error(json.message); + } + return json; + }; + + this.gptTranslate = async function (file) { + const result = await fetch( + this._baseurl + `/v5/api/deployments/sow/gpt-translate`, + { + method: "post", + headers: { + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }, + body: file, + } + ); + + const json = await result.json(); + + if (result.status === 401) { + throw new Error(json.message); + } + + if (result.status === 403) { + throw new Error(json.message); + } + return json; + }; + + this.runPodStatus = async function () { + const result = await fetch(this._baseurl + "v2/api/qna/server/status", { + method: "get", + headers: { + "Content-Type": "application/json", + Authorization: "Bearer " + localStorage.getItem("token"), + "x-project": base64Encode, + }, + }); + const json = await result.json(); + + if (result.status === 401) { + throw new Error(json.message); + } + + if (result.status === 403) { + throw new Error(json.message); + } + return json; + }; + + // CUSTOM GENERATED API + + return this; +} diff --git a/day20/src/utils/TreeSDK.jsx b/day20/src/utils/TreeSDK.jsx new file mode 100644 index 0000000..8cc0b29 --- /dev/null +++ b/day20/src/utils/TreeSDK.jsx @@ -0,0 +1,419 @@ + + import { empty } from "./utils"; + +export default function TreeSDK() { + this._baseurl = "https://inventorylynx.mkdlabs.com"; + this._project_id = "inventorylynx"; + this._secret = "1qrhpud67j4jpda5zrdm7oi5ugjo8h3c9"; + this._table = ""; + + const raw = this._project_id + ":" + this._secret; + let base64Encode = btoa(raw); + + this.updateXProject = function (projectId, secret) { + console.log(projectId, secret); + base64Encode = btoa(projectId + ":" + secret); + }; + this.resetXPRoject = function () { + base64Encode = btoa(raw); + }; + + this.getHeader = function () { + return { + Authorization: "Bearer " + localStorage.getItem("token"), + "x-project": base64Encode, + }; + }; + + this.baseUrl = function () { + return this._baseurl; + }; + + this.getProjectId = function () { + return this._project_id; + }; + + this.treeBaseUrl = function () { + return this._baseurl + "/v4/api/records"; + }; + + function getJoins(options = {}) { + let hasJoin = options.hasOwnProperty("join"); + let joins = options.join; + if (hasJoin && typeof joins === "string") { + joins = joins.split(","); + } else { + joins = []; + } + + let joinQuery = ""; + joins.forEach((join) => { + joinQuery += `join=${join}&`; + }); + + return [hasJoin, joins, joinQuery]; + } + + function getOrdering(options) { + let order = options.order ? options.order : "id"; + let direction = options.direction ? options.direction : "desc"; + + return `order=${order},${direction}&`; + } + + function getFilters(options) { + let hasFilter = options.hasOwnProperty("filter"); + let filters = options.filter; + + let filterQuery = ""; + if (hasFilter && Array.isArray(filters)) { + filters.forEach((filter) => { + filterQuery += `filter=${filter}&`; + }); + } + + return [hasFilter, filters, filterQuery]; + } + + /* + Returns one entry + @params table : string - name of table to fetch + @params id : number - id to fetch + @params options : object - optional parameters + options.join - Array or comma separated list of tables to join + + let res = await (new TreeSDK).getOne('author', 1 { + join: ['book'], + }); + + */ + + this.getOne = async function (table, id, options = {}) { + if (empty(table) || empty(id)) throw new Error("table and id is required."); + + let [hasJoin, joins, joinQuery] = getJoins(options); + const header = { + "Content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }; + + const getResult = await fetch( + this.treeBaseUrl() + `/ ${ table } /${id}?${joinQuery}`, + { + method: "get", + headers: header, + } + ); +const json = await getResult.json(); + +if (getResult.status === 401) { + throw new Error(json.message); +} + +if (getResult.status === 403) { + throw new Error(json.message); +} +return json; + }; + +/* + Returns one or more entries + @params table : string - name of table to fetch + @params ids : Array|string|number - array, comma separated list of ids or just a single id to fetch + @params options : object - optional parameters + options.join - Array or comma separated list of tables to join + + let res = await (new TreeSDK).getMany('author', [1,2] { + join: ['book'], + }); + +*/ +this.getMany = async function (table, ids, options = {}) { + if (empty(table) || empty(ids)) + throw new Error("table and id is required."); + + let [hasJoin, joins, joinQuery] = getJoins(options); + let id = Array.isArray(ids) ? ids.join(",") : ids; + const header = { + "Content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }; + + const getResult = await fetch( + this.treeBaseUrl() + `/${table}/${id}?${joinQuery}`, + { + method: "get", + headers: header, + } + ); + const json = await getResult.json(); + + if (getResult.status === 401) { + throw new Error(json.message); + } + + if (getResult.status === 403) { + throw new Error(json.message); + } + return json; +}; + +/* + Returns one or more entries with ordering and filters + @params table : string - name of table to fetch + @params options : object - optional parameters + options.join - Array or comma separated list of tables to join + options.filter - + options.order - field used to sort the result + options.direction - direction of result asc|desc + options.size - max number of entries + + let res = await (new TreeSDK).getList('author', { + filter: ['id,gt,2'], + join: ['book'] + }); + +*/ +this.getList = async function (table, options = {}) { + if (empty(table)) throw new Error("table and id is required."); + let [hasJoin, joins, joinQuery] = getJoins(options); + let [hasFilter, filters, filterQuery] = getFilters(options); + let orderQuery = getOrdering(options); + let sizeQuery = options.hasOwnProperty("size") + ? `size=${options.size}&` + : ""; + const header = { + "Content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }; + + const getResult = await fetch( + this.treeBaseUrl() + + `/${table}?${joinQuery}${orderQuery}${sizeQuery}${filterQuery}`, + { + method: "get", + headers: header, + } + ); + const json = await getResult.json(); + + if (getResult.status === 401) { + throw new Error(json.message); + } + + if (getResult.status === 403) { + throw new Error(json.message); + } + return json; +}; + +/* + Returns a paginated list of entries + @params table : string - name of table to fetch + @params options : object - optional parameters + options.join - Array or comma separated list of tables to join + options.filter - + options.order - field used to sort the result + options.direction - direction of result asc|desc + options.page - page number + options.size - max number of entries + + let res = await (new TreeSDK).getPaginate('author', { + filter: ['id,gt,2'], + join: ['book'] + }); + +*/ +this.getPaginate = async function (table, options = {}) { + if (empty(table)) throw new Error("table and id is required."); + + let [hasJoin, joins, joinQuery] = getJoins(options); + let [hasFilter, filters, filterQuery] = getFilters(options); + let orderQuery = getOrdering(options); + console.table({ orderQuery, joinQuery, filterQuery }); + let size = options.size ?? 20; + let pageQuery = options.hasOwnProperty("page") + ? `page=${options.page},${size}&` + : `page=1&`; + const header = { + "Content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }; + const getResult = await fetch( + this.treeBaseUrl() + + `/${table}?${joinQuery}${orderQuery}${pageQuery}${filterQuery}`, + { + method: "get", + headers: header, + } + ); + const json = await getResult.json(); + + if (getResult.status === 401) { + throw new Error(json.message); + } + + if (getResult.status === 403) { + throw new Error(json.message); + } + return json; +}; + +/* + Returns Creates a new entry + @params table : string - name of table to fetch + @params options : object - optional parameters + + + let res = await (new TreeSDK).create('author', { + name: 'authro name', + age: 23 + }); + + +*/ +this.create = async function (table, payload, options = {}) { + if (empty(table)) throw new Error("table and id is required."); + + const header = { + "Content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }; + const getResult = await fetch(this.treeBaseUrl() + `/${table}`, { + method: "post", + headers: header, + body: JSON.stringify(payload), + }); + const json = await getResult.json(); + + if (getResult.status === 401) { + throw new Error(json.message); + } + + if (getResult.status === 403) { + throw new Error(json.message); + } + return json; +}; + +/* + Returns Updates an entry + @params table : string - name of table to update + @params id : number - id of table entry to update + @params payload : object - key value pair for values to update + + let res = await (new TreeSDK).update('author', 2 { + name: 'updated author name', + }); + +*/ +this.update = async function (table, id, payload) { + if (empty(table) || empty(id)) throw new Error("table and id is required."); + + const header = { + "Content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }; + const getResult = await fetch(this.treeBaseUrl() + `/${table}/${id}`, { + method: "put", + headers: header, + body: JSON.stringify(payload), + }); + const json = await getResult.json(); + + if (getResult.status === 401) { + throw new Error(json.message); + } + + if (getResult.status === 403) { + throw new Error(json.message); + } + return json; +}; + +this.updateWhere = async function (table, where, payload) { + if (empty(table) || empty(id)) throw new Error("table and id is required."); + if (Object.keys(where).length === 0) + throw new Error("condition is required."); + + payload["updateCondition"] = where; + const header = { + "Content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }; + const getResult = await fetch(this.treeBaseUrl() + `/${table}`, { + method: "put", + headers: header, + body: JSON.stringify(payload), + }); + const json = await getResult.json(); + + if (getResult.status === 401) { + throw new Error(json.message); + } + + if (getResult.status === 403) { + throw new Error(json.message); + } + return json; +}; + +/* + Returns Delete an entry + @params table : string - name of table to delete from + @params id : number - id of table entry to delete + + let res = await (new TreeSDK).delete('author', 2); +*/ +this.delete = async function (table, id, payload) { + if (empty(table) || empty(id)) throw new Error("table and id is required."); + + const header = { + "Content-Type": "application/json", + "x-project": base64Encode, + Authorization: "Bearer " + localStorage.getItem("token"), + }; + const getResult = await fetch(this.treeBaseUrl() + `/${table}/${id}`, { + method: "delete", + headers: header, + body: JSON.stringify(payload), + }); + const json = await getResult.json(); + + if (getResult.status === 401) { + throw new Error(json.message); + } + + if (getResult.status === 403) { + throw new Error(json.message); + } + return json; +}; + +return this; +} +/* + +cs contains string +sw starts with +ew ends with +eq + equal +Default when no operator is provided +lt less than +le less or equal +ge greater or equal +gt greater than +bt between +in in list +is is null + +*/ + \ No newline at end of file diff --git a/day20/src/utils/config.jsx b/day20/src/utils/config.jsx new file mode 100644 index 0000000..efbcc67 --- /dev/null +++ b/day20/src/utils/config.jsx @@ -0,0 +1,1449 @@ + + const editorFunctions = [ + `// FUNCTION FOR SET CONTENT // + function handleContentChange(value) { + setContent(value); + if (value !== "") { + if (errors.content.message !== "") { + setError(prev => ({ ...prev, content: { message: "" } })); + } + } + // console.log( value ) + } `, +]; +const infiniteScrollFunctions = [ + ` const next = async (initialized, cursor, where) => { + + try { + console.log(initialized, where) + sdk.setTable("user") + const result = await sdk.callRestAPI({ limit: pageSize, cursor: cursor }, "CURSORPAGINATE") + console.log(result) + if (!result.error) { + if (!initialized) { + setCursorPaginateData(() => [...result?.list]) + // setInitialized( true ) + console.log("Not initialized") + } else { + setCursorPaginateData((prev) => [...prev, ...result?.list]) + console.log(" initialized") + } + setCurrentCursor(result?.cursor) + // setPageSize( result?.limit ) + setNextCursor(result?.nextCursor) + } + } catch (error) { + // Do somthing with your error + } + }`, +]; + +export const componentList = [ + { + id: "2b5b729e-4a2f-69e2-e575-cb37cb4ebecd", + name: "AddButton", + tag: "done", + group: "", + props: { + role: "", + model: "", + text: "", + has: { + props: true, + state: false, + function: false, + context: { global: false, auth: false }, + }, + }, + }, + + // { + // id: "1a13851b-9f6e-aa02-0076-1f84d507181c", + // name: "AddTags", + // props: { + // has: { + // props: true,// + // state: true, + // function: true, + // context: { global: false, auth: false }, + // }, + // }, + // }, + { + id: "0d63aea5-9106-6598-8b94-3bc51cb47a16", + name: "Editor", + tag: "done", + props: { + has: { + state: true, + props: true, + function: true, + customStateErrors: true, + context: { global: false, auth: false }, + }, + }, + }, + { + id: "8e3a25df-1a4c-1955-2de9-0922c7419287", + name: "Chat", + tag: "done", + props: { + has: { + props: true, + state: true, + function: true, + context: { global: false, auth: false }, + }, + }, + }, + { + id: "4154cfe4-07ad-6ffe-71e6-042b331970af", + name: "CollapsibleMenu", + props: { + has: { + props: true, + state: true, + function: true, + context: { global: false, auth: false }, + }, + }, + }, + + { + id: "65a7123f-b096-1bf9-f742-974222fb3ad1", + name: "IconCards", + props: { + has: { + props: true, + state: true, + function: true, + context: { global: false, auth: false }, + }, + }, + }, + { + id: "d8ce6c1c-70d0-5acf-22e5-28c32579f55d", + name: "DashboardUI", + tag: "done", + props: { + has: { + props: true, + state: false, + function: false, + context: { global: false, auth: false }, + }, + }, + }, + { + id: "36ab7743-5e0c-6fc3-265b-6c30be87bb99", + name: "LineChart", + tag: "done", + props: { + has: { + props: true, + state: true, + function: true, + context: { global: false, auth: false }, + }, + }, + }, + { + id: "1ed02e1a-2b2d-a95d-6466-ff6ad87f0440", + name: "NumberLabelCard", + tag: "done", + props: { + has: { + props: true, + state: true, + function: true, + context: { global: false, auth: false }, + }, + }, + }, + { + id: "af8a289e-fa11-70f3-4dd4-496be2429dd3", + name: "PieChart", + tag: "done", + props: { + has: { + props: true, + state: true, + function: true, + context: { global: false, auth: false }, + }, + }, + }, + { + id: "3cb3b742-ae1a-27cb-46f9-810ebe4780d0", + name: "Stats", + tag: "done", + props: { + has: { + props: false, + state: false, + function: false, + context: { global: false, auth: false }, + }, + }, + }, + { + id: "51818f2a-a1ff-b94f-64c6-67af89d45949", + name: "DateRange", + tag: "done", + props: { + has: { + props: true, + state: true, + function: true, + context: { global: false, auth: false }, + }, + }, + }, + { + id: "a34f7ae0-8cfe-a6f1-2a91-c10666a46a5c", + name: "DynamicContentType", + tag: "pending", + props: { + has: { + props: true, + state: true, + function: true, + context: { global: false, auth: false }, + }, + }, + }, + { + id: "ace4d180-4869-bea2-44c8-0e4123d9c5eb", + name: "CategoryFilter", + props: { + has: { + props: true, + state: true, + function: true, + context: { global: false, auth: false }, + }, + }, + }, + { + id: "36a799ad-59fe-f75e-1a2b-9224849c375f", + name: "EcomHeader", + props: { + has: { + props: true, + state: true, + function: true, + context: { global: false, auth: false }, + }, + }, + }, + { + id: "6e8bb184-39d0-c873-178e-b609af5071ae", + name: "FeaturedProducts", + props: { + has: { + props: true, + state: true, + function: true, + context: { global: false, auth: false }, + }, + }, + }, + { + id: "f592ab71-f08b-f4fd-83ba-3e0dfedccd81", + name: "MiniCart", + props: { + has: { + props: true, + state: true, + function: true, + context: { global: false, auth: false }, + }, + }, + }, + { + id: "654297d4-3fa3-d9a1-1f5d-be6b4e4d6740", + name: "PaymentElementWrapper", + props: { + has: { + props: true, + state: true, + function: true, + context: { global: false, auth: false }, + }, + }, + }, + { + id: "face801f-fb30-55ba-fc8d-2f29b0328cf7", + name: "ProductCardFlat", + props: { + has: { + props: true, + state: true, + function: true, + context: { global: false, auth: false }, + }, + }, + }, + { + id: "b2073c5e-3faf-d1c5-77b7-c8dc8592db2e", + name: "ProductCard", + props: { + has: { + props: true, + state: true, + function: true, + context: { global: false, auth: false }, + }, + }, + }, + { + id: "e0e2c809-d10e-2c3d-26ec-0926aa055d3a", + name: "ProductList", + props: { + has: { + props: true, + state: true, + function: true, + context: { global: false, auth: false }, + }, + }, + }, + { + id: "1b72e8a8-bbd8-251a-ad67-8553f06edbf1", + name: "ProductQuickView", + props: { + has: { + props: true, + state: true, + function: true, + context: { global: false, auth: false }, + }, + }, + }, + { + id: "8959db9a-87b1-d1d8-7cca-2bed679fb7fb", + name: "ProductReview", + props: { + has: { + props: true, + state: true, + function: true, + context: { global: false, auth: false }, + }, + }, + }, + { + id: "37c7ec07-0136-2370-2980-a3c08fa69755", + name: "ProductSearch", + props: { + has: { + props: true, + state: true, + function: true, + context: { global: false, auth: false }, + }, + }, + }, + { + id: "a0d12209-0ced-a90c-85c4-9825eac3bf2a", + name: "ExportButton", + props: { + has: { + props: true, + state: true, + function: true, + context: { global: false, auth: false }, + }, + }, + }, + // { id: "8ebebc6f-abc7-66bc-cb93-bcac98308112", name: "Header", props: { + // has: { + // props: true, + // state: true, + // function: true, + // context: { global: false, auth: false }, + // } + // } }, + // { + // id: "e9c8a242-7252-588c-96b5-106471ea15be", + // name: "HorizontalNavbar", + // props: {} }, + { + id: "004f486c-a3ce-b869-8033-b6cb90a935c4", + name: "ImagePreviewModal", + props: { + has: { + props: true, + state: true, + function: true, + context: { global: false, auth: false }, + }, + }, + }, + { + id: "edc22694-df9f-7d8d-bfac-b12b9053d71c", + name: "InfiniteScroll", + props: { + has: { + props: true, + state: true, + function: true, + context: { global: false, auth: false }, + }, + }, + }, + { + id: "63cb2af1-cfac-8e4d-046c-79b21865ae09", + name: "InteractiveButton", + tag: "done", + props: { + has: { + props: true, + state: true, + function: true, + context: { global: false, auth: false }, + }, + }, + }, + { + id: "8fe3c80e-4746-9873-51cc-edc0d25c74af", + name: "Loader", + props: { + has: { + props: true, + state: true, + function: true, + context: { global: false, auth: false }, + }, + }, + }, + { + id: "d5234b27-d5eb-709a-25b4-d3bbf4b7429b", + name: "LoadingIndicator", + props: { + has: { + props: true, + state: true, + function: true, + context: { global: false, auth: false }, + }, + }, + }, + // { id: "6cc4b97a-6024-2dbe-6911-92579a375631", name: "map", props: { + // has: { + // props: true,// + // state: true, + // function: true, + // context: { global: false, auth: false }, + // } + // } }, + { + id: "5133d3f9-1327-d897-3a7b-27c540bbb3e7", + name: "MKDForm", + props: { + has: { + props: true, + state: false, + function: false, + context: { global: false, auth: false }, + }, + }, + }, + { + id: "788f4de0-b921-fd44-45df-2a8f9cf98083", + name: "MkdInput", + tag: "done", + props: { + input_type: "text", + page: "", //Add|Edit|View + name: "", + label: "", + has: { + props: true, + state: true, + function: true, + context: { global: false, auth: false }, + }, + }, + }, + { + id: "4dafc6ce-8ba9-d65b-d405-ffdb3bcc016d", + name: "MkdListTable", + props: { + table: "", //Model + tableRole: "", + has: { + props: true, + state: true, + function: true, + context: { global: false, auth: false }, + }, + }, + }, + { + id: "f3a75064-ac32-3e3a-a494-15b1998bad96", + name: "Modal", + tag: "done", + container: "true", + props: { + has: { + props: true, + state: true, + function: true, + context: { global: false, auth: false }, + }, + }, + }, + { + id: "51f8130e-f7e4-1e14-4f5d-0791cc6ab3b2", + name: "MultiSelect", + tag: "done", + props: { + has: { + props: true, + state: true, + function: true, + context: { global: false, auth: false }, + }, + }, + }, + { + id: "98347b3f-6af6-4139-fb72-abc4fce529d2", + name: "PaginationBar", + props: { + has: { + props: true, + state: true, + function: true, + context: { global: false, auth: false }, + }, + }, + }, + { + id: "3887ed2f-9566-6769-b53f-9a35b0a6af2e", + name: "PortalWrapper", + props: { + has: { + props: true, + state: true, + function: true, + context: { global: false, auth: false }, + }, + }, + }, + { + id: "995e98e9-8209-a7fa-8a42-6f6508693247", + name: "PublicHeader", + props: { + has: { + props: true, + state: true, + function: true, + context: { global: false, auth: false }, + }, + }, + }, + { + id: "272bf426-72cf-17ba-94c6-3c5363a1889b", + name: "PublicWrapper", + props: { + has: { + props: true, + state: true, + function: true, + context: { global: false, auth: false }, + }, + }, + }, + { + id: "b3663fe5-521b-a9cb-b568-09f848ec9a24", + name: "scheduling", + props: { + has: { + props: true, + state: true, + function: true, + context: { global: false, auth: false }, + }, + }, + }, + { + id: "1e843c7c-33f0-1feb-1ae3-31e34fb72615", + name: "SessionExpiredModal", + props: { + has: { + props: true, + state: true, + function: true, + context: { global: false, auth: false }, + }, + }, + }, + { + id: "6a0040ff-b922-bca3-45f5-f79e8b5c22fe", + name: "ShedulePostCard", + props: { + has: { + props: true, + state: true, + function: true, + context: { global: false, auth: false }, + }, + }, + }, + { + id: "e827cdd8-eb0b-73da-feb2-e1ada6bda41e", + name: "SnackBar", + props: { + has: { + props: true, + state: true, + function: true, + context: { global: false, auth: false }, + }, + }, + }, + { + id: "stripe-plan-cards", + name: "StripePlansComponent", + props: { + title: "Select Plan", + columns: 3, + has: { + props: true, + state: true, + function: true, + context: { + global: false, + auth: false, + }, + }, + }, + }, + { + id: "87407211-9b17-64d4-8337-863c9d318e0f", + name: "StripeCardComponent", + props: { + has: { + props: true, + state: true, + function: true, + context: { global: false, auth: false }, + }, + }, + }, + { + id: "caf7453f-26d3-c033-b863-df629883de8d", + name: "StripeChargesComponent", + props: { + has: { + props: true, + state: true, + function: true, + context: { global: false, auth: false }, + }, + }, + }, + { + id: "97743f4e-3a77-a48c-4d4f-8206c3d0998e", + name: "StripeInvoicesComponent", + props: { + has: { + props: true, + state: true, + function: true, + context: { global: false, auth: false }, + }, + }, + }, + { + id: "40466bcf-95d8-a8e3-829a-8a327eef4b7f", + name: "StripeOnetimeProductsComponent", + props: { + has: { + props: true, + state: true, + function: true, + context: { global: false, auth: false }, + }, + }, + }, + { + id: "8e7edc69-c3de-5425-e481-44403af762cb", + name: "StripeOrdersComponent", + props: { + has: { + props: true, + state: true, + function: true, + context: { global: false, auth: false }, + }, + }, + }, + { + id: "4cd2b9c1-cfa4-3dee-d147-6fb3d023f2ac", + name: "StripePaginationBar", + props: { + has: { + props: true, + state: true, + function: true, + context: { global: false, auth: false }, + }, + }, + }, + { + id: "e3c6cba6-1ae9-ae7f-b530-cf24b63c83c5", + name: "StripePlansComponent", + props: { + has: { + props: true, + state: true, + function: true, + context: { global: false, auth: false }, + }, + }, + }, + { + id: "dc37f7ee-aedf-022b-db2c-07749748a250", + name: "StripeRegisterSubscribeComponent", + props: { + has: { + props: true, + state: true, + function: true, + context: { global: false, auth: false }, + }, + }, + }, + { + id: "061bcb01-f04a-a12e-e1c8-059dbe8086ad", + name: "StripeSubscriptionComponent", + props: { + has: { + props: true, + state: true, + function: true, + context: { global: false, auth: false }, + }, + }, + }, + { + id: "ded04c46-4b36-f18a-4875-80a9ee184ae0", + name: "TopHeader", + props: { + has: { + props: true, + state: true, + function: true, + context: { global: false, auth: false }, + }, + }, + }, + { + id: "6a4c8b9b-1418-e0f5-a585-3065fa931e60", + name: "Enable2FA", + props: { + has: { + props: true, + state: true, + function: true, + context: { global: false, auth: false }, + }, + }, + }, + { + id: "76c30259-37e3-7a80-5e8a-da119808669c", + name: "Modal", + props: { + has: { + props: true, + state: true, + function: true, + context: { global: false, auth: false }, + }, + }, + }, + { + id: "81203bcd-deb7-edb5-4852-41d873dfd9af", + name: "TwoFactorAuthenticate", + props: { + has: { + props: true, + state: true, + function: true, + context: { global: false, auth: false }, + }, + }, + }, + { + id: "d96716c2-bccf-4d92-2595-2bfa009d9dd9", + name: "Video", + tag: "done", + props: { + has: { + props: true, + state: true, + function: true, + context: { global: false, auth: false }, + }, + }, + }, + { id: "audio", name: "audio", tag: "", group: "", props: {} }, + { id: "Image", name: "Image", tag: "", group: "", props: {} }, + { id: "video", name: "NativeVideo", tag: "", group: "", props: {} }, + { id: "heading", name: "heading", tag: "", group: "", props: {} }, + { id: "hr", name: "hr", tag: "", group: "", props: {} }, + { id: "br", name: "br", tag: "", group: "", props: {} }, + { id: "link", name: "link", tag: "", group: "", props: {} }, + { id: "p", name: "p", tag: "", group: "", props: {} }, + { id: "span", name: "span", tag: "", group: "", props: {} }, +]; + +export const componentMap = { + "2b5b729e-4a2f-69e2-e575-cb37cb4ebecd": { + name: "AddButton", + props: { + props: [], + states: [], + context: { auth: [], global: [] }, + functions: [], + }, + }, + "1a13851b-9f6e-aa02-0076-1f84d507181c": { + name: "AddTags", + props: { + props: [], + states: [], + context: { auth: [], global: [] }, + functions: [], + }, + }, + "0d63aea5-9106-6598-8b94-3bc51cb47a16": { + name: "Editor", + props: { + props: ["content", "handleContentChange", "errors"], + states: [{ name: "content", default: '""' }], + customStateErrors: ["content"], + context: { auth: [], global: [] }, + functions: [...editorFunctions], + }, + }, + "8e3a25df-1a4c-1955-2de9-0922c7419287": { + name: "Chat", + props: { + props: [], + states: [], + context: { auth: [], global: [] }, + functions: [], + }, + }, + "4154cfe4-07ad-6ffe-71e6-042b331970af": { + name: "CollapsibleMenu", + props: { + props: [], + states: [], + context: { auth: [], global: [] }, + functions: [], + }, + }, + "1e1cfc67-65ed-ee96-9280-683d7b75ca3b": { + name: "CreateNewRoomModal", + props: { + props: [], + states: [], + context: { auth: [], global: [] }, + functions: [], + }, + }, + "65a7123f-b096-1bf9-f742-974222fb3ad1": { + name: "IconCards", + props: { + props: [], + states: [], + context: { auth: [], global: [] }, + functions: [], + }, + }, + "d8ce6c1c-70d0-5acf-22e5-28c32579f55d": { + name: "DashboardUI", + props: { + props: ["navigation", "user", "aside"], + states: [], + context: { auth: [], global: [] }, + functions: [], + }, + }, + "36ab7743-5e0c-6fc3-265b-6c30be87bb99": { + name: "LineChart", + props: { + props: [], + states: [], + context: { auth: [], global: [] }, + functions: [], + }, + }, + "1ed02e1a-2b2d-a95d-6466-ff6ad87f0440": { + name: "NumberLabelCard", + props: { + props: [], + states: [], + context: { auth: [], global: [] }, + functions: [], + }, + }, + "af8a289e-fa11-70f3-4dd4-496be2429dd3": { + name: "PieChart", + props: { + props: [], + states: [], + context: { auth: [], global: [] }, + functions: [], + }, + }, + "3cb3b742-ae1a-27cb-46f9-810ebe4780d0": { + name: "Stats", + props: { + props: [], + states: [], + context: { auth: [], global: [] }, + functions: [], + }, + }, + "51818f2a-a1ff-b94f-64c6-67af89d45949": { + name: "DateRange", + props: { + props: ["selectedDayRange", "setSelectedDayRange"], + states: [], + context: { auth: [], global: [] }, + functions: [], + }, + }, + "a34f7ae0-8cfe-a6f1-2a91-c10666a46a5c": { + name: "DynamicContentType", + props: { + props: ["contentType", "contentValue", "setContentValue"], + states: [], + context: { auth: [], global: [] }, + functions: [], + }, + }, + "ace4d180-4869-bea2-44c8-0e4123d9c5eb": { + name: "CategoryFilter", + props: { + props: [], + states: [], + context: { auth: [], global: [] }, + functions: [], + }, + }, + "36a799ad-59fe-f75e-1a2b-9224849c375f": { + name: "EcomHeader", + props: { + props: [], + states: [], + context: { auth: [], global: [] }, + functions: [], + }, + }, + "6e8bb184-39d0-c873-178e-b609af5071ae": { + name: "FeaturedProducts", + props: { + props: [], + states: [], + context: { auth: [], global: [] }, + functions: [], + }, + }, + "f592ab71-f08b-f4fd-83ba-3e0dfedccd81": { + name: "MiniCart", + props: { + props: [], + states: [], + context: { auth: [], global: [] }, + functions: [], + }, + }, + "654297d4-3fa3-d9a1-1f5d-be6b4e4d6740": { + name: "PaymentElementWrapper", + props: { + props: [], + states: [], + context: { auth: [], global: [] }, + functions: [], + }, + }, + "face801f-fb30-55ba-fc8d-2f29b0328cf7": { + name: "ProductCardFlat", + props: { + props: [], + states: [], + context: { auth: [], global: [] }, + functions: [], + }, + }, + "b2073c5e-3faf-d1c5-77b7-c8dc8592db2e": { + name: "ProductCard", + props: { + props: [], + states: [], + context: { auth: [], global: [] }, + functions: [], + }, + }, + "e0e2c809-d10e-2c3d-26ec-0926aa055d3a": { + name: "ProductList", + props: { + props: [], + states: [], + context: { auth: [], global: [] }, + functions: [], + }, + }, + "1b72e8a8-bbd8-251a-ad67-8553f06edbf1": { + name: "ProductQuickView", + props: { + props: [], + states: [], + context: { auth: [], global: [] }, + functions: [], + }, + }, + "8959db9a-87b1-d1d8-7cca-2bed679fb7fb": { + name: "ProductReview", + props: { + props: [], + states: [], + context: { auth: [], global: [] }, + functions: [], + }, + }, + "37c7ec07-0136-2370-2980-a3c08fa69755": { + name: "ProductSearch", + props: { + props: [], + states: [], + context: { auth: [], global: [] }, + functions: [], + }, + }, + "a0d12209-0ced-a90c-85c4-9825eac3bf2a": { + name: "ExportButton", + props: { + props: [], + states: [], + context: { auth: [], global: [] }, + functions: [], + }, + }, + "8ebebc6f-abc7-66bc-cb93-bcac98308112": { + name: "Header", + props: { + props: [], + states: [], + context: { auth: [], global: [] }, + functions: [], + }, + }, + "d2550c78-406e-94e5-55a3-428d1cb05eef": { + name: "HeatMap", + props: { + props: [], + states: [], + context: { auth: [], global: [] }, + functions: [], + }, + }, + "e9c8a242-7252-588c-96b5-106471ea15be": { + name: "HorizontalNavbar", + props: { + props: [], + states: [], + context: { auth: [], global: [] }, + functions: [], + }, + }, + "004f486c-a3ce-b869-8033-b6cb90a935c4": { + name: "ImagePreviewModal", + props: { + props: [], + states: [], + context: { auth: [], global: [] }, + functions: [], + }, + }, + "edc22694-df9f-7d8d-bfac-b12b9053d71c": { + name: "InfiniteScroll", + props: { + props: [ + "data", + "children", + "height", + "next", + "pageSize", + "nextCursor", + "className", + "setPageSize", + "setNextCursor", + "currentCursor", + "setData", + ], + states: [ + { name: "selected", default: "[]" }, + { name: "cursorPaginateData", default: "[]" }, + { name: "nextCursor", default: "null" }, + { name: "currentcursor", default: 0 }, + { name: "pageSize", default: 5 }, + ], + context: { auth: [], global: [] }, + functions: [...infiniteScrollFunctions], + }, + }, + "63cb2af1-cfac-8e4d-046c-79b21865ae09": { + name: "InteractiveButton", + props: { + props: [ + "loading:interactiveButtonLoading", + "disabled", + "type", + "className", + "onClick", + ], + states: [], + context: { auth: [], global: [] }, + functions: [], + }, + }, + "8fe3c80e-4746-9873-51cc-edc0d25c74af": { + name: "Loader", + props: { + props: ['style:{"":""}'], + states: [], + context: { auth: [], global: [] }, + functions: [], + }, + }, + "d5234b27-d5eb-709a-25b4-d3bbf4b7429b": { + name: "LoadingIndicator", + props: { + props: [], + states: [], + context: { auth: [], global: [] }, + functions: [], + }, + }, + "6cc4b97a-6024-2dbe-6911-92579a375631": { + name: "map", + props: { + props: [], + states: [], + context: { auth: [], global: [] }, + functions: [], + }, + }, + "5133d3f9-1327-d897-3a7b-27c540bbb3e7": { + name: "MKDForm", + props: { + props: ["onSubmit:handleSubmit(onSubmit)", 'className:"w-full max-w-lg"'], + states: [], + context: { auth: [], global: [] }, + functions: [], + }, + }, + "788f4de0-b921-fd44-45df-2a8f9cf98083": { + name: "MkdInput", + props: { + props: [], + states: [], + context: { auth: [], global: [] }, + functions: [], + }, + }, + "4dafc6ce-8ba9-d65b-d405-ffdb3bcc016d": { + name: "MkdListTable", + props: { + props: [], + states: [], + context: { auth: [], global: [] }, + functions: [], + }, + }, + "f3a75064-ac32-3e3a-a494-15b1998bad96": { + name: "Modal", + props: { + props: [], + states: [], + context: { auth: [], global: [] }, + functions: [], + }, + }, + "51f8130e-f7e4-1e14-4f5d-0791cc6ab3b2": { + name: "MultiSelect", + props: { + props: [], + states: [], + context: { auth: [], global: [] }, + functions: [], + }, + }, + "98347b3f-6af6-4139-fb72-abc4fce529d2": { + name: "PaginationBar", + props: { + props: [], + states: [], + context: { auth: [], global: [] }, + functions: [], + }, + }, + "3887ed2f-9566-6769-b53f-9a35b0a6af2e": { + name: "PortalWrapper", + props: { + props: [], + states: [], + context: { auth: [], global: [] }, + functions: [], + }, + }, + "995e98e9-8209-a7fa-8a42-6f6508693247": { + name: "PublicHeader", + props: { + props: [], + states: [], + context: { auth: [], global: [] }, + functions: [], + }, + }, + "272bf426-72cf-17ba-94c6-3c5363a1889b": { + name: "PublicWrapper", + props: { + props: [], + states: [], + context: { auth: [], global: [] }, + functions: [], + }, + }, + "b3663fe5-521b-a9cb-b568-09f848ec9a24": { + name: "scheduling", + props: { + props: [], + states: [], + context: { auth: [], global: [] }, + functions: [], + }, + }, + "1e843c7c-33f0-1feb-1ae3-31e34fb72615": { + name: "SessionExpiredModal", + props: { + props: [], + states: [], + context: { auth: [], global: [] }, + functions: [], + }, + }, + "6a0040ff-b922-bca3-45f5-f79e8b5c22fe": { + name: "ShedulePostCard", + props: { + props: [], + states: [], + context: { auth: [], global: [] }, + functions: [], + }, + }, + "e827cdd8-eb0b-73da-feb2-e1ada6bda41e": { + name: "SnackBar", + props: { + props: [], + states: [], + context: { auth: [], global: [] }, + functions: [], + }, + }, + "stripe-plan-cards": { name: "StripePlanCards" }, + "87407211-9b17-64d4-8337-863c9d318e0f": { + name: "StripeCardComponent", + props: { + props: [], + states: [], + context: { auth: [], global: [] }, + functions: [], + }, + }, + "caf7453f-26d3-c033-b863-df629883de8d": { + name: "StripeChargesComponent", + props: { + props: [], + states: [], + context: { auth: [], global: [] }, + functions: [], + }, + }, + "97743f4e-3a77-a48c-4d4f-8206c3d0998e": { + name: "StripeInvoicesComponent", + props: { + props: [], + states: [], + context: { auth: [], global: [] }, + functions: [], + }, + }, + "40466bcf-95d8-a8e3-829a-8a327eef4b7f": { + name: "StripeOnetimeProductsComponent", + props: { + props: [], + states: [], + context: { auth: [], global: [] }, + functions: [], + }, + }, + "8e7edc69-c3de-5425-e481-44403af762cb": { + name: "StripeOrdersComponent", + props: { + props: [], + states: [], + context: { auth: [], global: [] }, + functions: [], + }, + }, + "4cd2b9c1-cfa4-3dee-d147-6fb3d023f2ac": { + name: "StripePaginationBar", + props: { + props: [], + states: [], + context: { auth: [], global: [] }, + functions: [], + }, + }, + "e3c6cba6-1ae9-ae7f-b530-cf24b63c83c5": { + name: "StripePlansComponent", + props: { + props: [], + states: [], + context: { auth: [], global: [] }, + functions: [], + }, + }, + "dc37f7ee-aedf-022b-db2c-07749748a250": { + name: "StripeRegisterSubscribeComponent", + props: { + props: [], + states: [], + context: { auth: [], global: [] }, + functions: [], + }, + }, + "061bcb01-f04a-a12e-e1c8-059dbe8086ad": { + name: "StripeSubscriptionComponent", + props: { + props: [], + states: [], + context: { auth: [], global: [] }, + functions: [], + }, + }, + "ded04c46-4b36-f18a-4875-80a9ee184ae0": { + name: "TopHeader", + props: { + props: [], + states: [], + context: { auth: [], global: [] }, + functions: [], + }, + }, + "6a4c8b9b-1418-e0f5-a585-3065fa931e60": { + name: "Enable2FA", + props: { + props: [], + states: [], + context: { auth: [], global: [] }, + functions: [], + }, + }, + "76c30259-37e3-7a80-5e8a-da119808669c": { + name: "Enanble2FAModal", + props: { + props: [], + states: [], + context: { auth: [], global: [] }, + functions: [], + }, + }, + "81203bcd-deb7-edb5-4852-41d873dfd9af": { + name: "TwoFactorAuthenticate", + props: { + props: [], + states: [], + context: { auth: [], global: [] }, + functions: [], + }, + }, + "893b81b9-5502-4785-1ce4-4ede3a71dae7": { + name: "VideoItem", + props: { + props: [], + states: [], + context: { auth: [], global: [] }, + functions: [], + }, + }, + "d96716c2-bccf-4d92-2595-2bfa009d9dd9": { + name: "Video", + props: { + props: [], + states: [], + context: { auth: [], global: [] }, + functions: [], + }, + }, + "MTIzLUZpbGVUYWJsZS00NTY=": { name: "MkdFileTable" }, + MTIzLUZpbGVVcGxvYWQtNDU2: { name: "MkdFileUpload" }, + "MTIzLVFyQ29kZUdlbmVyYXRvci00NTY=": { name: "QrCodeGenerator" }, + "MTIzLVFyQ29kZVJlYWRlci00NTY=": { name: "QrCodeReader" }, + "MTIzLU1rZFRhYkNvbnRhaW5lci00NTY=": { name: "MkdTabContainer" }, + "MTIzLU1rZFNpbXBsZVRhYmxlLTQ1Ng==": { name: "MkdSimpleTable" }, + MTIzLU1rZERlYm91bmNlSW5wdXQtNDU2: { name: "MkdDebounceInput" }, + "MTIzLUNhbWVyYVRvVXBsb2FkLTQ1Ng==": { name: "CameraToUpload" }, + "MTIzLU1rZEpzb25RdWl6LTQ1Ng==": { name: "MkdJsonQuiz" }, + "MTIzLU1rZEdyaWRWaWV3LTQ1Ng==": { name: "MkdGridView" }, + MTIzLU1rZFRyZWxsb0NvbHVtbnMtNDU2: { name: "MkdTrelloColumns" }, + "MTIzLU1rZFdpemFyZENvbnRhaW5lci00NTY=": { name: "MkdWizardContainer" }, + MTIzLUJhY2tCdXR0b24tNDU2: { name: "BackButton" }, + "MTIzLUljb25DYXJkcy00NTY=": { name: "IconCards" }, + "MTIzLURhc2hib2FyZFVJLTQ1Ng==": { name: "DashboardUI" }, + "MTIzLUxpbmVDaGFydC00NTY=": { name: "LineChart" }, + "MTIzLU51bWJlckxhYmVsQ2FyZC00NTY=": { name: "NumberLabelCard" }, + "MTIzLVBpZUNoYXJ0LTQ1Ng==": { name: "PieChart" }, + MTIzLUNoYXRCb3QtNDU2: { name: "ChatBot" }, + "MTIzLU11bHRpcGxlQW5zd2VyLTQ1Ng==": { name: "MultipleAnswer" }, + MTIzLVJhdGluZ1N0YXItNDU2: { name: "RatingStar" }, + + audio: { name: "audio" }, + img: { name: "img" }, + video: { name: "NativeVideo" }, + heading: { name: "heading" }, + br: { name: "br" }, + link: { name: "link" }, + p: { name: "p" }, + span: { name: "span" }, +}; + +export const formType = { + login: "login", + signup: "signup", + add: "add", + edit: "edit", + search: "search", + custom: "custom", +}; + +export const colors = { + primary: "#0ea5e9", + signup: "signup", + add: "add", + edit: "edit", + search: "search", + custom: "custom", + secondary: "#F594C9", + lightInfo: "#29282980", +}; + +export default { colors, formType, componentMap, componentList, infiniteScrollFunctions, editorFunctions } diff --git a/day20/src/utils/metadata.json b/day20/src/utils/metadata.json new file mode 100644 index 0000000..177eae1 --- /dev/null +++ b/day20/src/utils/metadata.json @@ -0,0 +1,71 @@ + + { + "/": {"title": "Something else", "description": "Here are a set of free tools to use for you company", "twitter_image": ""}, + "/login": {"title": "Login Title", "description": ""}, + "/account": {"title": "Account Title", "description": ""}, + "/explore": {"title": "Explore Title", "description": ""}, + "/favorites": {"title": "Your Favorites", "description": ""}, + "/faq": {"title": "FAQ", "description": ""}, + "/contact-us": {"title": "Contact Us", "description": ""}, + "/account/my-bookings": {"title": "Bookings", "description": ""}, + "/account/my-spaces": {"title": "My Spaces", "description": ""}, + "/account/profile": {"title": "Profile", "description": ""}, + "/account/payments": {"title": "Payments", "description": ""}, + "/account/billings": {"title": "Billings", "description": ""}, + "/account/reviews": {"title": "Reviews", "description": ""}, + "/account/my-spaces/:id": {"title": "Dynamic", "description": ""}, + "/admin/add-cms": {"title": " admin add-cms", "description": ""}, +"/admin/add-email": {"title": " admin add-email", "description": ""}, +"/admin/add-photo": {"title": " admin add-photo", "description": ""}, +"/admin/cms": {"title": " admin cms", "description": ""}, +"/admin/email": {"title": " admin email", "description": ""}, +"/admin/photo": {"title": " admin photo", "description": ""}, +"/admin/edit-cms/:id": {"title": " admin edit-cms :id", "description": ""}, +"/admin/edit-email/:id": {"title": " admin edit-email :id", "description": ""}, +"/magic-login/:role": {"title": " magic-login :role", "description": ""}, +"/magic-login/verify": {"title": " magic-login verify", "description": ""}, +"/admin/login": {"title": " admin login", "description": ""}, +"/admin/signup": {"title": " admin signup", "description": ""}, +"/admin/profile": {"title": " admin profile", "description": ""}, +"/public/login": {"title": " public login", "description": ""}, +"/public/signup": {"title": " public signup", "description": ""}, +"/public/profile": {"title": " public profile", "description": ""}, +"/member/login": {"title": " member login", "description": ""}, +"/member/signup": {"title": " member signup", "description": ""}, +"/member/profile": {"title": " member profile", "description": ""}, +"/admin/dashboard": {"title": " admin dashboard", "description": ""}, +"/admin/department": {"title": "admin department", "description": ""}, +"/admin/add-department": {"title": "admin add department", "description": ""}, +"/admin/edit-department": {"title": "admin edit department", "description": ""}, +"/admin/view-department": {"title": "admin view department", "description": ""}, +"/admin/location": {"title": "admin location", "description": ""}, +"/admin/add-location": {"title": "admin add location", "description": ""}, +"/admin/edit-location": {"title": "admin edit location", "description": ""}, +"/admin/view-location": {"title": "admin view location", "description": ""}, +"/admin/items": {"title": "admin items", "description": ""}, +"/admin/add-items": {"title": "admin add items", "description": ""}, +"/admin/edit-items": {"title": "admin edit items", "description": ""}, +"/admin/view-items": {"title": "admin view items", "description": ""}, +"/admin/item_movement_history": {"title": "admin item_movement_history", "description": ""}, +"/admin/add-item_movement_history": {"title": "admin add item_movement_history", "description": ""}, +"/admin/edit-item_movement_history": {"title": "admin edit item_movement_history", "description": ""}, +"/admin/view-item_movement_history": {"title": "admin view item_movement_history", "description": ""}, +"/admin/user": {"title": "admin user", "description": ""}, +"/admin/add-user": {"title": "admin add user", "description": ""}, +"/admin/edit-user": {"title": "admin edit user", "description": ""}, +"/admin/view-user": {"title": "admin view user", "description": ""}, +"/member/forgot": {"title": " member forgot", "description": ""}, +"/member/reset": {"title": " member reset", "description": ""}, +"/member/dashboard": {"title": " member dashboard", "description": ""}, +"/admin/forgot": {"title": " admin forgot", "description": ""}, +"/admin/reset": {"title": " admin reset", "description": ""}, +"/admin/dashboard": {"title": " admin dashboard", "description": ""}, +"/admin/users": {"title": "admin users", "description": ""}, +"/admin/add-user": {"title": "admin add user", "description": ""}, +"/admin/edit-user/:id": {"title": " admin edit-user :id", "description": ""}, + "": { + "title": "404 Page not found", + "description": "Oops. Looks like this page doesn't exists" + } + +} diff --git a/day20/src/utils/utils.jsx b/day20/src/utils/utils.jsx new file mode 100644 index 0000000..320de34 --- /dev/null +++ b/day20/src/utils/utils.jsx @@ -0,0 +1,463 @@ + + import prettier from "prettier/standalone"; +import parserBabel from "prettier/parser-babel"; + +export function classNames(...classes) { + return classes.filter(Boolean).join(" "); +} + +export const getNonNullValue = (value) => { + if (value != "") { + return value; + } else { + return undefined; + } +}; + +export function filterEmptyFields(object) { + Object.keys(object).forEach((key) => { + if (empty(object[key])) { + delete object[key]; + } + }); + return object; +} + +export function empty(value) { + return ( + value === "" || + value === null || + value === undefined || + value === "undefined" + ); +} + +export const isImage = (file) => { + const validImageTypes = ["image/gif", "image/jpeg", "image/jpg", "image/png"]; + if (validImageTypes.includes(file.file.type)) return true; + return false; +}; + +export const isVideo = (file) => { + const validVideoTypes = ["video/webm", "video/mp4"]; + if (validVideoTypes.includes(file.file.type)) return true; + return false; +}; + +export const isPdf = (file) => { + const validVideoTypes = ["application/pdf"]; + if (validVideoTypes.includes(file.file.type)) return true; + return false; +}; + +export const randomString = (length) => { + let result = ""; + let characters = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + let charactersLength = characters.length; + for (let i = 0; i < length; i++) { + result += characters.charAt(Math.floor(Math.random() * charactersLength)); + } + return result; +}; + +export const generateUUID = () => { + const s4 = () => { + return Math.floor((1 + Math.random()) * 0x10000) + .toString(16) + .substring(1); + }; + + return ( + s4() + + s4() + + "-" + + s4() + + "-" + + s4() + + "-" + + s4() + + "-" + + s4() + + s4() + + s4() + ); +}; + +export const capitalize = (string) => { + const removedSpecialCharacters = string.replace(/[^a-zA-Z0-9]/g, " "); + + const splitWords = removedSpecialCharacters.split(" ").filter(Boolean); + + const capitalized = splitWords.map( + (dt) => `${ dt[0].toUpperCase() }${ dt.substring(1) } ` + ); + + return capitalized.join(" "); +}; + +export const dateHandle = (date) => { + const newDate = date + ? new Date(date).toISOString().split("T")[0] + : new Date().toISOString().split("T")[0]; + return newDate; +}; + +export const ghrapDate = (date) => { + const newDate = new Date(date); + var mS = [ + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "June", + "July", + "Aug", + "Sept", + "Oct", + "Nov", + "Dec", + ]; + console.log(newDate.getDate(), mS[newDate.getMonth()]); + + return `${ newDate.getDate() } ${ mS[newDate.getMonth()] } `; +}; + +export const formatCode = function (code) { + return prettier.format(code, { + parser: "babel", + plugins: [parserBabel], + singleQuote: true, + trailingComma: "es5", + jsxSingleQuote: true, + printWidth: 80, + tabWidth: 2, + }); +}; + +export const slugify = (str) => + str + .toLowerCase() + .trim() + .replace(/[^ws-]/g, "") + .replace(/[s_-]+/g, "-") + .replace(/^-+|-+$/g, ""); + +/** + * @typedef {Object} StringCaserOptions + * @property {"space" | String} separator - define what separates each word, undefined returns no separation - passing "space" separates the words by a space + * @property {"uppercase" | "lowercase" | "capitalize" | "camelCase" | "PascalCase"} casetype - text case type, uppercase, lowercase of capitalized | default is lowercase + */ +/** + * + * @param {String} string - text to convert + * @param {StringCaserOptions} options - options + * @returns + */ +export const StringCaser = (string, options) => { + if (!string) return null; + if (typeof string !== "string") return null; + const removedSpecialCharacters = string.replace(/[^a-zA-Z0-9]/g, " "); + let casedText = []; + const splitWords = removedSpecialCharacters.split(" ").filter(Boolean); + + if (options?.casetype === "capitalize") { + casedText = splitWords.map( + (/** @type {string} */ dt) => `${ dt[0].toUpperCase() }${ dt.substring(1) } ` + ); + } + if (options?.casetype === "uppercase") { + casedText = splitWords.map((/** @type {string} */ dt) => dt.toUpperCase()); + } + if (options?.casetype === "lowercase") { + casedText = splitWords.map((/** @type {string} */ dt) => dt.toLowerCase()); + } + if (options?.casetype === "camelCase") { + casedText = splitWords.map((/** @type {string} */ dt, index) => + index === 0 + ? dt.toLowerCase() + : `${ dt[0].toUpperCase() }${ dt.substring(1) } ` + ); + } + if (options?.casetype === "PascalCase") { + casedText = splitWords.map( + (/** @type {string} */ dt) => `${ dt[0].toUpperCase() }${ dt.substring(1) }` + ); + } + + if (options?.separator) { + if (options?.separator === "space") { + return casedText.join(" "); + } else { + return casedText.join(options?.separator); + } + } else { + return casedText.join(""); + } +}; + +export const testColumns = [ + { + header: "Action", + show: true, + accessor: "", + }, + + { + header: "Id", + accessor: "id", + show: false, + isSorted: false, + isSortedDesc: false, + mappingExist: false, + mappings: {}, + }, + + { + header: "User Id", + accessor: "user_id", + show: false, + isSorted: false, + isSortedDesc: false, + mappingExist: false, + mappings: {}, + }, + + { + header: "First Name", + accessor: "first_name", + show: true, + isSorted: false, + isSortedDesc: false, + mappingExist: false, + mappings: {}, + }, + + { + header: "Last Name", + accessor: "last_name", + show: true, + isSorted: false, + isSortedDesc: false, + mappingExist: false, + mappings: {}, + }, + { + header: "Email", + accessor: "email", + show: true, + isSorted: false, + isSortedDesc: false, + mappingExist: false, + mappings: {}, + }, + { + header: "Role", + accessor: "role", + show: true, + isSorted: false, + isSortedDesc: false, + mappingExist: true, + mappings: { + admin: "Admin", + employee: "Employee", + }, + }, + { + header: "Photo", + accessor: "photo", + show: true, + isSorted: false, + isSortedDesc: false, + mappingExist: false, + mappings: {}, + }, + { + header: "Phone", + accessor: "phone", + show: true, + isSorted: false, + isSortedDesc: false, + mappingExist: false, + mappings: {}, + }, + { + header: "Status", + accessor: "status", + show: false, + isSorted: false, + isSortedDesc: false, + mappingExist: true, + mappings: { 0: "pending", 1: "approved" }, + }, + { + header: "Type", + accessor: "type", + show: false, + isSorted: false, + isSortedDesc: false, + mappingExist: true, + mappings: { + 0: "normal", + 1: "facebook", + 2: "google", + }, + }, + { + header: "Verify", + accessor: "verify", + show: false, + isSorted: false, + isSortedDesc: false, + mappingExist: true, + mappings: { + 0: "not verified", + 1: "verified", + }, + }, + + { + header: "Create At", + accessor: "create_at", + show: false, + isSorted: false, + isSortedDesc: false, + mappingExist: false, + mappings: {}, + }, + + { + header: "Update At", + accessor: "update_at", + show: false, + isSorted: false, + isSortedDesc: false, + mappingExist: false, + mappings: {}, + }, +]; + + +export const exceptionalHtmlElements = [ + "audio", + "image", + "img", + "heading", + "video", + "h1", + "h2", + "h3", + "h4", + "h5", + "h6", + "hr", + "br", + "a", + "p", + "link", + "span", +]; +export const excludedHtmlElements = [ + "abbr", + "address", + "area", + "article", + "aside", + "b", + "base", + "bdi", + "bdo", + "blockquote", + "body", + "button", + "canvas", + "caption", + "cite", + "code", + "col", + "colgroup", + "data", + "datalist", + "dd", + "del", + "details", + "dfn", + "dialog", + "div", + "dl", + "dt", + "em", + "embed", + "fieldset", + "figcaption", + "figure", + "footer", + "form", + "head", + "header", + "hgroup", + "html", + "i", + "iframe", + "input", + "ins", + "kbd", + "label", + "legend", + "li", + // "link", + "main", + "map", + "mark", + "meta", + "meter", + "nav", + "noscript", + "object", + "ol", + "optgroup", + "option", + "output", + // "p", + "param", + "picture", + "pre", + "progress", + "q", + "rb", + "rp", + "rt", + "rtc", + "ruby", + "s", + "samp", + "script", + "section", + "select", + "slot", + "small", + "source", + "strong", + "style", + "sub", + "summary", + "sup", + "table", + "tbody", + "td", + "template", + "textarea", + "tfoot", + "th", + "thead", + "time", + "title", + "tr", + "track", + "u", + "ul", + "var", + "wbr", +] + \ No newline at end of file diff --git a/day20/tailwind.config.js b/day20/tailwind.config.js new file mode 100644 index 0000000..49bd233 --- /dev/null +++ b/day20/tailwind.config.js @@ -0,0 +1,28 @@ + + + /** @type {import('tailwindcss').Config} */ + module.exports = { + content: [ + "./src/**/*.{js,jsx,ts,tsx}", + "./node_modules/tw-elements/dist/js/**/*.js", + ], + theme: { + extend: { + colors: { + primaryBlue: "#4F46E5", + "primary-light": "#4F46E550", + }, + + keyframes: { + wiggle: { + "0%, 100%": { transform: "rotate(-3deg)" }, + "50%": { transform: "rotate(3deg)" }, + }, + }, + animation: { + wiggle: "wiggle 200ms ease-in-out", + }, + }, + }, + plugins: [require("tw-elements/dist/plugin"), require("@tailwindcss/forms")], + }; diff --git a/day20/vite.config.js b/day20/vite.config.js new file mode 100644 index 0000000..2f8d5da --- /dev/null +++ b/day20/vite.config.js @@ -0,0 +1,72 @@ + + import fs from "fs"; + import path from "path"; + import { fileURLToPath } from "url"; + import { defineConfig } from "vite"; + import react from "@vitejs/plugin-react"; + + import viteCompression from "vite-plugin-compression"; + + const dirname = path.dirname(fileURLToPath(import.meta.url)); + + const { dependencies } = JSON.parse( + fs.readFileSync(path.join(dirname, "package.json")) + ); + + const vendorPackages = [ + "react", + "react-router-dom", + "react-router", + "react-dom", + ]; + + function renderChunks(deps) { + let chunks = {}; + Object.keys(deps).forEach(key => { + if (vendorPackages.includes(key)) return; + chunks[key] = [key]; + }); + return chunks; + } + + export const OUTPUT_DIRECTORY = "dist"; + + // https://vitejs.dev/config/ + export default defineConfig({ + plugins: [ + react(), + + viteCompression({ + algorithm: "brotliCompress", + filter: /.(js|mjs|json|css|html|svg)$/i, + }), + ], + build: { + outDir: OUTPUT_DIRECTORY, + sourcemap: false, + rollupOptions: { + external: ["fsevents"], + output: { + manualChunks: { + vendor: vendorPackages, + ...renderChunks(dependencies), + }, + }, + }, + }, + resolve: { + alias: { + Components: path.resolve(dirname, "./src/components"), + Pages: path.resolve(dirname, "./src/pages"), + Utils: path.resolve(dirname, "./src/utils"), + Assets: path.resolve(dirname, "./src/assets"), + Context: path.resolve(dirname, "./src/context"), + Routes: path.resolve(dirname, "./src/routes"), + Hooks: path.resolve(dirname, "./src/hooks"), + Src: path.resolve(dirname, "./src"), + }, + }, + server: { + port: 3000, + }, + });
    +
    + +

    New chat

    + +
    +
    +
    +
    +
    + {!showEmptyChat && conversation.length > 0 ? ( +
    + +
    +
    +
    + ) : null} + {showEmptyChat ? ( +
    +

    + ChatGPT +

    +
    + {homePage.map((item, index) => ( +
    +
    + + {item.icon} + +

    + {item.title} +

    +
    +
    + {item.details.map((details, index) => ( +
    + {details} +
    + ))} +
    +
    + ))} +
    +
    + ) : null} +
    +
    +
    +
    +
    +
    +
    +
    + + + ) + + case "image": + return ( + <> + preview + + + ) + + case "number": + return ( + setContentValue(e.target.value)} + defaultValue={contentValue} + /> + ) + + case "team-list": + return ( + + ) + + case "image-list": + return ( + + ) + + case "captioned-image-list": + return ( + + ) + + case "kvp": + return ( + + ) + + default: + break; + } +} + +export default DynamicContentType; + +const ImageList = ({contentValue, setContentValue}) => { + let itemsObj = [ + {key: '', value_type: 'image', value: null} + ]; + if (!empty(contentValue)) { + itemsObj = JSON.parse(contentValue); + } + const [items, setItems] = React.useState(itemsObj); + + + const handleImageChange = async (e) => { + const listKey = e.target.getAttribute('listkey'); + const formData = new FormData(); + formData.append('file', e.target.files[0]); + try { + const result = await sdk.uploadImage(formData); + setItems(oldItems => { + let updatedItems = oldItems.map((item, index) => { + if (index == listKey) { + item.value = result.url; + return item; + } + return item; + }); + return updatedItems; + }) + setContentValue(JSON.stringify(items)) + }catch(err) { + console.error(err); + } + } + + const handleKeyChange = (e) => { + const listKey = e.target.getAttribute('listkey'); + setItems(oldItems => { + let updatedItems = oldItems.map((item, index) => { + if (index == listKey) { + item.key = e.target.value; + return item; + } + return item; + }); + return updatedItems; + }) + setContentValue(JSON.stringify(items)) + + } + + return ( +
    + {items.map( (item, index) =>
    + preview +
    + + +
    + +
    ) + } + +
    + + ) +} + +const CaptionedImageList = ({setContentValue, contentValue}) => { + let itemsObj = [ + {key: '', value_type: 'image', value: null, caption: ''} + ] + + if (!empty(contentValue)) { + itemsObj = JSON.parse(contentValue); + } + const [items, setItems] = React.useState(itemsObj); + + const handleImageChange = async (e) => { + const listKey = e.target.getAttribute('listkey'); + const formData = new FormData(); + formData.append('file', e.target.files[0]); + try { + const result = await sdk.uploadImage(formData); + setItems(oldItems => { + let updatedItems = oldItems.map((item, index) => { + if (index == listKey) { + item.value = result.url; + return item; + } + return item; + }); + return updatedItems; + }) + setContentValue(JSON.stringify(items)) + }catch(err) { + console.error(err); + } + } + + const handleKeyChange = (e) => { + const listKey = e.target.getAttribute('listkey'); + setItems(oldItems => { + let updatedItems = oldItems.map((item, index) => { + if (index == listKey) { + item.key = e.target.value; + return item; + } + return item; + }); + return updatedItems; + }) + setContentValue(JSON.stringify(items)) + } + + const handleCaptionChange = (e) => { + const listKey = e.target.getAttribute('listkey'); + setItems(oldItems => { + let updatedItems = oldItems.map((item, index) => { + if (index == listKey) { + item.caption = e.target.value; + return item; + } + return item; + }); + return updatedItems; + }) + setContentValue(JSON.stringify(items)) + } + + return ( +
    + {items.map( (item, index) =>
    + preview +
    + + +
    + + +
    ) + } + +
    + + ) +} +const TeamList = ({setContentValue, contentValue}) => { + let itemsObj = [ + {name: '', image: null, title: ''} + ] + + if (!empty(contentValue)) { + itemsObj = JSON.parse(contentValue); + } + const [items, setItems] = React.useState(itemsObj); + + const handleImageChange = async (e) => { + const listKey = e.target.getAttribute('listkey'); + const formData = new FormData(); + formData.append('file', e.target.files[0]); + try { + const result = await sdk.uploadImage(formData); + setItems(oldItems => { + let updatedItems = oldItems.map((item, index) => { + if (index == listKey) { + item.image = result.url; + return item; + } + return item; + }); + return updatedItems; + }) + setContentValue(JSON.stringify(items)) + }catch(err) { + console.error(err); + } + } + + const handleNameChange = (e) => { + const listKey = e.target.getAttribute('listkey'); + setItems(oldItems => { + let updatedItems = oldItems.map((item, index) => { + if (index == listKey) { + item.name = e.target.value; + return item; + } + return item; + }); + return updatedItems; + }) + setContentValue(JSON.stringify(items)) + } + + const handleTitleChange = (e) => { + const listKey = e.target.getAttribute('listkey'); + setItems(oldItems => { + let updatedItems = oldItems.map((item, index) => { + if (index == listKey) { + item.title = e.target.value; + return item; + } + return item; + }); + return updatedItems; + }) + setContentValue(JSON.stringify(items)) + } + + return ( +
    + {items.map( (item, index) =>
    + + {/*
    */} + + + preview + + {/*
    */} + + +
    ) + } + +
    + + ) +} +const KeyValuePair = ({setContentValue, contentValue}) => { + let itemsObj = [ + {key: '', value_type: 'text', value: ''} + ] + + if (!empty(contentValue)) { + itemsObj = JSON.parse(contentValue); + } + + const [items, setItems] = React.useState(itemsObj); + const valueTypeMap = [ + { + key: "text", + value: "Text" + }, + { + key: "number", + value: "Number" + }, + { + key: "json", + value: "JSON Object" + }, + { + key: "url", + value: "URL" + } + ] + + + const handleKeyChange = (e) => { + const listKey = e.target.getAttribute('listkey'); + setItems(oldItems => { + let updatedItems = oldItems.map((item, index) => { + if (index == listKey) { + item.key = e.target.value; + return item; + } + return item; + }); + return updatedItems; + }) + setContentValue(JSON.stringify(items)) + } + + const handleValueChange = (e) => { + const listKey = e.target.getAttribute('listkey'); + setItems(oldItems => { + let updatedItems = oldItems.map((item, index) => { + if (index == listKey) { + item.value = e.target.value; + return item; + } + return item; + }); + return updatedItems; + }) + setContentValue(JSON.stringify(items)) + } + + const handleValueTypeChange = (e) => { + const listKey = e.target.getAttribute('listkey'); + setItems(oldItems => { + let updatedItems = oldItems.map((item, index) => { + if (index == listKey) { + item.value_type = e.target.value; + return item; + } + return item; + }); + return updatedItems; + }) + setContentValue(JSON.stringify(items)) + } + + return ( +
    + {items.map( (item, index) =>
    + + + + + +
    ) + } + +
    + + ) +} + + diff --git a/day20/src/components/DynamicContentType/index.js b/day20/src/components/DynamicContentType/index.js new file mode 100644 index 0000000..7ebb2ae --- /dev/null +++ b/day20/src/components/DynamicContentType/index.js @@ -0,0 +1,5 @@ + + import { lazy } from 'react' + + export const DynamicContentType = lazy(()=> import("./DynamicContentType")) + \ No newline at end of file diff --git a/day20/src/components/Editor/Editor.jsx b/day20/src/components/Editor/Editor.jsx new file mode 100644 index 0000000..e0627a2 --- /dev/null +++ b/day20/src/components/Editor/Editor.jsx @@ -0,0 +1,47 @@ + + import React, { useState } from "react"; + import ReactQuill from "react-quill"; + import EditorToolbar, { modules, formats } from "./EditorToolbars"; + const Editor = ({ + setValue, + errors, + name, + placeholder = "Write something awesome...", + initialContent = "", + }) => { + const [content, setContent] = useState(initialContent); + const editorStyle = { + // maxheight: '500px', + // minheight: '500px', + height: "500px", + // overFlow: 'auto', + + // set the height to 500 pixels + }; + const onSetContent = (content) => { + setContent(content); + setValue(name, content); + }; + + return ( + <> + + onSetContent(content)} + placeholder={placeholder} + modules={modules} + formats={formats} + style={editorStyle} + /> + {errors && errors?.content && ( +

    + {errors?.content?.message} +

    + )} + + ); + }; + + export default Editor; diff --git a/day20/src/components/Editor/EditorToolbars.jsx b/day20/src/components/Editor/EditorToolbars.jsx new file mode 100644 index 0000000..b2b5b69 --- /dev/null +++ b/day20/src/components/Editor/EditorToolbars.jsx @@ -0,0 +1,160 @@ + +import React from "react"; +import { Quill } from "react-quill"; + +// Custom Undo button icon component for Quill editor. You can import it directly +// from 'quill/assets/icons/undo.svg' but I found that a number of loaders do not +// handle them correctly +const CustomUndo = () => ( + + + + +); + +// Redo button icon component for Quill editor +const CustomRedo = () => ( + + + + +); + +// Undo and redo functions for Custom Toolbar +function undoChange () { + this.quill.history.undo(); +} +function redoChange () { + this.quill.history.redo(); +} + +// Add sizes to whitelist and register them +const Size = Quill.import( "formats/size" ); +Size.whitelist = [ "extra-small", "small", "medium", "large" ]; +Quill.register( Size, true ); + +// Add fonts to whitelist and register them +const Font = Quill.import( "formats/font" ); +Font.whitelist = [ + "arial", + "comic-sans", + "courier-new", + "georgia", + "helvetica", + "lucida" +]; +Quill.register( Font, true ); + +// Modules object for setting up the Quill editor +export const modules = { + toolbar: { + container: "#toolbar", + handlers: { + undo: undoChange, + redo: redoChange + } + }, + history: { + delay: 500, + maxStack: 100, + userOnly: true + } +}; + +// Formats objects for setting up the Quill editor +export const formats = [ + "header", + "font", + "size", + "bold", + "italic", + "underline", + "align", + "strike", + "script", + "blockquote", + "background", + "list", + "bullet", + "indent", + "link", + "image", + "color", + "code-block" +]; + +// Quill Toolbar component +const QuillToolbar = () => ( +
    + + + + + + + + )} + {actions?.view && ( + + )} + + {actions?.delete && ( + + )} +
    + ); + } else { + return null; + } + } + if (cell?.mappingExist) { + return ( +
    +
    {cell?.header}:
    +
    + {cell?.mappings[row[cell?.accessor]]} +
    +
    + ); + } + return ( +
    +
    {cell?.header}:
    +
    + {row[cell?.accessor]} +
    +
    + ); + })} +
    + + ); +}; + +export default MkdGridCard; diff --git a/day20/src/components/MkdGridView/MkdGridCards.jsx b/day20/src/components/MkdGridView/MkdGridCards.jsx new file mode 100644 index 0000000..0b32829 --- /dev/null +++ b/day20/src/components/MkdGridView/MkdGridCards.jsx @@ -0,0 +1,87 @@ +import React from "react"; +import ModalPrompt from "Components/Modal/ModalPrompt"; +import { useNavigate } from "react-router-dom"; +import { capitalize } from "Utils/utils"; +import { Spinner } from "Assets/svgs"; +import { colors } from "Utils/config"; +import MkdGridCard from "./MkdGridCard"; + +const MkdGridCards = ({ + table, + onSort, + getData, + loading, + columns, + actions, + tableRole, + deleteItem, + deleteLoading, + actionId = "id", + showDeleteModal, + currentTableData, + setShowDeleteModal, +}) => { + const [deleteId, setIdToDelete] = React.useState(null); + + const navigate = useNavigate(); + + const setDeleteId = async (id) => { + setShowDeleteModal(true); + setIdToDelete(id); + }; + + return ( + <> +
    + {loading ? ( +
    + +
    + ) : ( +
    +
    + {currentTableData.map((row, i) => { + return ( + + ); + })} +
    +
    + )} +
    + + {showDeleteModal ? ( + { + deleteItem(deleteId); + }} + closeModalFunction={() => { + setIdToDelete(null); + setShowDeleteModal(false); + }} + title={`Delete ${capitalize(table)}`} + message={`You are about to delete ${capitalize( + table + )} ${deleteId}, note that this action is irreversible`} + acceptText={`DELETE`} + rejectText={`CANCEL`} + loading={deleteLoading} + /> + ) : null} + + ); +}; + +export default MkdGridCards; diff --git a/day20/src/components/MkdGridView/MkdGridView.jsx b/day20/src/components/MkdGridView/MkdGridView.jsx new file mode 100644 index 0000000..956f500 --- /dev/null +++ b/day20/src/components/MkdGridView/MkdGridView.jsx @@ -0,0 +1,325 @@ +import React from "react"; +import { useForm } from "react-hook-form"; +import { yupResolver } from "@hookform/resolvers/yup"; +import * as yup from "yup"; +import MkdSDK from "Utils/MkdSDK"; +import { getNonNullValue } from "Utils/utils"; +import {PaginationBar} from "Components/PaginationBar"; +import { AuthContext, tokenExpireError } from "Context/Auth"; +import { GlobalContext } from "Context/Global"; +import { MkdGridCards } from "Components/MkdGridView"; +import { MkdInput } from "Components/MkdInput"; + +let sdk = new MkdSDK(); +// const getSchemaStructure = (schema) => { +// return; +// }; +const getType = (type) => { + switch (type) { + case "varchar": + return "text"; + case "text": + return "textarea"; + case "mediumtext": + return "textarea"; + case "longtext": + return "textarea"; + case "tinyint": + return "number"; + case "int": + return "number"; + case "bigint": + return "number"; + case "float": + return "number"; + case "double": + return "number"; + case "image": + return "image"; + case "file": + return "file"; + case "date": + return "date"; + case "datetime": + return "datetime"; + default: + return "text"; + } +}; + +const MkdGridView = ({ + columns = [], + actions = { view: true, edit: true, delete: true }, + actionId = "id", + tableRole = "admin", + table = "user", + tableSchema = [], + hasFilter = true, + schemaFields = [], +}) => { + const { dispatch } = React.useContext(AuthContext); + const { dispatch: globalDispatch } = React.useContext(GlobalContext); + + const [query, setQuery] = React.useState(""); + const [currentTableData, setCurrentTableData] = React.useState([]); + const [pageSize, setPageSize] = React.useState(10); + const [pageCount, setPageCount] = React.useState(0); + const [dataTotal, setDataTotal] = React.useState(0); + const [currentPage, setPage] = React.useState(0); + const [canPreviousPage, setCanPreviousPage] = React.useState(false); + const [canNextPage, setCanNextPage] = React.useState(false); + const [showDeleteModal, setShowDeleteModal] = React.useState(false); + const [deleteLoading, setDeleteLoading] = React.useState(false); + const [loading, setLoading] = React.useState(false); + + const schema = yup.object({}); + + const { + register, + handleSubmit, + setError, + reset, + formState: { errors }, + } = useForm({ + resolver: yupResolver(schema), + }); + + function onSort(columnIndex) { + console.log(columns[columnIndex]); + if (columns[columnIndex].isSorted) { + columns[columnIndex].isSortedDesc = !columns[columnIndex].isSortedDesc; + } else { + columns.map((i) => (i.isSorted = false)); + columns.map((i) => (i.isSortedDesc = false)); + columns[columnIndex].isSorted = true; + } + + (async function () { + await getData(0, pageSize); + })(); + } + + function updatePageSize(limit) { + (async function () { + setPageSize(limit); + await getData(0, limit); + })(); + } + + function previousPage() { + (async function () { + await getData(currentPage - 1 > 0 ? currentPage - 1 : 0, pageSize); + })(); + } + + function nextPage() { + (async function () { + await getData( + currentPage + 1 <= pageCount ? currentPage + 1 : 0, + pageSize + ); + })(); + } + + async function getData(pageNum, limitNum, currentTableData) { + try { + // sdk.setTable("nanny_profile"); + // let sortField = columns.filter(col => col.isSorted); + setLoading(true); + sdk.setTable(table); + const result = await sdk.callRestAPI( + { + payload: { + ...currentTableData, + }, + page: pageNum, + limit: limitNum, + }, + "PAGINATE" + ); + if (result) { + setLoading(false); + } + const { list, total, limit, num_pages, page } = result; + + setCurrentTableData(list); + setPageSize(limit); + setPageCount(num_pages); + setPage(page); + setDataTotal(total); + setCanPreviousPage(page > 1); + setCanNextPage(page + 1 <= num_pages); + setLoading(false); + } catch (error) { + setLoading(false); + console.log("ERROR", error); + tokenExpireError(dispatch, error.message); + } + } + + const deleteItem = async (id) => { + try { + setDeleteLoading(true); + sdk.setTable(table); + const result = await sdk.callRestAPI({ id }, "DELETE"); + if (!result?.error) { + setCurrentTableData((list) => + list.filter((x) => Number(x.user_id) !== Number(id)) + ); + setDeleteLoading(false); + setShowDeleteModal(false); + } + } catch (err) { + setDeleteLoading(false); + setShowDeleteModal(false); + tokenExpireError(dispatch, err?.message); + throw new Error(err); + } + }; + + const exportTable = async (id) => { + try { + sdk.setTable(table); + const result = await sdk.exportCSV(); + } catch (err) { + throw new Error(err); + } + }; + + const resetForm = async () => { + reset(); + await getData(0, pageSize); + }; + + const onSubmit = (_data) => { + let filter = {}; + for (const field of schemaFields) { + const [key] = field.split(":"); + filter[key] = getNonNullValue(_data[key]); + } + getData(1, pageSize, filter); + }; + + React.useEffect(() => { + // globalDispatch({ + // type: "SETPATH", + // payload: { + // path: "nanny_profile", + // }, + // }); + + (async function () { + await getData(1, pageSize); + })(); + }, []); + + return ( +
    + {hasFilter ? ( +
    +

    {table} Search

    +
    + {tableSchema && tableSchema.length + ? tableSchema + .map((item, key) => { + if (item.is_filter) { + if (Object.keys(item.mapping).length) { + return ( +
    + +
    + ); + } else { + return ( +
    + +
    + ); + } + } + }) + .filter(Boolean) + : null} +
    + + + +
    + ) : null} + +
    +
    +

    {table} Profile

    +
    + {/* + */} +
    +
    + +
    + +
    + ); +}; + +export default MkdGridView; diff --git a/day20/src/components/MkdGridView/index.js b/day20/src/components/MkdGridView/index.js new file mode 100644 index 0000000..b0c4191 --- /dev/null +++ b/day20/src/components/MkdGridView/index.js @@ -0,0 +1,5 @@ + +import {lazy} from "react" +export const MkdGridView = lazy(()=> import("./MkdGridView")) +export const MkdGridCards = lazy(()=> import("./MkdGridCards")) +export const MkdGridCard = lazy(()=> import("./MkdGridCard")) diff --git a/day20/src/components/MkdInput/MkdInput.jsx b/day20/src/components/MkdInput/MkdInput.jsx new file mode 100644 index 0000000..3b59ba0 --- /dev/null +++ b/day20/src/components/MkdInput/MkdInput.jsx @@ -0,0 +1,120 @@ + + import React from "react"; +import { StringCaser } from "Utils/utils"; + +const MkdInput = ({ + type = "text", + page, + cols = "30", + rows = "50", + name, + label, + errors, + register, + className, + placeholder, + options = [], + mapping = null, + disabled = false, +}) => { + return ( + <> +
    + + {type === "textarea" ? ( + + ) : type === "radio" || type === "checkbox" || type === "color" ? ( + + ) : type === "dropdown" || type === "select" ? ( + + ) : type === "mapping" ? ( + <> + {mapping ? ( + + ) : ( + `Please Pass the mapping e.g {key:value}` + )} + + ) : ( + + )} +

    + {errors[name]?.message} +

    +
    + + ); +}; + +export default MkdInput; + + \ No newline at end of file diff --git a/day20/src/components/MkdInput/index.js b/day20/src/components/MkdInput/index.js new file mode 100644 index 0000000..6a5f779 --- /dev/null +++ b/day20/src/components/MkdInput/index.js @@ -0,0 +1,3 @@ + + export { default as MkdInput } from "./MkdInput"; + \ No newline at end of file diff --git a/day20/src/components/MkdJsonQuiz/AnswerTypes/MultipleChoice.jsx b/day20/src/components/MkdJsonQuiz/AnswerTypes/MultipleChoice.jsx new file mode 100644 index 0000000..31a5393 --- /dev/null +++ b/day20/src/components/MkdJsonQuiz/AnswerTypes/MultipleChoice.jsx @@ -0,0 +1,20 @@ +import React from "react"; +import MkdJsonQuizOptions from "../MkdJsonQuizOptions"; +import { QuestionTypes } from "../MkdJsonQuiz"; + +const MultipleChoice = ({ updateQuestions, currentQuestion }) => { + // console.log("currentQuestion >>", currentQuestion); + return ( + <> + {currentQuestion && + currentQuestion?.type === QuestionTypes.multiple_choice ? ( + + ) : null} + + ); +}; + +export default MultipleChoice; diff --git a/day20/src/components/MkdJsonQuiz/AnswerTypes/ShortLongAnswer.jsx b/day20/src/components/MkdJsonQuiz/AnswerTypes/ShortLongAnswer.jsx new file mode 100644 index 0000000..4b6be5f --- /dev/null +++ b/day20/src/components/MkdJsonQuiz/AnswerTypes/ShortLongAnswer.jsx @@ -0,0 +1,67 @@ +import React, { useId, useState } from "react"; +import { QuestionTypes } from "../MkdJsonQuiz"; + +let timeout = null; + +const ShortLongAnswer = ({ updateQuestions, currentQuestion }) => { + // console.log("currentQuestion >>", currentQuestion); + const inputId = useId(); + const [inputValue, setInputValue] = useState(""); + + const getValue = () => { + return inputValue || currentQuestion?.answer; + }; + + function handleInput(e) { + const inputValue = e.target.value; + // setValue(inputValue); + setInputValue(inputValue); + + if (timeout) { + clearTimeout(timeout); + } + + timeout = setTimeout(() => { + const tempCurrentQuestion = { ...currentQuestion }; + tempCurrentQuestion["answer"] = inputValue; + updateQuestions(tempCurrentQuestion); + setInputValue(""); + }, 1000); // 500 milliseconds = half a second + } + + return ( + <> + {currentQuestion && + [QuestionTypes.short_answer, QuestionTypes.long_answer].includes( + currentQuestion?.type + ) ? ( +
    + {/*
    */} + {currentQuestion?.type === QuestionTypes.short_answer ? ( + handleInput(e)} + value={getValue()} + className="block w-full rounded-lg border border-blue-600 bg-white p-4 pl-3 text-sm text-black placeholder-black focus:border-blue-500 focus:ring-blue-500 dark:text-gray-400 dark:placeholder-gray-400" + /> + ) : ( + +

    + {errors.name?.message} +

    +
    + +
    + + +
    + + ) : ( + + )} +
    +
    +
    +