Examples
Vollständige Beispiele und Use Cases für das ProcessCube® App-SDK.
Verfügbare Beispiele
Authentifizierung & Authority
Integration von ProcessCube® Authority mit NextAuth.js für OAuth 2.0 Authentifizierung.
Themen:
- NextAuth.js Setup
- OAuth 2.0 Flow konfigurieren
- Session Management
- Protected Routes
Zum Beispiel → (In Kürze)
External Tasks
Implementierung von External Task Workers direkt in Next.js.
Themen:
- External Task Handler erstellen
- Worker konfigurieren
- Error Handling
- Credentials Management
Zum Beispiel → (In Kürze)
Next.js Integration
Erweiterte Next.js Features mit ProcessCube® kombinieren.
Themen:
- Internationalisierung (i18n)
- Process Instance Tracker
- WebSocket Integration
- Real-time Updates
Zum Beispiel → (In Kürze)
GraphQL Client
ProcessCube® Engine via GraphQL nutzen.
Themen:
- GraphQL Client Setup
- Code Generation
- Type-safe Queries
- Mutations
Zum Beispiel → (In Kürze)
Quick Examples
User Task Liste mit Server Component
app/tasks/page.tsx
import { getWaitingUserTasks } from '@5minds/processcube_app_sdk/server';
import Link from 'next/link';
export default async function TasksPage() {
const { userTasks } = await getWaitingUserTasks();
return (
<div className="container mx-auto p-4">
<h1 className="text-2xl font-bold mb-4">Meine Aufgaben</h1>
{userTasks.length === 0 ? (
<p className="text-gray-500">Keine wartenden Aufgaben</p>
) : (
<div className="grid gap-4">
{userTasks.map((task) => (
<Link
key={task.flowNodeInstanceId}
href={`/tasks/${task.flowNodeInstanceId}`}
className="border rounded-lg p-4 hover:shadow-md transition"
>
<h3 className="font-semibold">{task.flowNodeName}</h3>
<p className="text-sm text-gray-600">
Prozess: {task.processName}
</p>
<p className="text-xs text-gray-500 mt-2">
ID: {task.correlationId}
</p>
</Link>
))}
</div>
)}
</div>
);
}Prozess starten mit Server Action
app/processes/page.tsx
import { getProcessModels, startProcessInstance } from '@5minds/processcube_app_sdk/server';
import { redirect } from 'next/navigation';
export default async function ProcessesPage() {
const processModels = await getProcessModels();
async function startProcess(formData: FormData) {
'use server';
const processModelId = formData.get('processModelId') as string;
const startEventId = formData.get('startEventId') as string;
const result = await startProcessInstance({
processModelId,
startEventId,
initialToken: {}
});
redirect(`/processes/${result.correlationId}`);
}
return (
<div className="container mx-auto p-4">
<h1 className="text-2xl font-bold mb-4">Prozess starten</h1>
<form action={startProcess} className="space-y-4">
<div>
<label className="block mb-2">Prozess auswählen</label>
<select
name="processModelId"
className="border rounded px-3 py-2 w-full"
required
>
{processModels.processModels.map((process) => (
<option key={process.id} value={process.id}>
{process.id}
</option>
))}
</select>
</div>
<input type="hidden" name="startEventId" value="StartEvent_1" />
<button
type="submit"
className="bg-blue-500 text-white px-4 py-2 rounded hover:bg-blue-600"
>
Prozess starten
</button>
</form>
</div>
);
}User Task mit Remote Component
app/tasks/[id]/page.tsx
'use client';
import { RemoteUserTask } from '@5minds/processcube_app_sdk/client';
import { useRouter } from 'next/navigation';
export default function TaskDetailPage({
params,
}: {
params: { id: string };
}) {
const router = useRouter();
return (
<div className="container mx-auto p-4">
<button
onClick={() => router.back()}
className="mb-4 text-blue-500 hover:underline"
>
← Zurück
</button>
<RemoteUserTask
flowNodeInstanceId={params.id}
onFinish={() => {
console.log('Task abgeschlossen');
router.push('/tasks');
}}
onCancel={() => router.back()}
className="border rounded-lg shadow-md"
/>
</div>
);
}Task-Übersicht mit Statistiken
app/dashboard/page.tsx
import {
getWaitingUserTasks,
getActiveCorrelations
} from '@5minds/processcube_app_sdk/server';
export default async function DashboardPage() {
const [tasksResult, correlations] = await Promise.all([
getWaitingUserTasks(),
getActiveCorrelations()
]);
const stats = {
openTasks: tasksResult.userTasks.length,
activeProcesses: correlations.correlations.length,
completedToday: 0, // Beispiel
};
return (
<div className="container mx-auto p-4">
<h1 className="text-2xl font-bold mb-6">Dashboard</h1>
<div className="grid grid-cols-3 gap-4 mb-8">
<div className="border rounded-lg p-6 text-center">
<div className="text-3xl font-bold text-blue-500">
{stats.openTasks}
</div>
<div className="text-gray-600">Offene Aufgaben</div>
</div>
<div className="border rounded-lg p-6 text-center">
<div className="text-3xl font-bold text-green-500">
{stats.activeProcesses}
</div>
<div className="text-gray-600">Aktive Prozesse</div>
</div>
<div className="border rounded-lg p-6 text-center">
<div className="text-3xl font-bold text-orange-500">
{stats.completedToday}
</div>
<div className="text-gray-600">Heute abgeschlossen</div>
</div>
</div>
<div>
<h2 className="text-xl font-semibold mb-4">Letzte Aufgaben</h2>
{tasksResult.userTasks.slice(0, 5).map((task) => (
<div key={task.flowNodeInstanceId} className="border-b py-3">
<div className="font-medium">{task.flowNodeName}</div>
<div className="text-sm text-gray-600">{task.processName}</div>
</div>
))}
</div>
</div>
);
}Repository & Beispiel-Projekte
GitHub Repository: github.com/processcube-io/app-sdk-examples
Vollständige Beispiel-Projekte zum Clonen und Ausprobieren finden Sie im offiziellen Repository.
Nächste Schritte
- Getting Started - Erste Schritte mit dem App-SDK
- Components - Verfügbare React Components
- Functions - Server-Side Helper Functions
- Configuration - Environment Variables und Plugin System