Issue
i have a simple library app. i have an array that contains all my "book" objects and will also have functionality to add more objects to the array which will then be displayed as table rows. I need a delete function that targets the rows the the table but also newly created rows.
function Book(name, author, ReadOrNot) {
    this.name = name
    this.author = author
    this.ReadOrNot = ReadOrNot
}
const book1 = new Book("The Hobbit", "J.R.R Tolkien", "Read")
const book2 = new Book("A Game of Thrones", "George R.R. Martin", "Not read")
const book3 = new Book("Jane Eyre", "Charlotte Brontë", "Read")
let myLibrary = []
function addBookToLibrary(...arr) {
 myLibrary.push(...arr)
}
addBookToLibrary(book1)
addBookToLibrary(book2)
addBookToLibrary(book3)
function addBookToTable(){
    let tbody = document.querySelector('tbody')
    myLibrary.forEach(b =>{
      let tr = document.createElement('tr')
      let content = '<td>' + b.name + '</td><td>' + b.author + '</td>'
      if(b.ReadOrNot == 'Read'){
        content += '<td><button id="readbtn" class="btn rdbtn">Read</button></td>'  
       }
       else if(b.ReadOrNot == 'Not read'){
         content += '<td><button id="readbtn" class="btn rdbtn">Not read</button></td>'
       }
       content += '<td><button class="btn delbtn" onclick="toggleDelete()">Delete</button></td>'
      tr.innerHTML = content
      tbody.appendChild(tr)
     })
  }
  
  addBookToTable()
<table>
        <thead>
            <tr>
                <td>Name</td>
                <td>Author</td>
                <td>Status</td>
                <td>      </td>
            </tr>
        </thead>
       
        <tbody>
            
        </tbody>
    </table>
Solution
Following a simple approach and just defining your already declared toggleDelete() function.
- Remove a row
 
function Book(name, author, ReadOrNot) {
  this.name = name
  this.author = author
  this.ReadOrNot = ReadOrNot
}
const book1 = new Book("The Hobbit", "J.R.R Tolkien", "Read")
const book2 = new Book("A Game of Thrones", "George R.R. Martin", "Not read")
const book3 = new Book("Jane Eyre", "Charlotte Brontë", "Read")
let myLibrary = []
function addBookToLibrary(...arr) {
  myLibrary.push(...arr)
}
addBookToLibrary(book1)
addBookToLibrary(book2)
addBookToLibrary(book3)
function addBookToTable() {
  let tbody = document.querySelector('tbody')
  myLibrary.forEach(b => {
    let tr = document.createElement('tr')
    let content = '<td>' + b.name + '</td><td>' + b.author + '</td>'
    if (b.ReadOrNot == 'Read') {
      content += '<td><button id="readbtn" class="btn rdbtn">Read</button></td>'
    } else if (b.ReadOrNot == 'Not read') {
      content += '<td><button id="readbtn" class="btn rdbtn">Not read</button></td>'
    }
    content += '<td><button class="btn delbtn" onclick="toggleDelete(this)">Delete</button></td>'
    tr.innerHTML = content
    tbody.appendChild(tr)
  })
}
addBookToTable()
function toggleDelete(o) {
  var p = o.parentNode.parentNode;
  p.parentNode.removeChild(p);
}
.hide-row {
  visibility: hidden;
}
<table>
  <thead>
    <tr>
      <td>Name</td>
      <td>Author</td>
      <td>Status</td>
      <td> </td>
    </tr>
  </thead>
  <tbody>
  </tbody>
</table>
- Hide/Show a row
 
function Book(name, author, ReadOrNot) {
  this.name = name
  this.author = author
  this.ReadOrNot = ReadOrNot
}
const book1 = new Book("The Hobbit", "J.R.R Tolkien", "Read")
const book2 = new Book("A Game of Thrones", "George R.R. Martin", "Not read")
const book3 = new Book("Jane Eyre", "Charlotte Brontë", "Read")
let myLibrary = []
function addBookToLibrary(...arr) {
  myLibrary.push(...arr)
}
addBookToLibrary(book1)
addBookToLibrary(book2)
addBookToLibrary(book3)
function addBookToTable() {
  let tbody = document.querySelector('tbody')
  myLibrary.forEach(b => {
    let tr = document.createElement('tr')
    let content = '<td>' + b.name + '</td><td>' + b.author + '</td>'
    if (b.ReadOrNot == 'Read') {
      content += '<td><button id="readbtn" class="btn rdbtn">Read</button></td>'
    } else if (b.ReadOrNot == 'Not read') {
      content += '<td><button id="readbtn" class="btn rdbtn">Not read</button></td>'
    }
    content += '<td><button class="btn delbtn" onclick="toggleDelete(this)">Hide</button></td>'
    tr.innerHTML = content
    tbody.appendChild(tr)
  })
}
addBookToTable()
function toggleDelete(o) {
  var p = o.parentNode.parentNode;
  p.childNodes.forEach(elements => {
    elements.classList.toggle('hide-row');
  })
  p.childNodes[3].style = 'visibility : visible !important';
  if (p.childNodes[3].childNodes[0].parentNode.classList[0] == "hide-row") {
    p.childNodes[3].childNodes[0].innerHTML = 'Show';
  } else {
    p.childNodes[3].childNodes[0].innerHTML = 'Hide';
  }
}
.hide-row {
  visibility: hidden;
}
<table>
  <thead>
    <tr>
      <td>Name</td>
      <td>Author</td>
      <td>Status</td>
      <td> </td>
    </tr>
  </thead>
  <tbody>
  </tbody>
</table>
Answered By - first Answer Checked By - Marilyn (PHPFixing Volunteer)
0 Comments:
Post a Comment
Note: Only a member of this blog may post a comment.