Merge branch 'dev' into live
This commit is contained in:
commit
34233edbd4
2 files changed
+128
-12
No files matched your search
@@ -0,0 +1,16 @@
|
||||
<?php
|
||||
// reset_einkaufsliste.php
|
||||
// Aufruf z.B. per Cron: php /pfad/zu/reset_einkaufsliste.php
|
||||
|
||||
include_once(__DIR__ . '/../controller/DatabaseController.php');
|
||||
|
||||
$result = DatabaseUpdate(
|
||||
'Einkaufsliste',
|
||||
'`STATUS` = ?',
|
||||
'`TYP` = ? AND `STATUS` = ?',
|
||||
'aktiv', 'vorlage', 'erledigt'
|
||||
);
|
||||
|
||||
echo $result
|
||||
? "Vorlagen-Artikel wurden zurückgesetzt.\n"
|
||||
: "Fehler beim Zurücksetzen.\n";
|
||||
@@ -11,6 +11,14 @@
|
||||
<input type="text" name="menge" id="menge" required>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label>Typ</label>
|
||||
<select name="typ" id="typ">
|
||||
<option value="einmalig">Einmalig</option>
|
||||
<option value="vorlage">Vorlage (wiederkehrend)</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<button type="submit" class="btn-submit-vergabe">
|
||||
Speichern
|
||||
</button>
|
||||
@@ -26,7 +34,6 @@
|
||||
</div>
|
||||
|
||||
<script src="/js/AjaxMethods.js"></script>
|
||||
<script src="/js/AjaxRenderTables.js"></script>
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
const tableWrapper = document.getElementById('tableWrapper');
|
||||
@@ -40,21 +47,109 @@ document.addEventListener('DOMContentLoaded', () => {
|
||||
key: 'MENGE',
|
||||
label: 'Menge'
|
||||
},
|
||||
{
|
||||
key: 'TYP',
|
||||
label: 'Typ'
|
||||
},
|
||||
];
|
||||
|
||||
// Eigene Render-Funktion, da hier je nach TYP unterschiedlich
|
||||
// gehandelt werden muss (Löschen vs. Erledigt-Markieren).
|
||||
function renderEinkaufsliste(entries) {
|
||||
if (entries && !Array.isArray(entries)) {
|
||||
entries = Object.values(entries);
|
||||
}
|
||||
|
||||
if (!entries || entries.length === 0) {
|
||||
tableWrapper.innerHTML = '<p>Keine Einträge vorhanden.</p>';
|
||||
return;
|
||||
}
|
||||
|
||||
let html = `
|
||||
<table class="db-table mobile-responsive-table">
|
||||
<thead>
|
||||
<tr>
|
||||
${spaltenKonfig.map(s => `<th>${escapeHtml(s.label)}</th>`).join('')}
|
||||
<th style="width: 100px;">Aktion</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
`;
|
||||
|
||||
for (const entry of entries) {
|
||||
const istVorlage = entry.TYP === 'vorlage';
|
||||
const label = istVorlage ? 'Erledigt' : 'Löschen';
|
||||
|
||||
html += `<tr>`;
|
||||
for (const s of spaltenKonfig) {
|
||||
let wert = entry[s.key];
|
||||
if (s.key === 'TYP') {
|
||||
wert = istVorlage ? 'Vorlage' : 'Einmalig';
|
||||
}
|
||||
html += `<td data-label="${escapeHtml(s.label)}">${escapeHtml(wert)}</td>`;
|
||||
}
|
||||
html += `
|
||||
<td data-label="Aktion">
|
||||
<button type="button" class="btn-delete" data-id="${escapeHtml(entry.ID)}" data-typ="${escapeHtml(entry.TYP)}">
|
||||
${label}
|
||||
</button>
|
||||
</td>
|
||||
</tr>`;
|
||||
}
|
||||
|
||||
html += `</tbody></table>`;
|
||||
tableWrapper.innerHTML = html;
|
||||
|
||||
tableWrapper.querySelectorAll('.btn-delete').forEach(btn => {
|
||||
btn.addEventListener('click', async () => {
|
||||
const id = btn.dataset.id;
|
||||
const istVorlage = btn.dataset.typ === 'vorlage';
|
||||
|
||||
const frage = istVorlage ?
|
||||
'Diesen Vorlagen-Artikel als erledigt markieren?' :
|
||||
'Diesen Artikel wirklich endgültig löschen?';
|
||||
if (!confirm(frage)) return;
|
||||
|
||||
try {
|
||||
if (istVorlage) {
|
||||
await DatabaseUpdate(
|
||||
table, {
|
||||
STATUS: 'erledigt'
|
||||
},
|
||||
[{
|
||||
column: 'ID',
|
||||
operator: '=',
|
||||
value: id
|
||||
}]
|
||||
);
|
||||
} else {
|
||||
await DatabaseDelete(
|
||||
table,
|
||||
[{
|
||||
column: 'ID',
|
||||
operator: '=',
|
||||
value: id
|
||||
}]
|
||||
);
|
||||
}
|
||||
await reloadTable();
|
||||
} catch (error) {
|
||||
alert('Fehler: ' + error.message);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
async function reloadTable() {
|
||||
try {
|
||||
const data = await DatabaseShow(table);
|
||||
renderTableWithDelete(tableWrapper, data.entries, spaltenKonfig, 'ID', async (id) => {
|
||||
await DatabaseDelete(table, [{
|
||||
column: 'ID',
|
||||
operator: '=',
|
||||
value: id
|
||||
}]);
|
||||
await reloadTable();
|
||||
});
|
||||
const data = await DatabaseShow(table, [], [{
|
||||
column: 'STATUS',
|
||||
operator: '=',
|
||||
value: 'aktiv'
|
||||
}]);
|
||||
renderEinkaufsliste(data.entries);
|
||||
} catch (error) {
|
||||
tableWrapper.innerHTML = `<p> ${escapeHtml(error.message)}</p>`;
|
||||
tableWrapper.innerHTML = `<p>${escapeHtml(error.message)}</p>`;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -62,10 +157,15 @@ document.addEventListener('DOMContentLoaded', () => {
|
||||
e.preventDefault();
|
||||
const artikel = document.getElementById('artikel').value.trim();
|
||||
const menge = document.getElementById('menge').value.trim();
|
||||
const typ = document.getElementById('typ').value;
|
||||
if (!artikel || !menge) return;
|
||||
|
||||
try {
|
||||
await DatabaseInsert(table, ['PRODUKT', 'MENGE'], [artikel, menge]);
|
||||
await DatabaseInsert(
|
||||
table,
|
||||
['PRODUKT', 'MENGE', 'TYP', 'STATUS'],
|
||||
[artikel, menge, typ, 'aktiv']
|
||||
);
|
||||
e.target.reset();
|
||||
await reloadTable();
|
||||
} catch (error) {
|
||||
|
||||
Reference in new issue
Block a user