Md Afiq Iskandar 0a4d41df06 Enhance Documentation and Navigation for Process Execution Module
- Added new sections in the README and PROJECT_OVERVIEW to include user and technical guides for the Process Execution interface.
- Updated navigation structure to incorporate the Process Execution module, detailing features such as the Execution Dashboard, Task Inbox, and Case History.
- Improved overall documentation clarity and organization to assist users in understanding the new process execution functionalities.
2025-05-21 13:36:43 +08:00

288 lines
7.9 KiB
Vue

<script setup>
definePageMeta({
title: "Process Execution Dashboard",
layout: "default",
middleware: ["auth"],
requiresAuth: true,
});
// Mock data for pending tasks
const pendingTasks = ref(12);
const activeCases = ref(7);
const completedCases = ref(23);
const overdueTasks = ref(5);
// Mock data for recent tasks
const recentTasks = ref([
{
name: "Complete Purchase Order Review",
process: "Purchase Order Approval",
dueDate: "Apr 30, 2024",
status: "PENDING",
action: { id: "task-123" },
},
{
name: "Review Leave Request",
process: "Leave Approval",
dueDate: "May 2, 2024",
status: "PENDING",
action: { id: "task-124" },
},
{
name: "Approve Budget Increase",
process: "Budget Management",
dueDate: "Apr 28, 2024",
status: "OVERDUE",
action: { id: "task-125" },
},
]);
// Mock data for recent processes
const recentProcesses = ref([
{
name: "Purchase Order Approval",
started: "Apr 25, 2024",
status: "ACTIVE",
action: { id: "case-123" },
},
{
name: "Leave Approval",
started: "Apr 29, 2024",
status: "ACTIVE",
action: { id: "case-124" },
},
{
name: "Invoice Processing",
started: "Apr 15, 2024",
status: "COMPLETED",
action: { id: "case-125" },
},
]);
// Table options
const tableOptions = {
striped: true,
hover: true,
responsive: true,
search: false,
pagination: false,
};
// Advanced table options
const optionsAdvanced = {
sortable: true,
filterable: false,
responsive: true,
outsideBorder: false,
};
</script>
<template>
<div>
<LayoutsBreadcrumb />
<!-- Stats -->
<div class="grid grid-cols-1 lg:grid-cols-2 xl:grid-cols-4 gap-x-6 mb-6">
<!-- Pending Tasks -->
<rs-card>
<template #body>
<div class="pt-5 pb-3 px-5 flex items-center gap-4">
<div
class="p-5 flex justify-center items-center bg-yellow-100 rounded-2xl"
>
<Icon
class="text-yellow-500"
name="material-symbols:inbox"
></Icon>
</div>
<div class="flex-1 truncate">
<span class="block font-semibold text-xl leading-tight">{{
pendingTasks
}}</span>
<span class="text-base font-semibold text-gray-500"
>Pending Tasks</span
>
</div>
</div>
</template>
</rs-card>
<!-- Active Cases -->
<rs-card>
<template #body>
<div class="pt-5 pb-3 px-5 flex items-center gap-4">
<div
class="p-5 flex justify-center items-center bg-blue-100 rounded-2xl"
>
<Icon
class="text-blue-500"
name="material-symbols:play-circle-outline"
></Icon>
</div>
<div class="flex-1 truncate">
<span class="block font-semibold text-xl leading-tight">{{
activeCases
}}</span>
<span class="text-base font-semibold text-gray-500"
>Active Cases</span
>
</div>
</div>
</template>
</rs-card>
<!-- Completed Cases -->
<rs-card>
<template #body>
<div class="pt-5 pb-3 px-5 flex items-center gap-4">
<div
class="p-5 flex justify-center items-center bg-green-100 rounded-2xl"
>
<Icon
class="text-green-500"
name="material-symbols:check-circle-outline"
></Icon>
</div>
<div class="flex-1 truncate">
<span class="block font-semibold text-xl leading-tight">{{
completedCases
}}</span>
<span class="text-base font-semibold text-gray-500"
>Completed Cases</span
>
</div>
</div>
</template>
</rs-card>
<!-- Overdue Tasks -->
<rs-card>
<template #body>
<div class="pt-5 pb-3 px-5 flex items-center gap-4">
<div
class="p-5 flex justify-center items-center bg-red-100 rounded-2xl"
>
<Icon
class="text-red-500"
name="material-symbols:warning-outline"
></Icon>
</div>
<div class="flex-1 truncate">
<span
class="block font-semibold text-xl leading-tight text-red-500"
>{{ overdueTasks }}</span
>
<span class="text-base font-semibold text-gray-500"
>Overdue Tasks</span
>
</div>
</div>
</template>
</rs-card>
</div>
<!-- Recent Tasks -->
<rs-card class="mb-6">
<template #header>
<div class="flex justify-between items-center p-5">
<h2 class="text-lg font-semibold">Recent Tasks</h2>
<rs-button variant="primary" size="sm" to="/execution/inbox">
View All Tasks
</rs-button>
</div>
</template>
<template #body>
<div class="px-5 pb-5">
<rs-table
:data="recentTasks"
:options="tableOptions"
:options-advanced="optionsAdvanced"
advanced
>
<!-- Status column with custom rendering -->
<template v-slot:status="{ value }">
<div class="inline-flex">
<rs-badge
:variant="
value.status === 'PENDING'
? 'warning'
: value.status === 'OVERDUE'
? 'danger'
: 'success'
"
>
{{ value.status }}
</rs-badge>
</div>
</template>
<!-- Action column with custom rendering -->
<template v-slot:action="{ value }">
<rs-button
variant="secondary"
size="sm"
class="px-3 inline-flex items-center justify-center"
>
<nuxt-link :to="`/execution/task/${value.id}`">
Open
</nuxt-link>
</rs-button>
</template>
</rs-table>
</div>
</template>
</rs-card>
<!-- Recent Processes -->
<rs-card>
<template #header>
<div class="flex justify-between items-center p-5">
<h2 class="text-lg font-semibold">Recent Processes</h2>
<rs-button variant="primary" size="sm" to="/execution/history">
View All Processes
</rs-button>
</div>
</template>
<template #body>
<div class="px-5 pb-5">
<rs-table
:data="recentProcesses"
:options="tableOptions"
:options-advanced="optionsAdvanced"
advanced
>
<!-- Status column with custom rendering -->
<template v-slot:status="{ value }">
<div class="inline-flex">
<rs-badge
:variant="
value.status === 'ACTIVE'
? 'primary'
: value.status === 'COMPLETED'
? 'success'
: 'warning'
"
>
{{ value.status }}
</rs-badge>
</div>
</template>
<!-- Action column with custom rendering -->
<template v-slot:action="{ text }">
<rs-button
variant="secondary"
size="sm"
class="px-3 inline-flex items-center justify-center"
:to="`/execution/case/${text.id}`"
>
View
</rs-button>
</template>
</rs-table>
</div>
</template>
</rs-card>
</div>
</template>