flopro's picture
Add 4 files
4445260 verified
const $ = (...params) => document.querySelector(...params);
/**
* Take a string representing the location in the library
* and return an object containing the following properties:
* room: the room number
* wall: the wall number
* shelf: the shelf number
* book: the book number
* page: the page number
*/
function getLocationDetails(location) {
const parts = location.split(".");
return {
room: parseInt(parts[0], 36),
wall: parseInt(parts[1]),
shelf: parseInt(parts[2]),
book: parseInt(parts[3]),
page: parseInt(parts[4]),
};
}
/**
* Take an object containing the following properties:
* room: the room number
* wall: the wall number
* shelf: the shelf number
* book: the book number
* page: the page number
* and return a string representing the unique identifier for the book.
*/
function getUniqueBookId(location) {
const { room, wall, shelf, book, page } = location;
return (room * 1000 + wall * 100 + shelf * 32 + book * 410) + page * 161;
}
/**
* Given a book index (integer 1-100), return the page number (1-410)
*/
function getPageNumber(bookIndex) {
return (bookIndex - 1) % 410 + 1;
}
/**
* Given a book index (integer 1-100), return the book number (1-32)
*/
function getBookNumber(bookIndex) {
return (bookIndex - 1) % 64 + 1;
}
/**
* Given a book index (integer 1-100), return the shelf number (1-5)
*/
function getShelfNumber(bookIndex) {
return (bookIndex - 1) % 32 + 1;
}
/**
* Given a book index (integer 1-100), return the wall number (1-4)
*/
function getWallNumber(bookIndex) {
return (bookIndex - 1) % 8 + 1;
}
/**
* Given a book index (integer 1-100), return the room number (string containing a letter and an integer)
*/
function getRoomNumber(bookIndex) {
return "Room " + ((bookIndex - 1) % 26 + 1).toUpperCase();
}
$(document).addEventListener("alpine:init", () => {
const app = new Alpine.Component();
app.define("location-details", {
input: "",
bookIndex: 0,
uniqueId: "",
});
app.store({
index: 1,
inputs: [],
});
app.watch("Input", (value) => {
const location = getLocationDetails(value);
app.bookIndex = getUniqueBookId(location);
app.uniqueId = getRoomNumber(app.bookIndex) + "." + getWallNumber(app.bookIndex) + "." + getShelfNumber(app.bookIndex) + "." + getBookNumber(app.bookIndex) + "." + getPageNumber(app.bookIndex);
});
app.watch("bookIndex", (value) => {
app.uniqueId = getRoomNumber(value) + "." + getWallNumber(value) + "." + getShelfNumber(value) + "." + getBookNumber(value) + "." + getPageNumber(value);
});
app.mount("#app");
// Update the input value with the unique identifier
app.on("change:bookIndex", (e) => {
const pagination = app.bookIndex;
const otherBooks = app. books.map((book) => book.bookIndex);
if (!otherBooks.includes(pagination)) {
app.bookIndex = pagination;
app.uniqueId = getRoomNumber(pagination) + "." + getWallNumber(pagination) + "." + getShelfNumber(pagination) + "." + getBookNumber(pagination) + "." + getPageNumber(pagination);
}
});
// Update the button label with the unique identifier
app.on("click", (e) => {
const pagination = app.bookIndex;
const otherBooks = app. books.map((book) => book.bookIndex);
if (!otherBooks.includes(pagination)) {
app.uniqueId = getRoomNumber(pagination) + "." + getWallNumber(pagination) + "." + getShelfNumber(pagination) + "." + getBookNumber(pagination) + "." + getPageNumber(pagination);
}
});
});
$(document).addEventListener("DOMContentLoaded", () => {
const app = new Alpine.Component();
app.define("library", {
books: [],
addBook: (title) => {
return { bookIndex: app.books.length + 1, title };
},
});
app.store({
books: [],
});
app.mount("#app");
});