finalize AI

This commit is contained in:
overcuriousity
2025-07-16 22:45:23 +02:00
parent 74f28f4fd9
commit 2b061db94e
5 changed files with 507 additions and 144 deletions

View File

@@ -368,6 +368,8 @@ Beispiele:
<script define:vars={{ toolsData: tools }}>
// Global tool data for quick lookup
window.aiToolsData = toolsData;
// Store AI session results
window.aiSessionResults = null;
// Authentication check function
async function checkAuthentication() {
@@ -454,6 +456,8 @@ document.addEventListener('DOMContentLoaded', () => {
queryInput.value = '';
charCount.textContent = '0';
hideAllStates();
// Clear session results
window.aiSessionResults = null;
});
}
@@ -461,10 +465,22 @@ document.addEventListener('DOMContentLoaded', () => {
if (newQueryBtn) {
newQueryBtn.addEventListener('click', () => {
hideAllStates();
// Clear session results
window.aiSessionResults = null;
queryInput?.focus();
});
}
// Function to restore previous results when switching back to AI view
function restoreSessionResults() {
if (window.aiSessionResults) {
showResults(window.aiSessionResults);
}
}
// Make restore function globally accessible
window.restoreAIResults = restoreSessionResults;
// State management functions
function showLoadingState() {
hideAllStates();
@@ -482,6 +498,8 @@ document.addEventListener('DOMContentLoaded', () => {
function showResults(recommendation) {
hideAllStates();
populateResults(recommendation);
// Save results to session
window.aiSessionResults = recommendation;
resultsEl.style.display = 'block';
submitBtn.disabled = false;
}
@@ -518,10 +536,14 @@ document.addEventListener('DOMContentLoaded', () => {
const phaseTools = recommendedTools.filter(tool => tool.phase === phaseId);
if (phaseTools.length === 0) {
container.innerHTML = '<p class="text-muted" style="font-size: 0.875rem; margin: 0; font-style: italic;">Keine spezifischen Tools für diese Phase empfohlen.</p>';
container.innerHTML = '<p class="text-muted" style="font-size: 0.875rem; margin: 0; font-style: italic; grid-column: 1 / -1; text-align: center; padding: 2rem;">Keine spezifischen Tools für diese Phase empfohlen.</p>';
return;
}
// Sort by priority: high -> medium -> low
const priorityOrder = { 'high': 1, 'medium': 2, 'low': 3 };
phaseTools.sort((a, b) => priorityOrder[a.priority] - priorityOrder[b.priority]);
container.innerHTML = phaseTools.map(recTool => {
const toolData = window.aiToolsData.find(t => t.name === recTool.name);
if (!toolData) return '';
@@ -543,15 +565,29 @@ document.addEventListener('DOMContentLoaded', () => {
"${recTool.justification}"
</div>
<div class="tool-rec-metadata">
<span>💻 ${(toolData.platforms || []).join(', ')}</span>
<span>•</span>
<span>📈 ${toolData.skillLevel}</span>
<span>•</span>
<span>📄 ${toolData.license}</span>
${hasValidProjectUrl ? '<span class="badge badge-primary">Self-Hosted</span>' : ''}
${isOSS ? '<span class="badge badge-success">Open Source</span>' : ''}
${hasKnowledgebase ? '<span class="badge badge-error">Infos 📖</span>' : ''}
<div style="margin-top: auto;">
<div class="tool-rec-metadata">
<div style="display: flex; align-items: center; gap: 0.25rem; margin-bottom: 0.5rem;">
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect>
<line x1="9" y1="9" x2="15" y2="9"></line>
<line x1="9" y1="15" x2="15" y2="15"></line>
</svg>
<span>${(toolData.platforms || []).join(', ')}</span>
</div>
<div style="display: flex; align-items: center; gap: 0.25rem; margin-bottom: 0.5rem;">
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<circle cx="12" cy="12" r="10"></circle>
<path d="M12 6v6l4 2"></path>
</svg>
<span>${toolData.skillLevel}</span>
</div>
<div style="display: flex; gap: 0.5rem; flex-wrap: wrap;">
${hasValidProjectUrl ? '<span class="badge badge-primary">Self-Hosted</span>' : ''}
${isOSS ? '<span class="badge badge-success">Open Source</span>' : ''}
${hasKnowledgebase ? '<span class="badge badge-error">Infos 📖</span>' : ''}
</div>
</div>
</div>
</div>
`;