JustPaste
HomeCategoriesAboutDonateContactTerms of UsePrivacy Policy
JustPaste

Free online notepad — write and share instantly

Navigate

  • Home
  • Timeline
  • Categories

Info

  • About
  • Donate
  • Contact

Legal

  • Terms of Use
  • Privacy Policy

© 2026 JustPaste.app. All rights reserved.

Made with ♥ by JustPaste

pnp2 | JustPaste.app
21 days ago4 views
👨‍💻Programming

pnp2

Mekanismenya tetap memakai guard di pnp.js. Ada satu tambahan supaya halaman bisa mengirim judul dan pesan sendiri (dipakai Upload Soal), lalu tiap halaman mendaftarkan kondisi dirty-nya.

1. pnp.js: dukung pesan khusus per halaman

a. Ganti register, clear, dan tambah options di window.PNP_DIRTY:

js
	register: function (fn, opts) { this._check = fn; this._opts = opts || {}; },
	clear: function () {
		if (typeof this._cleanup === "function") this._cleanup(); // hapus baris ini jika tidak memakai helper track()
		this._check = null;
		this._opts = null;
		this._cleanup = null;
	},
	options: function () { return this._opts || {}; },

b. Ganti confirmLeave di objek PNP:

js
	confirmLeave: function (proceed, onCancel) {
		if (!window.PNP_DIRTY.isDirty()) {
			proceed();
			return;
		}
		var opts = window.PNP_DIRTY.options();
		showConfirmModal(function () {
			window.PNP_DIRTY.clear();
			proceed();
		}, {
			title: opts.title || "Tinggalkan Halaman?",
			message: opts.message || "Perubahan Anda belum disimpan. Yakin ingin meninggalkan menu ini tanpa menyimpan?",
			confirmText: opts.confirmText || "Ya, Tinggalkan",
			cancelText: "Batal",
			variant: "warning",
			onCancel: onCancel
		});
	},

c. Ganti listener beforeunload. Peringatan bawaan browser (“perubahan mungkin tidak tersimpan”) menyesatkan untuk Upload Soal, jadi bisa dimatikan per halaman:

js
window.addEventListener("beforeunload", function (e) {
	if (window.PNP_DIRTY.isDirty() && window.PNP_DIRTY.options().warnOnUnload !== false) {
		e.preventDefault();
		e.returnValue = "";
	}
});
2. parameter-kelompok-distribusi.js

Ada empat mode edit: Kelompok Distribusi, Member, Jenis Soal Distribusi, dan Master Jenis Soal. Tambahkan di initParameterKelompokDistribusi(), sebelum window.__onLeavePage = ...:

js
	window.PNP_DIRTY.register(function () {
		return KDState.isEditingDistribusi ||
			KDState.isEditingMember ||
			KDState.isEditingJenisSoal ||
			JSState.isEditing;
	});

Setelah Save atau Cancel, semua flag kembali false, jadi otomatis tidak dirty.

3. pengaturan-notifikasi.js

Form-nya berupa modal yang dibuka dengan style.display = "flex". Dirty berarti ada modal yang sedang terbuka. Di PengaturanNotifikasiApp.init, sebelum window.__onLeavePage = ...:

js
        window.PNP_DIRTY.register(function () {
            return ["modalAgendaNotifSetting", "modalUserNotif"].some(function (id) {
                var m = document.getElementById(id);
                return !!(m && m.style.display === "flex");
            });
        });
4. pengaturan-running-text.js

Di PengaturanRunningTextApp.init, sebelum window.__onLeavePage = ...:

js
        window.PNP_DIRTY.register(function () {
            return ["modalRtAgenda", "modalRtUser"].some(function (id) {
                var m = document.getElementById(id);
                return !!(m && m.style.display === "flex");
            });
        });
5. bank-soal.js

Halaman ringkasan BankSoalApp tidak punya form, jadi tidak perlu diubah. Yang perlu guard adalah BankSoalDetailApp, saat mode edit. Tambahkan di init, sebelum window.__onLeavePage = ...:

js
        var selfDetail = this;
        window.PNP_DIRTY.register(function () {
            return selfDetail.state.isEditing;
        });

Kalau pengguna memilih “Ya, Tinggalkan”, loadPage memanggil cleanup(), sehingga lock SignalR Jenis Soal tetap dilepas seperti biasa.

6. kode-referensi (KodeRefApp)

Dirty jika modal buat/edit sedang terbuka. Di init, sebelum window.__onLeavePage = ...:

js
        window.PNP_DIRTY.register(function () {
            var m = document.getElementById("modalKodeReferensi");
            return !!(m && m.style.display === "flex");
        });
7. upload-soal.js

Dirty selama masih ada draft di tabel temporary yang belum dipublish atau dibuang. Pesannya menjelaskan bahwa soal tidak akan terhapus. Di init, sebelum window.__onLeavePage = ...:

js
        var selfUpload = this;
        window.PNP_DIRTY.register(function () {
            return !!selfUpload.state.currentBatchId ||
                selfUpload.state.totalRecords > 0 ||
                selfUpload.state.allData.length > 0;
        }, {
            title: "Tinggalkan Halaman Upload Soal?",
            message: "Draft soal belum disimpan ke Bank Soal. Soal tidak akan terhapus karena sudah tersimpan di tabel temporary, " +
                     "dan dapat dilanjutkan saat Anda membuka menu Upload Soal kembali. Yakin ingin meninggalkan halaman ini?",
            confirmText: "Ya, Tinggalkan",
            warnOnUnload: false
        });

Setelah _publishToMain atau _discardDraft, _resetDraftState() mengosongkan currentBatchId dan data, jadi modal tidak muncul lagi.

Perbaikan kecil. Pesan di atas menyebut soal tidak akan terhapus, tetapi edit sel yang dilakukan kurang dari 500 ms sebelum pindah menu bisa hilang. Alasannya, cleanup() membatalkan timer auto-save. Supaya klaim itu benar, flush dulu di awal cleanup, sebelum this._pageToken++;:

js
    cleanup: function () {
        this._flushAllPendingRowUpdates();   // <-- TAMBAH: kirim edit yang masih menunggu debounce
        this._pageToken++;
        // ...sisanya tidak berubah

Request update tetap terkirim walau halaman sudah berpindah, karena hanya pembaruan UI yang dilewati oleh pengecekan token.

Ringkasan
Menu	Kondisi dirty	Pesan
Parameter Scoring, Kelompok Distribusi	flag isEditing* aktif	default
Parameter Survey	modal form terbuka	default
Notifikasi, Running Text, Kode Referensi	modal form terbuka	default
Bank Soal (detail)	isEditing aktif	default
Distribusi Soal (Create/Reschedule)	form terisi	default
Upload Soal	ada draft temporary	khusus (soal tidak terhapus)

Menu Dashboard, Report, Approval, Bank Soal (ringkasan), dan Distribusi Soal (tabel utama) tidak punya data yang bisa hilang, jadi tidak perlu didaftarkan. ujian-peserta dan pencapaian-pnp tidak ada di dokumen. Kalau Anda ingin menjaga ujian yang sedang berlangsung, kirim filenya dan saya tuliskan kondisinya.
← Back to timeline