From d1acc0428f47ca96dba1ed4756c37f5aa8627a37 Mon Sep 17 00:00:00 2001 From: ilyasBozdemir Date: Thu, 2 May 2024 16:35:41 +0300 Subject: [PATCH] =?UTF-8?q?##=20=F0=9F=9A=80=20feat:=20Add=20complete=20la?= =?UTF-8?q?yout=20and=20user=20panel=20components?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🛠️ **This commit includes the following changes:** - Implemented layout components to structure the application interface, providing a consistent visual layout across all pages. - Created user panel components to facilitate user interaction and management within the application. - Populated various pages with fake data to simulate realistic scenarios and ensure functionality across different sections. - Enhanced overall styling and visual elements to improve the user experience and interface aesthetics. 👍 **These changes establish a robust foundation for the application layout and user panel, offering a structured interface for users to navigate and interact with various features. The integration of fake data ensures that the functionality is tested under realistic conditions, while the visual enhancements contribute to a more engaging user experience.** --- .../DataTransferObjects/LibraryBranchDTO.cs | 9 + .../GetAllLibraryBranchesQueryHandler.cs | 9 + .../Enums/WorkFormat.cs | 5 - .../LoginRegisterPage/LoginPage.jsx | 14 +- .../LoginRegisterPage/RegisterPage.jsx | 54 ++ .../frontend/constants/appSidebarItems.jsx | 11 +- .../src/frontend/constants/meSidebarItems.jsx | 54 ++ .../Admin/components/Sidebar/index.jsx | 2 + .../layouts/Admin/components/Stats.jsx | 147 ++++ .../layouts/Anon/components/HeroSection.jsx | 107 ++- .../layouts/App/components/Sidebar/index.jsx | 1 + .../layouts/Me/components/Navbar/index.jsx | 129 +++ .../layouts/Me/components/Sidebar/index.jsx | 136 ++++ .../frontend/layouts/Me/guides/tourSteps.js | 6 + .../src/frontend/layouts/Me/layout.jsx | 43 + .../src/frontend/pages/_app.jsx | 2 +- .../src/frontend/pages/admin/Stats.jsx | 146 ++++ .../src/frontend/pages/admin/index.jsx | 32 +- .../src/frontend/pages/admin/profile.jsx | 44 + .../pages/app/borrow/extension-requests.jsx | 65 ++ .../src/frontend/pages/app/borrow/give.jsx | 97 ++- .../src/frontend/pages/app/borrow/index.jsx | 83 +- .../src/frontend/pages/app/borrow/return.jsx | 85 +- .../src/frontend/pages/app/library/index.jsx | 4 +- .../src/frontend/pages/app/profile.jsx | 44 + .../src/frontend/pages/app/settings/index.jsx | 758 +++++++++++++++++- .../src/frontend/pages/index.jsx | 12 +- .../src/frontend/pages/me/borrow.jsx | 56 ++ .../src/frontend/pages/me/index.jsx | 9 + .../src/frontend/pages/me/library.jsx | 78 ++ .../src/frontend/pages/me/past-books.jsx | 40 + .../src/frontend/pages/me/profile.jsx | 44 + .../src/frontend/pages/me/social.jsx | 24 + .../src/frontend/pages/me/support.jsx | 84 ++ .../src/frontend/pages/privacy-policy.jsx | 74 ++ 35 files changed, 2393 insertions(+), 115 deletions(-) create mode 100644 LibraryTrackingApp/src/frontend/constants/meSidebarItems.jsx create mode 100644 LibraryTrackingApp/src/frontend/layouts/Admin/components/Stats.jsx create mode 100644 LibraryTrackingApp/src/frontend/layouts/Me/components/Navbar/index.jsx create mode 100644 LibraryTrackingApp/src/frontend/layouts/Me/components/Sidebar/index.jsx create mode 100644 LibraryTrackingApp/src/frontend/layouts/Me/guides/tourSteps.js create mode 100644 LibraryTrackingApp/src/frontend/layouts/Me/layout.jsx create mode 100644 LibraryTrackingApp/src/frontend/pages/admin/Stats.jsx create mode 100644 LibraryTrackingApp/src/frontend/pages/admin/profile.jsx create mode 100644 LibraryTrackingApp/src/frontend/pages/app/borrow/extension-requests.jsx create mode 100644 LibraryTrackingApp/src/frontend/pages/app/profile.jsx create mode 100644 LibraryTrackingApp/src/frontend/pages/me/borrow.jsx create mode 100644 LibraryTrackingApp/src/frontend/pages/me/index.jsx create mode 100644 LibraryTrackingApp/src/frontend/pages/me/library.jsx create mode 100644 LibraryTrackingApp/src/frontend/pages/me/past-books.jsx create mode 100644 LibraryTrackingApp/src/frontend/pages/me/profile.jsx create mode 100644 LibraryTrackingApp/src/frontend/pages/me/social.jsx create mode 100644 LibraryTrackingApp/src/frontend/pages/me/support.jsx create mode 100644 LibraryTrackingApp/src/frontend/pages/privacy-policy.jsx diff --git a/LibraryTrackingApp/src/backend/Core/LibraryTrackingApp.Application/DataTransferObjects/LibraryBranchDTO.cs b/LibraryTrackingApp/src/backend/Core/LibraryTrackingApp.Application/DataTransferObjects/LibraryBranchDTO.cs index a67c952..624c55d 100644 --- a/LibraryTrackingApp/src/backend/Core/LibraryTrackingApp.Application/DataTransferObjects/LibraryBranchDTO.cs +++ b/LibraryTrackingApp/src/backend/Core/LibraryTrackingApp.Application/DataTransferObjects/LibraryBranchDTO.cs @@ -7,4 +7,13 @@ public record LibraryBranchDTO : BaseAuditableDTO public string Address { get; init; } public string PhoneNumber { get; init; } public string Description { get; init; } + public int MaxCheckoutLimit { get; set; } // Azami ödünç alma adedi + public int MinCheckoutDurationInDays { get; set; } // Asgari teslim süresi (gün cinsinden) + public int MaxCheckoutDurationInDays { get; set; } // Azami teslim süresi (gün cinsinden) + public int CriticalLevelThreshold { get; set; } // Eser kritik seviyesi + + public bool NotifyOnBookOrBlogComment { get; set; } // Eser veya blog yorumu bildirimi açık mı? + + public int TopMembersReportLimit { get; set; } // En çok okuyan üyeler raporunda listelenecek maksimum üye sayısı + public int TopBooksReportLimit { get; set; } // En çok okuyan eserler raporunda listelenecek maksimum eser sayısı } diff --git a/LibraryTrackingApp/src/backend/Core/LibraryTrackingApp.Application/Features/LibraryBranches/Queries/Handlers/GetAllLibraryBranchesQueryHandler.cs b/LibraryTrackingApp/src/backend/Core/LibraryTrackingApp.Application/Features/LibraryBranches/Queries/Handlers/GetAllLibraryBranchesQueryHandler.cs index 78a73dc..06744fb 100644 --- a/LibraryTrackingApp/src/backend/Core/LibraryTrackingApp.Application/Features/LibraryBranches/Queries/Handlers/GetAllLibraryBranchesQueryHandler.cs +++ b/LibraryTrackingApp/src/backend/Core/LibraryTrackingApp.Application/Features/LibraryBranches/Queries/Handlers/GetAllLibraryBranchesQueryHandler.cs @@ -40,6 +40,15 @@ public async Task Handle(GetAllLibraryBranch Description = libraryBranch.Description, Address = libraryBranch.Address, PhoneNumber = libraryBranch.PhoneNumber, + + MaxCheckoutLimit = libraryBranch.MaxCheckoutLimit, + MinCheckoutDurationInDays = libraryBranch.MinCheckoutDurationInDays, + MaxCheckoutDurationInDays = libraryBranch.MaxCheckoutDurationInDays, + CriticalLevelThreshold = libraryBranch.CriticalLevelThreshold, + NotifyOnBookOrBlogComment = libraryBranch.NotifyOnBookOrBlogComment, + TopMembersReportLimit = libraryBranch.TopMembersReportLimit, + TopBooksReportLimit = libraryBranch.TopBooksReportLimit, + }); } diff --git a/LibraryTrackingApp/src/backend/Core/LibraryTrackingApp.Domain/Enums/WorkFormat.cs b/LibraryTrackingApp/src/backend/Core/LibraryTrackingApp.Domain/Enums/WorkFormat.cs index 34024aa..3b23f0e 100644 --- a/LibraryTrackingApp/src/backend/Core/LibraryTrackingApp.Domain/Enums/WorkFormat.cs +++ b/LibraryTrackingApp/src/backend/Core/LibraryTrackingApp.Domain/Enums/WorkFormat.cs @@ -32,9 +32,4 @@ public enum WorkFormat /// Thesis = 1 << 4, - /// - /// Eser öneri formatında. - /// - Recommendation = 1 << 5 - } \ No newline at end of file diff --git a/LibraryTrackingApp/src/frontend/components/LoginRegisterPage/LoginPage.jsx b/LibraryTrackingApp/src/frontend/components/LoginRegisterPage/LoginPage.jsx index 9d7b3b5..6c033a7 100644 --- a/LibraryTrackingApp/src/frontend/components/LoginRegisterPage/LoginPage.jsx +++ b/LibraryTrackingApp/src/frontend/components/LoginRegisterPage/LoginPage.jsx @@ -124,6 +124,14 @@ const LoginPage = () => { Şifremi Unuttum + + Giriş yaparak gizlilik sözleşmemizi kabul etmiş olursunuz.{" "} + + + Sözleşme metnine buradan ulaşabilirsiniz. + + + diff --git a/LibraryTrackingApp/src/frontend/constants/appSidebarItems.jsx b/LibraryTrackingApp/src/frontend/constants/appSidebarItems.jsx index 35510b1..43de737 100644 --- a/LibraryTrackingApp/src/frontend/constants/appSidebarItems.jsx +++ b/LibraryTrackingApp/src/frontend/constants/appSidebarItems.jsx @@ -3,7 +3,6 @@ import { FiSettings, FiLogOut, FiBook, - FiHelpCircle, } from "react-icons/fi"; import { BsArrowLeftRight, @@ -207,6 +206,12 @@ export const sidebarItems = [ href: "/app/borrow/return", target: "_self", }, + { + icon: , + title: "Uzatma İstekleri", + href: "/app/borrow/extension-requests", + target: "_self", + }, { icon: , title: "Ödünç Kitapları Listele", @@ -223,8 +228,8 @@ export const sidebarItems = [ subItems: [ { icon: , - title: "Ödünç Ver", - href: 'book-tag/new', + title: "Yeni Ekle", + href: "book-tag/new", target: "_self", }, { diff --git a/LibraryTrackingApp/src/frontend/constants/meSidebarItems.jsx b/LibraryTrackingApp/src/frontend/constants/meSidebarItems.jsx new file mode 100644 index 0000000..bcd1f68 --- /dev/null +++ b/LibraryTrackingApp/src/frontend/constants/meSidebarItems.jsx @@ -0,0 +1,54 @@ +import { + FaBook, + FaClock, + FaExchangeAlt, + FaHistory, + FaQuestionCircle, + FaUser, + FaUsers, +} from "react-icons/fa"; + +export const meSidebarItems = [ + { + title: "Profil Yönetimi", + icon: , + href: "/me/profile", + target: "_self", + subItems: [], + }, + { + title: "Kütüphane Yönetimi", + icon: , + href: "/me/library", + target: "_self", + subItems: [], + }, + { + title: "Kitap Alım ve Teslim", + icon: , + href: "/me/borrow", + target: "_self", + subItems: [], + }, + { + title: "Geçmiş Alınan Kitaplar", + icon: , + href: "/me/past-books", + target: "_self", + subItems: [], + }, + { + title: "Destek", + icon: , + href: "/me/support", + target: "_self", + subItems: [], + }, + { + title: "Sosyalleşme", + icon: , + href: "/me/social", + target: "_self", + subItems: [], + }, +]; diff --git a/LibraryTrackingApp/src/frontend/layouts/Admin/components/Sidebar/index.jsx b/LibraryTrackingApp/src/frontend/layouts/Admin/components/Sidebar/index.jsx index ad6c234..04d9a83 100644 --- a/LibraryTrackingApp/src/frontend/layouts/Admin/components/Sidebar/index.jsx +++ b/LibraryTrackingApp/src/frontend/layouts/Admin/components/Sidebar/index.jsx @@ -116,6 +116,8 @@ const SidebarItem = ({ icon, text, href, target, isActive, subItems }) => { onClick={subItems?.length > 0 ? handleToggle : null} as={subItems?.length > 0 ? null : Link} href={href} + target={target} + > {text} diff --git a/LibraryTrackingApp/src/frontend/layouts/Admin/components/Stats.jsx b/LibraryTrackingApp/src/frontend/layouts/Admin/components/Stats.jsx new file mode 100644 index 0000000..022b6ee --- /dev/null +++ b/LibraryTrackingApp/src/frontend/layouts/Admin/components/Stats.jsx @@ -0,0 +1,147 @@ +import React from 'react'; +import { + HStack, + VStack, + Text, + useColorModeValue, + Flex, + Link, + Icon, + SimpleGrid, + Container, + Stack +} from '@chakra-ui/react'; + +import { motion } from 'framer-motion'; + + +import { BsArrowUpShort, BsArrowDownShort } from 'react-icons/bs'; +import { BsBook } from 'react-icons/bs'; +import { HiOutlineMail } from 'react-icons/hi'; +import { RiUserStarLine, RiUserSharedLine, RiBookLine } from 'react-icons/ri'; +import { BiCurrentLocation } from 'react-icons/bi'; + + +const data = [ + { + id: 1, + label: 'Toplam Kütüphane Sayısı', + score: 25, + icon: BsBook, + percentage: '10%' + }, + { + id: 2, + label: 'Toplam Ödünç Verilen Kitap Sayısı', + score: 150, + icon: RiBookLine, + percentage: '30%' + }, + { + id: 3, + label: 'Toplam Kayıtlı Kullanıcı Sayısı', + score: 500, + icon: RiUserStarLine, + percentage: '15%' + }, + { + id: 4, + label: 'Toplam Aktif Kullanıcı Sayısı', + score: 200, + icon: RiUserSharedLine, + percentage: '20%' + }, + { + id: 5, + label: 'En Popüler Konum', + score: 'New York, NY', + icon: BiCurrentLocation, + percentage: '25%' + } + +]; + +const StatData = () => { + return ( + + + {data.map((data, index) => ( + + ))} + + + ); +}; + +const Card = ({ data }) => { + return ( + + + + + + + + + {data.label} + + + + {data.score} + + + {Number(data.score) > 100 ? ( + + ) : ( + + )} + + {data.percentage} + + + + + + + + View All + + + + ); +}; + +export default StatData; \ No newline at end of file diff --git a/LibraryTrackingApp/src/frontend/layouts/Anon/components/HeroSection.jsx b/LibraryTrackingApp/src/frontend/layouts/Anon/components/HeroSection.jsx index 44a28fe..9aedeba 100644 --- a/LibraryTrackingApp/src/frontend/layouts/Anon/components/HeroSection.jsx +++ b/LibraryTrackingApp/src/frontend/layouts/Anon/components/HeroSection.jsx @@ -1,4 +1,4 @@ -import { Fragment } from 'react'; +import { Fragment } from "react"; import { chakra, Container, @@ -8,57 +8,69 @@ import { Link as CLink, Icon, Flex, - Box -} from '@chakra-ui/react'; + Box, +} from "@chakra-ui/react"; -import { FaGithub } from 'react-icons/fa'; -import { FaCircleNodes } from 'react-icons/fa6'; +import { FaGithub } from "react-icons/fa"; +import { FaCircleNodes } from "react-icons/fa6"; import { RiNextjsLine } from "react-icons/ri"; import { AiOutlineDotNet } from "react-icons/ai"; -import Link from 'next/link'; +import Link from "next/link"; const features = [ { - title: 'Next.js ile Güçlendirilmiş', - detail: 'Next.js ile oluşturulan hızlı, etkileşimli ve SEO dostu web uygulamaları.', - icon: + title: "Next.js ile Güçlendirilmiş", + detail: + "Next.js ile oluşturulan hızlı, etkileşimli ve SEO dostu web uygulamaları.", + icon: , }, { - title: '.NET Core Backend', - detail: '.NET Core kullanarak güçlü ve ölçeklenebilir bir backend oluşturun.', - icon: + title: ".NET Core Backend", + detail: + ".NET Core kullanarak güçlü ve ölçeklenebilir bir backend oluşturun.", + icon: , }, { - title: 'Kolay Özelleştirme', - detail: 'Tüm bileşenler ve kancalar türleri ihraç eder.', - icon: - } + title: "Kolay Özelleştirme", + detail: "Tüm bileşenler ve kancalar türleri ihraç eder.", + icon: , + }, ]; const HeroSection = () => { return ( - + - + Kütüphane Yönetim Sistemi - Hızlı ve etkili bir şekilde kütüphanenizi yönetin. Kolay kullanım ve esnek özelliklerle kütüphane işlerinizi düzenleyin. + Hızlı ve etkili bir şekilde kütüphanenizi yönetin. Kolay kullanım + ve esnek özelliklerle kütüphane işlerinizi düzenleyin. {features.map((feature, index) => ( - + { {feature.title} - + {feature.detail} @@ -81,24 +97,29 @@ const HeroSection = () => { ))} - - Get started - + + Şimdi Başlayalım! + + { fontWeight="bold" alignItems="center" > - + Github - @@ -123,7 +148,7 @@ const HeroSection = () => { { ); }; -export default HeroSection; \ No newline at end of file +export default HeroSection; diff --git a/LibraryTrackingApp/src/frontend/layouts/App/components/Sidebar/index.jsx b/LibraryTrackingApp/src/frontend/layouts/App/components/Sidebar/index.jsx index e4c1ce7..c22fa7b 100644 --- a/LibraryTrackingApp/src/frontend/layouts/App/components/Sidebar/index.jsx +++ b/LibraryTrackingApp/src/frontend/layouts/App/components/Sidebar/index.jsx @@ -98,6 +98,7 @@ const SidebarItem = ({ icon, text, href, target, isActive, subItems }) => { onClick={subItems?.length > 0 ? handleToggle : null} as={subItems?.length > 0 ? null : Link} href={href} + target={target} > {text} diff --git a/LibraryTrackingApp/src/frontend/layouts/Me/components/Navbar/index.jsx b/LibraryTrackingApp/src/frontend/layouts/Me/components/Navbar/index.jsx new file mode 100644 index 0000000..27718d6 --- /dev/null +++ b/LibraryTrackingApp/src/frontend/layouts/Me/components/Navbar/index.jsx @@ -0,0 +1,129 @@ +import { useState } from "react"; +import { + Box, + Avatar, + Button, + HStack, + VStack, + Menu, + MenuButton, + MenuList, + MenuItem, + Text, + useColorModeValue, + Icon, + Flex, +} from "@chakra-ui/react"; +import Link from "next/link"; +import ThemeSwitcher from "../../../../components/ThemeSwitcher"; +import LanguageSwitcher from "../../../../components/LanguageSwitcher"; + +import { FiMinimize, FiMaximize } from "react-icons/fi"; +import { HiMenuAlt2 } from "react-icons/hi"; + +const Navbar = ({ isOpen, onMenuToggle }) => { + const [isMaximized, setIsMaximized] = useState(false); + + const handleMaximizeToggle = () => { + setIsMaximized(!isMaximized); + + if (!isMaximized) { + // Pencere tam ekran yapılabilir + if (document.documentElement.requestFullscreen) { + document.documentElement.requestFullscreen(); + } else if (document.documentElement.mozRequestFullScreen) { + document.documentElement.mozRequestFullScreen(); + } else if (document.documentElement.webkitRequestFullscreen) { + document.documentElement.webkitRequestFullscreen(); + } else if (document.documentElement.msRequestFullscreen) { + document.documentElement.msRequestFullscreen(); + } + } else { + // Tam ekranı kapat + if (document.exitFullscreen) { + document.exitFullscreen(); + } else if (document.mozCancelFullScreen) { + document.mozCancelFullScreen(); + } else if (document.webkitExitFullscreen) { + document.webkitExitFullscreen(); + } else if (document.msExitFullscreen) { + document.msExitFullscreen(); + } + } + }; + + return ( + + + + + + + + ); +}; + +const NavItem = ({ isMaximized, handleMaximizeToggle }) => { + return ( + <> + + + + + + + + + + + + + + + İlyas Bozdemir + + @ilyasbozdemir + + + + + + + + + ); +}; + +export default Navbar; diff --git a/LibraryTrackingApp/src/frontend/layouts/Me/components/Sidebar/index.jsx b/LibraryTrackingApp/src/frontend/layouts/Me/components/Sidebar/index.jsx new file mode 100644 index 0000000..4dcc5a2 --- /dev/null +++ b/LibraryTrackingApp/src/frontend/layouts/Me/components/Sidebar/index.jsx @@ -0,0 +1,136 @@ +import { + Box, + Flex, + VStack, + Text, + Avatar, + Icon, + Button, + Divider, + Collapse, +} from "@chakra-ui/react"; + +import Link from "next/link"; + +import { CloseIcon } from "@chakra-ui/icons"; +import { useRouter } from "next/router"; +import { meSidebarItems } from "@/constants/meSidebarItems"; +import { useEffect, useState } from "react"; + +function Sidebar({ isOpen, toggleSidebar }) { + const router = useRouter(); + + return ( + + + + + Me Panel + + + + + + + {meSidebarItems.map((item, index) => ( + + + {meSidebarItems.subItems && item.subItems.length > 0 && ( + + {item.subItems.map((subItem, subIndex) => ( + + ))} + + )} + + ))} + + + ); +} + +const SidebarItem = ({ icon, text, href, target, isActive, subItems }) => { + const [isOpen, setIsOpen] = useState(false); + const color = isActive ? "#1468de" : "gray.100"; + const router = useRouter(); + + const handleToggle = () => { + setIsOpen(!isOpen); + }; + + return ( + <> + + + + + {subItems?.map((subItem, subIndex) => ( + + ))} + + + + ); +}; +export default Sidebar; diff --git a/LibraryTrackingApp/src/frontend/layouts/Me/guides/tourSteps.js b/LibraryTrackingApp/src/frontend/layouts/Me/guides/tourSteps.js new file mode 100644 index 0000000..23f53ea --- /dev/null +++ b/LibraryTrackingApp/src/frontend/layouts/Me/guides/tourSteps.js @@ -0,0 +1,6 @@ +export const tourSteps = [ + { + target: "#lang-switcher", + content: "Bu alandan dil değiştirebilirsiniz.", + }, + ]; \ No newline at end of file diff --git a/LibraryTrackingApp/src/frontend/layouts/Me/layout.jsx b/LibraryTrackingApp/src/frontend/layouts/Me/layout.jsx new file mode 100644 index 0000000..442c05d --- /dev/null +++ b/LibraryTrackingApp/src/frontend/layouts/Me/layout.jsx @@ -0,0 +1,43 @@ +import { Box, Flex } from "@chakra-ui/react"; +import Head from "next/head"; +import React, { useState } from "react"; + +import Navbar from "./components/Navbar"; +import Sidebar from "./components/Sidebar"; + +function Layout({ children }) { + const [isSidebarOpen, setIsSidebarOpen] = useState(false); + + const toggleSidebar = () => { + setIsSidebarOpen(!isSidebarOpen); + }; + return ( + + + + + Library Managament + + + + + + + + {children} + + + + ); +} + +export default Layout \ No newline at end of file diff --git a/LibraryTrackingApp/src/frontend/pages/_app.jsx b/LibraryTrackingApp/src/frontend/pages/_app.jsx index c7a23e6..fbf41b3 100644 --- a/LibraryTrackingApp/src/frontend/pages/_app.jsx +++ b/LibraryTrackingApp/src/frontend/pages/_app.jsx @@ -29,7 +29,7 @@ function MyApp({ Component, pageProps, session, statusCode }) { colorMode === "light" ? lightTheme.colors : darkTheme.colors ); - const placeholderRoutes = ["/login", "/register", "/docs", "/api-docs",'/401','/403','/404','/409','/500','/501','/502','/503']; + const placeholderRoutes = ["/privacy-policy", "/login", "/register", "/docs", "/api-docs", '/401', '/403', '/404', '/409', '/500', '/501', '/502', '/503']; const anonLayoutRoutes = ["/./"]; const adminLayoutRoutes = /^\/admin(?:\/|$)/; const appLayoutRoutes = /^\/app(?:\/|$)/; diff --git a/LibraryTrackingApp/src/frontend/pages/admin/Stats.jsx b/LibraryTrackingApp/src/frontend/pages/admin/Stats.jsx new file mode 100644 index 0000000..64e16c6 --- /dev/null +++ b/LibraryTrackingApp/src/frontend/pages/admin/Stats.jsx @@ -0,0 +1,146 @@ +import React from 'react'; +import { + HStack, + VStack, + Text, + useColorModeValue, + Flex, + Link, + Icon, + SimpleGrid, + Container, + Stack +} from '@chakra-ui/react'; + +import { motion } from 'framer-motion'; + + +import { BsArrowUpShort, BsArrowDownShort } from 'react-icons/bs'; +import { BsBook } from 'react-icons/bs'; +import { RiUserStarLine, RiUserSharedLine, RiBookLine } from 'react-icons/ri'; +import { BiCurrentLocation } from 'react-icons/bi'; + + +const data = [ + { + id: 1, + label: 'Toplam Kütüphane Sayısı', + score: 25, + icon: BsBook, + percentage: '10%' + }, + { + id: 2, + label: 'Toplam Ödünç Verilen Kitap Sayısı', + score: 150, + icon: RiBookLine, + percentage: '30%' + }, + { + id: 3, + label: 'Toplam Kayıtlı Kullanıcı Sayısı', + score: 500, + icon: RiUserStarLine, + percentage: '15%' + }, + { + id: 4, + label: 'Toplam Aktif Kullanıcı Sayısı', + score: 200, + icon: RiUserSharedLine, + percentage: '20%' + }, + { + id: 5, + label: 'En Popüler Konum', + score: 'New York, NY', + icon: BiCurrentLocation, + percentage: '25%' + } + +]; + +const StatData = () => { + return ( + + + {data.map((data, index) => ( + + ))} + + + ); +}; + +const Card = ({ data }) => { + return ( + + + + + + + + + {data.label} + + + + {data.score} + + + {Number(data.score) > 100 ? ( + + ) : ( + + )} + + {data.percentage} + + + + + + + + View All + + + + ); +}; + +export default StatData; \ No newline at end of file diff --git a/LibraryTrackingApp/src/frontend/pages/admin/index.jsx b/LibraryTrackingApp/src/frontend/pages/admin/index.jsx index 623137c..ec2818b 100644 --- a/LibraryTrackingApp/src/frontend/pages/admin/index.jsx +++ b/LibraryTrackingApp/src/frontend/pages/admin/index.jsx @@ -1,3 +1,4 @@ +import StatData from "@/layouts/Admin/components/Stats"; import { Box, Flex, Heading, VStack, Text, Badge, HStack } from "@chakra-ui/react"; import { FiUsers, FiBook, FiMapPin, FiClock } from "react-icons/fi"; @@ -12,36 +13,7 @@ const AdminIndexPage = () => { return ( - - - - - Yeni Kullanıcılar - {todayActivities.newUsers} - - - - - - Yeni Kitaplar - {todayActivities.newBooks} - - - - - - Yeni Konumlar - {todayActivities.newLocations} - - - - - - Yeni Çalışma Saatleri - {todayActivities.newWorkingHours} - - - + ); }; diff --git a/LibraryTrackingApp/src/frontend/pages/admin/profile.jsx b/LibraryTrackingApp/src/frontend/pages/admin/profile.jsx new file mode 100644 index 0000000..41eddbb --- /dev/null +++ b/LibraryTrackingApp/src/frontend/pages/admin/profile.jsx @@ -0,0 +1,44 @@ +import React from 'react' + +import { Box, Flex, Avatar, Text, Badge } from "@chakra-ui/react"; + +const user = { + name: "İlyas Bozdemir", + email: "user@example.com", + avatar: "https://avatars.githubusercontent.com/u/52322835?s=96&v=4", + role: "Admin", + status: "Aktif", + bio: "Merhaba, ben İlyas. Kitap okumayı çok seviyorum ve bu platformda yeni kitaplar keşfetmeyi umuyorum.", +}; + + +const ProfileCard = ({ user }) => { + return ( + + + + + {user.name} + {user.email} + + {user.role} + {user.status} + + + + + {user.bio} + + + ); +}; + +function MyProfilePage() { + return ( + <> + + + ) +} + +export default MyProfilePage \ No newline at end of file diff --git a/LibraryTrackingApp/src/frontend/pages/app/borrow/extension-requests.jsx b/LibraryTrackingApp/src/frontend/pages/app/borrow/extension-requests.jsx new file mode 100644 index 0000000..2b53d06 --- /dev/null +++ b/LibraryTrackingApp/src/frontend/pages/app/borrow/extension-requests.jsx @@ -0,0 +1,65 @@ +import React from 'react'; +import { Box, Heading, Text, Badge, HStack, Button } from "@chakra-ui/react"; + +const ExtensionRequestsPage = () => { + + // Backend ile bağlantı sağlandığında uzatma isteklerinin alındığı bir liste oluşturulacak + const extensionRequests = [ + { + id: 1, + bookTitle: "Sefiller", + userName: "John Doe", + requestDate: "2024-05-20", + status: "Beklemede", + }, + { + id: 2, + bookTitle: "Harry Potter and the Sorcerer's Stone", + userName: "Alice Smith", + requestDate: "2024-05-22", + status: "Uzatıldı", + }, + { + id: 3, + bookTitle: "Lord of the Rings", + userName: "Emily Brown", + requestDate: "2024-05-25", + status: "Reddedildi", + }, + ]; + + const handleAccept = (id) => { + console.log(`Uzatma isteği ID${id} onaylandı.`); + }; + + const handleReject = (id) => { + console.log(`Uzatma isteği ID${id} reddedildi.`); + }; + + return ( + + Uzatma İstekleri + Aşağıda kullanıcıların gönderdiği uzatma istekleri listelenmektedir. + {extensionRequests.map((request) => ( + + Kitap: {request.bookTitle} + Kullanıcı: {request.userName} + İstek Tarihi: {request.requestDate} + + + {request.status} + + {request.status === "Beklemede" && ( + <> + + + + )} + + + ))} + + ); +}; + +export default ExtensionRequestsPage; diff --git a/LibraryTrackingApp/src/frontend/pages/app/borrow/give.jsx b/LibraryTrackingApp/src/frontend/pages/app/borrow/give.jsx index 716ba2c..4f2c43d 100644 --- a/LibraryTrackingApp/src/frontend/pages/app/borrow/give.jsx +++ b/LibraryTrackingApp/src/frontend/pages/app/borrow/give.jsx @@ -1,9 +1,94 @@ -import React from 'react' +import { useState } from "react"; +import { + Button, + Container, + FormControl, + FormLabel, + Input, + Stack, + Text, + useToast, +} from "@chakra-ui/react"; + +const BorrowGivePage = () => { + const toast = useToast(); + + const [formData, setFormData] = useState({ + itemName: "", + itemDescription: "", + borrowerName: "", + borrowerEmail: "", + }); + + const handleChange = (e) => { + const { name, value } = e.target; + setFormData((prevData) => ({ + ...prevData, + [name]: value, + })); + }; + + const handleSubmit = (e) => { + e.preventDefault(); + console.log(formData); + toast({ + title: "Bilgiler gönderildi", + status: "success", + duration: 2000, + isClosable: true, + }); + }; -function GiveBorrowPage() { return ( -
GiveBorrowPage
- ) -} + + + + Eser Ödünç Verme + +
+ + Öğe Adı + + + + Eser Açıklaması + + + + Ödünç Alan Kişinin Adı + + + + Ödünç Alan Kişinin E-posta Adresi + + + +
+
+
+ ); +}; -export default GiveBorrowPage \ No newline at end of file +export default BorrowGivePage; diff --git a/LibraryTrackingApp/src/frontend/pages/app/borrow/index.jsx b/LibraryTrackingApp/src/frontend/pages/app/borrow/index.jsx index 8c0f3fb..d45475a 100644 --- a/LibraryTrackingApp/src/frontend/pages/app/borrow/index.jsx +++ b/LibraryTrackingApp/src/frontend/pages/app/borrow/index.jsx @@ -1,9 +1,80 @@ -import React from 'react' +import { useState } from "react"; +import { + Container, + Table, + Thead, + Tbody, + Tr, + Th, + Td, + Button, + useToast, +} from "@chakra-ui/react"; + +const BorrowListPage = () => { + const toast = useToast(); + + const [borrowedItems, setBorrowedItems] = useState([ + { + id: 1, + itemName: "Kitap 1", + borrowerName: "Ahmet Yılmaz", + borrowerEmail: "ahmet@example.com", + }, + { + id: 2, + itemName: "Kitap 2", + borrowerName: "Ayşe Kaya", + borrowerEmail: "ayse@example.com", + }, + { + id: 3, + itemName: "Kitap 3", + borrowerName: "Mehmet Demir", + borrowerEmail: "mehmet@example.com", + }, + ]); + + const handleReturn = (id) => { + setBorrowedItems((prevItems) => prevItems.filter((item) => item.id !== id)); + toast({ + title: "Öğe geri alındı", + status: "success", + duration: 2000, + isClosable: true, + }); + }; -function BorrowPage() { return ( -
BorrowPage
- ) -} + + + + + + + + + + + + + {borrowedItems.map((item) => ( + + + + + + + + ))} + +
IDÖğe AdıÖdünç Alan Kişinin AdıÖdünç Alan Kişinin E-posta Adresiİşlemler
{item.id}{item.itemName}{item.borrowerName}{item.borrowerEmail} + +
+
+ ); +}; -export default BorrowPage \ No newline at end of file +export default BorrowListPage; diff --git a/LibraryTrackingApp/src/frontend/pages/app/borrow/return.jsx b/LibraryTrackingApp/src/frontend/pages/app/borrow/return.jsx index a21eaa8..e73ce82 100644 --- a/LibraryTrackingApp/src/frontend/pages/app/borrow/return.jsx +++ b/LibraryTrackingApp/src/frontend/pages/app/borrow/return.jsx @@ -1,9 +1,82 @@ -import React from 'react' +import { useState } from "react"; +import { + Button, + Container, + FormControl, + FormLabel, + Input, + Stack, + Text, + useToast, +} from "@chakra-ui/react"; + +const BorrowReturnPage = () => { + const toast = useToast(); + + const [formData, setFormData] = useState({ + itemName: "", + borrowerName: "", + borrowerEmail: "", + }); + + const handleChange = (e) => { + const { name, value } = e.target; + setFormData((prevData) => ({ + ...prevData, + [name]: value, + })); + }; + + const handleSubmit = (e) => { + e.preventDefault(); + console.log(formData); + toast({ + title: "Bilgiler gönderildi", + status: "success", + duration: 2000, + isClosable: true, + }); + }; -function TakeBorrowPage() { return ( -
TakeBorrowPage
- ) -} + + + Öğe Geri Alma +
+ + Öğe Adı + + + + Ödünç Alan Kişinin Adı + + + + Ödünç Alan Kişinin E-posta Adresi + + + +
+
+
+ ); +}; -export default TakeBorrowPage \ No newline at end of file +export default BorrowReturnPage; diff --git a/LibraryTrackingApp/src/frontend/pages/app/library/index.jsx b/LibraryTrackingApp/src/frontend/pages/app/library/index.jsx index e279302..b214dc6 100644 --- a/LibraryTrackingApp/src/frontend/pages/app/library/index.jsx +++ b/LibraryTrackingApp/src/frontend/pages/app/library/index.jsx @@ -45,7 +45,7 @@ function LibraryIndexPage() { const fetchedLibrary = await LibraryService.getLibraries(); setLibraries(fetchedLibrary.data); } catch (error) { - console.error("Yazarları getirirken bir hata oluştu:", error); + console.error("Kütüphane şubelerini getirirken bir hata oluştu:", error); } }; @@ -86,7 +86,7 @@ function LibraryIndexPage() { <> - {`${libraries.length} yazar bulundu.`} + {`${libraries.length} kütüphane şubesi bulundu.`} diff --git a/LibraryTrackingApp/src/frontend/pages/app/profile.jsx b/LibraryTrackingApp/src/frontend/pages/app/profile.jsx new file mode 100644 index 0000000..1367134 --- /dev/null +++ b/LibraryTrackingApp/src/frontend/pages/app/profile.jsx @@ -0,0 +1,44 @@ +import React from 'react' + +import { Box, Flex, Avatar, Text, Badge } from "@chakra-ui/react"; + +const user = { + name: "İlyas Bozdemir", + email: "user@example.com", + avatar: "https://avatars.githubusercontent.com/u/52322835?s=96&v=4", + role: "Manager", + status: "Aktif", + bio: "Merhaba, ben İlyas. Kitap okumayı çok seviyorum ve bu platformda yeni kitaplar keşfetmeyi umuyorum.", +}; + + +const ProfileCard = ({ user }) => { + return ( + + + + + {user.name} + {user.email} + + {user.role} + {user.status} + + + + + {user.bio} + + + ); +}; + +function MyProfilePage() { + return ( + <> + + + ) +} + +export default MyProfilePage \ No newline at end of file diff --git a/LibraryTrackingApp/src/frontend/pages/app/settings/index.jsx b/LibraryTrackingApp/src/frontend/pages/app/settings/index.jsx index 0ad7d4d..a51b0c1 100644 --- a/LibraryTrackingApp/src/frontend/pages/app/settings/index.jsx +++ b/LibraryTrackingApp/src/frontend/pages/app/settings/index.jsx @@ -1,9 +1,755 @@ -import React from 'react' +import { useState } from "react"; +import { + Button, + Container, + Tab, + TabList, + TabPanel, + TabPanels, + Tabs, + FormControl, + FormLabel, + Input, + Stack, + Text, + useToast, + CheckboxGroup, + HStack, + Checkbox, + VStack, + Box, + Heading, + Switch, + ButtonGroup, +} from "@chakra-ui/react"; + +const LibraryProfileSettingsPage = () => { + const toast = useToast(); + const [formData, setFormData] = useState({ + name: "", + address: "", + phoneNumber: "", + description: "", + maxCheckoutLimit: 0, + minCheckoutDurationInDays: 0, + maxCheckoutDurationInDays: 0, + criticalLevelThreshold: 0, + notifyOnBookOrBlogComment: false, + topMembersReportLimit: 0, + topBooksReportLimit: 0, + }); + + const handleChange = (e) => { + const { name, value, type, checked } = e.target; + setFormData((prevData) => ({ + ...prevData, + [name]: type === "checkbox" ? checked : value, + })); + }; + + const handleSubmit = (e) => { + e.preventDefault(); + console.log(formData); + toast({ + title: "Ayarlar güncellendi", + status: "success", + duration: 2000, + isClosable: true, + }); + }; + + return ( + + + + + Genel Ayarlar + + + Kütüphane Bilgileri + + + Eser Ayarları + + + Üye Ayarları + + + Çalışan Ayarları + + + Gizlilik Ayarları + + + Sosyal Medya Ayarları + + + + + + + +
+ + + Kütüphane Adı + + + + Adres + + + + Telefon Numarası + + + + Açıklama + + + + + +
+ +
+ + + Azami Ödünç Alma Adedi + + + + Asgari Teslim Süresi (Gün) + + + + Azami Teslim Süresi (Gün) + + + + Eser Kritik Seviyesi + + + + Eser veya Blog Yorumu Bildirimi + + + + En Çok Okuyan Üyeler Raporu Limiti + + + + En Çok Okunan Kitaplar Raporu Limiti + + + + + +
+ + + + + Bildirim Ayarları + + + E-posta Bildirimleri + SMS Bildirimleri + + + + + + + + + + + + + + + + +
+
+
+ ); +}; + +const GeneralSettingsPage = () => { + const toast = useToast(); + const [formData, setFormData] = useState({ + enableDarkMode: false, + enableNotifications: true, + enableEmailNotifications: false, + enableAutoApproval: false, + }); + + const handleChange = (e) => { + const { name, checked } = e.target; + setFormData((prevData) => ({ + ...prevData, + [name]: checked, + })); + }; + + const handleSubmit = (e) => { + e.preventDefault(); + console.log(formData); + toast({ + title: "Ayarlar güncellendi", + status: "success", + duration: 2000, + isClosable: true, + }); + }; + + return ( + +
+ + + Karanlık Modu Etkinleştir + + + + Bildirimleri Etkinleştir + + + + E-posta Bildirimlerini Etkinleştir + + + + Otomatik Onayı Etkinleştir + + + + + +
+ ); +}; + +const EmployeeSettingsPage = () => { + const toast = useToast(); + const [formData, setFormData] = useState({ + enableNotifications: true, + enableEmailNotifications: false, + enableAutoApproval: false, + enablePerformanceMetrics: true, + enableEmployeeDirectory: true, + }); + + const handleChange = (e) => { + const { name, checked } = e.target; + setFormData((prevData) => ({ + ...prevData, + [name]: checked, + })); + }; + + const handleSubmit = (e) => { + e.preventDefault(); + console.log(formData); + toast({ + title: "Ayarlar güncellendi", + status: "success", + duration: 2000, + isClosable: true, + }); + }; + + return ( + + + Çalışan Ayarları + +
+ + + Bildirimleri Etkinleştir + + + + E-posta Bildirimlerini Etkinleştir + + + + Otomatik Onayı Etkinleştir + + + + Performans Metriklerini Görüntüle + + + + Çalışan Rehberini Görüntüle + + + + + +
+ ); +}; + +const PrivacySettingsPage = () => { + const toast = useToast(); + const [formData, setFormData] = useState({ + enableAnalytics: true, + enablePersonalizedAds: false, + enableLocationSharing: false, + }); + + const handleChange = (e) => { + const { name, checked } = e.target; + setFormData((prevData) => ({ + ...prevData, + [name]: checked, + })); + }; + + const handleSubmit = (e) => { + e.preventDefault(); + console.log(formData); + toast({ + title: "Ayarlar güncellendi", + status: "success", + duration: 2000, + isClosable: true, + }); + }; + + return ( + + + Gizlilik Ayarları + +
+ + + Analitik Verileri Etkinleştir + + + + + Kişiselleştirilmiş Reklamları Etkinleştir + + + + + Konum Paylaşımını Etkinleştir + + + + + +
+ ); +}; +const SocialMediaSettingsPage = () => { + const toast = useToast(); + + const [socialMediaLinks, setSocialMediaLinks] = useState({ + facebook: "", + twitter: "", + instagram: "", + tiktok: "", + }); + + const [pixelCodes, setPixelCodes] = useState({ + facebook: "", + linkedin: "", + googleTagManager: "", + googleAnalytics: "", + }); + + const [emailAccounts, setEmailAccounts] = useState([ + { + server: "", + port: "", + email: "", + password: "", + displayName: "", + }, + ]); + + const handleSocialMediaChange = (e, platform) => { + const { value } = e.target; + setSocialMediaLinks((prevLinks) => ({ + ...prevLinks, + [platform]: value, + })); + }; + + const handlePixelCodeChange = (e, platform) => { + const { value } = e.target; + setPixelCodes((prevCodes) => ({ + ...prevCodes, + [platform]: value, + })); + }; + + const handleEmailAccountChange = (e, index) => { + const { name, value } = e.target; + setEmailAccounts((prevAccounts) => { + const updatedAccounts = [...prevAccounts]; + updatedAccounts[index][name] = value; + return updatedAccounts; + }); + }; + + const addEmailAccount = () => { + setEmailAccounts((prevAccounts) => [ + ...prevAccounts, + { + server: "", + port: "", + email: "", + password: "", + displayName: "", + }, + ]); + }; + + const removeEmailAccount = (index) => { + setEmailAccounts((prevAccounts) => { + const updatedAccounts = [...prevAccounts]; + updatedAccounts.splice(index, 1); + return updatedAccounts; + }); + }; + + const handleSubmit = (e) => { + e.preventDefault(); + console.log("Social Media Links:", socialMediaLinks); + console.log("Pixel Codes:", pixelCodes); + console.log("Email Accounts:", emailAccounts); + toast({ + title: "Ayarlar güncellendi", + status: "success", + duration: 2000, + isClosable: true, + }); + }; -function SettingsPage() { return ( -
SettingsPage
- ) -} + + + + Sosyal Medya + Takip Kodları + E-posta Hesapları + + + +
+ + + Facebook Linki + handleSocialMediaChange(e, "facebook")} + /> + + + Twitter Linki + handleSocialMediaChange(e, "twitter")} + /> + + + Instagram Linki + handleSocialMediaChange(e, "instagram")} + /> + + + TikTok Linki + handleSocialMediaChange(e, "tiktok")} + /> + + + + +
+ +
+ + + Facebook Pixel Kodu + handlePixelCodeChange(e, "facebook")} + /> + + + LinkedIn Pixel Kodu + handlePixelCodeChange(e, "linkedin")} + /> + + + Google Tag Manager Kodu + + handlePixelCodeChange(e, "googleTagManager") + } + /> + + + Google Analytics Kodu + + handlePixelCodeChange(e, "googleAnalytics") + } + /> + + + + +
+ +
+ {emailAccounts.map((account, index) => ( + + + Sunucu + handleEmailAccountChange(e, index)} + /> + + + Port + handleEmailAccountChange(e, index)} + /> + + + E-posta + handleEmailAccountChange(e, index)} + /> + + + Şifre + handleEmailAccountChange(e, index)} + /> + + + Görüntülenen Ad + handleEmailAccountChange(e, index)} + /> + + + + ))} + + + + + +
+
+
+
+ ); +}; -export default SettingsPage \ No newline at end of file +export default LibraryProfileSettingsPage; diff --git a/LibraryTrackingApp/src/frontend/pages/index.jsx b/LibraryTrackingApp/src/frontend/pages/index.jsx index f9de449..2a292b1 100644 --- a/LibraryTrackingApp/src/frontend/pages/index.jsx +++ b/LibraryTrackingApp/src/frontend/pages/index.jsx @@ -8,7 +8,6 @@ import Testimonials from "@/layouts/Anon/components/Testimonials"; import LibraryPricing from "@/layouts/Anon/components/LibraryPricing"; import OverviewSection from "@/layouts/Anon/components/OverviewSection"; - function IndexPage() { return ( <> @@ -25,12 +24,13 @@ const LandingPage = () => { return ( - - - + + + - - + + + ); diff --git a/LibraryTrackingApp/src/frontend/pages/me/borrow.jsx b/LibraryTrackingApp/src/frontend/pages/me/borrow.jsx new file mode 100644 index 0000000..f5fca24 --- /dev/null +++ b/LibraryTrackingApp/src/frontend/pages/me/borrow.jsx @@ -0,0 +1,56 @@ +import React, { useState } from 'react'; +import { Box, Heading, Text, Button, Stack, Divider } from "@chakra-ui/react"; + +// Ödünç alınan kitapların örnek veri yapısı +const borrowedBooks = [ + { + id: 1, + title: "Harry Potter and the Sorcerer's Stone", + author: "J.K. Rowling", + dueDate: "2024-06-15", + status: "Bekliyor" + }, + { + id: 2, + title: "To Kill a Mockingbird", + author: "Harper Lee", + dueDate: "2024-06-20", + status: "Uzatıldı" + }, + // Diğer ödünç alınan kitaplar buraya eklenebilir +]; + +const BorrowPage = () => { + const [extendedBooks, setExtendedBooks] = useState([]); + + // Kitap için uzatma isteği gönderme işlevi + const handleExtend = (id) => { + console.log(`Kitap ID${id} için takip süresi uzatma isteği gönderildi.`); + // Uzatılan kitabı güncelle + const updatedBooks = borrowedBooks.map(book => + book.id === id ? { ...book, status: "Uzatma İsteği Gönderildi" } : book + ); + setExtendedBooks(updatedBooks); + }; + + return ( + + Ödünç Aldıklarım + + {borrowedBooks.map((book) => ( + + {book.title} + Yazar: {book.author} + Son Teslim Tarihi: {book.dueDate} + Status: {book.status} + {book.status === "Bekliyor" && ( + + )} + + ))} + + + ); +}; + +export default BorrowPage; diff --git a/LibraryTrackingApp/src/frontend/pages/me/index.jsx b/LibraryTrackingApp/src/frontend/pages/me/index.jsx new file mode 100644 index 0000000..732ec8b --- /dev/null +++ b/LibraryTrackingApp/src/frontend/pages/me/index.jsx @@ -0,0 +1,9 @@ +import React from 'react' + +function IndexPage() { + return ( +
IndexPage
+ ) +} + +export default IndexPage \ No newline at end of file diff --git a/LibraryTrackingApp/src/frontend/pages/me/library.jsx b/LibraryTrackingApp/src/frontend/pages/me/library.jsx new file mode 100644 index 0000000..9bbe793 --- /dev/null +++ b/LibraryTrackingApp/src/frontend/pages/me/library.jsx @@ -0,0 +1,78 @@ +import React, { useState } from 'react' +import { Box, Heading, Text, Button, Stack, Divider, Input } from "@chakra-ui/react"; + +const publicLibraries = [ + { + name: "Merkez Kütüphane", + location: "İstanbul", + availableBooks: [ + { title: "Harry Potter and the Sorcerer's Stone", type: "Basılı Kitap" }, + { title: "1984", type: "E-Kitap" }, + { title: "The Great Gatsby", type: "Sesli Kitap" }, + // Diğer kitaplar buraya eklenebilir + ] + }, + { + name: "Şehir Kütüphanesi", + location: "Ankara", + availableBooks: [ + { title: "To Kill a Mockingbird", type: "Basılı Kitap" }, + { title: "Pride and Prejudice", type: "E-Kitap" }, + // Diğer kitaplar buraya eklenebilir + ] + }, + // Diğer kütüphaneler buraya eklenebilir +]; + + +const LibrarySearch = ({ libraries }) => { + const [searchTerm, setSearchTerm] = useState(''); + + const filteredLibraries = libraries.filter(library => + library.name.toLowerCase().includes(searchTerm.toLowerCase()) + ); + + return ( + + setSearchTerm(e.target.value)} + mb={4} + /> + {filteredLibraries.map((library, index) => ( + + {library.name} + Konum: {library.location} + + {library.availableBooks.map((book, index) => ( + + {book.title} + Tür: {book.type} + + ))} + + + + ))} + + ); +}; + + +const PublicLibraries = () => { + return ( + + ); +}; + + +function MeLibraryPage() { + return ( + <> + + + ) +} + +export default MeLibraryPage \ No newline at end of file diff --git a/LibraryTrackingApp/src/frontend/pages/me/past-books.jsx b/LibraryTrackingApp/src/frontend/pages/me/past-books.jsx new file mode 100644 index 0000000..4dc6ddc --- /dev/null +++ b/LibraryTrackingApp/src/frontend/pages/me/past-books.jsx @@ -0,0 +1,40 @@ +import React from 'react' +import { Box, Heading, Text, Stack, Divider } from "@chakra-ui/react"; + +const pastBooks = [ + { + id: 1, + title: "Harry Potter and the Sorcerer's Stone", + author: "J.K. Rowling", + returnDate: "2024-06-15", + }, + { + id: 2, + title: "To Kill a Mockingbird", + author: "Harper Lee", + returnDate: "2024-06-20", + }, + // Diğer önceki kitaplar buraya eklenebilir +]; + +function PastBooksPage() { + return ( + <> + + Geçmiş Kitaplarım + + {pastBooks.map((book) => ( + + {book.title} + Yazar: {book.author} + İade Tarihi: {book.returnDate} + + + ))} + + + + ) +} + +export default PastBooksPage \ No newline at end of file diff --git a/LibraryTrackingApp/src/frontend/pages/me/profile.jsx b/LibraryTrackingApp/src/frontend/pages/me/profile.jsx new file mode 100644 index 0000000..ddb5d91 --- /dev/null +++ b/LibraryTrackingApp/src/frontend/pages/me/profile.jsx @@ -0,0 +1,44 @@ +import React from 'react' + +import { Box, Flex, Avatar, Text, Badge } from "@chakra-ui/react"; + +const user = { + name: "İlyas Bozdemir", + email: "user@example.com", + avatar: "https://avatars.githubusercontent.com/u/52322835?s=96&v=4", + role: "Üye", + status: "Aktif", + bio: "Merhaba, ben İlyas. Kitap okumayı çok seviyorum ve bu platformda yeni kitaplar keşfetmeyi umuyorum.", +}; + + +const ProfileCard = ({ user }) => { + return ( + + + + + {user.name} + {user.email} + + {user.role} + {user.status} + + + + + {user.bio} + + + ); +}; + +function MyProfilePage() { + return ( + <> + + + ) +} + +export default MyProfilePage \ No newline at end of file diff --git a/LibraryTrackingApp/src/frontend/pages/me/social.jsx b/LibraryTrackingApp/src/frontend/pages/me/social.jsx new file mode 100644 index 0000000..f2d5ce3 --- /dev/null +++ b/LibraryTrackingApp/src/frontend/pages/me/social.jsx @@ -0,0 +1,24 @@ +import { Box, Button, Heading, Text, VStack } from "@chakra-ui/react"; +import { FaComments, FaUsers } from "react-icons/fa"; + +const SocialInteractions = () => { + return ( + + Sosyal Etkileşimler + + + Forum ve Tartışma + Çeşitli konular hakkında tartışma başlatın veya katılın. + + + + Okuma Grupları + Belirli bir kitabı birlikte okumak isteyen diğer üyelerle bir araya gelin. + + + + + ); +}; + +export default SocialInteractions; diff --git a/LibraryTrackingApp/src/frontend/pages/me/support.jsx b/LibraryTrackingApp/src/frontend/pages/me/support.jsx new file mode 100644 index 0000000..4151ee5 --- /dev/null +++ b/LibraryTrackingApp/src/frontend/pages/me/support.jsx @@ -0,0 +1,84 @@ +import { useState } from "react"; +import { + Box, + Heading, + VStack, + Text, + Input, + Button, + Divider, +} from "@chakra-ui/react"; + +const SupportPage = () => { + const [title, setTitle] = useState(""); + const [message, setMessage] = useState(""); + const [supportRequests, setSupportRequests] = useState([ + { + id: 1, + title: "Kütüphane Açılış Saati Değişikliği", + message: + "Kütüphane açılış saati hafta içi saat 10:00'dan 08:00'e alındı. Bu değişiklik hakkında bilgi almak istiyorum.", + status: "Açık", + }, + { + id: 2, + title: "Kitap İade Süresi Uzatma", + message: "Kitap iade süresini uzatmak istiyorum. Acaba mümkün mü?", + status: "Açık", + }, + ]); + + const handleSubmit = () => { + console.log("Destek talebi gönderildi:", { title, message }); + if (title && message) { + setSupportRequests([ + ...supportRequests, + { id: Date.now(), title, message }, + ]); + setTitle(""); + setMessage(""); + } + }; + + return ( + + Destek Talebi Oluştur + + setTitle(e.target.value)} + /> + setMessage(e.target.value)} + /> + + + + + + Önceki Talepler + + {supportRequests.map((request) => ( + + {request.title} + {request.message} + + ))} + + + ); +}; + +export default SupportPage; diff --git a/LibraryTrackingApp/src/frontend/pages/privacy-policy.jsx b/LibraryTrackingApp/src/frontend/pages/privacy-policy.jsx new file mode 100644 index 0000000..a50aaf9 --- /dev/null +++ b/LibraryTrackingApp/src/frontend/pages/privacy-policy.jsx @@ -0,0 +1,74 @@ +import { site } from "@/constants/site"; +import { NextSeo } from "next-seo"; +import React from "react"; +import { Container, Heading, Text, Link } from "@chakra-ui/react"; + +const PrivacyPolicyPage = () => { + return ( + <> + + + + + Gizlilik Politikası + + + Bu gizlilik politikası, [şirket adı] tarafından işletilen [web sitesi + adı] web sitesi ve [mobil uygulama adı] mobil uygulaması ('Servis') + kullanıcılarının gizliliğini ilgilendirir. Servisimizi + kullandığınızda, bu politikayı kabul etmiş olursunuz ve kişisel + verilerinizi bu politikanın açıkladığı şekilde kullanmamıza izin + vermiş olursunuz. + + + Toplanan Veriler ve Kullanımı + + + Servisi kullanırken, belirli kişisel olarak tanımlanabilir bilgileri + toplayabiliriz, bu bilgileri toplama ve kullanma hakkında daha fazla + bilgi için lütfen Gizlilik Politikamızı{" "} + ziyaret edin. + + + Çerezler + + + Çerezler, bir web sitesini veya hizmeti kullanımınız sırasında + tarayıcınıza yerleştirilen küçük bir veri parçasıdır. Daha fazla bilgi + için lütfen Çerez Politikamızı ziyaret + edin. + + + Üçüncü Taraf Bağlantıları + + + Servisimizde üçüncü taraf web sitelerine bağlantılar bulunabilir. Bu + bağlantıları kullanırken dikkatli olmanızı öneririz. Herhangi bir + üçüncü taraf web sitesinin gizlilik politikasını kontrol etmeli ve + kabul etmelisiniz. + + + Değişiklikler + + + Gizlilik politikamızı zaman zaman güncelleyebiliriz. Bu sayfayı + düzenli olarak ziyaret ederek güncellemeler hakkında bilgi + edinebilirsiniz. + + + + ); +}; + +export default PrivacyPolicyPage;
Id