Interaktywne dashboardy Sprucely.io możesz zintegrować z własną witryną lub aplikacją internetową na trzy sposoby: osadzając je za pomocą standardowego elementu HTML iframe, renderując je natywnie za pomocą samodzielnego środowiska uruchomieniowego JavaScript, albo montując samodzielne komponenty React. iframe konfiguruje się najszybciej; samodzielne środowiska uruchomieniowe rysują dashboardy bezpośrednio na Twojej stronie i pozwalają na bieżąco dopisywać nowe dane w trakcie działania. Struktura JSON odczytywana przez samodzielne środowiska uruchomieniowe - dashboardy, wykresy i zbiory danych - jest opisana w referencji format danych. Informacje o automatyzacji dashboardów sterowanej przez AI znajdziesz w sekcji MCP API.
Osadzanie dashboardów w HTML
Najprostsza integracja wykorzystuje standardowy element HTML iframe i działa na dowolnej witrynie, a nawet na lokalnych stronach HTML. Aby dashboard poprawnie się załadował, musi być udostępniony - w Chmurze albo On-premise. Pamiętaj, że dashboardy On-premise ładują się wyłącznie wtedy, gdy klient uzyskujący do nich dostęp znajduje się w tej samej sieci firmowej.
Instrukcje:
1) Pobierz link do osadzenia dashboardu - Na stronie Dashboardy upewnij się, że Twój dashboard jest udostępniony, a następnie kliknij ikonę przy tym dashboardzie. Zielony baner powiadomi Cię, że link został skopiowany do schowka. Użyjesz go, aby zastąpić poniższą zawartość atrybutu src elementu HTML iframe.
2) Osadź dashboard w stałym rozmiarze
<html>
<head>
<title>Sprucely.io Dashboard</title>
</head>
<body>
<h1>Sprucely.io Dashboard</h1>
<iframe src="https://www.sprucely.io/service/dashboards/embed/[userId]/[dashboardId]/"
allow="clipboard-write"
style="height: 500px; width: 700px;"
title="Sprucely.io Dashboard"></iframe>
</body>
</html>(lub) Osadź dashboard z dynamiczną szerokością - Automatycznie dostosowuje rozmiar dashboardu na podstawie szerokości dokumentu nadrzędnego
Możesz użyć parametru stylu aspect-ratio, aby automatycznie przeliczać wysokość na podstawie szerokości.
<html>
<head>
<title>Sprucely.io Dashboard</title>
</head>
<body>
<h1>Sprucely.io Dashboard</h1>
<iframe src="https://www.sprucely.io/service/dashboards/embed/[userId]/[dashboardId]/"
allow="clipboard-write"
scrolling="no"
style="width: 100%; aspect-ratio: 1.5; border: none;"
title="Sprucely.io Dashboard"></iframe>
</body>
</html>3) Inne przydatne opcje osadzania
Możesz dodać własne modyfikacje stylu do bloku style elementu iframe, aby dostosować wygląd ramki. Te parametry są zgodne ze standardowymi wytycznymi HTML/CSS. Poniższy przykład dodaje szare obramowanie wokół dashboardu:
<html>
<head>
<title>Sprucely.io Dashboard</title>
</head>
<body>
<h1>Sprucely.io Dashboard</h1>
<iframe src="https://www.sprucely.io/service/dashboards/embed/[userId]/[dashboardId]/"
allow="clipboard-write"
style="height: 100%; width: 100%; border: 2px solid grey;"
title="Sprucely.io Dashboard"></iframe>
</body>
</html>Osadzanie za pomocą samodzielnego JavaScript
Samodzielne środowisko uruchomieniowe renderuje dashboardy bezpośrednio na Twojej stronie - bez iframe. Twoje dane są wczytywane do bazy danych działającej w przeglądarce i rysowane jako w pełni interaktywne wykresy; środowisko uruchomieniowe kontaktuje się ze Sprucely.io wyłącznie w celu zweryfikowania Twojego tokenu dostępu.
Instrukcje:
1) Utwórz token dostępu - W sekcji Tokeny dostępu swojego profilu utwórz token dostępu dla źródła (origin), z którego serwowane są Twoje strony (na przykład https://www.yourdomain.com). Przed renderowaniem środowisko uruchomieniowe sprawdza, czy źródło osadzającej strony zgadza się z tokenem.
2) Wczytaj środowisko uruchomieniowe i wyrenderuj dashboard - Dodaj skrypt środowiska uruchomieniowego do swojej strony, połącz raz bazę danych działającą w przeglądarce za pomocą sprucely_db, a następnie wyrenderuj każdy dashboard za pomocą sprucely_create. Poniższa kompletna strona podpina też przycisk, który dopisuje kolejne wiersze:
<html>
<head>
<title>Orders Dashboard</title>
</head>
<body>
<div id="database"></div>
<div id="orders_dashboard"></div>
<button onclick="addRows()">Add rows</button>
<script src="https://www.sprucely.io/cross-origin/sprucely-runtime.min.js"></script>
<script>
const data = {
name: "Orders",
headers: ["region", "amount", "items"],
types: ["VARCHAR", "FLOAT", "INTEGER"],
entries: [
["North", 120.50, 2],
["South", 89.95, 1],
["North", 432.00, 5],
["South", 74.50, 1]
]
};
const dashboard = {
config: {
type: "dashboard",
style: {
widget: {
color: "#667FFF",
backgroundColor: "#0C0B29",
primaryColor: "#01EEAE",
primaryColorSubtle: "#C70584",
secondaryColor: "#2C2B49"
}
}
},
data: {
type: "dash",
children: [
{
type: "dash_stacker_hor",
children: [
{ type: "dash_chart", datasetId: "Orders", x: "region", chartType: "bar", dataFunction: "count" },
{ type: "dash_chart", datasetId: "Orders", x: "amount", y: "items", chartType: "hexbin", dataFunction: "count" }
]
}
]
}
};
sprucely_db({
id: "database",
host: "https://www.yourdomain.com",
accessToken: "YOUR_ACCESS_TOKEN"
});
sprucely_create({ id: "orders_dashboard", dashboard, data });
function addRows() {
sprucely_add({
name: "Orders",
headers: ["region", "amount", "items"],
types: ["VARCHAR", "FLOAT", "INTEGER"],
entries: [
["East", 310.40, 3],
["West", 129.95, 1]
]
});
}
</script>
</body>
</html>3) Dopisuj dane w trakcie działania - W dowolnym momencie wywołaj sprucely_add z dodatkowymi wierszami. Każdy dashboard korzystający z tego zbioru danych odświeży się automatycznie:
sprucely_add({
name: "Orders",
headers: ["region", "amount", "items"],
types: ["VARCHAR", "FLOAT", "INTEGER"],
entries: [
["East", 310.40, 3],
["West", 129.95, 1]
]
});Opis funkcji
sprucely_db({ id, host, accessToken })- łączy bazę danych działającą w przeglądarce i weryfikuje Twój token dostępu względem źródła strony. Renderuje baner statusu w elemencie wskazanym przez id. Wywołaj ją raz na stronę, przed utworzeniem dashboardów.sprucely_create({ id, dashboard, data })- renderuje jeden dashboard w elemencie wskazanym przez id. Parametr dashboard definiuje układ i stylowanie; data dostarcza zbiór danych wraz z jego nazwą, nagłówkami, typami kolumn (VARCHAR,INTEGER,FLOATlubTIMESTAMP) i wierszami - patrz referencja format danych.sprucely_add(data)- dopisuje wiersze do zbioru danych, którego nazwa zgadza się z już wczytanym zbiorem danych, a następnie odświeża wszystkie dashboardy, które go używają.
Osadzanie za pomocą samodzielnego React
Jeśli Twoja witryna jest zbudowana w React, możesz renderować dashboardy jako komponenty zamiast ręcznie wczytywać skrypt. Komponenty korzystają z tych samych tokenów dostępu, definicji dashboardu i formatu zbioru danych co samodzielne środowisko uruchomieniowe JavaScript.
Instrukcje:
1) Utwórz token dostępu - Podobnie jak w przypadku samodzielnego JavaScript, utwórz token dostępu dla źródła swojej witryny w sekcji Tokeny dostępu swojego profilu.
2) Wyrenderuj komponenty dashboardu - Pobierz środowisko uruchomieniowe z https://www.sprucely.io/cross-origin/sprucely-runtime.min.cjs.js i umieść je w swoim projekcie. Zamontuj jeden komponent Sprucely.Database na stronę oraz jeden komponent Sprucely.Dashboard na dashboard. Dashboardy pokazują wskaźnik ładowania, dopóki baza danych nie zweryfikuje tokenu dostępu, a następnie się renderują. Poniższa kompletna aplikacja renderuje dwa dashboardy z osobnych zbiorów danych i po pięciu sekundach dopisuje nowe wiersze do pierwszego z nich:
// Get https://www.sprucely.io/cross-origin/sprucely-runtime.min.cjs.js
// and place it in your project, next to this file.
import React, { useEffect } from "react";
import { createRoot } from "react-dom/client";
import Sprucely, { sprucely_add } from "./sprucely-runtime.min.cjs.js";
const style = {
widget: {
color: "#667FFF",
backgroundColor: "#0C0B29",
primaryColor: "#01EEAE",
primaryColorSubtle: "#C70584",
secondaryColor: "#2C2B49"
}
};
const orders = {
name: "Orders",
headers: ["region", "amount", "items"],
types: ["VARCHAR", "FLOAT", "INTEGER"],
entries: [
["North", 120.50, 2],
["South", 89.95, 1],
["North", 432.00, 5],
["South", 74.50, 1]
]
};
const returns = {
name: "Returns",
headers: ["reason", "amount", "days"],
types: ["VARCHAR", "FLOAT", "INTEGER"],
entries: [
["Damaged", 45.00, 3],
["Late", 12.50, 8],
["Changed", 99.90, 2]
]
};
const moreOrders = {
name: "Orders",
headers: ["region", "amount", "items"],
types: ["VARCHAR", "FLOAT", "INTEGER"],
entries: [
["East", 310.40, 3],
["West", 129.95, 1]
]
};
const ordersDashboard = {
config: { type: "dashboard", style },
data: {
type: "dash",
children: [
{
type: "dash_stacker_hor",
children: [
{ type: "dash_chart", datasetId: "Orders", x: "region", chartType: "bar", dataFunction: "count" },
{ type: "dash_chart", datasetId: "Orders", x: "amount", y: "items", chartType: "hexbin", dataFunction: "count" }
]
}
]
}
};
const returnsDashboard = {
config: { type: "dashboard", style },
data: {
type: "dash",
children: [
{
type: "dash_stacker_hor",
children: [
{ type: "dash_chart", datasetId: "Returns", x: "amount", y: "days", d: "amount", r: "days", chartType: "dot", dataFunction: "average" }
]
}
]
}
};
const App = () => {
useEffect(() => {
const timer = setTimeout(() => { sprucely_add(moreOrders); }, 5000);
return () => clearTimeout(timer);
}, []);
return (
<>
<Sprucely.Database host="https://www.yourdomain.com" accessToken="YOUR_ACCESS_TOKEN" />
<Sprucely.Dashboard id="orders_dashboard" dashboard={ordersDashboard} data={orders} />
<Sprucely.Dashboard id="returns_dashboard" dashboard={returnsDashboard} data={returns} />
</>
);
};
createRoot(document.getElementById("root")).render(<App />);Wydawanie krótkotrwałych tokenów
Token dostępu, który tworzysz powyżej, jest długoterminowy i ma pozostać sekretem po stronie serwera. Jeśli strony z osadzonym dashboardem serwuje Twój własny backend - a nie strona pozbawiona własnego backendu - wcale nie musisz umieszczać na niej tego długoterminowego tokenu - Twój backend może wymienić go, w komunikacji serwer-serwer, na krótkotrwały (15-minutowy) token renderowania tuż przed wysłaniem każdej strony, dzięki czemu do przeglądarki trafia wyłącznie token renderowania. Token renderowania, który odwiedzający wyodrębni ze strony, jest użyteczny jedynie przez kilka minut, a nie bezterminowo.
Instrukcje:
1) Wymień token dostępu na token renderowania - z poziomu swojego backendu wywołaj POST https://www.sprucely.io/api/auth/render_token z tokenem dostępu jako poświadczeniem bearer. Odpowiedź zawiera nowy token, powiązany z nim host oraz czas jego ważności w sekundach:
// On your server, immediately before serving each embedding page:
const response = await fetch("https://www.sprucely.io/api/auth/render_token", {
method: "POST",
headers: { Authorization: "Bearer " + process.env.SPRUCELY_ACCESS_TOKEN }
});
const { token, expires_in } = await response.json(); // expires_in: 900 (15 minutes)
// Send only the render token to the browser - never the long-lived access
// token itself:
res.send(`
<script src="https://www.sprucely.io/cross-origin/sprucely-runtime.min.js"></script>
<script>
sprucely_db({
id: "database",
host: "https://www.yourdomain.com",
accessToken: "${token}"
});
</script>
`);2) Prześlij token renderowania do przeglądarki - używaj go dokładnie tak jak tokenu dostępu przy wywoływaniu sprucely_db lub montowaniu Sprucely.Database. Powtarzaj wymianę przed wysłaniem każdej strony (lub cyklicznie, jeśli renderowaną stronę buforujesz), tak aby przeglądarka nigdy nie otrzymywała tokenu ważnego dłużej niż 15 minut.
Opis funkcji
POST /api/auth/render_token- wymienia ważny token dostępu, przesłany jakoAuthorization: Bearer <token>, na token renderowania. Zwraca{ token, host, expires_in }, przy czymexpires_injest zawsze równe 900 sekund. Tokenu renderowania nie można wymienić na kolejny token renderowania - o nowy token może wystąpić wyłącznie długoterminowy token dostępu.
Ustawienia zabezpieczeń
Jeśli Twoja witryna wymusza Content Security Policy (CSP), opisane powyżej integracje samodzielnego JavaScript i React wymagają dopuszczenia kilku źródeł, zanim dashboardy się załadują - środowisko uruchomieniowe wczytuje swój skrypt ze Sprucely.io, otwiera bazę danych działającą w przeglądarce opartą na WebAssembly oraz weryfikuje Twój token dostępu względem naszego API, a każdy z tych elementów wymaga jawnego dopuszczenia w CSP. Jeśli Twoja witryna nie korzysta z CSP, możesz pominąć tę sekcję.
Dodaj poniższe źródła do swojej istniejącej polityki - są to dyrektywy do połączenia z tym, co już masz, a nie kompletna polityka mająca to zastąpić:
script-src 'self' https://www.sprucely.io 'wasm-unsafe-eval';
connect-src 'self' https://www.sprucely.io;
worker-src 'self' blob: https://www.sprucely.io;Do czego służy każda dyrektywa:
script-src-https://www.sprucely.iowczytuje skrypt środowiska uruchomieniowego.'wasm-unsafe-eval'jest wymagane do skompilowania i uruchomienia bazy danych działającej w przeglądarce, która jest zbudowana na WebAssembly.connect-src-https://www.sprucely.iojest kontaktowane w celu zweryfikowania Twojego tokenu dostępu oraz wczytania plików WebAssembly i workera bazy danych.worker-src- baza danych działająca w przeglądarce wykonuje swoje zapytania w wątku w tle, utworzonym z adresu URLblob:.
Żadna z powyższych dyrektyw nie wymaga 'unsafe-inline' - samo środowisko uruchomieniowe Sprucely nigdy go nie potrzebuje. Jeśli własne definicje dashboardu i zbioru danych trzymasz w tagu inline <script>, tak jak w powyższym przykładzie samodzielnego JavaScript, albo Twoja strona korzysta ze stylów inline, dodaj 'unsafe-inline' do script-src lub style-src, albo rozważ użycie CSP nonce.