/
Alcatraz
/
Wagomon
Обзор
Документация
Войти
/
Alcatraz
/
Wagomon
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/lib/visualization/dashboardsStore.js
140 строк
3 KB
saitgalineu
vkr
26 май 2026, 10:08
26 май 2026, 10:08
f9b2919
Код
Авторство
О чём код?
import { writable } from 'svelte/store'; /** * @typedef {Object} Dashboard * @property {number} id * @property {string} name * @property {string} updated_at */ /** * * @type {import('svelte/store').Writable<Dashboard[]>} */ export const dashboards = writable([]); /** * * @type {import('svelte/store').Writable<boolean>} */ export const dashboardsLoading = writable(false); /** * * @type {import('svelte/store').Writable<boolean>} */ export const isBackgroundRefresh = writable(false); /** * * @param {boolean} background * @returns {Promise<void>} */ export async function loadDashboards(background = false) { if (!background) { dashboardsLoading.set(true); } isBackgroundRefresh.set(background); try { const res = await fetch('/api/visualization'); if (!res.ok) { let message = 'Ошибка загрузки списка дэшбордов'; try { const payload = await res.json(); if (payload && typeof payload.error === 'string') { message = payload.error; } } catch { } throw new Error(message); } const result = await res.json(); const newDashboards = result.dashboards || []; dashboards.update((current) => { const oldList = current.map(d => ({ id: d.id, name: d.name, updated_at: d.updated_at })); const newList = newDashboards.map(d => ({ id: d.id, name: d.name, updated_at: d.updated_at })); const hasChanges = JSON.stringify(oldList) !== JSON.stringify(newList); return hasChanges ? newDashboards : current; }); } catch (e) { console.error('Ошибка загрузки дэшбордов:', e); if (!background) { throw new Error('Ошибка загрузки списка дэшбордов'); } } finally { if (!background) { dashboardsLoading.set(false); } isBackgroundRefresh.set(false); } } /** * * @param {string} name * @returns {Promise<void>} */ export async function createDashboard(name) { const res = await fetch('/api/visualization', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ action: 'create', dashboard: name.trim() }) }); if (!res.ok) { const err = await res.json(); throw new Error(err.error || 'Ошибка создания дэшборда'); } await loadDashboards(); } /** * * @param {string} dashboardName * @returns {Promise<void>} */ export async function deleteDashboard(dashboardName) { const res = await fetch(`/api/visualization?dashboard=${encodeURIComponent(dashboardName)}`, { method: 'DELETE' }); if (!res.ok) { const err = await res.json(); throw new Error(err.error || 'Ошибка удаления дэшборда'); } await loadDashboards(); } /** * * @param {string} oldName * @param {string} newName * @returns {Promise<void>} */ export async function renameDashboard(oldName, newName) { const res = await fetch('/api/visualization', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ action: 'rename', dashboard: oldName, newName: newName.trim() }) }); if (!res.ok) { const err = await res.json().catch(() => ({})); throw new Error(err.error || 'Ошибка переименования дэшборда'); } await loadDashboards(); }