fix: switch production build to webpack
This commit is contained in:
parent
1079111de2
commit
ea8612b8fd
7 changed files with 48 additions and 31 deletions
11
README.md
11
README.md
|
|
@ -1,6 +1,6 @@
|
||||||
## Sistema de Chamados
|
## Sistema de Chamados
|
||||||
|
|
||||||
Aplicação **Next.js 16 (App Router)** com **React 19**, **Convex** e **Better Auth** para gestão de tickets da Rever. A stack ainda inclui **Prisma 6** (SQLite padrão para DEV), **Tailwind** e **Turbopack** como bundler padrão. Todo o código-fonte fica na raiz do monorepo seguindo as convenções do App Router.
|
Aplicação **Next.js 16 (App Router)** com **React 19**, **Convex** e **Better Auth** para gestão de tickets da Rever. A stack ainda inclui **Prisma 6** (SQLite padrão para DEV), **Tailwind** e **Turbopack** em desenvolvimento (o build de produção roda com o webpack padrão do Next). Todo o código-fonte fica na raiz do monorepo seguindo as convenções do App Router.
|
||||||
|
|
||||||
## Requisitos
|
## Requisitos
|
||||||
|
|
||||||
|
|
@ -35,7 +35,7 @@ Aplicação **Next.js 16 (App Router)** com **React 19**, **Convex** e **Better
|
||||||
bun run convex:dev:bun
|
bun run convex:dev:bun
|
||||||
```
|
```
|
||||||
> Alternativa: `bun run convex:dev` (runtime Node) caso queira manter o comportamento anterior.
|
> Alternativa: `bun run convex:dev` (runtime Node) caso queira manter o comportamento anterior.
|
||||||
7. Em outro terminal, suba o frontend Next.js (Turbopack):
|
7. Em outro terminal, suba o frontend Next.js (dev com Turbopack):
|
||||||
```bash
|
```bash
|
||||||
bun run dev:bun
|
bun run dev:bun
|
||||||
```
|
```
|
||||||
|
|
@ -66,10 +66,11 @@ Para fluxos detalhados de desenvolvimento — banco de dados local (SQLite/Prism
|
||||||
- `bun run dev:bun` — padrão atual para o Next.js com runtime Bun (`bun run dev:webpack` permanece como fallback).
|
- `bun run dev:bun` — padrão atual para o Next.js com runtime Bun (`bun run dev:webpack` permanece como fallback).
|
||||||
- `bun run convex:dev:bun` — runtime Bun para o Convex (`bun run convex:dev` mantém o fluxo antigo usando Node).
|
- `bun run convex:dev:bun` — runtime Bun para o Convex (`bun run convex:dev` mantém o fluxo antigo usando Node).
|
||||||
- `bun run build:bun` / `bun run start:bun` — build e serve com Bun; `bun run build` mantém o fallback Node.
|
- `bun run build:bun` / `bun run start:bun` — build e serve com Bun; `bun run build` mantém o fallback Node.
|
||||||
- `bun run dev:webpack` / `bun run build:webpack` — fallback oficial caso Turbopack apresente problemas.
|
- `bun run dev:webpack` — fallback do Next.js em modo desenvolvimento (webpack).
|
||||||
- `bun run lint` — ESLint com as regras do projeto.
|
- `bun run lint` — ESLint com as regras do projeto.
|
||||||
- `bun test` — suíte de testes unitários usando o runner do Bun (o teste de screenshot fica automaticamente ignorado se o matcher não existir).
|
- `bun test` — suíte de testes unitários usando o runner do Bun (o teste de screenshot fica automaticamente ignorado se o matcher não existir).
|
||||||
- `bun run build` — executa `next build --turbopack` usando Node como fallback.
|
- `bun run build` — executa `next build --webpack` (webpack padrão do Next).
|
||||||
|
- `bun run build:turbopack` — executa `next build --turbopack` para reproduzir/debugar problemas.
|
||||||
- `bun run auth:seed` — atualiza/cria contas padrão do Better Auth (credenciais em `agents.md`).
|
- `bun run auth:seed` — atualiza/cria contas padrão do Better Auth (credenciais em `agents.md`).
|
||||||
- `bunx prisma migrate deploy` — aplica migrações ao banco SQLite local.
|
- `bunx prisma migrate deploy` — aplica migrações ao banco SQLite local.
|
||||||
- `bun run convex:dev` — roda o Convex em modo desenvolvimento com Node, gerando tipos em `convex/_generated`.
|
- `bun run convex:dev` — roda o Convex em modo desenvolvimento com Node, gerando tipos em `convex/_generated`.
|
||||||
|
|
@ -106,7 +107,7 @@ Consulte `PROXIMOS_PASSOS.md` para acompanhar o backlog funcional e o progresso
|
||||||
|
|
||||||
- `bun install` é o fluxo padrão (o arquivo `bun.lock` deve ser versionado; use `bun install --frozen-lockfile` em CI).
|
- `bun install` é o fluxo padrão (o arquivo `bun.lock` deve ser versionado; use `bun install --frozen-lockfile` em CI).
|
||||||
- `bun run dev:bun`, `bun run convex:dev:bun`, `bun run build:bun` e `bun run start:bun` já estão configurados; internamente executam `bun run --bun <script>` para usar o runtime do Bun sem abrir mão dos scripts existentes. O `cross-env` garante os valores esperados de `NODE_ENV` (`development`/`production`).
|
- `bun run dev:bun`, `bun run convex:dev:bun`, `bun run build:bun` e `bun run start:bun` já estão configurados; internamente executam `bun run --bun <script>` para usar o runtime do Bun sem abrir mão dos scripts existentes. O `cross-env` garante os valores esperados de `NODE_ENV` (`development`/`production`).
|
||||||
- Em caso de incompatibilidade do Turbopack (relatada em algumas combinações Bun + Next 16), use `bun run dev:webpack` ou `bun run build:webpack` como fallback imediato.
|
- Se precisar validar o bundler experimental, use `bun run build:turbopack`; para o fluxo estável mantenha `bun run build` (webpack).
|
||||||
- `bun test` utiliza o test runner do Bun. O teste de snapshot de screenshot é automaticamente ignorado quando o matcher não está disponível; testes de navegador completos continuam via `bun run test:browser` (Vitest + Playwright).
|
- `bun test` utiliza o test runner do Bun. O teste de snapshot de screenshot é automaticamente ignorado quando o matcher não está disponível; testes de navegador completos continuam via `bun run test:browser` (Vitest + Playwright).
|
||||||
|
|
||||||
<!-- ci: smoke test 3 -->
|
<!-- ci: smoke test 3 -->
|
||||||
|
|
|
||||||
10
agents.md
10
agents.md
|
|
@ -19,10 +19,10 @@ Os demais colaboradores reais são provisionados via **Convites & acessos**. Cas
|
||||||
- Seeds de usuários/tickets demo: `convex/seed.ts`.
|
- Seeds de usuários/tickets demo: `convex/seed.ts`.
|
||||||
- Para DEV: rode `bun run convex:dev:bun` e acesse `/dev/seed` uma vez para popular dados realistas.
|
- Para DEV: rode `bun run convex:dev:bun` e acesse `/dev/seed` uma vez para popular dados realistas.
|
||||||
|
|
||||||
## Stack atual (18/10/2025)
|
## Stack atual (06/11/2025)
|
||||||
- **Next.js**: `15.5.5` (Turbopack em produção + cache de filesystem em DEV).
|
- **Next.js**: `16.0.1` (Turbopack em desenvolvimento; builds de produção usam webpack).
|
||||||
- Whitelist de domínios em `src/config/allowed-hosts.ts` é aplicada pelo `middleware.ts`.
|
- Whitelist de domínios em `src/config/allowed-hosts.ts` é aplicada pelo `middleware.ts`.
|
||||||
- **React / React DOM**: `18.2.0`.
|
- **React / React DOM**: `19.2.0`.
|
||||||
- **Trilha de testes**: Vitest (`bun test`) sem modo watch por padrão (`--run --passWithNoTests`).
|
- **Trilha de testes**: Vitest (`bun test`) sem modo watch por padrão (`--run --passWithNoTests`).
|
||||||
- **CI**: workflow `Quality Checks` (`.github/workflows/quality-checks.yml`) roda `bun install`, `bun run prisma:generate`, `bun run lint`, `bun test`, `bun run build:bun`. Variáveis críticas (`BETTER_AUTH_SECRET`, `NEXT_PUBLIC_APP_URL`, etc.) são definidas apenas no runner — não afetam a VPS.
|
- **CI**: workflow `Quality Checks` (`.github/workflows/quality-checks.yml`) roda `bun install`, `bun run prisma:generate`, `bun run lint`, `bun test`, `bun run build:bun`. Variáveis críticas (`BETTER_AUTH_SECRET`, `NEXT_PUBLIC_APP_URL`, etc.) são definidas apenas no runner — não afetam a VPS.
|
||||||
- **Disciplina pós-mudanças**: sempre que fizer alterações locais, rode **obrigatoriamente** `bun run lint`, `bun run build:bun` e `bun test` antes de entregar ou abrir PR. Esses comandos são mandatórios também para os agentes/automations, garantindo que o projeto continua íntegro.
|
- **Disciplina pós-mudanças**: sempre que fizer alterações locais, rode **obrigatoriamente** `bun run lint`, `bun run build:bun` e `bun test` antes de entregar ou abrir PR. Esses comandos são mandatórios também para os agentes/automations, garantindo que o projeto continua íntegro.
|
||||||
|
|
@ -90,7 +90,7 @@ bun run build:bun
|
||||||
- **Testes unitários/integrados (Vitest)**:
|
- **Testes unitários/integrados (Vitest)**:
|
||||||
- Cobertura atual inclui utilitários (`tests/*.test.ts`), rotas `/api/machines/*` e `sendSmtpMail`.
|
- Cobertura atual inclui utilitários (`tests/*.test.ts`), rotas `/api/machines/*` e `sendSmtpMail`.
|
||||||
- Executar `bun test -- --watch` apenas quando precisar de modo interativo.
|
- Executar `bun test -- --watch` apenas quando precisar de modo interativo.
|
||||||
- **Build**: `bun run build:bun` (`next build --turbopack`).
|
- **Build**: `bun run build:bun` (`next build --webpack`, webpack). Para reproduzir problemas do bundler experimental, use `bun run build:turbopack`.
|
||||||
- **CI**: falhas mais comuns
|
- **CI**: falhas mais comuns
|
||||||
- `ERR_BUN_LOCKFILE_OUTDATED`: confirme que o `bun.lock` foi regenerado (`bun install`) após alterar dependências, especialmente do app desktop.
|
- `ERR_BUN_LOCKFILE_OUTDATED`: confirme que o `bun.lock` foi regenerado (`bun install`) após alterar dependências, especialmente do app desktop.
|
||||||
- Variáveis Better Auth ausentes (`BETTER_AUTH_SECRET`): definidas no workflow (`Quality Checks`).
|
- Variáveis Better Auth ausentes (`BETTER_AUTH_SECRET`): definidas no workflow (`Quality Checks`).
|
||||||
|
|
@ -168,4 +168,4 @@ bun run build:bun
|
||||||
- `docs/admin-inventory-ui.md`, `docs/plano-app-desktop-maquinas.md` — detalhes do inventário/agente.
|
- `docs/admin-inventory-ui.md`, `docs/plano-app-desktop-maquinas.md` — detalhes do inventário/agente.
|
||||||
|
|
||||||
---
|
---
|
||||||
_Última atualização: 18/10/2025 (Next.js 15.5.5 estável, Turbopack, fluxos desktop + portal documentados)._
|
_Última atualização: 06/11/2025 (Next.js 16, build de produção com webpack, fluxos desktop + portal documentados)._
|
||||||
|
|
|
||||||
16
docs/DEV.md
16
docs/DEV.md
|
|
@ -6,7 +6,7 @@ Este documento consolida o estado atual do ambiente de desenvolvimento, descreve
|
||||||
|
|
||||||
- **Bun (runtime padrão)**: 1.3+ já instalado no runner e VPS (`bun --version`). Após instalar localmente, exporte `PATH="$HOME/.bun/bin:$PATH"` para tornar o binário disponível. Use `bun install`, `bun run dev:bun`, `bun run convex:dev:bun`, `bun run build:bun` e `bun test` como fluxo principal (scripts Node continuam disponíveis como fallback).
|
- **Bun (runtime padrão)**: 1.3+ já instalado no runner e VPS (`bun --version`). Após instalar localmente, exporte `PATH="$HOME/.bun/bin:$PATH"` para tornar o binário disponível. Use `bun install`, `bun run dev:bun`, `bun run convex:dev:bun`, `bun run build:bun` e `bun test` como fluxo principal (scripts Node continuam disponíveis como fallback).
|
||||||
- **Node.js**: mantenha a versão 20.9+ instalada para ferramentas auxiliares (Prisma CLI, scripts legados em Node) quando não estiver usando o runtime do Bun.
|
- **Node.js**: mantenha a versão 20.9+ instalada para ferramentas auxiliares (Prisma CLI, scripts legados em Node) quando não estiver usando o runtime do Bun.
|
||||||
- **Next.js 15.5.5**: Projeto voltou para a versão estável (`next@15.5.5`) com Turbopack como bundler padrão e whitelist de domínios garantida pelo middleware.
|
- **Next.js 16**: Projeto roda em `next@16.0.1` com Turbopack apenas no ambiente de desenvolvimento; builds de produção usam o webpack padrão do framework.
|
||||||
- **Lint/Test/Build**: `bun run lint`, `bun test`, `bun run build:bun`. O test runner do Bun já roda em modo não interativo; utilize `bunx vitest --watch` apenas quando precisar do modo watch manualmente.
|
- **Lint/Test/Build**: `bun run lint`, `bun test`, `bun run build:bun`. O test runner do Bun já roda em modo não interativo; utilize `bunx vitest --watch` apenas quando precisar do modo watch manualmente.
|
||||||
- **Banco DEV**: SQLite em `prisma/prisma/db.dev.sqlite`. Defina `DATABASE_URL="file:./prisma/db.dev.sqlite"` ao chamar CLI do Prisma.
|
- **Banco DEV**: SQLite em `prisma/prisma/db.dev.sqlite`. Defina `DATABASE_URL="file:./prisma/db.dev.sqlite"` ao chamar CLI do Prisma.
|
||||||
- **Desktop (Tauri)**: fonte em `apps/desktop`. Usa Radix tabs + componentes shadcn-like, integra com os endpoints `/api/machines/*` e suporta atualização automática via GitHub Releases.
|
- **Desktop (Tauri)**: fonte em `apps/desktop`. Usa Radix tabs + componentes shadcn-like, integra com os endpoints `/api/machines/*` e suporta atualização automática via GitHub Releases.
|
||||||
|
|
@ -35,12 +35,11 @@ Este documento consolida o estado atual do ambiente de desenvolvimento, descreve
|
||||||
|
|
||||||
> **Por quê inline?** Evitamos declarar `DATABASE_URL` em `prisma/.env` porque o Prisma lê também o `.env` da raiz (produção). O override inline garante isolamento do banco DEV.
|
> **Por quê inline?** Evitamos declarar `DATABASE_URL` em `prisma/.env` porque o Prisma lê também o `.env` da raiz (produção). O override inline garante isolamento do banco DEV.
|
||||||
|
|
||||||
## Next.js 15 (estável)
|
## Next.js 16 (estável)
|
||||||
|
|
||||||
- Mantemos o projeto em `next@15.5.5`, priorizando estabilidade enquanto acompanhamos as novidades do 16.
|
- Mantemos o projeto em `next@16.0.1`, com React 19 e o App Router completo.
|
||||||
- **React 18.2**: voltamos para a versão suportada oficialmente pelo Next 15. Evite APIs exclusivas do React 19 (`use(...)`, `useActionState`, etc.).
|
- **Bundlers**: Turbopack permanece habilitado no `next dev`/`bun run dev:bun` pela velocidade, mas o `next build --webpack` é o caminho oficial para produção. Execute `bun run build:turbopack` apenas para reproduzir bugs.
|
||||||
- **Turbopack** segue como bundler padrão, sem flags experimentais adicionais.
|
- **Whitelist de hosts**: o release estável continua sem aceitar `server.allowedHosts` (vide [`invalid-next-config`](https://nextjs.org/docs/messages/invalid-next-config)), portanto bloqueamos domínios exclusivamente via `middleware.ts`.
|
||||||
- **Whitelist de hosts**: o release estável 15.5 não aceita `server.allowedHosts` (vide [`invalid-next-config`](https://nextjs.org/docs/messages/invalid-next-config)), portanto bloqueamos domínios exclusivamente via `middleware.ts`.
|
|
||||||
|
|
||||||
### Editor rich text (TipTap) — menções de ticket
|
### Editor rich text (TipTap) — menções de ticket
|
||||||
|
|
||||||
|
|
@ -53,9 +52,10 @@ Este documento consolida o estado atual do ambiente de desenvolvimento, descreve
|
||||||
|
|
||||||
- `bun run lint`: executa ESLint (flat config) sobre os arquivos do projeto.
|
- `bun run lint`: executa ESLint (flat config) sobre os arquivos do projeto.
|
||||||
- `bun test`: roda a suíte de testes utilizando o runner nativo do Bun. Para modo watch, use `bunx vitest --watch` manualmente.
|
- `bun test`: roda a suíte de testes utilizando o runner nativo do Bun. Para modo watch, use `bunx vitest --watch` manualmente.
|
||||||
- `bun run build:bun`: `next build --turbopack` usando o runtime Bun. `bun run build` permanece disponível como fallback em Node.
|
- `bun run build:bun`: `next build --webpack` usando o runtime Bun (webpack).
|
||||||
- Scripts com Bun (padrão atual): `bun run dev:bun`, `bun run convex:dev:bun`, `bun run build:bun`, `bun run start:bun`. Eles mantêm os scripts existentes, apenas forçando o runtime do Bun via `bun run --bun`. O `cross-env` garante `NODE_ENV` consistente (`development`/`production`).
|
- Scripts com Bun (padrão atual): `bun run dev:bun`, `bun run convex:dev:bun`, `bun run build:bun`, `bun run start:bun`. Eles mantêm os scripts existentes, apenas forçando o runtime do Bun via `bun run --bun`. O `cross-env` garante `NODE_ENV` consistente (`development`/`production`).
|
||||||
- Fallback Webpack disponível via `bun run dev:webpack` / `bun run build:webpack` quando Turbopack não coopera (caso observado em combinações Bun + Next 16).
|
- `bun run build:turbopack`: build experimental com Turbopack. Use apenas para debugging/local, pois ainda causa inconsistências em produção.
|
||||||
|
- `bun run dev:webpack`: fallback do Next em dev quando o Turbopack apresentar problemas.
|
||||||
- `bun run prisma:generate`: necessário antes do build quando o client Prisma muda. Para migrações use `bunx prisma migrate deploy`.
|
- `bun run prisma:generate`: necessário antes do build quando o client Prisma muda. Para migrações use `bunx prisma migrate deploy`.
|
||||||
|
|
||||||
### Automação no CI
|
### Automação no CI
|
||||||
|
|
|
||||||
|
|
@ -332,9 +332,11 @@ Benefícios
|
||||||
- Guia CI/CD Desktop: `apps/desktop/docs/guia-ci-cd-web-desktop.md`
|
- Guia CI/CD Desktop: `apps/desktop/docs/guia-ci-cd-web-desktop.md`
|
||||||
- Docs Convex self‑hosted: imagem oficial `ghcr.io/get-convex/convex-backend`
|
- Docs Convex self‑hosted: imagem oficial `ghcr.io/get-convex/convex-backend`
|
||||||
|
|
||||||
## Turbopack (Next.js)
|
## Bundlers (Next.js)
|
||||||
- O projeto usa Turbopack em dev e build.
|
- Em desenvolvimento utilizamos Turbopack (`next dev --turbopack`) pela velocidade incremental.
|
||||||
- Scripts (package.json):
|
- Builds de produção rodam com `next build --webpack` para evitar mismatches de chunks vistos com o Turbopack em produção.
|
||||||
|
- Scripts principais (package.json):
|
||||||
- `dev`: `next dev --turbopack`
|
- `dev`: `next dev --turbopack`
|
||||||
- `build`: `next build --turbopack`
|
- `build`: `next build --webpack`
|
||||||
- O workflow de CI executa `bun run build:bun` (que já chama Turbopack via script), e a stack utiliza `bun run start:bun` sobre o artefato gerado.
|
- `build:turbopack`: `next build --turbopack` (uso pontual para debug)
|
||||||
|
- O workflow de CI executa `bun run build:bun` (que agora roda `next build --webpack` via Bun) e a stack continua a usar `bun run start:bun` sobre o artefato gerado.
|
||||||
|
|
|
||||||
|
|
@ -6,8 +6,8 @@
|
||||||
"prebuild": "prisma generate",
|
"prebuild": "prisma generate",
|
||||||
"dev": "next dev --turbopack",
|
"dev": "next dev --turbopack",
|
||||||
"dev:webpack": "next dev --webpack",
|
"dev:webpack": "next dev --webpack",
|
||||||
"build": "next build --turbopack",
|
"build": "next build --webpack",
|
||||||
"build:webpack": "next build --webpack",
|
"build:turbopack": "next build --turbopack",
|
||||||
"start": "next start",
|
"start": "next start",
|
||||||
"lint": "eslint",
|
"lint": "eslint",
|
||||||
"prisma:generate": "prisma generate",
|
"prisma:generate": "prisma generate",
|
||||||
|
|
|
||||||
|
|
@ -4,15 +4,23 @@ import { SiteHeader } from "@/components/site-header"
|
||||||
import { requireStaffSession } from "@/lib/auth-server"
|
import { requireStaffSession } from "@/lib/auth-server"
|
||||||
|
|
||||||
type PageProps = {
|
type PageProps = {
|
||||||
params: { id: string }
|
params?: Promise<{ id: string }>
|
||||||
searchParams: { [key: string]: string | string[] | undefined }
|
searchParams?: Promise<{ [key: string]: string | string[] | undefined }>
|
||||||
}
|
}
|
||||||
|
|
||||||
export const dynamic = "force-dynamic"
|
export const dynamic = "force-dynamic"
|
||||||
|
|
||||||
export default async function DashboardDetailPage({ params, searchParams }: PageProps) {
|
export default async function DashboardDetailPage({ params, searchParams }: PageProps) {
|
||||||
|
if (!params) {
|
||||||
|
throw new Error("Dashboard id not provided")
|
||||||
|
}
|
||||||
|
|
||||||
|
const { id } = await params
|
||||||
|
const resolvedSearchParams =
|
||||||
|
(searchParams ? await searchParams : {}) as Record<string, string | string[] | undefined>
|
||||||
|
|
||||||
await requireStaffSession()
|
await requireStaffSession()
|
||||||
const tvMode = searchParams?.tv === "1"
|
const tvMode = resolvedSearchParams?.tv === "1"
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<AppShell
|
<AppShell
|
||||||
|
|
@ -25,7 +33,7 @@ export default async function DashboardDetailPage({ params, searchParams }: Page
|
||||||
>
|
>
|
||||||
<div className="mx-auto w-full max-w-7xl px-4 pb-12 lg:px-6">
|
<div className="mx-auto w-full max-w-7xl px-4 pb-12 lg:px-6">
|
||||||
<DashboardBuilder
|
<DashboardBuilder
|
||||||
dashboardId={params.id}
|
dashboardId={id}
|
||||||
editable={!tvMode}
|
editable={!tvMode}
|
||||||
mode={tvMode ? "tv" : "edit"}
|
mode={tvMode ? "tv" : "edit"}
|
||||||
/>
|
/>
|
||||||
|
|
|
||||||
|
|
@ -2,16 +2,22 @@ import { DashboardBuilder } from "@/components/dashboards/dashboard-builder"
|
||||||
import { requireStaffSession } from "@/lib/auth-server"
|
import { requireStaffSession } from "@/lib/auth-server"
|
||||||
|
|
||||||
type PageProps = {
|
type PageProps = {
|
||||||
params: { id: string }
|
params?: Promise<{ id: string }>
|
||||||
}
|
}
|
||||||
|
|
||||||
export const dynamic = "force-dynamic"
|
export const dynamic = "force-dynamic"
|
||||||
|
|
||||||
export default async function DashboardPrintPage({ params }: PageProps) {
|
export default async function DashboardPrintPage({ params }: PageProps) {
|
||||||
|
if (!params) {
|
||||||
|
throw new Error("Dashboard id not provided")
|
||||||
|
}
|
||||||
|
|
||||||
|
const { id } = await params
|
||||||
|
|
||||||
await requireStaffSession()
|
await requireStaffSession()
|
||||||
return (
|
return (
|
||||||
<div className="min-h-screen bg-white p-6" data-dashboard-print>
|
<div className="min-h-screen bg-white p-6" data-dashboard-print>
|
||||||
<DashboardBuilder dashboardId={params.id} editable={false} mode="print" />
|
<DashboardBuilder dashboardId={id} editable={false} mode="print" />
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue