155 lines
6.1 KiB
JavaScript
Executable File
155 lines
6.1 KiB
JavaScript
Executable File
/* Default users in the invitation list */
|
|
let userList = [
|
|
{ shortName: "Alice", fullName: "Alice N. Wonderland" },
|
|
{ shortName: "Bob", fullName: "Bob Malooga" },
|
|
{ shortName: "Charlie", fullName: "Charlie Bucket" },
|
|
];
|
|
|
|
/* STEP 1:
|
|
* Update a field of the card preview based on the current value of the
|
|
* preview-form field. For the preview-form, use the field's .value field.
|
|
* Find the corresponding preview-X field (i.e., for the preview-form host
|
|
* field, you should update preview-host's textContent. */
|
|
function updateField(field) {
|
|
document.querySelector(`#preview-${field.name}`).textContent = field.value;
|
|
}
|
|
|
|
/* STEP 1:
|
|
* When the Clear Form button is clicked, set all of the preview-area's
|
|
* fields back to the default values as given in the HTML file. */
|
|
function defaultPreview() {
|
|
document.querySelector("#preview-host").textContent = "HOST";
|
|
document.querySelector("#preview-title").textContent = "TITLE";
|
|
document.querySelector("#preview-message").textContent = "YOUR MESSAGE HERE";
|
|
document.querySelector("#preview-date").textContent = "DATE";
|
|
}
|
|
|
|
/* STEP 2:
|
|
* Update the preview of the card to show the selected user. Use the
|
|
* user parameter to search through the userList, trying to match the
|
|
* shortName field. You should do a case-insensitive match, meaning
|
|
* the shortName field should be passed to the toLowerCase() function.
|
|
* Get the preview-guest field and set its textContent to the user's
|
|
* fullName field. */
|
|
function previewCard(user) {
|
|
const guestPreview = document.querySelector("#preview-guest");
|
|
const listUser = userList.find(
|
|
(listUser) => listUser.shortName.toLowerCase() === user.id
|
|
);
|
|
guestPreview.textContent = listUser.fullName;
|
|
}
|
|
|
|
(function () {
|
|
// STEP 1:
|
|
// Get the preview form. For each of the text fields (host, title, message),
|
|
// add a keyup event listener to call updateField on that field name. For
|
|
// the date field, use a change event listener to do the same.
|
|
const form = document.querySelector("#preview-form");
|
|
const { host, title, message, date } = form;
|
|
host.addEventListener("keyup", updateField.bind(null, host));
|
|
title.addEventListener("keyup", updateField.bind(null, title));
|
|
message.addEventListener("keyup", updateField.bind(null, message));
|
|
date.addEventListener("change", updateField.bind(null, date));
|
|
|
|
// STEP 1:
|
|
// When the reset-btn button is clicked, call defaultPreview() to restore
|
|
// the preview fields to their original values.
|
|
document
|
|
.querySelector("#reset-btn")
|
|
.addEventListener("click", defaultPreview);
|
|
|
|
// STEP 2:
|
|
// For each of the existing users in the invitation list, add a click
|
|
// listener that will put their name into the card preview.
|
|
// HINT: You can grab all of them and use .forEach:
|
|
document
|
|
.querySelectorAll("#guest-list > li")
|
|
.forEach((userCard) =>
|
|
userCard.addEventListener("click", previewCard.bind(null, userCard))
|
|
);
|
|
|
|
// STEP 3:
|
|
// Grab all elements with the "modal" class. When clicked, remove the
|
|
// "show" class from the target element.
|
|
const modal = document.querySelector(".modal");
|
|
modal.addEventListener("click", (event) => {
|
|
if (event.target === modal) {
|
|
modal.classList.remove("show");
|
|
}
|
|
});
|
|
|
|
// STEP 3:
|
|
// For each of the btn-edit-guest buttons, add a click event listener. When
|
|
// clicked, get the data-user attribute from the clicked item and find the
|
|
// guest from the userList with that shortName. Store the guest's fullName
|
|
// and shortName into the user-form fields and show the modal. Also store
|
|
// the shortName in the old-short field and stop the event propagation.
|
|
const userForm = document.querySelector("#user-form");
|
|
|
|
document.querySelectorAll(".btn-edit-guest").forEach((btn) => {
|
|
btn.addEventListener("click", (event) => {
|
|
event.stopPropagation();
|
|
|
|
const dataUser = btn.dataset.user;
|
|
const listUser = userList.find(
|
|
(listUser) => listUser.shortName.toLowerCase() === dataUser
|
|
);
|
|
userForm["guest-full"].value = listUser.fullName;
|
|
userForm["guest-short"].value = listUser.shortName;
|
|
userForm["old-short"].value = listUser.shortName;
|
|
|
|
modal.classList.add("show");
|
|
});
|
|
});
|
|
|
|
// STEP 3:
|
|
// When the modal form is submitted, user the user-form's old-short field
|
|
// to find the user from the userList. Also look for the new short-name value
|
|
// in the userList. If the new short-name is found and it is not the same
|
|
// user as before (e.g., the new name conflicts with someone else), add the
|
|
// "invalid" class to the guest-short input and return.
|
|
//
|
|
// If the short-name is valid, get the guest-short and guest-full values from
|
|
// the form and update the user in the userList. Hide the modal.
|
|
//
|
|
// BONUS: Update the short name that appears in the guest-list item. Note
|
|
// that you'll need to first get the item, then access its firstChild. Otherwise,
|
|
// setting the textContent will accidentally remove the edit button.
|
|
userForm.addEventListener("submit", (event) => {
|
|
event.preventDefault();
|
|
|
|
const guestFull = userForm["guest-full"].value;
|
|
const guestShort = userForm["guest-short"].value;
|
|
const oldShort = userForm["old-short"].value;
|
|
|
|
const newId = guestShort.toLowerCase();
|
|
const oldId = oldShort.toLowerCase();
|
|
|
|
const listUserIndex = userList.findIndex(
|
|
(listUser) => listUser.shortName.toLowerCase() === oldId
|
|
);
|
|
|
|
for (let i = 0; i < userList.length; i++) {
|
|
const shortNameMatches = userList[i].shortName.toLowerCase() === newId;
|
|
if (i !== listUserIndex && shortNameMatches) {
|
|
userForm["guest-short"].classList.add("invalid");
|
|
return;
|
|
}
|
|
}
|
|
|
|
userList[listUserIndex].fullName = guestFull;
|
|
userList[listUserIndex].shortName = guestShort;
|
|
|
|
const oldListItem = document.querySelector(`#guest-list > li#${oldId}`);
|
|
oldListItem.id = newId;
|
|
|
|
const newNode = document.createElement("div");
|
|
newNode.textContent = guestShort;
|
|
oldListItem.replaceChild(newNode.firstChild, oldListItem.firstChild);
|
|
oldListItem.firstElementChild.dataset.user = newId;
|
|
|
|
userForm["guest-short"].classList.remove("invalid");
|
|
modal.classList.remove("show");
|
|
});
|
|
})();
|