Progress yang sudah dilakukan
Uncanny Automator
Nama Recipe : Profil Klien – SiLaporKerjaCL
Keterangan
- Trigger : a user submit form “profil klien” , form ID = 1103
- Action : Create Post – Custom Post Type (CPT) “Update Klien” , dengan judul post diambil dari token yaitu “Date” “Time” | “Nama Klien”
- Custom CSS tidak diaktifkan, Custom Java Script tidak diaktifkan
Post Content Code
<div class=”profil-klien-wrapper”>
<div class=”row”><span class=”label”>Nama Perusahaan:</span> <span class=”value”>{{1138:FRFORM:1103|text-4}}</span></div>
<div class=”row”><span class=”label”>Kode Klien:</span> <span class=”value”>{{1138:FRFORM:1103|text-1}}</span></div>
<div class=”row”><span class=”label”>Alamat:</span> <span class=”value”>{{1138:FRFORM:1103|textarea-3}}</span></div>
<div class=”row”><span class=”label”>Lokasi/Provinsi:</span> <span class=”value”>{{1138:FRFORM:1103|text-2}}</span></div>
<div class=”row”><span class=”label”>Contact Person:</span> <span class=”value”>{{1138:FRFORM:1103|name-2}}</span></div>
<div class=”row”><span class=”label”>Jabatan Contact Person:</span> <span class=”value”>{{1138:FRFORM:1103|text-3}}</span></div>
<div class=”row”><span class=”label”>Nomor Telepon/HP:</span> <span class=”value”>{{1138:FRFORM:1103|phone-1}}</span></div>
<div class=”row”><span class=”label”>Email:</span> <span class=”value”>{{1138:FRFORM:1103|email-1}}</span></div>
<div class=”row”><span class=”label”>Informasi Mengenai Klien:</span> <span class=”value”>{{1138:FRFORM:1103|textarea-1}}</span></div>
<div class=”row”><span class=”label”>Keterangan:</span> <span class=”value”>{{1138:FRFORM:1103|textarea-2}}</span></div>
</div>
Nama Recipe : Update Klien – SiLaporKerjaCL
Keterangan
- Trigger : a user submit form “updaet klien form” , form ID = 1101
- Action : Create Post – Custom Post Type (CPT) “Update Klien” , dengan judul post diambil dari token yaitu “Date” “Time” | “Nama Klien”
- Custom CSS tidak diaktifkan, Custom Java Script tidak diaktifkan
Post Content Code
<div class=”update-klien-wrapper”>
<div class=”row”><strong><span class=”label”>Tanggal Update:</span></strong> <span class=”value”>{{1141:FRFORM:1101|date-1}}</span></div>
<div class=”row”><strong><span class=”label”>Kode Klien:</span></strong> <span class=”value”>{{1141:FRFORM:1101|text-1}}</span></div>
<div class=”row”><strong><span class=”label”>Nama Klien:</span></strong> <span class=”value”>{{1141:FRFORM:1101|text-2}}</span></div>
<div class=”row”><strong><span class=”label”>Status:</span></strong> <span class=”value”>{{1141:FRFORM:1101|select-1}}</span></div>
<div class=”row”><strong><span class=”label”>Update Klien:</span></strong> <span class=”value”>{{1141:FRFORM:1101|textarea-1}}</span></div>
<div class=”row”><strong><span class=”label”>Keterangan:</span></strong> <span class=”value”>{{1141:FRFORM:1101|textarea-2}}</span></div>
<div class=”row”><strong><span class=”label”>Dokumen #1:</span></strong> <span class=”value dokumen-link”> <a href=”{{1141:FRFORM:1101|upload-1}}” target=”_blank” rel=”noopener”>Lihat Dokumen</a> </span></div>
<div class=”row”><strong><span class=”label”>Dokumen #2:</span></strong> <span class=”value dokumen-link”> <a href=”{{1141:FRFORM:1101|upload-5}}” target=”_blank” rel=”noopener”>Lihat Dokumen</a> </span></div>
<div class=”row”><strong><span class=”label”>Image #1:</span></strong> <span class=”value image-preview”> <a href=”{{1141:FRFORM:1101|upload-6}}” target=”_blank” rel=”noopener”> <img style=”max-height: 120px;” src=”{{1141:FRFORM:1101|upload-6}}” alt=”Image #1″ /> </a> </span></div>
<div class=”row”><strong><span class=”label”>Image #2:</span></strong> <span class=”value image-preview”> <a href=”{{1141:FRFORM:1101|upload-4}}” target=”_blank” rel=”noopener”> <img style=”max-height: 120px;” src=”{{1141:FRFORM:1101|upload-4}}” alt=”Image #2″ /> </a> </span></div>
</div>
Forminator
Nama Form: Profil Klien, ID Form = 1103 , untuk SiLaporKerjaCL, shortcode=forminator_form id=”1103″ , tanda kurung [ ] pada shortcode tidak dituliskan, supaya formulirnya tidak tampil di halaman ini
Field pada form Profil Klien
- Label=Date ; Type=hidden-1 ; Submission date (dd/mm/yyy)
- Label=Time ; Type=hidden-3 ; Submission Time (hh:mm:sss am/pm time zone)
- Label=Nama ; Type=hidden-2 ; otomatis capture login username
- Label=Jabatan ; Type=hidden-4 ; Custom Value dikosongkan
- Label=Divisi ; Type=hidden-5 ; Custom Value dikosongkan
- Label=Nama Klien ; Type=text-4
- Label=Kode Klien ; Type=text-1
- Label=Alamat ; Type=textarea-3
- Label=Lokasi ; Type=text-2
- Label=Contact Person ; Type=name-2
- Label=Jabatan Contact Person ; Type=text-3
- Label=Nomor Telepon ; Type=phone-1
- Label=Email ; Type=email-1
- Label=Informasi Klien ; Type=textarea-1
- Label=Keterangan ; Type=textarea-2
Nama Form: Profil Klien, ID Form = 1101 , untuk SiLaporKerjaCL, shortcode=forminator_form id=”1101″ , tanda kurung [ ] pada shortcode tidak dituliskan, supaya formulirnya tidak tampil di halaman ini
Field pada form Update Klien
- Label=Date ; Type=hidden-1 ; Submission date (dd/mm/yyy)
- Label=Time ; Type=hidden-3 ; Submission Time (hh:mm:sss am/pm time zone)
- Label=Nama ; Type=hidden-2 ; otomatis capture login username
- Label=Jabatan ; Type=hidden-4 ; Custom Value dikosongkan
- Label=Divisi ; Type=hidden-5 ; Custom Value dikosongkan
- Label=Tanggal ; Type=date-1
- Label=Kode Klien ; Type=text-1
- Label=Nama Klien ; Type=text-2
- Label=Status ; Type=select-1
- Label=Update Klien ; Type=textarea-1
- Label=Keterangan ; Type=textarea-2
- Label=Dokumen #1 ; Type=upload-1
- Label=Dokumen #2 ; Type=upload-5
- Label=Image #1 ; Type=upload-6
- Label=Image #2 ; Type=upload-4
ACF
Nama Field Group: Profil Klien – SiLaporKerjaCL
Field Group “Profil Klien” (Status Aktif)
- Label=Tanggal Submit ; Name=tanggal_submit ; Type=Date Picker
- Label=Jam Submit ; Name=jam_submit ; Type=Time Picker
- Label=User Login ; Name=user_login ; Type=Text
- Label=Jabatan ; Name=user_jabatan ; Type=Text
- Label=Divisi ; Name=user_divisi ; Type=Text
- Label=Nama Perusahaan; Name=nama_perusahaan ; Type=Text
- Label=Kode Klien; Name=kode_klien ; Type=Text
- Label=Alamat; Name=alamat_klien ; Type=Text Area
- Label=Lokasi; Name=lokasi_klien ; Type=Text
- Label=Contact Person ; Name=contact_person ; Type=Text
- Label=Nomor Telepon ; Name=nomor_telepon ; Type=Text
- Label=Email ; Name=email_klien ; Type=Text
- Label=Informasi Klien ; Name=informasi_klien ; Type=Text Area
- Label=Keterangan Klien ; Name=keterangan_klien ; Type=Text Area
Nama Field Group: Update Klien – SiLaporKerjaCL
Field Group “Update Klien” (Status Aktif)
- Label=Tanggal Submit ; Name=tanggal_submit ; Type=Date Picker
- Label=Jam Submit ; Name=jam_submit ; Type=Time Picker
- Label=User Login ; Name=user_login ; Type=Text
- Label=Jabatan ; Name=user_jabatan ; Type=Text
- Label=Divisi ; Name=user_divisi ; Type=Text
- Label=Tanggal Update; Name=tanggal_update ; Type=Date Picker
- Label=Kode Klien; Name=kode_klien ; Type=Text
- Label=Nama Klien; Name=nama_klien ; Type=Text
- Label=Status ; Name=status ; Type=Select
- Label=Update Klien; Name=update_klien; Type=Text Area
- Label=Keterangan Klien ; Name=keterangan_klien ; Type=Text Area
- Label=Dokumen #1 ; Name=dokumen_1; Type=File
- Label=Dokumen #2 ; Name=dokumen_2; Type=File
- Label=Image #1 ; Name=image_1; Type=Image
- Label=Image #2 ; Name=image_2; Type=Image
SNIPPETS
Nama : Register CPT Aktivitas Regular
Keterangan “Register CPT Aktivitas Regular”
- Membuat Custom Post Type Aktivitas Regular
- Run snippet everywhere
- Status Aktif
- Muncul menu WP “Aktivitas Regular”
- Untuk versi SiLaporKerja Demo
Script:
add_action(‘init’, function() {
$labels = array(
‘name’ => ‘Aktivitas Regular’,
‘singular_name’ => ‘Aktivitas Regular’,
‘add_new’ => ‘Tambah Aktivitas’,
‘add_new_item’ => ‘Tambah Aktivitas Baru’,
‘edit_item’ => ‘Edit Aktivitas’,
‘new_item’ => ‘Aktivitas Baru’,
‘view_item’ => ‘Lihat Aktivitas’,
‘search_items’ => ‘Cari Aktivitas’,
‘not_found’ => ‘Tidak ditemukan’,
‘not_found_in_trash’ => ‘Tidak ditemukan di tong sampah’,
‘all_items’ => ‘Semua Aktivitas’,
‘archives’ => ‘Arsip Aktivitas’,
‘insert_into_item’ => ‘Masukkan ke Aktivitas’,
‘uploaded_to_this_item’ => ‘Upload ke Aktivitas ini’,
);
$args = array(
‘labels’ => $labels,
‘public’ => true,
‘publicly_queryable’ => true,
‘show_ui’ => true,
‘show_in_rest’ => true, // Penting untuk REST API & block editor
‘rest_base’ => ‘aktivitas_regular’,
‘menu_icon’ => ‘dashicons-welcome-write-blog’,
‘supports’ => array(‘title’, ‘editor’, ‘author’, ‘custom-fields’),
‘has_archive’ => true,
‘rewrite’ => array(‘slug’ => ‘aktivitas’),
);
register_post_type(‘aktivitas_regular’, $args);
});
Nama : Custom Java Script
Keterangan “Custom Java Script”
Untuk modifikasi dan logika content post pada Uncanny Automator , yaitu :
- Sembunyikan Dokumen, jika tidak ada URL
- Sembunyikan Gambar, jika tidak ada URL
- Format angka ribuan pada field nominal kontrak
- Run snippet everywhere
- Kondisi Aktif
- Untuk versi SiLaporKerja Demo
Script:
add_action(‘wp_footer’, function () {
if (is_singular(‘aktivitas_regular’)) : ?>
<script>
document.addEventListener(“DOMContentLoaded”, function () {
// Sembunyikan dokumen jika tidak ada URL
document.querySelectorAll(“.dokumen”).forEach(function (el) {
const url = el.getAttribute(“data-url”)?.trim();
if (!url || url === “#” || url.includes(“null”)) {
const link = el.querySelector(“a”);
if (link) link.style.display = “none”;
}
});
// Sembunyikan gambar jika tidak ada URL
document.querySelectorAll(“.gambar”).forEach(function (el) {
const url = el.getAttribute(“data-url”)?.trim();
if (!url || url === “#” || url.includes(“null”)) {
const link = el.querySelector(“a”);
if (link) link.style.display = “none”;
}
});
// Format angka Nominal Kontrak
const nominalEl = document.querySelector(“.nominal-kontrak”);
if (nominalEl) {
const raw = nominalEl.innerText || nominalEl.textContent;
const cleaned = raw.replace(/\D/g, “”);
const number = parseInt(cleaned, 10);
if (!isNaN(number)) {
nominalEl.textContent = “Rp ” + number.toLocaleString(“id-ID”);
}
}
});
</script>
<?php endif;
});
Nama : Custom CSS
Keterangan “Custom CSS”
- Run snippet everywhere
- Status Aktif
- Untuk versi SiLaporKerja Demo
Untuk Uncanny Automator Post & lainnya:
- Layout single post “Aktivitas Regular”
- tampilan 2 kolom pada pc, dan 1 kolom pada mobile
- Styling judul pada post
- Styling judul pada WP Show posts
- Styling tampilan dashboard SiLaporKerja
- Pagination pada daftar judul post Aktivitas Regular
Script:
add_action(‘wp_head’, function () { ?>
Nama : Struktur Data Akses (Map Direktur, Manager & Staf)
Keterangan “Struktur Data Akses (Map Direktur, Manager & Staf)”
Mendefinisikan hubungan staff, manager dan direktur, serta hak akses masing masing
- Direktur bisa akses ke seluruh tim nya
- Manager bisa akses ke seluruh tim di bawahnya, tidak bisa akses ke manager lain, tidak bisa akses ke staff yang berada di bawah manager lain
- Staff hanya bisa akses datanya sendiri
- Run snippet everywhere
- Kondisi Aktif
- Untuk versi SiLaporKerja Demo
Script
function silaporkerja_get_team_structure() {
return [
‘marketing’ => [
‘manager’ => ‘rina’,
‘staff’ => [‘bpro1’, ‘bpro2’, ‘bpro3’],
],
‘sales’ => [
‘manager’ => ‘deni’,
‘staff’ => [‘bpro4’, ‘bpro5’, ‘bpro6’],
],
‘direktur’ => [‘pakyudho’]
];
}
Nama : Shortcode silaporkerja_dashboard
Keterangan “Shortcode: silaporkerja_dashboard”
- Dashboard SiLaporKerja
- Membatasi user sesuai hak akses, jika akses ke halaman yang tidak sesuai level nya, maka akan di blok dan ada notifikasi
- Direktur berupa tampilan Folder Tree, bisa melihat seluruh tim nya
Manager berupa dropdown list, bisa melihat seluruh staf nya - Staf hanya melihat data nya sendiri
- Ada filter bulan
- Ada Pagination, jika jumlah judul post lebih dari 10
- Run snippet everywhere
- Status Aktif
- Untuk versi SiLaporKerja Demo
Script:
add_shortcode(‘silaporkerja_dashboard’, function () {
if (!is_user_logged_in() || !user_can(get_current_user_id(), ‘read’)) {
return ‘<p>❌ Kamu tidak diizinkan mengakses halaman ini.</p>’;
}
$current_user = wp_get_current_user();
$current_user_login = $current_user->user_login;
$current_user_name = $current_user->display_name;
$struktur = silaporkerja_get_team_structure();
$target_user = isset($_GET[‘lihat’]) ? sanitize_text_field($_GET[‘lihat’]) : $current_user_login;
$selected_month = isset($_GET[‘bulan’]) ? sanitize_text_field($_GET[‘bulan’]) : date(‘Y-m’);
$paged = isset($_GET[‘hal’]) ? max(1, intval($_GET[‘hal’])) : 1;
$posts_per_page = 10;
$is_direktur = in_array($current_user_login, $struktur[‘direktur’] ?? []);
$is_manager = false;
$manager_divisi = ”;
foreach ($struktur as $divisi => $data) {
if (!is_array($data)) continue;
if (isset($data[‘manager’]) && $data[‘manager’] === $current_user_login) {
$is_manager = true;
$manager_divisi = $divisi;
break;
}
}
// Validasi akses: hanya user yang sesuai struktur bisa melihat
$akses_diperbolehkan = false;
if ($target_user === $current_user_login) {
$akses_diperbolehkan = true;
} elseif ($is_direktur) {
$akses_diperbolehkan = true;
} elseif ($is_manager) {
$allowed = array_merge([$current_user_login], $struktur[$manager_divisi][‘staff’]);
if (in_array($target_user, $allowed)) {
$akses_diperbolehkan = true;
}
}
if (!$akses_diperbolehkan) {
return ‘<p>❌ Kamu tidak punya akses ke data ini.</p>’;
}
ob_start();
// Direktur: tampilkan daftar user
if ($is_direktur) {
echo “<div class=’user-list’>”;
echo “<p><strong>Pilih User:</strong></p><ul>”;
echo “<li><a href=’?lihat=$current_user_login&bulan=$selected_month#aktivitas-list’>Saya ($current_user_name)</a></li>”;
foreach ($struktur as $divisi => $data) {
if ($divisi === ‘direktur’) continue;
echo “<li><strong>📂 $divisi</strong><ul>”;
echo “<li>👤 <a href=’?lihat={$data[‘manager’]}&bulan=$selected_month#aktivitas-list’>{$data[‘manager’]} (Manager)</a></li>”;
foreach ($data[‘staff’] as $staf) {
echo “<li>👥 <a href=’?lihat=$staf&bulan=$selected_month#aktivitas-list’>$staf</a></li>”;
}
echo “</ul></li>”;
}
echo “</ul></div><hr>”;
}
// Manager: dropdown + bulan + tombol Pilih
if ($is_manager) {
echo “<form method=’get’>”;
echo “<p><strong>✅ Pilih user yang datanya ingin kamu lihat:</strong></p>”;
echo “<select name=’lihat’>”;
echo “<option value=’$current_user_login'” . selected($target_user, $current_user_login, false) . “>Saya ($current_user_name)</option>”;
echo “<optgroup label=’Staff’>”;
foreach ($struktur[$manager_divisi][‘staff’] as $staf) {
echo “<option value=’$staf'” . selected($target_user, $staf, false) . “>👥 $staf</option>”;
}
echo “</optgroup>”;
echo “</select>”;
// Filter bulan
echo “<select name=’bulan’ style=’margin-left:10px’>”;
for ($i = 0; $i < 12; $i++) {
$bulan = date(‘Y-m’, strtotime(“-$i months”));
$label = date(‘F Y’, strtotime($bulan));
echo “<option value=’$bulan'” . selected($selected_month, $bulan, false) . “>$label</option>”;
}
echo “</select>”;
echo ” <button type=’submit’>Pilih</button>”;
echo “</form><hr>”;
}
// Filter bulan (untuk non-manager)
if (!$is_manager) {
echo “<div style=’margin-bottom:20px;’>”;
echo “<form method=’get’>”;
echo “<input type=’hidden’ name=’lihat’ value='” . esc_attr($target_user) . “‘>”;
echo “<select name=’bulan’>”;
for ($i = 0; $i < 12; $i++) {
$bulan = date(‘Y-m’, strtotime(“-$i months”));
$label = date(‘F Y’, strtotime($bulan));
echo “<option value=’$bulan'” . selected($selected_month, $bulan, false) . “>$label</option>”;
}
echo “</select> “;
echo “<button type=’submit’>Filter Bulan</button>”;
echo “</form></div>”;
}
// Query data CPT
$args = [
‘post_type’ => ‘aktivitas_regular’,
‘post_status’ => ‘publish’,
‘author_name’ => $target_user,
‘posts_per_page’ => $posts_per_page,
‘paged’ => $paged,
‘date_query’ => [
[
‘after’ => $selected_month . ‘-01’,
‘before’ => $selected_month . ‘-31’,
‘inclusive’ => true,
]
]
];
$query = new WP_Query($args);
$max_pages = $query->max_num_pages;
echo “<div id=’aktivitas-list’ class=’aktivitas-list’>”;
$target_user_data = get_user_by(‘login’, $target_user);
if ($target_user_data) {
echo “<span class=’aktivitas-user-label’>👤 Data aktivitas: <strong>{$target_user_data->display_name}</strong></span>”;
}
if ($query->have_posts()) {
echo “<ul>”;
while ($query->have_posts()) {
$query->the_post();
echo “<li><a href='” . get_permalink() . “‘>” . get_the_title() . “</a></li>”;
}
echo “</ul>”;
} else {
echo “<p>📭 Tidak ada aktivitas yang ditemukan untuk bulan ini.</p>”;
}
// Pagination (jika jumlah post > 10)
if ($max_pages > 1) {
echo “<div class=’pagination’ style=’display:flex;justify-content:flex-end;gap:5px;margin-top:10px’>”;
$base_url = “?lihat=$target_user&bulan=$selected_month”;
echo “<a href='{$base_url}&hal=1#aktivitas-list’ title=’Halaman Pertama’>«</a>”;
if ($paged > 1) {
echo “<a href='{$base_url}&hal=” . ($paged – 1) . “#aktivitas-list’ title=’Sebelumnya’>‹</a>”;
}
if ($paged < $max_pages) {
echo “<a href='{$base_url}&hal=” . ($paged + 1) . “#aktivitas-list’ title=’Berikutnya’>›</a>”;
}
echo “<a href='{$base_url}&hal=$max_pages#aktivitas-list’ title=’Halaman Terakhir’>»</a>”;
echo “</div>”;
}
echo “</div>”;
wp_reset_postdata();
return ob_get_clean();
});
Nama : Register CPT Klien Update_SiLaporKerjaCL
Register CPT Klien Update_SiLaporKerjaCL”
- Mendaftarkan Custom Post Type (CPT) “Update Klien” dan akan muncul menu “Update Klien” pada menu WP Dashboar Admin
- Kondisi Aktif
- Run snippet everywhere
- Untuk SiLaporKerjaCL
Script
add_action(‘init’, ‘register_klien_update_cpt’);
function register_klien_update_cpt() {
$labels = array(
‘name’ => ‘Update Klien’,
‘singular_name’ => ‘Update Klien’,
‘menu_name’ => ‘Update Klien’,
‘name_admin_bar’ => ‘Update Klien’,
‘add_new’ => ‘Tambah Update’,
‘add_new_item’ => ‘Tambah Update Baru’,
‘new_item’ => ‘Update Baru’,
‘edit_item’ => ‘Edit Update’,
‘view_item’ => ‘Lihat Update’,
‘all_items’ => ‘Semua Update Klien’,
‘search_items’ => ‘Cari Update Klien’,
‘not_found’ => ‘Tidak ditemukan.’,
‘not_found_in_trash’ => ‘Tidak ditemukan di tong sampah.’
);
$args = array(
‘labels’ => $labels,
‘public’ => true,
‘show_in_menu’ => true,
‘menu_position’ => 25,
‘menu_icon’ => ‘dashicons-id-alt’,
‘supports’ => array(‘title’, ‘editor’, ‘author’, ‘custom-fields’),
‘has_archive’ => false,
‘show_in_rest’ => true, // mendukung Gutenberg & REST API
‘capability_type’ => ‘post’
);
register_post_type(‘klien_update’, $args);
}
Nama : REST API “Nama_Klien” SiLaporKerjaCL
Keterangan REST API “Nama_Klien” SiLaporKerjaCL
REST API – Daftar Nama & Kode Klien
Endpoint RESTMenyediakan daftar kode klien dan nama perusahaan secara publik (tanpa login)
✅ Digunakan oleh form “Update Klien” untuk:Mencegah input manual di field “Nama Klien”
Memvalidasi “Kode Klien”
Menampilkan notifikasi “✅ Kode klien valid” atau “❌ Kode klien tidak ditemukan”
Script
add_action(‘rest_api_init’, function () {
register_rest_route(‘silaporkerja/v1’, ‘/klien-public’, [
‘methods’ => ‘GET’,
‘callback’ => ‘silaporkerja_get_klien_public’,
‘permission_callback’ => ‘__return_true’,
]);
});
function silaporkerja_get_klien_public($request) {
$args = [
‘post_type’ => ‘profil_klien’,
‘post_status’ => ‘publish’,
‘posts_per_page’ => -1,
];
$query = new WP_Query($args);
$result = [];
if ($query->have_posts()) {
foreach ($query->posts as $post) {
$kode_klien = get_field(‘kode_klien’, $post->ID);
$nama_klien = get_field(‘nama_klien’, $post->ID); // Diambil dari field ACF
if (!empty($kode_klien) && !empty($nama_klien)) {
$result[] = [
‘kode’ => sanitize_text_field($kode_klien),
‘nama’ => sanitize_text_field($nama_klien),
];
}
}
}
return rest_ensure_response($result);
}
