Calculator Tools Calculator Tools
Create

Wine Cellar Manager

Jun 22, 2025

About this app

Manage your wine cellar with ease. Track your wine inventory, evaluate aging potential, and create tasting notes. Perfect for enthusiasts and connoisseurs.

Wine Cellar Manager Wine Cellar Manager Wine Name Variety Year Tasting Notes Rating 1 2 3 4 5 Add Wine Wine List # Name Variety Year Notes Rating Action

Related apps

Put this on your site

Source

                    <html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1">

<title>Wine Cellar Manager</title>
<meta name="description" content="Manage your wine cellar with ease. Track your wine inventory, evaluate aging potential, and create tasting notes. Perfect for enthusiasts and connoisseurs.">
<meta name="keywords" content="Wine Cellar Manager, wine inventory, wine tracking, wine notes, wine connoisseur, wine enthusiasts">

<!-- Libraries -->
<!-- jQuery (3.6.0) -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js" crossorigin="anonymous"></script>
<!-- Bootstrap CSS (5.3.3) -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" crossorigin="anonymous">
<!-- Bootstrap JS (5.3.3) -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.min.js" crossorigin="anonymous"></script>
<!-- Font Awesome (6.6.0) -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.6.0/css/fontawesome.min.css" crossorigin="anonymous">

<script type="text/javascript">
try {
// App Javascript Goes Here. Place your entire script content inside the try block for error handling.

// This will run when the DOM is ready.
document.addEventListener("DOMContentLoaded", function() {
let wineList = [];
const wineForm = document.getElementById('wine-form');

wineForm.addEventListener('submit', function(event) {
event.preventDefault();
const formData = new FormData(wineForm);
const wine = {
name: formData.get('name'),
variety: formData.get('variety'),
year: formData.get('year'),
notes: formData.get('notes'),
rating: formData.get('rating')
};
wineList.push(wine);
renderWineList();
wineForm.reset();
});

function renderWineList() {
const wineTableBody = document.getElementById('wine-table-body');
wineTableBody.innerHTML = '';
wineList.forEach((wine, index) => {
const tr = document.createElement('tr');
tr.innerHTML = `
<td>${index + 1}</td>
<td>${wine.name}</td>
<td>${wine.variety}</td>
<td>${wine.year}</td>
<td>${wine.notes}</td>
<td>${wine.rating}</td>
<td>
<button class="btn btn-danger btn-sm" onclick="deleteWine(${index})">Remove</button>
</td>`;
wineTableBody.appendChild(tr);
});
}

window.deleteWine = function(index) {
wineList.splice(index, 1);
renderWineList();
};
});

} catch (error) {
// This will throw the error to the parent window.
throw error;
}
</script>

<style>
body {
background: linear-gradient(135deg, #6db3f2, #1f3f78);
color: white;
}
#main-container {
margin-top: 30px;
background-color: rgba(255, 255, 255, 0.1);
border-radius: 10px;
padding: 20px;
}
h1, h2 {
color: #ffd700;
}
table {
border-collapse: collapse;
width: 100%;
margin-top: 20px;
}
th, td {
padding: 10px;
text-align: left;
border: 1px solid #ddd;
}
th {
background-color: rgba(255, 205, 0, 0.7);
}
.btn-danger {
background-color: #ff4c4c;
border: none;
}
.btn-danger:hover {
background-color: #ff0000;
}
textarea {
resize: none;
}
</style>
</head>
<body>
<div id="main-container" class="container">
<h1 class="text-center">Wine Cellar Manager</h1>
<form id="wine-form" class="mb-4">
<div class="mb-3">
<label for="name" class="form-label">Wine Name</label>
<input type="text" class="form-control" id="name" name="name" required>
</div>
<div class="mb-3">
<label for="variety" class="form-label">Variety</label>
<input type="text" class="form-control" id="variety" name="variety" required>
</div>
<div class="mb-3">
<label for="year" class="form-label">Year</label>
<input type="number" class="form-control" id="year" name="year" required min="1800" max="2023">
</div>
<div class="mb-3">
<label for="notes" class="form-label">Tasting Notes</label>
<textarea class="form-control" id="notes" name="notes" rows="3"></textarea>
</div>
<div class="mb-3">
<label for="rating" class="form-label">Rating</label>
<select class="form-select" id="rating" name="rating">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
</select>
</div>
<button type="submit" class="btn btn-primary">Add Wine</button>
</form>
<h2>Wine List</h2>
<table class="table table-striped">
<thead>
<tr>
<th>#</th>
<th>Name</th>
<th>Variety</th>
<th>Year</th>
<th>Notes</th>
<th>Rating</th>
<th>Action</th>
</tr>
</thead>
<tbody id="wine-table-body">
<!-- Dynamic Wine List Rows -->
</tbody>
</table>
</div>
</body>
</html>