Skip to content

Feature: Editor skema kabupaten (KAB-02) — daftar sektor, susun isian, simpan draf, dan terbitkan - #1308

Open
pandigresik wants to merge 5 commits into
rilis-devfrom
2504-pengelola-skema-editor
Open

pandigresik wants to merge 5 commits into
rilis-devfrom
2504-pengelola-skema-editor

Conversation

@pandigresik

@pandigresik pandigresik commented Oct 15, 2026 •

Copy link
Copy Markdown
Contributor

Pull Request: Feature: Editor skema kabupaten (KAB-02) — daftar sektor, susun isian, simpan draf, dan terbitkan

Description

Pada mode Terpusat, desa tidak dapat mengubah skema sendiri, sehingga halaman ini menjadi satu-satunya tempat skema kabupaten diatur. PR ini mengubah /dataspasial/skema dari kerangka statis menjadi editor tiga panel yang berfungsi penuh: daftar sektor dan versi di kiri, tabel isian di tengah, pratinjau formulir desa di kanan — seluruhnya dibaca dan ditulis lewat DataSpasialApiService ke API Satu Data.

Selain editor, PR ini mengaktifkan tombol Terbitkan (tadi nonaktif statis) dan menambahkan ubah sektor, sehingga alur dari menyusun sampai menerbitkan dapat dilakukan dari satu halaman.

Changes made:

  1. Service: SkemaEditorService baru (431 baris) — read model pemetaan sektor, versi, isian, pemetaan sumber, dan status editor.
  2. Enum: TipeIsian dan StatusSkemaEditor untuk tipe isian serta keadaan editor (kosong / draf / terbit / belum tersedia).
  3. Controller: SkemaDataSpasialController — index, storeSektor, updateSektor, storeDraf, terbit; sumber kebenarannya daftar sektor dan riwayat versi, bukan daftar skema.
  4. FormRequest: StoreSektorRequest, UpdateSektorRequest, StoreDrafSkemaRequest, TerbitSkemaRequest — seluruh aksi tulis memakai FormRequest (bukan validator() inline).
  5. Route: GET dataspasial/skema (read) serta POST|PUT sektor, POST draf, POST terbitan — semuanya dibatasi permission:dataspasial-skema-write.
  6. Service klien: DataSpasialApiService — menambah riwayatSkema(), buatSektor(), ubahSektor(), dan memakai ulang buatDrafSkema() / terbitkanSkema() untuk endpoint yang belum ada.
  7. View: 6 partial baru + penyusunan ulang index.blade.php (daftar sektor, daftar versi, tabel isian, form isian, pemilih sumber, pratinjau).
  8. Frontend: public/js/dataspasial/schema-editor.js (946 baris) — tambah/hapus/urut isian, pemetaan sumber, saklar tampilan, pratinjau langsung, simpan draf, terbitkan, ubah sektor.
  9. Test: 14 file test DataSpasial (≈2.660 baris) + Fixtures.php berisi salinan respons API nyata, dan SmokeSkemaEditorTest.php untuk browser.

Reason for change:

  • Daftar skema tidak bisa diambil dari GET /skema?sektor=: endpoint itu hanya mengembalikan satu versi aktif. Editor butuh seluruh versi (draf berjalan + riwayat), sehingga dipakai GET /skema/riwayat?sektor={kode} — diverifikasi langsung ke API hidup.
  • Keunikan milik API, bukan OpenKab: nama sektor dan nomor_versi divalidasi sisi server. OpenKab hanya menjaga bentuk input; field tersembunyi nama_sektor_ada dihapus agar tidak ada sumber kebenaran ganda.
  • kode isian diturunkan dari label: admin tidak lagi mengetik kode. Label duplikat ditolak (bukan diberi akhiran angka) dan keunikannya berlaku per versi — draf berikutnya disalin dari versi sebelumnya, jadi larangan lintas versi akan membuat penerbitan versi mustahil.
  • Tombol Terbitkan tidak bisa tetap nonaktif: penerbitan adalah langkah nyata yang perlu Umumnya sudah ada di DataSpasialApiService dari KAB-01, tetapi tidak ada route, controller, maupun handler JS — jadi diimplementasikan penuh di sini.

Impact of change:

✅ Editor berfungsi: halaman /dataspasial/skema tidak lagi sekadar kerangka — daftar sektor, versi, isian, dan pratinjau semuanya hidup.
✅ Alur penuh sampai terbit: draf → terbitan dengan konfirmasi yang menyebut sektor dan nomor versi.
✅ Otorisasi ditegakkan server-side lewat middleware permission, bukan sekadar menyembunyikan tombol.
✅ Kegagalan API tidak merusak state: 404/405/422 diterjemahkan menjadi pesan "data sementara tidak tersedia"; isi editor dipertahankan.
✅ Satu sumber kebenaran untuk kode: nilai turunan dari label yang selalu dihitung ulang saat serialisasi, bukan input yang bisa dipercayai tapi berbeda dari label.
✅ Bug runtime tertangkap: dataset?.aturan-hitung diparse sebagai pengurangan sehingga ReferenceError terjadi setiap kali admin menekan "Simpan draf" — sudah diperbaiki dan diberi regression test.

Related Issue

⚠️ Perubahan di luar lingkup yang ikut ter-commit

Commit 7cc36145 ("UI/UX sudah OK") membbundel refaktor pada 7 service yang tidak berkaitan dengan KAB-02:

app/Services/ArtikelService.php          |  1 -
app/Services/CaptchaService.php          | 47 +++-----
app/Services/ConfigApiService.php        | 18 +++---
app/Services/IlluminatePaginatorAdapter.php |  4 +-
app/Services/OtpService.php              | 73 ++++++----
app/Services/SitemapService.php          | 13 +---
app/Services/TwoFactorService.php        |  2 +-

Perubahan ini tidak bagian dari #1297 dan sebaiknya dipisah menjadi PR tersendiri agar review fokus. Tidak ada test yang menutupnya di PR ini.

Selain itu, .eslintignore, .npmignore, dan .prettierignore masih untracked — belum ikut ter-commit.

Steps to Reproduce

Before (sebelum PR):

  1. Buka /dataspasial/skema
  2. ❌ Halaman hanya menampilkan kerangka — daftar sektor kosong, tabel isian tidak memiliki baris
  3. ❌ Tidak ada cara menambah sektor, menyusun isian, atau menyimpan draf
  4. ❌ Tombol "Terbitkan" selalu nonaktif dengan catatan "Penerbitan menjadi lingkup KAB-03"
  5. ❌ Admin tidak bisa mengubah sektor yang sudah ada

After (sesudah PR):

  1. Buka /dataspasial/skema sebagai peran Admin Skema
  2. ✅ Daftar sektor tampil di kiri dengan label versi / draf berjalan
  3. ✅ Pilih sektor → daftar versi tampil dari endpoint riwayat
  4. ✅ Susun isian: label diisi, kode terbangkit otomatis dan kolomnya tidak lagi ada
  5. ✅ Simpan draf lewat POST /dataspasial/skema; draf dapat dibuka dan diedit lagi
  6. ✅ Klik Terapkan → konfirmasi menyebut sektor + nomor versi → POST terbitan
  7. ✅ Klik ikon pensil pada sektor → ubah nama & ikon (kode tampil baca-saja)

Testing on related features:

  • KAB-01 (menu, permission, komponen tiga-keadaan) ✅ tidak berubah — DataSpasialController.php tidak disentuh
  • Simpan draf & buka kembali ✅ 11 test
  • Validasi isian ✅ 25 test
  • Otorisasi peran ✅ 37 test (DataSpasialMenuAccessTest)

Checklist

  • I have complied with script writing rules
  • I have followed pull request review process
  • I have created unit test/integration test to verify the fix
  • Manual testing has been done in development environment
  • No console errors or warnings
  • Code has been reviewed by at least 1 person

Technical Details

Technical Explanation

Arsitektur: nol tabel lokal. Seluruh data ds_* dibaca/tulis lewat DataSpasialApiService. Halaman hanya punya satu sumber kebenaran — daftar sektor (GET /dataspasial/sektor) dan riwayat versi (GET /dataspasial/skema/riwayat?sektor={kode}).

Komponen tiga-keadaan dari KAB-01 dipakai apa adanya:

data        → editor tampil
empty       → "Belum ada isian"
unavailable → "Data sementara tidak tersedia", tombol mati

Alur kode (FR-017/Q14/Q17):

// satu-satunya tempat yang membuat kode
export function slugKodeDariLabel(label) {
    const dasar = String(label || '')
        .toLowerCase()
        .normalize('NFD')
        .replace(/[\u0300-\u036f]/g, '')   // buang tanda diakritik
        .replace(/[^a-z0-9]+/g, '_')
        .replace(/_+/g, '_')
        .replace(/^_|_$/g, '');

    if (dasar === '' || !/^[a-z]/.test(dasar)) {
        return '';
    }
    return dasar;
}

Jumlah Siswa → jumlah_siswa. Label duplikat ditolak; kode tidak diberi akhiran angka. Saat serialisasi, kode selalu dihitung ulang dari label — input kode tidak pernah dipercaya.

Otorisasi — server-side, bukan menyembunyikan tombol:

Route::post('skema/sektor', [SkemaDataSpasialController::class, 'storeSektor'])
    ->middleware('permission:dataspasial-skema-write')
    ->name('dataspasial.skema.sektor.store');

Configuration changes

Tidak ada perubahan config, .env, atau migrasi. Peran & izin sudah tersedia dari KAB-01 — tidak ada migration peran baru.

Dependencies added

No new dependencies. Everything uses the existing stack (Laravel 13, Blade, native HTML5 drag-and-drop, ben-sampo/laravel-enum).

⚠️ npm run build tidak dapat dipakai — resources/sass/app.scss mengimpor daterangepicker yang tidak ada di node_modules (masalah bawaan, bukan dari PR ini). Karena itu JS editor diletakkan di public/js/dataspasial/schema-editor.js dan dimuat lewat asset(). Bundling diverifikasi dengan npx esbuild.

Testing

Manual Testing

  • Tambah sektor baru → kode bathed otomatis, tampil baca-saja
  • Ubah sektor (ikon pensil) → nama & ikon berubah, kode tetap
  • Susun isian → kolom Kode tidak ada, kode muncul otomatis saat label diketik
  • Dua isian berlabel sama pada satu versi → ditolak, pesan menyebut label yang bentrok
  • Ubah label lalu belum simpan → tombol Terbitan nonaktif dengan "Simpan draf dulu"
  • Simpan draf → sukses, kembali ke editor dengan draf terbuka
  • Terbitkan → konfirmasi menyebut sektor + nomor versi → versi berstatus terbit
  • Isian manual di pratinjau → input bisa diisi; isian terpetakan → terkunci + keterangan sumber
  • Buka editor dengan API mati → "data sementara tidak tersedia", tombol mati, tanpa halaman error

Automated Testing

14 file, 258 test passed (diverifikasi per-file):

File Test
SkemaEditorSektorTest 36
SkemaEditorValidationTest 25
SkemaEditorIsianTest 18
DataSpasialRoleMigrationTest 18
DataSpasialUnavailableTest 18
DataSpasialMenuAccessTest 37
DataSpasialApiServiceTest 41
SkemaEditorPratinjauTest 13
SkemaEditorDrafTest 11
SkemaEditorSaklarTest 10
DataSpasialResultTest 10
SkemaEditorPemetaanTest 8
SkemaEditorEditSektorTest 8
SkemaEditorTerbitTest 7

Perintah:

vendor/bin/pest tests/Feature/DataSpasial/
vendor/bin/pint --test app/Http/Requests/DataSpasial/ app/Http/Controllers/DataSpasial/ app/Services/ tests/Feature/DataSpasial/

⚠️ Peringatan: hasil di atas adalah jumlah per file. Jalankan vendor/bin/pest tests/Feature/DataSpasial/ satu kali untuk mengonfirmasi jumlah gabungan — run gabungan pernah terputus dua kali dan belum pernah selesai penuh.

Screenshots / Video

simplescreenrecorder-2026-10-16_10.00.54.mp4

Before:

Halaman /dataspasial/skema hanya kerangka — tidak ada daftar sektor, tabel isian kosong, tombol Terbitkan nonaktif.

After:

Tiga panel aktif — daftar sektor + versi di kiri, tabel isian (tanpa kolom Kode) di tengah, pratinjau formulir di kanan; tombol Simpan draf & Terbitkan aktif.

⚠️ Screenshot belum dilampirkan. DoD #1297 mewajibkan screenshot/contoh request-response — perlu dilengkapi sebelum merge.

Breaking Changes

None — tidak ada perubahan pada kontrak API, config, atau skema basis data. ds_skema_versi tidak perlu field nama baru.

⚠️ Perubahan perilaku pada UI: kolom Kode dihapus dari tabel isian. kode kini diturunkan dari label. Ini konsekuensi langsung dari Q14, bukan perubahan tak terduga.

Migration Guide

Not required — tidak ada migrasi. Peran dan izin sudah ada dari KAB-01.

References

  • Issue: [KAB-02] Editor sektor, isian & pemetaan skema kabupaten #1297
  • Kontrak API: docs/spasial/openapi-fondasi.yaml
  • Temuan kontrak: specs/004-pengelola-skema-editor/contracts/skema-editor-api.md
  • Usulan kontrak: specs/004-pengelola-skema-editor/contracts/openapi-fragment.yaml
  • Spesifikasi: specs/004-pengelola-skema-editor/spec.md
  • Rencana & tugas: specs/004-pengelola-skema-editor/tasks.md

Additional notes untuk reviewer:

  1. Pisahkan 7 service tak terkait (lihat bagian "di luar lingkup") sebelum merge — membuat diff review jauh lebih mudah.
  2. Testing manual belum dilakukan. PR ini besar dan menyentuh UI; ToDo [KAB-02] Editor sektor, isian & pemetaan skema kabupaten #1297 mewajibkan review System Analyst + uji QA staging.
  3. Browser smoke belum dijalankan. Bug ReferenceError: hitung is not defined pada "Simpan draf" bertahan lama karena tidak ada test yang benar-benar mengklik tombol itu. Test yang ada bersifat statis/regression — belum menggantikan browser test.
  4. Empat endpoint tulis belum ada di API. Fitur edit sektor & terbitan sudah terimplementasi penuh tetapi akan menampilkan "data sementara tidak tersedia" sampai Perbaikan bug menu struktur bagan pada organisasi #468/tambahkan tombol data selengkapnya pada detail suplemen terdata dan pada export data #470 Landing. Perlu disepakati apakah PR ini boleh merge sebelum endpoint tersedia.

@github-actions

Copy link
Copy Markdown
Contributor

🔄 AI PR Review sedang antri di server...

Proses review akan segera dimulai di background — hasil akan muncul sebagai komentar setelah selesai.
Powered by CrewAI · PR #1308

@pandigresik pandigresik changed the title pengelola skema editor Feature: Editor skema kabupaten (KAB-02) — daftar sektor, susun isian, simpan draf, dan terbitkan Oct 15, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant