Skip to main content

Fitur Assigne Claim dan Delegate ๐ŸŽ‰

ยท 4 min read

Hello Semua , skarang sudah ada fitur assigne dan claim ya nah fitur ini di gunakan untuk melakukan setting assigne task ke user tertentu dan claim task yang sudah di assigne ke user lain

Fitur itu ada di tasklist nya camunda ya picture 0

Dan juga ada di tampilan detail process instance di Cocpitnya picture 1

Fitur tersebut dapat di ambil dari appi usertask ya sebagai berikut

Claim Taskโ€‹

digunakan untuk melakukan set task ke user yang sedang login

[POST] /api/rtgs-approvals/tm-maintenance-review/claim/{{user_task_id}}/{{busniess_key}}

Assign Taskโ€‹

sementara assign digunakan untuk assign task ke user yang di pilih

[POST] /api/rtgs-approvals/tm-maintenance-review/assign/{{user_task_id}}/{{busniess_key}}

dengan payload

{"user_id":19999}

Tampilan pada alurkerja tableโ€‹

selain api teman teman juga bisa menambahkan tampilan assign delegate dan claim ini pada table alurkerja nya dengan cara

membuat assigne component dengan


import { AuthContext, Button, Input, Modal, Select } from "alurkerja-ui"
import { useContext, useEffect, useState } from "react"
import Swal from "sweetalert2"

const toKebabCase = (str: string) => {

if (str != null) {
return str.match(/[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g)
?.map(x => x.toLowerCase())
.join('-')
}
return ""
}


export default ({ task , id }: { task: any, id:string }) => {
const axiosInstance = useContext(AuthContext)


const claimTask = () => {

Swal.fire({
icon: 'warning',
title: "Claim Task",
text: "Apakah Anda Yakin Untuk Claim Task",
showCancelButton: true,
confirmButtonColor: '#0095E8',
cancelButtonColor: '#d33',
cancelButtonText: "Batalkan",
confirmButtonText: "Konfirmasi",
}).then(async (result) => {
if (result.isConfirmed) {
console.log(task)
const taskName = toKebabCase(task.taskDefinitionKey)
axiosInstance.post(`/api/rtgs-approvals/${taskName}/assign/${id}/${task.id}`, {user_id:19999}).then(
// axiosInstance.post(`/api/rtgs-approvals/${taskName}/claim/${id}/${task.id}`).then(
(response) => {
// Todo add handler
Swal.fire("Claim Task", "Behasil Melakukan Claim Task", "success")
}
).catch(() => {

Swal.fire("Oops", "Terjadi kesalahan ketika claim task", "error")
})
}
})

}
return <>
<div className="flex flex-row justify-between">
<div className="flex flex-col">

<div >
<b>{task.name}</b>
</div>
<div>

{task.assignee || "Not Assigned"}
</div>
</div>
<div>

{task.assignee &&
<div>
<DelegateModal task={task} id={id}></DelegateModal>
</div>
}

{task.assignee == null &&
<div>
<Button size="sm" onClick={() => {
claimTask()
}}>Claim</Button>
</div>
}
</div>
</div>
</>
}



const DelegateModal = ({ task , id }: {id : string , task: any}) => {

const action ="Delegate"
const taskName = toKebabCase(task.taskDefinitionKey)
const axiosInstance = useContext(AuthContext)
const [userList, setUserList] = useState<any[]>();
const getAssigne = () => {
axiosInstance.post(`/api/rtgs-approvals/${taskName}/assignee-candidate`, task).then((response) => {
setUserList(response.data.data)
})
}
const assign = () => {
Swal.fire({
icon: 'warning',
title: action + " Task",
text: "Apakah Anda Yakin Untuk " + action + " Task",
showCancelButton: true,
confirmButtonColor: '#0095E8',
cancelButtonColor: '#d33',
cancelButtonText: "Batalkan",
confirmButtonText: "Konfirmasi",
}).then(async (result) => {taskName
if (result.isConfirmed) {
console.log(task)
const taskName = toKebabCase(task.taskDefinitionKey)
axiosInstance.post(`/api/rtgs-approvals/${taskName}/assign/${id}/${task.id}`, {user_id:selectedAssigne}).then(
(response) => {
// Todo add handler
Swal.fire("Claim Task", "Behasil Melakukan Delegate Task", "success")
}
).catch(() => {

Swal.fire("Oops", "Terjadi kesalahan ketika delegate task", "error")
})
}
})
}
const [selectedAssigne, setSelectedAssigne] = useState();
const [message, setMessage] = useState("");
useEffect(() => {
getAssigne()
}, []);
return <Modal
title={action}
triggerButton={<Button size="sm">{action}</Button>}
>
<div>
<div className='px-4 pt-4'>
<label>Select Assigne</label>
<Select
onChange={(e: any) => { setSelectedAssigne(e.value) } }
options={userList}
/>
</div>
<div className='px-4 pt-4'>
<label>Message</label>
<Input type="text"
textArea={true}
onChange={(e: any) => { setMessage(e.target.value) }}
/>
</div>
<div className='px-4 pt-4'>

<Button onClick={() => { assign() }}>{action}</Button>
</div>

</div>


</Modal>
}

Tampilan yang akan di hasilkan dari component tersebut adalah sebuah cell yang bisa di masukan ke dalam table alurkerja dengan cara


<TableLowcode

...

customCell={({ name, fields, value, rowValue, defaultCell, }) => {


....


if (name == "status") {
return <>
{rowValue.available_task.map((item: any) => {

return <AssigneComponent task={item} id={rowValue.id}></AssigneComponent>
})}
</>
}

....


}}
/>

Dan akan menghasilkan tampilan seperti ini

picture 2

tombol claim akan muncul ketika assinge masih kosong dan tombol delegate akan muncul ketika assigne sudah di isi

picture 3

masing masing button akan memunculkan tampilan modal seperti ini

picture 4

Delegate Candidateโ€‹

ada juga api untuk menentukan assigne candidate yaitu

[POST] /api/rtgs-approvals/${taskName}/assignee-candidate

api tersebut bisa di override dari service usertask yang di inginkan sesuai dengan parameter tertentu yang di post ke api tersebut

contoh pada react di atas

   const getAssigne = () => {
axiosInstance.post(`/api/rtgs-approvals/${taskName}/assignee-candidate`, task).then((response) => {
setUserList(response.data.data)
})
}

ketika mengambil ke api tersebut kita mengirimkan kembali task yang sedang di kerjakan agar bisa dicheck sesuai dengan kriteria tasknya juga untuk itu silahkan override pada Usertaskservice bagian



public function assigneeCandidate($request)
{
// lakukan manipulasi pengambilan data user di sini
return User::all()->map(function ($data) {
return [
"value" => $data->id,
"label" => $data->name,
];
});
}


Berikut penjelasan dari masing masing component yang di gunakan

Silahkan jika ada yang kurang jelas bisa di tanyakan di grup telegram

Terimakasih