@extends('layouts.app', ['class' => 'g-sidenav-show bg-gray-100']) @section('content') @include('layouts.navbars.auth.topnav', ['title' => ''])

MSJFramework

Dokumentasi Layout dan Fitur

Panduan ringkas namun tetap cukup lengkap untuk memahami cara kerja struktur menu dinamis di MSJFramework, hubungan antara sys_gmenu, sys_dmenu, sys_table, dan sys_auth, fungsi setiap layout bawaan, pola routing ke controller layout, mekanisme metadata field, validasi, query lookup, generate ID, sampai contoh implementasi nyata yang sudah tersedia di project ini agar proses membuat menu baru lebih cepat, konsisten, dan mudah dipelajari oleh developer lain.

Peta Cepat

1. Buat / siapkan tabel migrasi

2. Daftarkan menu di sys_dmenu

3. Atur field di sys_table

4. Beri akses lewat sys_auth

@if (!empty($setup_app->file_docs ?? null)) Download PDF Docs @else @endif
Komponen Inti
  • sys_gmenu: grup menu sidebar.
  • sys_dmenu: daftar menu, url, icon, layout, tabel.
  • sys_table: metadata field, validasi, query, posisi, dan tampilan.
  • sys_auth: hak akses per role, termasuk add, edit, delete, print, approval, dan posting.
  • sys_id + sys_counter: generator ID otomatis.
  • sys_enum: master enum layout, type, status, dan nilai default.
  • Function_Helper::resolveContentView(): helper global pencari view konten berdasarkan sys_gmenu aktif.
Alur Routing
  • PageController membaca sys_dmenu.url.
  • Jika layout != manual, framework mengarah ke controller layout terkait.
  • Contoh: standr ke StandrController, transc ke TranscController, listdt ke ListdtController.
  • Jika manual, view diambil langsung dari folder sesuai grup menu dan url.
  • Jika anda merubah posisi gmenu pada list_menu yang menggunakan layout standr, master, report, transc dan listdt maka yang harus lakukan adalah mengupdate gmnu di sys_table dan sys_auth.
Seeder Referensi
  • example_gmenu: semua menu contoh.
  • example_tabel_form_standard: contoh layout standard.
  • example_tabel_form_master: contoh layout master.
  • example_tabel_form_transaction: contoh layout transaction.
  • menu_framework_docs: menu dokumentasi framework.
  • example_insert_transaction: sample data transaction untuk trexam.
Daftar Layout
Layout Fungsi Controller / View Contoh Menu
standr CRUD satu tabel, form biasa, cocok untuk master sederhana. StandrController Layout - Standard (msfrmd)
master CRUD dengan list lebih kaya, export, split posisi kiri-kanan. MasterController Layout - Master (msfrmm), Example Menu X (dmenux)
system Header-detail metadata internal framework. SystemController System Auth (authxx), System Table (tablex)
sublnk Sub menu / child data yang ditautkan dari menu lain. SublnkController Layout - Sublink (sbexam)
report Filter report, query dinamis, result DataTable, export. ReportController Layout - Report (rpexam), Report Syslog (rsyslg)
transc Transaksi header-detail dengan tabel _h dan _d, alur status, approval, posting, reverse, dan print preview PDF. TranscController Layout - Transaction (trexam)
listdt Halaman list / dokumentasi tanpa CRUD, tetap lewat controller layout. ListdtController Framework Docs (fwdocs)
manual Halaman bebas yang langsung menuju view spesifik tanpa controller layout. View custom Dashboard (dashbr), Report Seeder (rpseed)
Field Type Umum
  • string, char, text: input teks dasar.
  • number, currency: angka dan nominal.
  • date, date2: tanggal tunggal / rentang.
  • enum: select option dari query.
  • search: modal lookup berbasis query.
  • image, file: upload file / gambar.
  • hidden: nilai sistem yang tidak ditampilkan.
  • join, report, sublink: kebutuhan khusus layout tertentu.
Arti Kolom Penting di sys_table
  • field: nama kolom database.
  • alias: label tampilan.
  • validate: rule Laravel validation.
  • query: sumber data untuk enum/search/join/report.
  • primary: primary key field.
  • list: tampil di list / tabel.
  • show: tampil di form / view.
  • position:
    0 standard, 1 header, 2 detail, 3 left, 4 right.
Fitur dan Kegunaan Tiap Layout

Baca bagian ini jika Anda ingin memilih layout yang paling cocok lebih dulu. Urutannya dibuat dari layout yang paling umum dipakai sampai layout yang paling khusus.

Kegunaan: menu CRUD satu tabel yang sederhana dan cepat dipakai untuk master data umum.

Gunakan jika: Anda hanya butuh satu tabel, form sederhana, dan alur CRUD standar.

  • Memakai satu tabel utama.
  • Mendukung add, edit, show, nonaktifkan, dan upload file / image.
  • Mendukung validasi dari sys_table.validate.
  • Bisa memakai enum, search, dan generate ID.
  • Cocok untuk form standar tanpa detail child.

Kegunaan: menu CRUD satu tabel dengan list yang lebih kaya dan nyaman untuk data operasional.

Gunakan jika: Anda masih memakai satu tabel, tetapi butuh list, filter, dan komponen form yang lebih fleksibel.

  • Toolbar list mendukung search, pagination, dan export.
  • Form bisa dibagi posisi kiri dan kanan lewat position 3 dan 4.
  • Mendukung komponen search, enum, custom-select, dan select-multiple.
  • Cocok untuk menu master yang butuh list lebih fleksibel dibanding standr.

Kegunaan: menu pengaturan internal framework dan tabel metadata sistem.

Gunakan jika: menu yang dibuat berhubungan langsung dengan konfigurasi aplikasi atau tabel sistem.

  • Dipakai untuk menu inti seperti auth, table, role, setup, dan sejenisnya.
  • Mendukung pola CRUD seperti layout lain, tetapi fokusnya untuk konfigurasi framework.
  • Cocok saat field dan prosesnya terkait pengaturan aplikasi, bukan transaksi bisnis.

Kegunaan: child menu yang dibuka dari menu induk untuk menampilkan data turunan.

Gunakan jika: data hanya bermakna ketika dibuka dari parent atau transaksi induknya.

  • Dipakai ketika satu menu bergantung pada data parent.
  • Cocok untuk daftar detail, referensi turunan, atau shortcut data terkait.
  • Biasanya dipanggil dari konteks menu lain, bukan berdiri sendiri dari awal.

Kegunaan: halaman filter dan hasil report berbasis query dinamis.

Gunakan jika: tujuan utamanya adalah mencari, menyaring, menampilkan, dan mengekspor hasil query.

  • Filter report dibentuk dari metadata sys_table.
  • Mendukung search, enum, date range, dan query khusus.
  • Hasil report dapat ditampilkan dalam tabel dan diexport.
  • Cocok untuk menu analisa, monitoring, dan laporan operasional.

Kegunaan: transaksi header-detail dengan alur pilih transaksi, add, edit, show, hapus, dan print.

Gunakan jika: satu data utama memiliki banyak baris detail dan perlu alur input transaksi lengkap.

  • Nama tabel cukup base name, misal trs_rekap_tagihan.
  • Framework akan baca _h sebagai header dan _d sebagai detail.
  • Field position = 1 dipakai untuk header dan position = 2 untuk detail.
  • Status transaksi mendukung alur E = Entry, A = Approve, R = Reject, F = Finish, C = Cancel.
  • Detail row bisa tambah / hapus dinamis.
  • item otomatis diisi kelipatan 10, 20, 30....
  • Support search dan enum di header maupun detail, termasuk custom-select dan select-multiple.
  • Lookup transaksi di halaman list memakai endpoint /form-transaction-options/{page}.
  • Lookup transaksi di modal list mengikuti query metadata sys_table, termasuk kolom status dan badge warnanya.
  • Tombol Approve, UnApprove, Reject, dan Ajukan Kembali membutuhkan hak approval di sys_auth.
  • Tombol Posting dan Reverse membutuhkan hak posting di sys_auth.
  • Flow approval dan posting bersifat fleksibel: jika tidak ada hak approval aktif pada menu itu, maka Posting bisa langsung dipakai dari status E. Jika tidak ada hak posting aktif, maka flow approval tetap bisa dipakai tanpa proses posting terpisah.
  • Tombol aksi tampil bertahap sesuai status: Approve dan Reject saat E jika flow approval aktif, UnApprove saat A, Ajukan Kembali saat R, Posting saat A atau langsung E jika approval tidak dipakai, Reverse saat F.
  • Edit dan Delete otomatis dikunci saat status sudah A, F, atau C.
  • Tombol print sudah diarahkan ke preview PDF portrait.
  • Modal transaksi, detail dynamic row, preview show, dan print PDF semua memakai metadata yang sama agar satu kali setting bisa dipakai di banyak halaman.
  • Contoh menu: Layout - Transaction (trexam).

Kegunaan: halaman list atau dokumentasi tanpa CRUD dinamis.

Gunakan jika: Anda hanya perlu menampilkan konten informasi atau list statis dalam satu halaman.

  • Fokus pada satu view konten list.blade.php.
  • Tidak memakai add, edit, show, atau delete bawaan framework.
  • Cocok untuk halaman informasi, dokumentasi, petunjuk, atau dashboard data ringan.
  • Resolver view mendukung perpindahan gmenu.

Kegunaan: halaman bebas yang tidak ingin mengikuti engine CRUD dinamis.

Gunakan jika: kebutuhan halaman terlalu khusus dan akan lebih cepat dibuat manual daripada dipaksa ke layout dinamis.

  • Developer bebas menentukan view, query, dan interaksi sendiri.
  • Cocok untuk dashboard, landing page internal, utility page, atau report khusus.
  • Dipakai ketika kebutuhan halaman terlalu spesifik untuk dipaksa ke layout standar framework.
Fallback Framework
  • Function_Helper::resolveContentView() dipakai layout listdt untuk mencari view berdasarkan daftar sys_gmenu aktif.
  • StandrController punya fallback metadata sys_table berdasarkan dmenu bila gmenu menu dipindah tetapi metadata belum ikut dipindah.
  • TranscController juga memakai fallback metadata sys_table berdasarkan dmenu, sehingga menu transaksi tetap bisa membaca field walau posisi gmenu dipindah.
  • PageController::searchOptions() sekarang bisa membaca field yang punya query walau tidak literal bertipe search, agar cocok untuk lookup transaksi.
  • PageController::transactionOptions() membangun modal pilih transaksi dari query metadata dan sekaligus menyiapkan URL aksi show, edit, delete, approve, unapprove, reject, posting, reverse, dan print.
Flow Status Transaksi

Gunakan bagian ini sebagai panduan cepat untuk memahami kapan tombol aksi transaksi muncul dan apa dampaknya ke status dokumen.

Kode Arti Badge
E Entry Entry
A Approve Approve
R Reject Reject
F Finish Finish
C Cancel Cancel
Urutan Proses

E A / R F C

  • Status awal transaksi umumnya dimulai dari E atau Entry.
  • Tombol Approve hanya muncul jika user punya hak approval dan status masih E.
  • Tombol Reject juga muncul saat status E dan akan meminta alasan reject melalui textarea sebelum status berubah menjadi R.
  • Tombol UnApprove muncul saat status A dan akan mengembalikan transaksi ke E.
  • Tombol Ajukan Kembali muncul saat status R dan akan mengembalikan transaksi ke E agar bisa diproses approval lagi.
  • Tombol Posting hanya muncul jika user punya hak posting dan status sudah A, atau langsung dari E jika menu itu memang tidak memakai flow approval terpisah.
  • Jika menu tidak punya hak posting aktif, maka alur approval akan berhenti di A atau R sampai user melakukan UnApprove dari A atau Ajukan Kembali dari R untuk kembali ke E.
  • Tombol Reverse hanya muncul jika user punya hak posting dan status sudah F.
  • Saat status sudah A, F, atau C, tombol Edit dan Delete otomatis dikunci oleh UI dan backend.
  • Modal list transaksi akan menampilkan badge status agar user mudah mengenali posisi dokumen sebelum memilihnya.
Skenario Flow
approval = 1 dan posting = 1 E -> A / R, lalu A -> F -> C dan R -> E
Hanya posting = 1 E -> F -> C
Hanya approval = 1 E -> A / R -> E
Ringkasan Alur Membuat Menu Baru

Jika Anda hanya butuh gambaran cepat, cukup ikuti tujuh langkah ini. Jika perlu panduan detail per layout, lanjutkan ke accordion di bawahnya.

  1. Tentukan layout yang ingin dipakai: standr, master, report, transc, listdt, atau manual.
  2. Buat migration tabel sesuai kebutuhan.
  3. Tambahkan menu ke sys_dmenu.
  4. Tambahkan akses role ke sys_auth.
  5. Tambahkan metadata field ke sys_table.
  6. Jika perlu ID otomatis, isi sys_id dan sys_counter.
  7. Untuk transaksi, siapkan dua tabel dengan suffix _h dan _d.
Menu Referensi yang Sudah Ada
  • Layout - Standard (msfrmd): contoh standard.
  • Layout - Master (msfrmm): contoh master.
  • Layout - System (msfrms): contoh system.
  • Layout - Report (rpexam): contoh report.
  • Layout - Sublink (sbexam): contoh sublink.
  • Layout - Transaction (trexam): contoh transaction sederhana dengan header search dan detail search/enum.
  • Framework Docs (fwdocs): dokumentasi framework dengan layout listdt.
Contoh Langkah Teknis Membuat Menu Baru

Bagian ini menjelaskan alur teknis yang biasa dipakai di MSJFramework sampai menu benar-benar bisa dibuka. Urutan bacanya disarankan:
1. pilih layout yang sesuai, 2. baca langkah teknis layout tersebut, 3. buat migration dan seeder, 4. jalankan migrate:fresh --seed atau db:seed, 5. uji menu dari sidebar.

Cocok untuk: CRUD satu tabel, form sederhana, master data umum.

  1. Buat migration satu tabel, misalnya master_karyawan.
  2. Pastikan ada primary key yang jelas, misalnya nik atau id.
  3. Buat seeder menu ke sys_dmenu dengan:
    layout = standr, tabel = master_karyawan, url, dmenu, gmenu.
  4. Tambahkan akses role ke sys_auth.
  5. Isi sys_table untuk semua field yang tampil di list, add, edit, dan show.
    Gunakan position = 0.
  6. Set field primary dengan primary = 1.
  7. Jika ID auto generate, isi sys_id lalu pastikan counter awal tersedia di sys_counter.
  8. Daftarkan seeder ke DatabaseSeeder bila ingin ikut saat migrate:fresh --seed.

Contoh: Layout - Standard (msfrmd).

Cocok untuk: CRUD satu tabel dengan list lebih kaya, export, dan toolbar data.

  1. Langkah dasarnya sama dengan standr: migration tabel, seeder sys_dmenu, sys_auth, dan sys_table.
  2. Pada sys_dmenu set layout = master.
  3. Gunakan position = 3 untuk field kiri dan position = 4 untuk field kanan bila form ingin terbagi dua sisi.
  4. Field list yang ingin tampil di tabel harus list = 1.
  5. Jika ada lookup, isi query pada field bertipe search atau enum.
  6. Bila menu dipindah gmenu-nya, framework punya fallback metadata berdasarkan dmenu, tetapi tetap disarankan metadata sys_table ikut dirapikan.

Contoh: Layout - Master (msfrmm).

Cocok untuk: menu internal framework yang butuh pola metadata sistem.

  1. Buat tabel dan field sesuai kebutuhan internal.
  2. Set menu ke layout = system.
  3. Definisikan field di sys_table seperti layout CRUD lain.
  4. Gunakan tipe field khusus bila memang dibutuhkan oleh pengaturan sistem.
  5. Karena biasanya dipakai admin, pastikan role yang boleh mengakses benar-benar dibatasi di sys_auth.

Contoh: System Auth (authxx), System Table (tablex).

Cocok untuk: child data yang dibuka dari menu induk.

  1. Buat tabel child lebih dulu dan tentukan foreign key ke tabel induk.
  2. Set menu child ke layout = sublnk.
  3. Isi metadata sys_table untuk field child yang tampil.
  4. Pastikan field penghubung ke parent tersedia dan konsisten dengan link yang dikirim dari menu induk.
  5. Uji dari menu parent, bukan hanya dari URL langsung.

Contoh: Layout - Sublink (sbexam).

Cocok untuk: filter report, query dinamis, hasil tabel dan export.

  1. Tidak wajib membuat tabel baru jika report hanya membaca data yang sudah ada.
  2. Buat menu di sys_dmenu dengan layout = report.
  3. Di sys_table, field yang tampil pada halaman filter harus show = 1.
  4. Isi query untuk field search, enum, atau lookup report lainnya.
  5. Pastikan query hasil report mengembalikan alias kolom yang stabil agar tabel result dan export konsisten.
  6. Uji filter, modal search, dan export setelah metadata selesai dibuat.

Contoh: Layout - Report (rpexam), Report Syslog (rsyslg).

Cocok untuk: transaksi header-detail dengan add/edit/show/print.

  1. Tentukan nama base tabel, misalnya example_transaction.
  2. Buat dua tabel:
    example_transaction_h untuk header, example_transaction_d untuk detail.
  3. Tentukan primary key header. Jika auto generate, siapkan format di sys_id.
  4. Pastikan tabel detail punya field foreign key yang mengarah ke primary key header, misalnya idtrx atau id_tanterima.
  5. Tambahkan menu ke sys_dmenu dengan:
    layout = transc, tabel = example_transaction.
  6. Isi sys_auth untuk akses add, edit, delete, dan print.
  7. Jika transaksi memakai proses approval bertahap, isi juga kolom approval dan posting di sys_auth.
  8. Isi sys_table:
    position = 1 untuk header, position = 2 untuk detail.
  9. Field primary header harus primary = 1.
  10. Jika input pilih transaksi di list ingin pakai query custom, isi query pada field primary header atau field header bertipe search.
  11. Untuk detail dinamis, sediakan field item bila ingin urutan otomatis 10, 20, 30....
  12. Jika ada search atau enum di detail, isi query lookup di metadata agar modal dan select dapat memuat data via AJAX.
  13. Jika transaksi memakai proses reject, siapkan kolom seperti remark untuk menyimpan alasan reject dan tambahkan metadata field yang sesuai di header maupun detail bila memang ingin ikut dilacak. Pada contoh saat ini, remark disimpan untuk proses reject dan tidak ditampilkan di halaman tambah, edit, maupun show biasa.
  14. Jika modal pilih transaksi di list ingin menampilkan status yang rapi, gunakan query lookup dengan CASE WHEN untuk mengubah kode status menjadi label seperti Entry, Approve, Reject, Finish, dan Cancel.
  15. Flow status bawaan yang saat ini dipakai adalah E -> A / R, lalu A -> F -> C untuk menu yang memakai approval dan posting sekaligus. Jika hanya salah satu flow yang dipakai, sesuaikan rule bisnisnya, misalnya E -> F -> C untuk posting saja atau E -> A / R -> E untuk approval saja.
  16. Setelah status masuk A, F, atau C, tombol Edit dan Delete otomatis dikunci oleh UI dan backend.
  17. Setelah seeder dijalankan, uji alur lengkap:
    list, pilih transaksi, add, edit, hapus, approve, unapprove, reject, posting, reverse, show, print preview PDF.

Contoh: Layout - Transaction (trexam).

Cocok untuk: halaman dokumentasi atau halaman list statis tanpa CRUD.

  1. Buat menu di sys_dmenu dengan layout = listdt.
  2. Siapkan view konten dengan pola resources/views/{gmenu}/{url}/list.blade.php.
  3. Jika menu dipindah ke gmenu lain, resolver view akan mencoba mencari kandidat berdasarkan semua sys_gmenu aktif.
  4. Layout ini tidak menyiapkan add, edit, delete, atau show. Isi halaman sepenuhnya dikendalikan oleh view.
  5. Sangat cocok untuk dokumentasi seperti fwdocs.

Contoh: Framework Docs (fwdocs).

Cocok untuk: halaman bebas yang memang punya view atau logic sendiri.

  1. Buat menu di sys_dmenu dengan layout = manual.
  2. Siapkan view sesuai kebutuhan menu, biasanya di folder yang memang dirancang khusus untuk halaman tersebut.
  3. Layout ini tidak mengikuti engine CRUD dinamis, jadi logika form, query, atau komponen tambahan Anda kelola sendiri.
  4. Gunakan layout ini bila kebutuhan halaman terlalu khusus dan tidak cocok dipaksa ke standr, master, report, atau transc.

Contoh: Dashboard (dashbr), Report Seeder (rpseed).

@endsection