Also for the Update use case, we have an HTML
page for the user interface (updateBook.html) and a
view code file (src/v/updateBook.js). The HTML form
for the UI of the "update book" operation has a selection field for
choosing the book to be updated, an output field for the
standard identifier attribute isbn, and an input
field for each attribute of the Book class that can be
updated. Notice that by using an output field for the
standard identifier attribute, we do not allow changing the standard
identifier of an existing object.
<main>
<form id="Book">
<div><label>Select book:
<select name="selectBook">
<option value=""> --- </option></select>
</label></div>
<div><label>ISBN: <output name="isbn"></output></label></div>
<div><label>Title: <input name="title"/></label></div>
<div><label>Year: <input name="year"/></label></div>
<div><button type="button" name="commit">
Save Changes</button></div>
</form>
</main>Notice that we include a kind of empty option element, with a value
of "" and a display text of ---, as a default
choice in the selectBook selection list element. So, by
default, the value of the selectBook form
control is empty, requiring the user to choose one of the available
options for filling the form.
The setupUserInterface procedure now has to populate
the select element's option list by loading the collection of
all book objects from the data store and creating an option element for
each book object:
pl.v.updateBook = {
setupUserInterface: function () {
const formEl = document.forms["Book"],
saveButton = formEl.commit,
selectBookEl = formEl.selectBook;
Book.retrieveAll(); // load all book objects
// populate the selection list with books
for (const key of Object.keys( Book.instances)) {
const book = Book.instances[key];
const optionEl = document.createElement("option");
optionEl.text = book.title;
optionEl.value = book.isbn;
selectBookEl.add( optionEl, null);
}
// when a book is selected, fill the form with its data
selectBookEl.addEventListener("change",
pl.v.updateBook.handleBookSelectionEvent);
// set an event handler for the submit/save button
saveButton.addEventListener("click",
pl.v.updateBook.handleSaveButtonClickEvent);
// handle the event when the browser window/tab is closed
window.addEventListener("beforeunload", Book.saveAll);
},
...
}A book selection event is caught via a listener for
change events on the select element. When a book
is selected, the form is filled with its data:
handleBookSelectionEvent: function () {
const formEl = document.forms["Book"],
selectBookEl = formEl.selectBook,
key = selectBookEl.value;
if (key) {
const book = Book.instances[key];
formEl.isbn.value = book.isbn;
formEl.title.value = book.title;
formEl.year.value = book.year;
} else {
formEl.reset();
}
},When the save button is activated, a slots record is
created from the form field values and used as the argument for calling
Book.update:
handleSaveButtonClickEvent: function () {
const formEl = document.forms["Book"],
selectBookEl = formEl.selectBook;
const slots = { isbn: formEl.isbn.value,
title: formEl.title.value,
year: formEl.year.value
};
Book.update( slots);
// update the selection list option element
selectBookEl.options[selectBookEl.selectedIndex].text = slots.title;
formEl.reset();
}
};