EERP Suite

Integration Guide

This guide explains how to integrate the MarlinJai packages into your applications.

Prerequisites

  • Node.js 20+
  • pnpm or npm
  • Cloudflare account (for D1/R2/Workers)

1. Data Table Integration

Installation

# Core packages
npm install @marlinjai/data-table-core @marlinjai/data-table-react

# Choose your database adapter
npm install @marlinjai/data-table-adapter-d1      # For Cloudflare D1
npm install @marlinjai/data-table-adapter-memory  # For testing

# Optional: File storage adapter
npm install @marlinjai/data-table-file-adapter-storage-brain

Basic Setup

import { DataTableProvider, TableView, useTable } from '@marlinjai/data-table-react';
import { D1Adapter } from '@marlinjai/data-table-adapter-d1';

// Create adapter (in API route or server component)
const dbAdapter = new D1Adapter(env.DB);

function App() {
  return (
    <DataTableProvider dbAdapter={dbAdapter} workspaceId={userId}>
      <MyTable />
    </DataTableProvider>
  );
}

function MyTable() {
  const {
    table,
    columns,
    rows,
    updateCell,
    addRow,
    deleteRow,
  } = useTable({ tableId: 'my-table-id' });

  return (
    <TableView
      columns={columns}
      rows={rows}
      onCellChange={updateCell}
      onAddRow={addRow}
      onDeleteRow={deleteRow}
    />
  );
}

With File Upload Support

import { StorageBrainFileAdapter } from '@marlinjai/data-table-file-adapter-storage-brain';
import { StorageBrain } from '@marlinjai/storage-brain-sdk';

const storageBrain = new StorageBrain({
  apiKey: process.env.STORAGE_BRAIN_API_KEY,
});

const fileAdapter = new StorageBrainFileAdapter({
  client: storageBrain,
  defaultContext: 'default',
});

<DataTableProvider
  dbAdapter={dbAdapter}
  fileAdapter={fileAdapter}
  workspaceId={userId}
>
  ...
</DataTableProvider>

2. Storage Brain Integration

Installation

npm install @marlinjai/storage-brain-sdk

Basic Usage

import { StorageBrain } from '@marlinjai/storage-brain-sdk';

const client = new StorageBrain({
  apiKey: process.env.STORAGE_BRAIN_API_KEY,   // sk_live_... or sk_test_...
  baseUrl: 'https://your-worker.workers.dev',  // Optional
  workspaceId: 'my-workspace',                 // Optional default workspace
});

// Upload a file
const result = await client.upload(file, {
  context: 'documents',
  tags: { category: 'invoice' },
  onProgress: (percent) => console.log(`${percent}% uploaded`),
});

console.log(result);
// {
//   id: 'file-123',
//   url: 'https://...',
//   originalName: 'invoice.pdf',
//   fileType: 'application/pdf',
//   sizeBytes: 123456,
//   workspaceId: 'my-workspace',
//   processingStatus: 'completed'
// }

// Get a signed URL (time-limited access)
const { url, expiresAt } = await client.getSignedUrl('file-123', 3600);

// Workspace-scoped client
const wsClient = client.withWorkspace('other-workspace');
const files = await wsClient.listFiles();

Workspace Management

// Create a workspace
const ws = await client.createWorkspace({
  name: 'Team Files',
  slug: 'team-files',
});

// List all workspaces
const workspaces = await client.listWorkspaces();

3. Data Brain Integration

Installation

npm install @marlinjai/data-brain-sdk

Basic Usage

import { DataBrain } from '@marlinjai/data-brain-sdk';

const client = new DataBrain({
  apiKey: process.env.DATA_BRAIN_API_KEY,      // sk_live_... or sk_test_...
  baseUrl: 'https://your-worker.workers.dev',  // Optional
  workspaceId: 'my-workspace',                 // Optional default workspace
});

// Create a table
const table = await client.createTable({
  name: 'Contacts',
  columns: [
    { name: 'Name', type: 'text' },
    { name: 'Email', type: 'text' },
    { name: 'Status', type: 'select' },
  ],
});

// Insert rows
const row = await client.createRow({
  tableId: table.id,
  cells: { Name: 'Jane Doe', Email: 'jane@example.com' },
});

// Query with filters
const results = await client.getRows(table.id, {
  filter: { field: 'Status', operator: 'eq', value: 'active' },
  sort: [{ field: 'Name', direction: 'asc' }],
  limit: 50,
});

With Data Table Adapter

import { DataBrainAdapter } from '@marlinjai/data-table-adapter-data-brain';

const adapter = new DataBrainAdapter({
  baseUrl: process.env.DATA_BRAIN_URL!,
  apiKey: process.env.DATA_BRAIN_API_KEY!,
});

4. Database Schema Setup

Cloudflare D1

Run the migration to create Data Table schema:

-- dt_tables
CREATE TABLE dt_tables (
  id TEXT PRIMARY KEY,
  workspace_id TEXT NOT NULL,
  name TEXT NOT NULL,
  description TEXT,
  icon TEXT,
  created_at TEXT DEFAULT (datetime('now')),
  updated_at TEXT DEFAULT (datetime('now'))
);

-- dt_columns
CREATE TABLE dt_columns (
  id TEXT PRIMARY KEY,
  table_id TEXT NOT NULL REFERENCES dt_tables(id) ON DELETE CASCADE,
  name TEXT NOT NULL,
  type TEXT NOT NULL,
  position INTEGER NOT NULL,
  width INTEGER DEFAULT 200,
  is_primary INTEGER DEFAULT 0,
  config TEXT,
  created_at TEXT DEFAULT (datetime('now'))
);

-- dt_rows
CREATE TABLE dt_rows (
  id TEXT PRIMARY KEY,
  table_id TEXT NOT NULL REFERENCES dt_tables(id) ON DELETE CASCADE,
  cells TEXT NOT NULL DEFAULT '{}',
  computed TEXT DEFAULT '{}',
  parent_row_id TEXT,
  archived INTEGER DEFAULT 0,
  created_at TEXT DEFAULT (datetime('now')),
  updated_at TEXT DEFAULT (datetime('now'))
);

-- dt_select_options
CREATE TABLE dt_select_options (
  id TEXT PRIMARY KEY,
  column_id TEXT NOT NULL REFERENCES dt_columns(id) ON DELETE CASCADE,
  name TEXT NOT NULL,
  color TEXT,
  position INTEGER DEFAULT 0
);

-- dt_views
CREATE TABLE dt_views (
  id TEXT PRIMARY KEY,
  table_id TEXT NOT NULL REFERENCES dt_tables(id) ON DELETE CASCADE,
  name TEXT NOT NULL,
  type TEXT NOT NULL,
  is_default INTEGER DEFAULT 0,
  position INTEGER DEFAULT 0,
  config TEXT DEFAULT '{}',
  created_at TEXT DEFAULT (datetime('now')),
  updated_at TEXT DEFAULT (datetime('now'))
);

-- Indexes
CREATE INDEX idx_tables_workspace ON dt_tables(workspace_id);
CREATE INDEX idx_columns_table ON dt_columns(table_id);
CREATE INDEX idx_rows_table ON dt_rows(table_id);
CREATE INDEX idx_rows_parent ON dt_rows(parent_row_id);
CREATE INDEX idx_select_options_column ON dt_select_options(column_id);
CREATE INDEX idx_views_table ON dt_views(table_id);

5. Next.js App Router Integration

Server Component Setup

// app/providers.tsx
'use client';

import { DataTableProvider } from '@marlinjai/data-table-react';

export function Providers({
  children,
  dbAdapter,
  fileAdapter,
  workspaceId,
}) {
  return (
    <DataTableProvider
      dbAdapter={dbAdapter}
      fileAdapter={fileAdapter}
      workspaceId={workspaceId}
    >
      {children}
    </DataTableProvider>
  );
}

API Route for Adapter

// app/api/data-table/route.ts
import { D1Adapter } from '@marlinjai/data-table-adapter-d1';

export const runtime = 'edge';

export async function GET(request: Request) {
  const adapter = new D1Adapter(process.env.DB);
  // ... handle requests
}

6. Theming

The Data Table package uses CSS variables for theming:

:root {
  --dt-bg-primary: #ffffff;
  --dt-bg-secondary: #f9fafb;
  --dt-bg-hover: #f3f4f6;
  --dt-border-color: #e5e7eb;
  --dt-text-primary: #111827;
  --dt-text-secondary: #6b7280;
  --dt-accent-primary: #2563eb;
}

/* Dark mode */
.dark {
  --dt-bg-primary: #1f2937;
  --dt-bg-secondary: #111827;
  --dt-text-primary: #f9fafb;
  /* ... */
}

Import the base styles:

import '@marlinjai/data-table-react/styles/variables.css';
import '@marlinjai/data-table-react/styles/base.css';

7. Email Editor Integration

Installation

npm install @marlinjai/email-editor

React Setup

import { EmailEditorReact } from '@marlinjai/email-editor/react';
import '@marlinjai/email-editor/styles.css';

function App() {
  return (
    <EmailEditorReact
      initialTemplate={myTemplate}
      onChange={(template) => saveTemplate(template)}
      onExport={(template) => compileOnServer(template)}
    />
  );
}

Server-Side MJML Compilation

import { MJMLExporter } from '@marlinjai/email-editor-core/server';

const exporter = new MJMLExporter();

export async function POST(request: Request) {
  const template = await request.json();
  const { html, errors } = exporter.export(template);
  return Response.json({ html, errors });
}

For full setup details, see the Email Editor Quickstart guide and the Email Editor docs.


8. Clearify Integration

Add documentation to any project with Clearify:

Installation

npm install @marlinjai/clearify --save-dev
npx clearify init

Development

npx clearify dev    # Dev server at localhost:4747
npx clearify build  # Static site output

For full setup details, see the Clearify Setup guide and the Clearify docs.