This commit is contained in:
Tomas Dvorak
2025-05-30 16:16:45 +02:00
parent 7947f1d56b
commit 8fae5b8e0e
+30 -29
View File
@@ -1056,24 +1056,24 @@
<div class="md:col-span-2 space-y-4"> <div class="md:col-span-2 space-y-4">
<div class="grid grid-cols-1 md:grid-cols-2 gap-4"> <div class="grid grid-cols-1 md:grid-cols-2 gap-4">
<div class="form-group"> <div class="form-group">
<label for="appName" class="block text-sm font-medium text-gray-700 mb-1">Název aplikace</label> <label for="name" class="block text-sm font-medium text-gray-700 mb-1">Název aplikace</label>
<input type="text" id="appName" name="appName" class="form-control w-full" required> <input type="text" id="name" name="name" class="form-control w-full" required>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="appLink" class="block text-sm font-medium text-gray-700 mb-1">Odkaz</label> <label for="url" class="block text-sm font-medium text-gray-700 mb-1">Odkaz</label>
<input type="url" id="appLink" name="appLink" class="form-control w-full" required> <input type="url" id="url" name="url" class="form-control w-full" required>
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="appDescription" class="block text-sm font-medium text-gray-700 mb-1">Popis</label> <label for="description" class="block text-sm font-medium text-gray-700 mb-1">Popis</label>
<textarea id="appDescription" name="appDescription" rows="3" class="form-control w-full"></textarea> <textarea id="description" name="description" rows="3" class="form-control w-full"></textarea>
</div> </div>
</div> </div>
<div class="space-y-4"> <div class="space-y-4">
<div class="form-group"> <div class="form-group">
<label class="block text-sm font-medium text-gray-700 mb-2">Ikona</label> <label class="block text-sm font-medium text-gray-700 mb-2">Ikona</label>
<div class="flex items-center space-x-4"> <div class="flex items-center space-x-4">
<input type="text" id="appIcon" name="appIcon" class="form-control w-full cursor-pointer" placeholder="Vyberte ikonu" readonly> <input type="text" id="appIcon" name="iconClass" class="form-control w-full cursor-pointer" placeholder="Vyberte ikonu" readonly>
</div> </div>
<div id="iconPreview" class="mt-2 flex items-center justify-center w-16 h-16 bg-gray-100 rounded-md overflow-hidden"> <div id="iconPreview" class="mt-2 flex items-center justify-center w-16 h-16 bg-gray-100 rounded-md overflow-hidden">
<i id="selectedIcon" class="fas fa-cube text-2xl text-gray-400"></i> <i id="selectedIcon" class="fas fa-cube text-2xl text-gray-400"></i>
@@ -2609,43 +2609,44 @@ async function deleteApp(appId) {
async function saveApp(event) { async function saveApp(event) {
event.preventDefault(); event.preventDefault();
// Get form data // Get form values
const form = document.getElementById('appForm'); const name = document.getElementById('name').value.trim();
const formData = new FormData(form); const url = document.getElementById('url').value.trim();
const description = document.getElementById('description').value.trim();
// Get app ID const iconClass = document.getElementById('appIcon').value.trim();
const appId = document.getElementById('appId').value; const appId = document.getElementById('appId').value;
// Get icon class from the selected icon // Validate required fields
const iconClass = document.getElementById('appIcon').value; if (!name || !url || !iconClass) {
formData.set('iconClass', iconClass); showNotification('Název, URL a ikona jsou povinné pole', 'error');
return;
// Convert FormData to URL-encoded string
const urlEncoded = new URLSearchParams();
for (const [key, value] of formData.entries()) {
urlEncoded.append(key, value);
} }
// Create request URL // Create form data
const url = appId ? `/api/apps/${appId}` : '/api/apps'; const formData = new URLSearchParams();
formData.append('name', name);
formData.append('url', url);
formData.append('description', description);
formData.append('iconClass', iconClass);
// Set request method // Create request URL
const requestUrl = appId ? `/api/apps/${appId}` : '/api/apps';
const method = appId ? 'PUT' : 'POST'; const method = appId ? 'PUT' : 'POST';
// Send request
try { try {
const response = await fetch(url, { const response = await fetch(requestUrl, {
method: method, method: method,
headers: { headers: {
'Content-Type': 'application/x-www-form-urlencoded', 'Content-Type': 'application/x-www-form-urlencoded',
}, },
body: urlEncoded.toString(), body: formData.toString(),
credentials: 'include' credentials: 'include'
}); });
if (!response.ok) { if (!response.ok) {
const errorData = await response.json().catch(() => ({})); const errorText = await response.text();
throw new Error(errorData.error || 'Network response was not ok'); console.error('Server response:', errorText);
throw new Error(`HTTP error! status: ${response.status}`);
} }
const data = await response.json(); const data = await response.json();
@@ -2653,7 +2654,7 @@ async function saveApp(event) {
loadApps(); loadApps();
closeAppModal(); closeAppModal();
} catch (error) { } catch (error) {
console.error('Error:', error); console.error('Error saving app:', error);
showNotification(`Chyba při ukládání aplikace: ${error.message}`, 'error'); showNotification(`Chyba při ukládání aplikace: ${error.message}`, 'error');
} }
} }