$(document).ready(function() { // Bootstrap Initialisierungen const popoverTriggerList = document.querySelectorAll('[data-bs-toggle="popover"]'); const popoverList = [...popoverTriggerList].map(popoverTriggerEl => new bootstrap.Popover(popoverTriggerEl)); const tooltipTriggerList = document.querySelectorAll('[data-bs-toggle="tooltip"]'); const tooltipList = [...tooltipTriggerList].map(tooltipTriggerEl => new bootstrap.Tooltip(tooltipTriggerEl)); // NEU: DataTables für die Samen-Tabelle initialisieren if ($('#seeds-table').length) { $('#seeds-table').DataTable({ "dom": "t", // 't' bedeutet, dass NUR die Tabelle gerendert wird, ohne zusätzliche Controls "paging": false, // Keine Paginierung "info": false, // Keine "Zeige x von y Einträgen"-Info "language": { "zeroRecords": "Keine passenden Samen gefunden", }, "columnDefs": [ { "orderable": false, "targets": 'no-sort' } ] }); } // Zonen Logik $('#zoneModal').on('show.bs.modal', function(event) { const button = $(event.relatedTarget); const form = $('#zone-form'); form.trigger('reset'); if (button.data('id')) { $('#zoneModalLabel').text('Zone bearbeiten'); form.find('[name="name"]').val(button.data('name')); form.find('[name="id"]').val(button.data('id')); form.find('[name="action"]').val('edit_zone'); } else { $('#zoneModalLabel').text('Neue Zone hinzufügen'); form.find('[name="action"]').val('add_zone'); } }); $('#zone-form').on('submit', function(e) { e.preventDefault(); handleFormSubmit($(this)); }); // Pflanzgefäß Logik $('#containerModal').on('show.bs.modal', function(event) { const button = $(event.relatedTarget); const form = $('#container-form'); form.trigger('reset'); if (button.data('id')) { $('#containerModalLabel').text('Pflanzgefäß bearbeiten'); form.find('[name="name"]').val(button.data('name')); form.find('[name="id"]').val(button.data('id')); form.find('[name="zone_id"]').val(button.data('zoneid')); form.find('[name="action"]').val('edit_container'); } else { $('#containerModalLabel').text('Neues Pflanzgefäß hinzufügen'); form.find('[name="action"]').val('add_container'); } }); $('#container-form').on('submit', function(e) { e.preventDefault(); handleFormSubmit($(this)); }); // Samen Logik $('#seedModal').on('show.bs.modal', function(event) { const button = $(event.relatedTarget); const form = $('#seed-form'); form.trigger('reset'); $('#ratio_sativa').val(50).trigger('input'); if (button.data('seed')) { $('#seedModalLabel').text('Samen bearbeiten'); const seedData = button.data('seed'); form.find('[name="id"]').val(seedData.id); form.find('[name="strain_name"]').val(seedData.strain_name); form.find('[name="internal_name"]').val(seedData.internal_name); form.find('[name="stock_count"]').val(seedData.stock_count); form.find('[name="info_url"]').val(seedData.info_url); form.find('[name="description"]').val(seedData.description); form.find('[name="ratio_sativa"]').val(seedData.ratio_sativa).trigger('input'); form.find('[name="is_autoflower"]').prop('checked', seedData.is_autoflower == 1); form.find('[name="action"]').val('edit_seed'); } else { $('#seedModalLabel').text('Neuen Samen hinzufügen'); form.find('[name="action"]').val('add_seed'); } }); $('#seed-form').on('submit', function(e) { e.preventDefault(); handleFormSubmit($(this)); }); $('#ratio_sativa').on('input', function() { let sativa = $(this).val(); $('#sativa-value-label').text(sativa); $('#indica-value-label').text(100 - sativa); }); // Pflanzen Logik $('#plant-form, #edit-plant-form, #activity-form, #measurement-form, #global-activity-form').on('submit', function(e) { e.preventDefault(); handleFormSubmit($(this)); }); $('#image-upload-form').on('submit', function(e) { e.preventDefault(); const formData = new FormData(this); $.ajax({ type: 'POST', url: 'ajax_handler.php', data: formData, dataType: 'json', contentType: false, processData: false, success: function(response) { if (response.success) { location.reload(); } else { alert('Fehler beim Upload: ' + (response.message || 'Unbekannter Fehler')); } }, error: function() { alert('Ein schwerwiegender Serverfehler ist aufgetreten.'); } }); }); $('#editPlantModal').on('show.bs.modal', function(event) { const button = $(event.relatedTarget); const form = $('#edit-plant-form'); const plantData = button.data('plant-info'); form.find('[name="phase"]').val(plantData.phase); form.find('[name="plant_date"]').val(plantData.plant_date); form.find('[name="zone_id"]').val(plantData.zone_id).trigger('change', [plantData.container_id]); }); $('#zone-select, #edit-zone-select').on('change', function(event, preselectContainerId) { const zoneId = $(this).val(); const isEditMode = $(this).attr('id') === 'edit-zone-select'; const containerSelect = isEditMode ? $('#edit-container-select') : $('#container-select'); containerSelect.prop('disabled', true).html(''); if (!zoneId) { containerSelect.html(''); return; } $.ajax({ type: 'GET', url: 'ajax_handler.php', data: { action: 'get_containers_by_zone', zone_id: zoneId }, dataType: 'json', success: function(response) { if (response.success) { containerSelect.empty().append(''); if (isEditMode && preselectContainerId) { const plantData = $('.edit-plant-btn').data('plant-info'); containerSelect.append($(''); } }, error: function() { containerSelect.html(''); } }); }); $('#confirmHarvestBtn').on('click', function() { const plantId = $('#edit-plant-form [name="plant_id"]').val(); if (plantId) { $.ajax({ type: 'POST', url: 'ajax_handler.php', data: { action: 'harvest_plant', plant_id: plantId }, dataType: 'json', success: function(response) { if (response.success) { location.reload(); } else { alert('Aktion fehlgeschlagen: ' + (response.message || 'Unbekannter Fehler')); } }, error: () => alert('Serverfehler!') }); } }); $('#confirmFinishDryingBtn').on('click', function() { const plantId = $('#edit-plant-form [name="plant_id"]').val(); if (plantId) { $.ajax({ type: 'POST', url: 'ajax_handler.php', data: { action: 'finish_drying', plant_id: plantId }, dataType: 'json', success: function(response) { if (response.success) { location.reload(); } else { alert('Aktion fehlgeschlagen: ' + (response.message || 'Unbekannter Fehler')); } }, error: () => alert('Serverfehler!') }); } }); $('#addActivityModal').on('show.bs.modal', function() { const now = new Date(); now.setMinutes(now.getMinutes() - now.getTimezoneOffset()); const localDateTime = now.toISOString().slice(0,16); $(this).find('input[type="datetime-local"]').val(localDateTime); }); $('#addMeasurementModal').on('show.bs.modal', function() { const today = new Date().toISOString().slice(0, 10); $(this).find('input[type="date"]').val(today); }); $('#generate-api-key-form').on('submit', function(e) { e.preventDefault(); if (confirm('Bist du sicher? Ein neuer Key macht einen eventuell bestehenden ungültig.')) { handleFormSubmit($(this)); } }); $('#change-username-form').on('submit', function(e) { e.preventDefault(); handleFormSubmit($(this)); }); $('#change-password-form').on('submit', function(e) { e.preventDefault(); $.ajax({ type: 'POST', url: 'ajax_handler.php', data: $(this).serialize(), dataType: 'json', success: function(response) { if (response.success) { $('#changePasswordModal').modal('hide'); alert(response.message); } else { alert('Fehler: ' + (response.message || 'Unbekannter Fehler')); } }, error: () => alert('Serverfehler!') }); }); const sensorTabBtn = document.querySelector('#sensor-tab-btn'); if (sensorTabBtn) { sensorTabBtn.addEventListener('shown.bs.tab', function () { if ($(this).data('loaded')) { return; } $(this).data('loaded', true); const plantId = new URLSearchParams(window.location.search).get('id'); const chartsContainer = $('#sensor-charts-container'); chartsContainer.html('