rename proyecto a Alpha, refactor imports a components/ui, fix types en stores

This commit is contained in:
Ricardo Gonzalez
2026-05-23 17:38:15 -05:00
parent 002d8f06d3
commit 72662852bf
24 changed files with 347 additions and 59 deletions
+181
View File
@@ -0,0 +1,181 @@
import { ref } from "vue"
import { kappa } from "@/services/kappa-api"
import type {
KappaInitiative,
KappaUserStory,
KappaLogbookEntry,
KappaPlanningEntry,
KappaBusinessRule,
KappaRequirement,
} from "@/types/kappa"
export interface SearchResult {
type: "initiative" | "userstory" | "logbook" | "planning" | "businessrule" | "requirement"
id: number
title: string
description?: string
projectId?: number
projectName?: string
}
export function useSearch() {
const results = ref<SearchResult[]>([])
const loading = ref(false)
const error = ref<string | null>(null)
async function search(query: string) {
if (!query.trim()) {
results.value = []
return
}
loading.value = true
error.value = null
try {
const allResults: SearchResult[] = []
const initiativeResult = await Promise.allSettled([kappa.getInitiatives()])
if (initiativeResult[0].status === "fulfilled") {
const data = initiativeResult[0].value as KappaInitiative[]
const items = Array.isArray(data) ? data : (data as { results?: KappaInitiative[] }).results ?? []
items.forEach((item: KappaInitiative) => {
if (matchesQuery(item.name || item.initiative_name || "", query) ||
matchesQuery(item.key || "", query) ||
matchesQuery(item.description || "", query)) {
allResults.push({
type: "initiative",
id: item.id,
title: item.name || item.initiative_name || `Project ${item.id}`,
description: item.description,
projectId: item.id,
projectName: item.name || item.initiative_name,
})
}
})
}
const storyResult = await Promise.allSettled([kappa.getUserStories()])
if (storyResult[0].status === "fulfilled") {
const data = storyResult[0].value as KappaUserStory[]
const items = Array.isArray(data) ? data : (data as { results?: KappaUserStory[] }).results ?? []
items.forEach((item: KappaUserStory) => {
if (matchesQuery(item.title, query) ||
matchesQuery(item.code || "", query) ||
matchesQuery(item.description || "", query)) {
allResults.push({
type: "userstory",
id: item.id || Math.random(),
title: item.title,
description: item.description,
projectId: typeof item.initiative === "number" ? item.initiative : undefined,
})
}
})
}
const logResult = await Promise.allSettled([kappa.getLogbooks()])
if (logResult[0].status === "fulfilled") {
const data = logResult[0].value as KappaLogbookEntry[]
const items = Array.isArray(data) ? data : (data as { results?: KappaLogbookEntry[] }).results ?? []
items.forEach((item: KappaLogbookEntry) => {
if (matchesQuery(item.description, query)) {
allResults.push({
type: "logbook",
id: item.id || Math.random(),
title: item.description.slice(0, 80),
description: item.description,
projectId: typeof item.initiative === "number" ? item.initiative : undefined,
})
}
})
}
const planResult = await Promise.allSettled([kappa.getPlannings()])
if (planResult[0].status === "fulfilled") {
const data = planResult[0].value as KappaPlanningEntry[]
const items = Array.isArray(data) ? data : (data as { results?: KappaPlanningEntry[] }).results ?? []
items.forEach((item: KappaPlanningEntry) => {
if (matchesQuery(item.description, query) ||
matchesQuery(item.responsible || "", query)) {
allResults.push({
type: "planning",
id: item.id || Math.random(),
title: item.description.slice(0, 80),
description: item.description,
projectId: typeof item.initiative === "number" ? item.initiative : undefined,
})
}
})
}
const ruleResult = await Promise.allSettled([kappa.getBusinessRules()])
if (ruleResult[0].status === "fulfilled") {
const data = ruleResult[0].value as KappaBusinessRule[]
const items = Array.isArray(data) ? data : (data as { results?: KappaBusinessRule[] }).results ?? []
items.forEach((item: KappaBusinessRule) => {
if (matchesQuery(item.name, query) ||
matchesQuery(item.description, query)) {
allResults.push({
type: "businessrule",
id: Math.random(),
title: item.name,
description: item.description,
projectId: typeof item.initiative === "number" ? item.initiative : undefined,
})
}
})
}
const reqResult = await Promise.allSettled([kappa.getRequirements()])
if (reqResult[0].status === "fulfilled") {
const data = reqResult[0].value as KappaRequirement[]
const items = Array.isArray(data) ? data : (data as { results?: KappaRequirement[] }).results ?? []
items.forEach((item: KappaRequirement) => {
if (matchesQuery(item.name || item.name_requirement || "", query) ||
matchesQuery(item.description, query)) {
allResults.push({
type: "requirement",
id: Math.random(),
title: item.name || item.name_requirement || "Requirement",
description: item.description,
projectId: typeof item.initiative === "number" ? item.initiative : undefined,
})
}
})
}
results.value = allResults
} catch (e: any) {
error.value = e.message
results.value = []
} finally {
loading.value = false
}
}
function matchesQuery(text: string, query: string): boolean {
return text.toLowerCase().includes(query.toLowerCase())
}
function clearResults() {
results.value = []
}
return {
results,
loading,
error,
search,
clearResults,
}
}
export const typeColors: Record<SearchResult["type"], { bg: string; text: string; label: string }> = {
initiative: { bg: "bg-blue-100 dark:bg-blue-900", text: "text-blue-700 dark:text-blue-300", label: "Project" },
userstory: { bg: "bg-green-100 dark:bg-green-900", text: "text-green-700 dark:text-green-300", label: "User Story" },
logbook: { bg: "bg-purple-100 dark:bg-purple-900", text: "text-purple-700 dark:text-purple-300", label: "Logbook" },
planning: { bg: "bg-orange-100 dark:bg-orange-900", text: "text-orange-700 dark:text-orange-300", label: "Planning" },
businessrule: { bg: "bg-red-100 dark:bg-red-900", text: "text-red-700 dark:text-red-300", label: "Rule" },
requirement: { bg: "bg-yellow-100 dark:bg-yellow-900", text: "text-yellow-700 dark:text-yellow-300", label: "Req" },
}