Refactor: Moved standard assets to assets/images/ and updated all references. README updated with rebuild instructions.
This commit is contained in:
19
README.md
19
README.md
@@ -82,6 +82,25 @@ Die Anwendung ist vollständig containerisiert ("Dockerized"). Du kannst sie dir
|
||||
--name packliste-container \
|
||||
packliste-app
|
||||
```
|
||||
*Hinweis:* Bilder werden im Volume `packliste_uploads` gespeichert. Das Git-Repository enthält keine Nutzer-Bilder.
|
||||
|
||||
3. **Update & Rebuild (Aktualisierung):**
|
||||
Wenn du Änderungen aus dem Git ziehen ("den Rotz ziehen") und die App aktualisieren willst:
|
||||
|
||||
```bash
|
||||
# 1. Neuesten Code holen
|
||||
git pull origin master
|
||||
|
||||
# 2. Container stoppen und löschen (Datenbank & Uploads bleiben im Volume erhalten!)
|
||||
docker stop packliste-container
|
||||
docker rm packliste-container
|
||||
|
||||
# 3. Image neu bauen
|
||||
docker build -t packliste-app .
|
||||
|
||||
# 4. Neuen Container starten (gleicher Befehl wie oben)
|
||||
docker run -d ... (siehe oben)
|
||||
```
|
||||
Die App ist anschließend unter `http://localhost:8080` erreichbar.
|
||||
|
||||
---
|
||||
|
||||
@@ -271,7 +271,7 @@ $conn->close();
|
||||
<div class="mb-3"><label for="image_file" class="form-label">1. Bild hochladen</label><input class="form-control" type="file" id="image_file" name="image_file" accept="image/*"></div>
|
||||
<div class="mb-3"><label for="image_url" class="form-label">2. ODER Bild-URL angeben</label><input type="url" class="form-control" id="image_url" name="image_url" placeholder="https://..."></div>
|
||||
<div class="mb-3"><label class="form-label">3. ODER Bild einfügen (Strg+V)</label><div id="pasteArea" class="paste-area"><i class="fas fa-paste"></i> Hier klicken & einfügen</div></div>
|
||||
<div class="text-center mt-auto"><label class="form-label d-block">Vorschau</label><img id="imagePreview" src="keinbild.png" class="mb-2"></div>
|
||||
<div class="text-center mt-auto"><label class="form-label d-block">Vorschau</label><img id="imagePreview" src="assets/images/keinbild.png" class="mb-2"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -289,7 +289,7 @@ document.addEventListener('DOMContentLoaded', function () {
|
||||
|
||||
function generateRowHTML(article, level = 0) {
|
||||
let html = '';
|
||||
const imagePath = article.image_url ? article.image_url : 'keinbild.png';
|
||||
const imagePath = article.image_url ? article.image_url : 'assets/images/keinbild.png';
|
||||
const productLink = article.product_url ? `<a href="${article.product_url}" target="_blank" class="btn btn-sm btn-outline-secondary" data-bs-toggle="tooltip" title="Produktseite öffnen"><i class="fas fa-external-link-alt"></i></a>` : '';
|
||||
const creatorBadge = article.user_id != currentUserId ? `<span class="badge bg-info">${article.creator_name}</span>` : `<span class="badge bg-primary">Ich</span>`;
|
||||
const householdBadge = article.household_id ? `<span class="badge bg-success" data-bs-toggle="tooltip" title="Für den Haushalt freigegeben"><i class="fas fa-users"></i></span>` : `<span class="badge bg-secondary" data-bs-toggle="tooltip" title="Privater Artikel"><i class="fas fa-user"></i></span>`;
|
||||
@@ -349,7 +349,7 @@ document.addEventListener('DOMContentLoaded', function () {
|
||||
document.querySelectorAll('.article-image-trigger').forEach(trigger => {
|
||||
trigger.addEventListener('mouseover', function (e) {
|
||||
const previewUrl = this.getAttribute('data-preview-url');
|
||||
if(previewUrl && !previewUrl.endsWith('keinbild.png')) {
|
||||
if(previewUrl && !previewUrl.endsWith('assets/images/keinbild.png')) {
|
||||
tooltip.style.backgroundImage = `url('${previewUrl}')`;
|
||||
tooltip.style.display = 'block';
|
||||
}
|
||||
@@ -365,7 +365,7 @@ document.addEventListener('DOMContentLoaded', function () {
|
||||
trigger.addEventListener('click', function(e) {
|
||||
const fullImageUrl = this.getAttribute('data-preview-url');
|
||||
const articleName = this.getAttribute('alt');
|
||||
if(fullImageUrl && !fullImageUrl.endsWith('keinbild.png')) {
|
||||
if(fullImageUrl && !fullImageUrl.endsWith('assets/images/keinbild.png')) {
|
||||
fullImageElement.src = fullImageUrl;
|
||||
imageModalLabel.textContent = articleName;
|
||||
imageModal.show();
|
||||
|
||||
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
@@ -28,7 +28,7 @@ $product_url = ''; $manufacturer_id = null; $product_designation = '';
|
||||
$storage_location_id = null;
|
||||
$parent_article_id = null;
|
||||
|
||||
$display_current_image_path = 'keinbild.png';
|
||||
$display_current_image_path = 'assets/images/keinbild.png';
|
||||
$display_image_url_in_input = '';
|
||||
$is_local_uploaded_image = false;
|
||||
$upload_dir = 'uploads/images/';
|
||||
@@ -409,7 +409,7 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||
if(deleteCheckbox) {
|
||||
deleteCheckbox.addEventListener('change', function() {
|
||||
if(this.checked) {
|
||||
imagePreview.src = 'keinbild.png';
|
||||
imagePreview.src = 'assets/images/keinbild.png';
|
||||
clearOtherImageInputs('delete');
|
||||
} else {
|
||||
imagePreview.src = originalImageSrc;
|
||||
|
||||
@@ -314,7 +314,7 @@ require_once 'header.php';
|
||||
<label class="form-label">Bild</label>
|
||||
<div class="card bg-light mb-2">
|
||||
<div class="card-body text-center p-2">
|
||||
<img id="imagePreview" src="<?php echo !empty($image_url) ? htmlspecialchars($image_url) : 'keinbild.png'; ?>" class="img-fluid" style="max-height:150px; object-fit:contain;">
|
||||
<img id="imagePreview" src="<?php echo !empty($image_url) ? htmlspecialchars($image_url) : 'assets/images/keinbild.png'; ?>" class="img-fluid" style="max-height:150px; object-fit:contain;">
|
||||
</div>
|
||||
</div>
|
||||
<input type="file" name="image_file" id="image_file" class="form-control form-control-sm mb-2" accept="image/*">
|
||||
|
||||
@@ -224,7 +224,7 @@ $conn->close();
|
||||
document.body.addEventListener('mouseover', e => {
|
||||
if (e.target.classList.contains('article-image-trigger')) {
|
||||
const url = e.target.getAttribute('data-preview-url');
|
||||
if (url && !url.endsWith('keinbild.png')) {
|
||||
if (url && !url.endsWith('assets/images/keinbild.png')) {
|
||||
tooltip.style.backgroundImage = `url('${url}')`;
|
||||
tooltip.style.display = 'block';
|
||||
}
|
||||
@@ -273,7 +273,7 @@ $conn->close();
|
||||
const matchesManufacturer = !filterManufacturer || article.manufacturer_name === filterManufacturer;
|
||||
if (matchesText && matchesCategory && matchesManufacturer) {
|
||||
const details = [article.manufacturer_name, article.product_designation].filter(Boolean).join(' - ');
|
||||
const imgUrl = article.image_url ? article.image_url : 'keinbild.png';
|
||||
const imgUrl = article.image_url ? article.image_url : 'assets/images/keinbild.png';
|
||||
html += `
|
||||
<div class="available-item-card d-flex align-items-center" data-article-id="${article.id}">
|
||||
<img src="${imgUrl}" class="article-image-trigger me-2 rounded" style="width: 30px; height: 30px; object-fit: cover; cursor: pointer;" data-preview-url="${imgUrl}">
|
||||
|
||||
@@ -153,7 +153,7 @@ function render_item_row($item, $level, $items_by_parent) {
|
||||
$icon = '<i class="fas fa-folder-open me-2 text-warning"></i>';
|
||||
} else {
|
||||
// Standard Item
|
||||
$img_src = !empty($item['image_url']) ? htmlspecialchars($item['image_url']) : 'keinbild.png';
|
||||
$img_src = !empty($item['image_url']) ? htmlspecialchars($item['image_url']) : 'assets/images/keinbild.png';
|
||||
$icon = '<img src="' . $img_src . '" class="item-image me-2 article-image-trigger" data-preview-url="' . $img_src . '">';
|
||||
}
|
||||
|
||||
@@ -345,7 +345,7 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||
document.querySelectorAll('.article-image-trigger').forEach(trigger => {
|
||||
trigger.addEventListener('mouseover', e => {
|
||||
const url = e.target.getAttribute('data-preview-url');
|
||||
if (url && !url.endsWith('keinbild.png')) {
|
||||
if (url && !url.endsWith('assets/images/keinbild.png')) {
|
||||
tooltip.style.backgroundImage = `url('${url}')`;
|
||||
tooltip.style.display = 'block';
|
||||
}
|
||||
|
||||
@@ -93,7 +93,7 @@ $conn->close();
|
||||
<div class="col-md-6 col-lg-4">
|
||||
<div class="card h-100 shadow-sm packing-list-card">
|
||||
<div class="card-body d-flex flex-column">
|
||||
<img src="rucksack_icon.png" alt="Packliste" class="card-icon">
|
||||
<img src="assets/images/rucksack_icon.png" alt="Packliste" class="card-icon">
|
||||
<h5 class="card-title"><?php echo htmlspecialchars($list['name']); ?></h5>
|
||||
<p class="card-text text-muted flex-grow-1 small"><?php echo htmlspecialchars($list['description'] ?: 'Keine Beschreibung vorhanden.'); ?></p>
|
||||
<div class="mt-auto d-flex justify-content-between">
|
||||
|
||||
Reference in New Issue
Block a user