parent
3a5b4b4076
commit
eef58a77b5
@ -0,0 +1,68 @@
|
|||||||
|
# Simple Library Management
|
||||||
|
|
||||||
|
A simple library management project that is easy to use and helps the learner to understand the basic concept of JS.
|
||||||
|
|
||||||
|
Visit Website: [Online Library](https://delightful-coast-00b51a700.1.azurestaticapps.net/)
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<img src="https://user-images.githubusercontent.com/52650290/167833386-ec9951a2-fe1f-4c9b-88c9-2b7fe1ef6009.png">
|
||||||
|
<img src="https://user-images.githubusercontent.com/52650290/167833479-370a3485-2286-4eed-a7a8-57bb2c5411ed.png">
|
||||||
|
</p>
|
||||||
|
|
||||||
|
## Functionalities :-
|
||||||
|
Input book name, author and book type to add the book. If book name is missing it will shown you error. As I used LocalStorage if you refresh or close the tab your books will not disappear. You can clear book shelf just by clicking on **clear shelf**. You can also search book by book name, author and type.
|
||||||
|
|
||||||
|
## Adding
|
||||||
|
|
||||||
|
### Adding Book in Shelf:
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<img src="https://user-images.githubusercontent.com/52650290/167833690-b5ac19a3-b49b-424a-b258-bae2bcb9dcb9.png">
|
||||||
|
<img src="https://user-images.githubusercontent.com/52650290/167833986-826f5ea1-f403-4cc8-9200-2718c15f208f.png">
|
||||||
|
</p>
|
||||||
|
|
||||||
|
### Adding Book Without Entering Book Name:
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<img src="https://user-images.githubusercontent.com/52650290/167834120-d1dae43f-ab4c-46da-9f8f-fb688eed67b2.png">
|
||||||
|
</p>
|
||||||
|
|
||||||
|
### Clearing Book Shelf:
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<img src="https://user-images.githubusercontent.com/52650290/167834210-e4dfd335-d2fd-438b-904a-b1e3cb1625a2.png">
|
||||||
|
</p>
|
||||||
|
|
||||||
|
## Searching
|
||||||
|
|
||||||
|
### Search Book by type:
|
||||||
|
<p align="center">
|
||||||
|
<img src="https://user-images.githubusercontent.com/52650290/173614799-51fe4d94-53e5-43a1-b6f7-e63298e9e76b.png">
|
||||||
|
</p>
|
||||||
|
|
||||||
|
### Search Book by author:
|
||||||
|
<p align="center">
|
||||||
|
<img src="https://user-images.githubusercontent.com/52650290/173615250-765e14dc-9a81-4692-bd3e-c6b842cd6514.png">
|
||||||
|
</p>
|
||||||
|
|
||||||
|
### Search Book by name:
|
||||||
|
<p align="center">
|
||||||
|
<img src="https://user-images.githubusercontent.com/52650290/173616186-f208a089-c13a-4ec1-b234-4a59e6ff7d75.png">
|
||||||
|
</p>
|
||||||
|
|
||||||
|
|
||||||
|
## Built with :-
|
||||||
|
- HTML
|
||||||
|
- CSS
|
||||||
|
- Bootstrap
|
||||||
|
- JavaScript
|
||||||
|
|
||||||
|
## How to use :-
|
||||||
|
- Clone the repository
|
||||||
|
- Go to the directory
|
||||||
|
- Run index.html file
|
||||||
|
- Enter book name, author and type of book
|
||||||
|
- Press add book
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,8 @@
|
|||||||
|
# Simple Library Management
|
||||||
|
|
||||||
|
## How to use :-
|
||||||
|
- Clone the repository
|
||||||
|
- Go to the directory
|
||||||
|
- Run index.html file
|
||||||
|
- Enter book name, author and type of book
|
||||||
|
- Press add book
|
@ -0,0 +1,158 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>Online Library</title>
|
||||||
|
|
||||||
|
<!--Bootstrap CSS-->
|
||||||
|
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"
|
||||||
|
integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
|
||||||
|
|
||||||
|
<!--FontAwesome-->
|
||||||
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
|
||||||
|
|
||||||
|
<style>
|
||||||
|
#clear {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
#libraryForm{
|
||||||
|
border: .5px dashed black;
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
#table{
|
||||||
|
border: .5px dashed black;
|
||||||
|
padding: 10px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<!--NavBar-->
|
||||||
|
<nav id="navbar" class="navbar navbar-expand-lg navbar-dark fixed-top" style="background-color: #7952b3; opacity: .8;">
|
||||||
|
<a class="navbar-brand mb-1" href="#" style="font-size: 24px;">Online Library</a>
|
||||||
|
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarTogglerDemo02"
|
||||||
|
aria-controls="navbarTogglerDemo02" aria-expanded="false" aria-label="Toggle navigation">
|
||||||
|
<span class="navbar-toggler-icon"></span>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<div class="collapse navbar-collapse" id="navbarTogglerDemo02">
|
||||||
|
<ul class="navbar-nav mr-auto mt-2 mt-lg-0">
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
<form class="form-inline my-2 my-lg-0">
|
||||||
|
<input class="form-control mr-sm-2" id="searchText" type="search" style="border-radius: 45px;" placeholder="Search">
|
||||||
|
<button class="btn btn-dark my-2 my-sm-0 px-3" type="submit" style="border-radius: 45px;">Search</button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<!--Message shown on successful adding of book-->
|
||||||
|
<div class="fixed-top" id="message"></div>
|
||||||
|
|
||||||
|
|
||||||
|
<!--Adding books-->
|
||||||
|
<div class="container pt-4 mt-5 my-3">
|
||||||
|
<h1 class="text-center display-4 font-weight-bold">Welcome To Online Library</h1>
|
||||||
|
<hr>
|
||||||
|
<form id="libraryForm">
|
||||||
|
<div class="form-group row">
|
||||||
|
<label for="bookName" class="col-sm-2 col-form-label">Name</label>
|
||||||
|
<div class="col-sm-10">
|
||||||
|
<input type="text" class="form-control" id="bookName" placeholder="Book Name">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group row">
|
||||||
|
<label for="Author" class="col-sm-2 col-form-label">Author</label>
|
||||||
|
<div class="col-sm-10">
|
||||||
|
<input type="text" class="form-control" id="author" placeholder="Author">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<fieldset class="form-group">
|
||||||
|
<div class="row">
|
||||||
|
<legend class="col-form-label col-sm-2 pt-0">Type</legend>
|
||||||
|
<div class="col-sm-10">
|
||||||
|
<div class="form-check">
|
||||||
|
<input class="form-check-input" type="radio" name="type" id="fiction" value="fiction">
|
||||||
|
<label class="form-check-label" for="fiction">
|
||||||
|
Fiction
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div class="form-check">
|
||||||
|
<input class="form-check-input" type="radio" name="type" id="programming"
|
||||||
|
value="programming">
|
||||||
|
<label class="form-check-label" for="programming">
|
||||||
|
Computer Programming
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div class="form-check">
|
||||||
|
<input class="form-check-input" type="radio" name="type" id="science" value="science">
|
||||||
|
<label class="form-check-label" for="science">
|
||||||
|
Science
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div class="form-check">
|
||||||
|
<input class="form-check-input" type="radio" name="type" id="other" value="other">
|
||||||
|
<label class="form-check-label" for="other">
|
||||||
|
Other
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</fieldset>
|
||||||
|
<div class="form-group row">
|
||||||
|
<div class="col-lg-12 col-sm-10">
|
||||||
|
<button type="submit" class="btn text-light btn-large btn-block" style="background-color: #7f5bb4f3;">Add Book</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
<br>
|
||||||
|
|
||||||
|
<!--Display of books-->
|
||||||
|
<div id="table mt-0">
|
||||||
|
|
||||||
|
<h1>Your Book Shelf</h1>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<div id="table" class="mb-5">
|
||||||
|
<h5 class="float-right" id="books"></h5>
|
||||||
|
|
||||||
|
<table class="table table-striped table-bordered">
|
||||||
|
<thead class="text-center text-light" style="background-color: #7952b3;">
|
||||||
|
<tr>
|
||||||
|
<th scope="col">No.</th>
|
||||||
|
<th scope="col">Name</th>
|
||||||
|
<th scope="col">Author</th>
|
||||||
|
<th scope="col">Type</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody class="text-center" id="tableBody"> </tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
|
||||||
|
<!--Display Msg when table is empty-->
|
||||||
|
<h5 id="emptyMsg" class="mb-5"></h5>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button type="button" id="clear" class="btn px-3 mb-2 btn-danger float-right">Clear Shelf</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!--JS file-->
|
||||||
|
<script src="script.js"></script>
|
||||||
|
|
||||||
|
<!--Required Bootrap Jquery first,Popper JS , Bootstrap JS-->
|
||||||
|
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"
|
||||||
|
integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo"
|
||||||
|
crossorigin="anonymous"></script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"
|
||||||
|
integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1"
|
||||||
|
crossorigin="anonymous"></script>
|
||||||
|
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"
|
||||||
|
integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM"
|
||||||
|
crossorigin="anonymous"></script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
@ -0,0 +1,262 @@
|
|||||||
|
displayBooks(); //As the browser open it show all the stored books
|
||||||
|
|
||||||
|
let libraryForm = document.getElementById('libraryForm');
|
||||||
|
|
||||||
|
// Adding Books
|
||||||
|
libraryForm.addEventListener('submit', (e) => {
|
||||||
|
|
||||||
|
e.preventDefault();
|
||||||
|
|
||||||
|
let name = document.getElementById("bookName").value;
|
||||||
|
let author = document.getElementById("author").value;
|
||||||
|
|
||||||
|
let fiction = document.getElementById('fiction');
|
||||||
|
let programming = document.getElementById('programming');
|
||||||
|
let science = document.getElementById('science');
|
||||||
|
let others = document.getElementById('other');
|
||||||
|
|
||||||
|
let type;
|
||||||
|
|
||||||
|
|
||||||
|
if (fiction.checked) {
|
||||||
|
type = fiction.value;
|
||||||
|
programming.unchecked;
|
||||||
|
science.unchecked;
|
||||||
|
}
|
||||||
|
else if (programming.checked) {
|
||||||
|
type = programming.value;
|
||||||
|
science.unchecked;
|
||||||
|
fiction.unchecked;
|
||||||
|
}
|
||||||
|
else if (science.checked) {
|
||||||
|
type = science.value;
|
||||||
|
fiction.unchecked;
|
||||||
|
programming.unchecked;
|
||||||
|
}
|
||||||
|
else if (others.checked) {
|
||||||
|
type = others.value;
|
||||||
|
fiction.unchecked;
|
||||||
|
programming.unchecked;
|
||||||
|
science.unchecked;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
let shelf = localStorage.getItem('shelfOfBooks');
|
||||||
|
let objOfBook; //object which stores books
|
||||||
|
|
||||||
|
if (shelf == null) {
|
||||||
|
objOfBook = [];
|
||||||
|
}
|
||||||
|
else { //We might have multiple books
|
||||||
|
objOfBook = JSON.parse(shelf); //By using JSON we convert it into Object
|
||||||
|
}
|
||||||
|
|
||||||
|
if (name == "") {
|
||||||
|
errorMessage();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
let myObj = {
|
||||||
|
book: name,
|
||||||
|
bookauthor: author,
|
||||||
|
bookType: type
|
||||||
|
}
|
||||||
|
objOfBook.push(myObj);
|
||||||
|
addMessage();
|
||||||
|
}
|
||||||
|
|
||||||
|
localStorage.setItem('shelfOfBooks', JSON.stringify(objOfBook));
|
||||||
|
|
||||||
|
name = "";
|
||||||
|
author = "";
|
||||||
|
type.value = "";
|
||||||
|
|
||||||
|
UpdateBook();
|
||||||
|
displayBooks();
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
//Function to show elements(books) from LocalStorage
|
||||||
|
function displayBooks() {
|
||||||
|
let books = localStorage.getItem('shelfOfBooks');
|
||||||
|
let clearBtn = document.getElementById("clear");
|
||||||
|
let objOfBook;
|
||||||
|
|
||||||
|
if (books == null) {
|
||||||
|
objOfBook = [];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
objOfBook = JSON.parse(books);
|
||||||
|
}
|
||||||
|
let html="";
|
||||||
|
let index = 1;
|
||||||
|
|
||||||
|
objOfBook.forEach( (books)=> { //index is the length of the array
|
||||||
|
|
||||||
|
html += `
|
||||||
|
<tr class="rows">
|
||||||
|
<th scope="row">${index++}</th>
|
||||||
|
<td class="name">${books.book}</td>
|
||||||
|
<td class="author">${books.bookauthor}</td>
|
||||||
|
<td class="type">${books.bookType}</td>
|
||||||
|
</tr>
|
||||||
|
`;
|
||||||
|
});
|
||||||
|
|
||||||
|
let table = document.getElementById('tableBody');
|
||||||
|
let noDisplayMsg = document.getElementById('emptyMsg');
|
||||||
|
|
||||||
|
if (objOfBook.length != 0) {
|
||||||
|
table.innerHTML = html;
|
||||||
|
clearBtn.style.display = "block";
|
||||||
|
noDisplayMsg.innerHTML = "";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
noDisplayMsg.innerHTML = `Nothing to display! Use "Add book" above to add books`;
|
||||||
|
}
|
||||||
|
|
||||||
|
let libraryForm = document.getElementById('libraryForm');
|
||||||
|
libraryForm.reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//Show adding message
|
||||||
|
function addMessage() {
|
||||||
|
let message = document.getElementById('message');
|
||||||
|
let navbar = document.getElementById('navbar');
|
||||||
|
|
||||||
|
navbar.style.display = "none";
|
||||||
|
|
||||||
|
message.innerHTML = `<div class="alert alert-success alert-dismissible fade show" role="alert">
|
||||||
|
<strong>Message:</strong> Your book has been successfully added.
|
||||||
|
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
|
||||||
|
<span aria-hidden="true">×</span>
|
||||||
|
</button>
|
||||||
|
</div>`
|
||||||
|
|
||||||
|
setTimeout(() => {
|
||||||
|
navbar.style.display = "flex";
|
||||||
|
message.innerHTML = ``;
|
||||||
|
}, 2000);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Show error message
|
||||||
|
function errorMessage() {
|
||||||
|
let message = document.getElementById('message');
|
||||||
|
let navbar = document.getElementById('navbar');
|
||||||
|
|
||||||
|
navbar.style.display = "none";
|
||||||
|
message.innerHTML = `<div class="alert alert-danger alert-dismissible fade show" role="alert">
|
||||||
|
<strong>Error:</strong> To add book, add name of book.
|
||||||
|
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
|
||||||
|
<span aria-hidden="true">×</span>
|
||||||
|
</button>
|
||||||
|
</div>`
|
||||||
|
|
||||||
|
setTimeout(() => {
|
||||||
|
navbar.style.display = "flex";
|
||||||
|
message.innerHTML = ``;
|
||||||
|
}, 2000);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Show clear message
|
||||||
|
function clearMessage() {
|
||||||
|
let message = document.getElementById('message');
|
||||||
|
let navbar = document.getElementById('navbar');
|
||||||
|
|
||||||
|
navbar.style.display = "none";
|
||||||
|
|
||||||
|
message.innerHTML = `<div class="alert alert-info alert-dismissible fade show" role="alert">
|
||||||
|
<strong>Message:</strong> Your book shelf is clear! To add more books refresh the browser.
|
||||||
|
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
|
||||||
|
<span aria-hidden="true">×</span>
|
||||||
|
</button>
|
||||||
|
</div>`
|
||||||
|
|
||||||
|
setTimeout(() => {
|
||||||
|
navbar.style.display = "flex";
|
||||||
|
message.innerHTML = ``;
|
||||||
|
}, 2000);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Clearning shelf (Deleting all books)
|
||||||
|
let clearBtn = document.getElementById("clear");
|
||||||
|
|
||||||
|
clearBtn.addEventListener('click', ()=> {
|
||||||
|
localStorage.removeItem("shelfOfBooks");
|
||||||
|
localStorage.removeItem("getBookNumber");
|
||||||
|
|
||||||
|
document.getElementById("books").innerHTML = "No. of Books: " + 0;
|
||||||
|
let table = document.getElementById('tableBody');
|
||||||
|
table.style.display = "none"
|
||||||
|
clearBtn.style.display = "none";
|
||||||
|
|
||||||
|
let noDisplayMsg = document.getElementById('emptyMsg');
|
||||||
|
noDisplayMsg.innerHTML = `Nothing to display! Use "Add book" above to add books`;
|
||||||
|
|
||||||
|
clearMessage();
|
||||||
|
})
|
||||||
|
|
||||||
|
//Searching book by bookname, author and type
|
||||||
|
let searchNote = document.getElementById('searchText');
|
||||||
|
searchNote.addEventListener('input', function () {
|
||||||
|
|
||||||
|
let search = searchNote.value.toLowerCase();
|
||||||
|
|
||||||
|
let tableRows = document.getElementsByClassName('rows');
|
||||||
|
|
||||||
|
Array.from(tableRows).forEach(function (element) {
|
||||||
|
|
||||||
|
let bookName = element.getElementsByClassName("name")[0].innerText.toLowerCase();
|
||||||
|
let authorName = element.getElementsByClassName("author")[0].innerText.toLowerCase();
|
||||||
|
let type = element.getElementsByClassName("type")[0].innerText.toLowerCase();
|
||||||
|
|
||||||
|
if (bookName.includes(search)) {
|
||||||
|
element.style.display = "table-row";
|
||||||
|
}
|
||||||
|
else if(authorName.includes(search)){
|
||||||
|
element.style.display = "table-row";
|
||||||
|
}
|
||||||
|
else if(type.includes(search)){
|
||||||
|
element.style.display = "table-row";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
element.style.display = "none";
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
// Update Number of books in Shelf section
|
||||||
|
function UpdateBook() {
|
||||||
|
let bookNumber = localStorage.getItem("getBookNumber");
|
||||||
|
bookNumber = parseInt(bookNumber);
|
||||||
|
|
||||||
|
if (bookNumber) {
|
||||||
|
localStorage.setItem("getBookNumber", bookNumber + 1);
|
||||||
|
document.getElementById("books").innerHTML = "No. of Books: " + (bookNumber + 1);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
localStorage.setItem("getBookNumber", 1);
|
||||||
|
document.getElementById("books").innerHTML ="No. of Books: 0" + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//Show Number of books in Shelf section
|
||||||
|
function showNumberOfBooks() {
|
||||||
|
let getBookNumber = localStorage.getItem("getBookNumber");
|
||||||
|
getBookNumber = parseInt(getBookNumber);
|
||||||
|
|
||||||
|
|
||||||
|
if (getBookNumber) {
|
||||||
|
document.getElementById("books").innerHTML = "No. of Books: " + getBookNumber;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
document.getElementById("books").innerHTML = "No. of Books: " + 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
showNumberOfBooks();
|
Loading…
Reference in new issue