finish the frontend functionality; needs styling
	
		
			
	
		
	
	
		
	
		
			All checks were successful
		
		
	
	
		
			
				
	
				ci/woodpecker/push/woodpecker Pipeline was successful
				
			
		
		
	
	
				
					
				
			
		
			All checks were successful
		
		
	
	ci/woodpecker/push/woodpecker Pipeline was successful
				
			This commit is contained in:
		@@ -51,6 +51,62 @@ function init() {
 | 
			
		||||
 | 
			
		||||
function renderAddBookView() {
 | 
			
		||||
  document.getElementById("current").innerHTML = AddBookTemplate();
 | 
			
		||||
  document.getElementById("lookup").addEventListener("click", (e) => {
 | 
			
		||||
    e.preventDefault();
 | 
			
		||||
    if (document.getElementById("isbn-13").value.length === 13) {
 | 
			
		||||
      getPossibleBooks(document.getElementById("isbn-13").value);
 | 
			
		||||
    } else {
 | 
			
		||||
      console.log("no isbn");
 | 
			
		||||
    }
 | 
			
		||||
  });
 | 
			
		||||
  document.getElementById("save").addEventListener("click", (e) => {
 | 
			
		||||
    e.preventDefault();
 | 
			
		||||
    fetch("/api/books", {
 | 
			
		||||
      method: "POST",
 | 
			
		||||
      headers: { "Content-Type": "application/json" },
 | 
			
		||||
      body: JSON.stringify({
 | 
			
		||||
        title: document.getElementById("title").value,
 | 
			
		||||
        authors: document.getElementById("authors").value.split(";"),
 | 
			
		||||
        sortAuthor: document.getElementById("sortAuthor").value,
 | 
			
		||||
        "isbn-10": document.getElementById("isbn-10").value,
 | 
			
		||||
        "isbn-13": document.getElementById("isbn-13").value,
 | 
			
		||||
        publisher: document.getElementById("publisher").value,
 | 
			
		||||
        format: document.getElementById("format").value,
 | 
			
		||||
        genre: document.getElementById("genre").value,
 | 
			
		||||
        series: document.getElementById("series").value,
 | 
			
		||||
        volume: document.getElementById("volume").value,
 | 
			
		||||
        year: document.getElementById("year").value,
 | 
			
		||||
        coverURL: document.getElementById("coverURL").value,
 | 
			
		||||
      }),
 | 
			
		||||
    });
 | 
			
		||||
    renderAddBookView();
 | 
			
		||||
    init();
 | 
			
		||||
  });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function getPossibleBooks(isbn) {
 | 
			
		||||
  fetch("/api/query", {
 | 
			
		||||
    method: "POST",
 | 
			
		||||
    headers: { "Content-Type": "application/json" },
 | 
			
		||||
    body: JSON.stringify({ "isbn-13": isbn }),
 | 
			
		||||
  })
 | 
			
		||||
    .then((response) => response.json())
 | 
			
		||||
    .then((json) => {
 | 
			
		||||
      Object.keys(json).forEach((key) => {
 | 
			
		||||
        var elem = document.getElementById(key);
 | 
			
		||||
        if (elem !== null) {
 | 
			
		||||
          elem.value = json[key];
 | 
			
		||||
        }
 | 
			
		||||
      });
 | 
			
		||||
    });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function saveBook(book) {
 | 
			
		||||
  fetch("/api/books", {
 | 
			
		||||
    method: "POST",
 | 
			
		||||
    headers: { "Content-Type": "application/json" },
 | 
			
		||||
    body: JSON.stringify(book),
 | 
			
		||||
  });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function renderTable(books, sortField) {
 | 
			
		||||
@@ -94,7 +150,8 @@ function renderTable(books, sortField) {
 | 
			
		||||
  Array.from(bookElement.querySelectorAll("tbody tr th[data-sort-by]")).forEach(
 | 
			
		||||
    (row) => {
 | 
			
		||||
      row.addEventListener("click", function (e) {
 | 
			
		||||
        renderTable(books, e.target.dataset.sortBy); // only add callback when there's a sortBy attribute
 | 
			
		||||
        // only add callback when there's a sortBy attribute
 | 
			
		||||
        renderTable(books, e.target.dataset.sortBy);
 | 
			
		||||
      });
 | 
			
		||||
    }
 | 
			
		||||
  );
 | 
			
		||||
@@ -170,9 +227,7 @@ function BookTemplate({
 | 
			
		||||
  "isbn-10": isbn10,
 | 
			
		||||
  authors,
 | 
			
		||||
  coverURL,
 | 
			
		||||
  description,
 | 
			
		||||
  format,
 | 
			
		||||
  notes,
 | 
			
		||||
  publisher,
 | 
			
		||||
  series,
 | 
			
		||||
  signed,
 | 
			
		||||
@@ -235,28 +290,33 @@ function TableTemplate(books) {
 | 
			
		||||
 | 
			
		||||
function AddBookTemplate() {
 | 
			
		||||
  return `<div class="addBookView">
 | 
			
		||||
    <form>${[
 | 
			
		||||
      { name: "ISBN10", type: "text" },
 | 
			
		||||
      { name: "ISBN13", type: "text" },
 | 
			
		||||
      { name: "Title", type: "text" },
 | 
			
		||||
      { name: "Authors", type: "text" },
 | 
			
		||||
      { name: "SortAuthor", type: "text" },
 | 
			
		||||
      { name: "Format", type: "text" },
 | 
			
		||||
      { name: "Genre", type: "text" },
 | 
			
		||||
      { name: "Publisher", type: "text" },
 | 
			
		||||
      { name: "Series", type: "text" },
 | 
			
		||||
      { name: "Volume", type: "text" },
 | 
			
		||||
      { name: "Year", type: "text" },
 | 
			
		||||
      { name: "Signed", type: "checkbox" },
 | 
			
		||||
      // { name: "Description", type: "text" },
 | 
			
		||||
      // { name: "Notes", type: "text" },
 | 
			
		||||
      { name: "CoverURL", type: "text" },
 | 
			
		||||
      { name: "Childrens", type: "checkbox" },
 | 
			
		||||
    ].reduce((acc, field) => {
 | 
			
		||||
      return acc.concat(
 | 
			
		||||
        `<label>${field.name} <input type="${field.type}" name="${field.name.toLowerCase}"/></label><br/>`
 | 
			
		||||
      );
 | 
			
		||||
    }, "")}
 | 
			
		||||
    </form>
 | 
			
		||||
    <div id="newBookForm">
 | 
			
		||||
      ${[
 | 
			
		||||
        { name: "Title", id: "title", type: "text" },
 | 
			
		||||
        { name: "Authors", id: "authors", type: "text" },
 | 
			
		||||
        { name: "SortAuthor", id: "sortAuthor", type: "text" },
 | 
			
		||||
        { name: "ISBN10", id: "isbn-10", type: "text" },
 | 
			
		||||
        { name: "ISBN13", id: "isbn-13", type: "text" },
 | 
			
		||||
        { name: "Publisher", id: "publisher", type: "text" },
 | 
			
		||||
        { name: "Format", id: "format", type: "text" },
 | 
			
		||||
        { name: "Genre", id: "genre", type: "text" },
 | 
			
		||||
        { name: "Series", id: "series", type: "text" },
 | 
			
		||||
        { name: "Volume", id: "volume", type: "text" },
 | 
			
		||||
        { name: "Year", id: "year", type: "text" },
 | 
			
		||||
        { name: "CoverURL", id: "coverURL", type: "text" },
 | 
			
		||||
        { name: "Signed", id: "signed", type: "checkbox" },
 | 
			
		||||
        { name: "Childrens", id: "childrens", type: "checkbox" },
 | 
			
		||||
      ].reduce((acc, field) => {
 | 
			
		||||
        return acc.concat(
 | 
			
		||||
          `<label>${field.name} <input
 | 
			
		||||
              type="${field.type}"
 | 
			
		||||
              name="${field.name.toLowerCase()}"
 | 
			
		||||
              id="${field.id}"
 | 
			
		||||
            /></label><br/>`
 | 
			
		||||
        );
 | 
			
		||||
      }, "")}
 | 
			
		||||
      <input id="lookup" type="submit" value="look up">
 | 
			
		||||
      <input id="save" type="submit" value="save">
 | 
			
		||||
    </div>
 | 
			
		||||
  </div>`;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user