11let myLibrary = [ ] ;
22
3- window . addEventListener ( "load" , function ( e ) {
4- populateStorage ( ) ;
5- render ( ) ;
3+ window . addEventListener ( "load" , function ( ) {
4+ populateStorage ( ) ;
5+ render ( ) ;
66} ) ;
77
88function populateStorage ( ) {
9- if ( myLibrary . length == 0 ) {
10- let book1 = new Book ( "Robison Crusoe" , "Daniel Defoe" , "252" , true ) ;
11- let book2 = new Book (
12- "The Old Man and the Sea" ,
13- "Ernest Hemingway" ,
14- "127" ,
15- true
16- ) ;
17- myLibrary . push ( book1 ) ;
18- myLibrary . push ( book2 ) ;
19- render ( ) ;
20- }
9+ if ( myLibrary . length = == 0 ) {
10+ let book1 = new Book ( "Robison Crusoe" , "Daniel Defoe" , "252" , true ) ;
11+ let book2 = new Book (
12+ "The Old Man and the Sea" ,
13+ "Ernest Hemingway" ,
14+ "127" ,
15+ true
16+ ) ;
17+ myLibrary . push ( book1 ) ;
18+ myLibrary . push ( book2 ) ;
19+ render ( ) ;
20+ }
2121}
2222
2323const title = document . getElementById ( "title" ) ;
2424const author = document . getElementById ( "author" ) ;
2525const pages = document . getElementById ( "pages" ) ;
2626const check = document . getElementById ( "check" ) ;
2727
28- //check the right input from forms and if its ok -> add the new book (object in array)
29- //via Book function and start render function
30- function submit ( ) {
31- if (
32- title . value == null ||
33- title . value == "" ||
34- pages . value == null ||
35- pages . value == ""
36- ) {
37- alert ( "Please fill all fields!" ) ;
38- return false ;
39- } else {
40- let book = new Book ( title . value , title . value , pages . value , check . checked ) ;
41- library . push ( book ) ;
28+ // Check the input from forms and, if valid, add the new book (object in array)
29+ // via Book constructor and start render function
30+ function addBook ( ) {
31+ if (
32+ title . value == null ||
33+ title . value === "" ||
34+ pages . value == null ||
35+ pages . value === ""
36+ ) {
37+ showError ( "Please fill all fields!" ) ;
38+ return false ;
39+ }
40+
41+ if ( myLibrary . some ( b => b . title === title . value && b . author === author . value ) ) {
42+ showError ( "This book already exists!" ) ;
43+ return ;
44+ }
45+
46+ if ( ! isNaN ( title . value . trim ( ) ) || ! isNaN ( author . value . trim ( ) ) ) {
47+ showError ( "Title and Author must be text!" ) ;
48+ return ;
49+ }
50+
51+ let book = new Book ( title . value , author . value , Number ( pages . value ) , check . checked ) ;
52+ myLibrary . push ( book ) ;
4253 render ( ) ;
43- }
4454}
4555
46- function Book ( title , author , pages , check ) {
47- this . title = title ;
48- this . author = author ;
49- this . pages = pages ;
50- this . check = check ;
56+ // Clear any previous error messages
57+ document . getElementById ( "errorMessage" ) . style . display = "none" ;
58+
59+ function Book ( title , author , pages , read ) {
60+ this . title = title ;
61+ this . author = author ;
62+ this . pages = pages ;
63+ this . read = read ;
5164}
5265
66+
5367function render ( ) {
54- let table = document . getElementById ( "display" ) ;
55- let rowsNumber = table . rows . length ;
56- //delete old table
57- for ( let n = rowsNumber - 1 ; n > 0 ; n -- {
58- table . deleteRow ( n ) ;
59- }
60- //insert updated row and cells
61- let length = myLibrary . length ;
62- for ( let i = 0 ; i < length ; i ++ ) {
63- let row = table . insertRow ( 1 ) ;
64- let titleCell = row . insertCell ( 0 ) ;
65- let authorCell = row . insertCell ( 1 ) ;
66- let pagesCell = row . insertCell ( 2 ) ;
67- let wasReadCell = row . insertCell ( 3 ) ;
68- let deleteCell = row . insertCell ( 4 ) ;
69- titleCell . innerHTML = myLibrary [ i ] . title ;
70- authorCell . innerHTML = myLibrary [ i ] . author ;
71- pagesCell . innerHTML = myLibrary [ i ] . pages ;
72-
73- //add and wait for action for read/unread button
74- let changeBut = document . createElement ( "button" ) ;
75- changeBut . id = i ;
76- changeBut . className = "btn btn-success" ;
77- wasReadCell . appendChild ( changeBut ) ;
78- let readStatus = "" ;
79- if ( myLibrary [ i ] . check == false ) {
80- readStatus = "Yes" ;
81- } else {
82- readStatus = "No" ;
68+ let table = document . getElementById ( "display" ) ;
69+ let rowsNumber = table . rows . length ;
70+
71+ // Delete old table rows
72+ for ( let n = rowsNumber - 1 ; n > 0 ; n -- ) {
73+ table . deleteRow ( n ) ;
74+ }
75+
76+ // Insert updated rows and cells
77+ let length = myLibrary . length ;
78+ for ( let i = 0 ; i < length ; i ++ ) {
79+ let row = table . insertRow ( 1 ) ;
80+ let titleCell = row . insertCell ( 0 ) ;
81+ let authorCell = row . insertCell ( 1 ) ;
82+ let pagesCell = row . insertCell ( 2 ) ;
83+ let wasReadCell = row . insertCell ( 3 ) ;
84+ let deleteCell = row . insertCell ( 4 ) ;
85+
86+ titleCell . innerHTML = myLibrary [ i ] . title ;
87+ authorCell . innerHTML = myLibrary [ i ] . author ;
88+ pagesCell . innerHTML = myLibrary [ i ] . pages ;
89+
90+ // Add and configure read/unread button
91+ let changeBut = document . createElement ( "button" ) ;
92+ changeBut . id = i ;
93+ changeBut . className = "btn btn-primary" ;
94+ wasReadCell . appendChild ( changeBut ) ;
95+
96+ let readStatus = myLibrary [ i ] . check ? "Yes" : "No" ;
97+ changeBut . innerHTML = readStatus ;
98+
99+ if ( myLibrary [ i ] . check ) {
100+ changeBut . className = "btn btn-success" ;
101+ }
102+
103+ changeBut . addEventListener ( "click" , function ( ) {
104+ myLibrary [ i ] . check = ! myLibrary [ i ] . check ;
105+ render ( ) ;
106+ } ) ;
107+
108+ // Add delete button to each row
109+ let delBut = document . createElement ( "button" ) ;
110+ delBut . id = i + 5 ;
111+ delBut . className = "btn btn-warning" ;
112+ delBut . innerHTML = "Delete" ;
113+ deleteCell . appendChild ( delBut ) ;
114+
115+ delBut . setAttribute ( "data-index" , i ) ;
116+ delBut . addEventListener ( "click" , function ( ) {
117+ let index = this . getAttribute ( "data-index" ) ;
118+ showError ( `You've deleted title: ${ myLibrary [ index ] . title } ` ) ;
119+ myLibrary . splice ( index , 1 ) ;
120+ render ( ) ;
121+ } ) ;
83122 }
84- changeBut . innerText = readStatus ;
85-
86- changeBut . addEventListener ( "click" , function ( ) {
87- myLibrary [ i ] . check = ! myLibrary [ i ] . check ;
88- render ( ) ;
89- } ) ;
90-
91- //add delete button to every row and render again
92- let delButton = document . createElement ( "button" ) ;
93- delBut . id = i + 5 ;
94- deleteCell . appendChild ( delBut ) ;
95- delBut . className = "btn btn-warning" ;
96- delBut . innerHTML = "Delete" ;
97- delBut . addEventListener ( "clicks" , function ( ) {
98- alert ( `You've deleted title: ${ myLibrary [ i ] . title } ` ) ;
99- myLibrary . splice ( i , 1 ) ;
100- render ( ) ;
101- } ) ;
102- }
103123}
124+
125+ // Handle error messages
126+ function showError ( message ) {
127+ let errorMessCont = document . getElementById ( "errorMessage" ) ;
128+ errorMessCont . textContent = message ;
129+ errorMessCont . classList . add ( "show" ) ;
130+
131+ setTimeout ( ( ) => {
132+ errorMessCont . classList . remove ( "show" ) ;
133+ } , 3000 ) ;
134+ }
0 commit comments