limpiar HTML de descripciones KAPPA + sync proyectos a Turso

This commit is contained in:
2026-05-26 17:01:04 -05:00
parent eb71790f54
commit 54e1ba688f
3 changed files with 71 additions and 2 deletions
+24
View File
@@ -0,0 +1,24 @@
export function stripHtml(html: string): string {
if (!html) return ''
return html
.replace(/<[^>]*>/g, '')
.replace(/&nbsp;/g, ' ')
.replace(/&amp;/g, '&')
.replace(/&lt;/g, '<')
.replace(/&gt;/g, '>')
.replace(/&quot;/g, '"')
.replace(/&#39;/g, "'")
.replace(/\s+/g, ' ')
.trim()
}
export function extractFirstSentence(text: string, maxLen = 200): string {
const cleaned = stripHtml(text)
const match = cleaned.match(/^[^.!?]+[.!?]/)
if (match) return match[0].slice(0, maxLen)
return cleaned.slice(0, maxLen)
}
export function stripHtmlTags(html: string): string {
return stripHtml(html)
}
+21
View File
@@ -1,5 +1,15 @@
import { invoke } from '@tauri-apps/api/core' import { invoke } from '@tauri-apps/api/core'
export interface ProjectRecord {
id: number
name: string
key: string | null
description: string | null
status: string
start_date: string | null
end_date: string | null
}
export interface AlphaUserRecord { export interface AlphaUserRecord {
id: number id: number
email: string email: string
@@ -70,6 +80,17 @@ export interface PerformanceRecord {
} }
export const tauriDb = { export const tauriDb = {
// Projects
getProjects(): Promise<ProjectRecord[]> {
return invoke('get_projects')
},
saveProject(project: ProjectRecord): Promise<number> {
return invoke('save_project', { project })
},
deleteProject(id: number): Promise<void> {
return invoke('delete_project', { id })
},
// Users // Users
getUsers(): Promise<AlphaUserRecord[]> { getUsers(): Promise<AlphaUserRecord[]> {
return invoke('get_users') return invoke('get_users')
+26 -2
View File
@@ -1,6 +1,8 @@
import { defineStore } from 'pinia' import { defineStore } from 'pinia'
import { ref, computed } from 'vue' import { ref, computed } from 'vue'
import { kappa } from '@/services/kappa-api' import { kappa } from '@/services/kappa-api'
import { tauriDb } from '@/services/tauri-db'
import { stripHtml } from '@/services/clean-html'
import type { KappaInitiative } from '@/types/kappa' import type { KappaInitiative } from '@/types/kappa'
export const useProjectsStore = defineStore('projects', () => { export const useProjectsStore = defineStore('projects', () => {
@@ -20,8 +22,16 @@ export const useProjectsStore = defineStore('projects', () => {
error.value = null error.value = null
try { try {
const data = await kappa.getInitiatives() as KappaInitiative[] | { results?: KappaInitiative[] } const data = await kappa.getInitiatives() as KappaInitiative[] | { results?: KappaInitiative[] }
console.log('[KAPPA] initiatives:', data) const raw = Array.isArray(data) ? data : (data.results ?? [])
projects.value = Array.isArray(data) ? data : (data.results ?? [])
projects.value = raw.map(p => ({
...p,
description: stripHtml(p.description || ''),
name: p.name || p.initiative_name || `Proyecto ${p.id}`,
initiative_name: p.initiative_name || p.name,
}))
syncToTurso(projects.value)
} catch (e: any) { } catch (e: any) {
error.value = e.message error.value = e.message
} finally { } finally {
@@ -29,6 +39,20 @@ export const useProjectsStore = defineStore('projects', () => {
} }
} }
async function syncToTurso(list: KappaInitiative[]) {
for (const p of list) {
await tauriDb.saveProject({
id: p.id,
name: p.initiative_name || p.name || `Proyecto ${p.id}`,
key: p.key ?? null,
description: p.description ?? null,
status: p.status || 'active',
start_date: p.start_date ?? null,
end_date: p.end_date ?? null,
}).catch(() => {})
}
}
function select(id: number) { function select(id: number) {
selectedId.value = id selectedId.value = id
localStorage.setItem('kappa_last_project', String(id)) localStorage.setItem('kappa_last_project', String(id))