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