fix(ui): link repo ke gitea.oxpoe.xyz, buka semua menu, hapus kontak aktivasi
All checks were successful
CI / test (push) Successful in 1m55s

- ganti sisa URL gitea.oxpoe.qzz.io -> gitea.oxpoe.xyz (sidebar, donate, package.json, projectUrl)
- default menu sidebar semuanya Tampil (tidak ada lagi menu terkunci)
- hapus nomor kontak aktivasi palsu 081947215703 dari UI & pesan route
- form pengaturan sidebar tidak lagi meminta password aktivasi
This commit is contained in:
oxpoe
2026-11-05 06:29:33 +07:00
parent 64e321a350
commit 205db53d7e
9 changed files with 30 additions and 38 deletions

View File

@@ -177,7 +177,7 @@ app.use((req, res, next) => {
res.locals.serviceNotice = noticeSvc.getServiceNotice();
res.locals.uptimeUrl = getSetting('uptime_url', '');
res.locals.heroVer = getSetting('landing_hero_version', '');
res.locals.projectUrl = String(getSetting('project_url', 'https://gitea.oxpoe.qzz.io/oxpoe/open-isp') || '').replace(/\/+$/, '');
res.locals.projectUrl = String(getSetting('project_url', 'https://gitea.oxpoe.xyz/oxpoe/open-isp') || '').replace(/\/+$/, '');
res.locals.appVersion = String(getSetting('app_version', '0.5.1') || '0.5.1');
res.locals.appVersionName = String(getSetting('app_version_name', 'pickle-lime') || 'pickle-lime');
res.locals.pwaVersion = String(getSetting('pwa_version', '2.0') || '2.0');

View File

@@ -47,7 +47,7 @@ Rilis ini menggabungkan pembaruan fitur dari repo upstream (`alijayanet/billing-
- Kolom API key AI disamarkan di halaman Pengaturan.
## Dokumentasi
- 10 screenshot (desktop + mobile) di `docs/screenshots/`.
- 10 screenshot (desktop + mobile) di `docs/screenshots/` (format WebP, ringan).
## Cara upgrade

View File

@@ -50,12 +50,12 @@
},
"author": "oxpoe",
"license": "ISC",
"homepage": "https://gitea.oxpoe.qzz.io/oxpoe/open-isp#readme",
"homepage": "https://gitea.oxpoe.xyz/oxpoe/open-isp#readme",
"repository": {
"type": "git",
"url": "git+https://gitea.oxpoe.qzz.io/oxpoe/open-isp.git"
"url": "git+https://gitea.oxpoe.xyz/oxpoe/open-isp.git"
},
"bugs": {
"url": "https://gitea.oxpoe.qzz.io/oxpoe/open-isp/issues"
"url": "https://gitea.oxpoe.xyz/oxpoe/open-isp/issues"
}
}

View File

@@ -705,7 +705,7 @@ function requireSidebarMenuAccess(menuKey) {
}
if (access.reason === 'locked') {
req.session._msg = { type: 'error', text: `Menu "${access.menu.labelDefault}" terkunci. Hubungi ${sidebarMenuSvc.getFeatureContactPhone()} untuk mendapatkan password.` };
req.session._msg = { type: 'error', text: `Menu "${access.menu.labelDefault}" terkunci. Buka dari Pengaturan Sidebar.` };
return res.redirect('/admin/sidebar-settings');
}

View File

@@ -317,7 +317,7 @@ function requireSidebarMenuAccess(menuKey) {
}
if (access.reason === 'locked') {
req.session._msg = { type: 'error', text: `Menu "${access.menu.labelDefault}" terkunci. Hubungi ${sidebarMenuSvc.FEATURE_CONTACT_PHONE} untuk mendapatkan password.` };
req.session._msg = { type: 'error', text: `Menu "${access.menu.labelDefault}" terkunci. Buka dari Pengaturan Sidebar.` };
return res.redirect('/admin/sidebar-settings');
}
@@ -3989,11 +3989,6 @@ router.get('/sidebar-settings', requireAdminSession, (req, res) => {
router.post('/sidebar-settings', requireAdminSession, restrictToAdmin, express.urlencoded({ extended: true }), (req, res) => {
try {
const featurePassword = String(req.body.feature_password || '').trim();
if (!sidebarMenuSvc.isFeaturePasswordValid(featurePassword)) {
throw new Error(`Password aktivasi salah. Hubungi ${sidebarMenuSvc.getFeatureContactPhone()} untuk mendapatkan password yang benar.`);
}
const menuStates = sidebarMenuSvc.sanitizeMenuStates(req.body.menu_state || {});
const success = sidebarMenuSvc.saveMenuStates(menuStates);
if (!success) throw new Error('Gagal menyimpan pengaturan sidebar');

View File

@@ -3,7 +3,7 @@ const { getSetting, getSettings, saveSettings } = require('../config/settingsMan
const { getAppSetting, saveAppSetting } = require('../config/database');
const FEATURE_PASSWORD_HASH = 'af03458614be223016c5bc1c0788eaefc6a6bfd0c11cdcd4bc520f49d0cb474a'; // sha256 kode aktivasi — plaintext hanya di settings.json (activation_code), tidak di repo
const FEATURE_CONTACT_PHONE = '081947215703';
const FEATURE_CONTACT_PHONE = '';
function getFeaturePasswordHash() {
return getSetting('feature_password_hash', FEATURE_PASSWORD_HASH);
@@ -115,16 +115,16 @@ const DEFAULT_MENU_STATES = {
cashiers_reports: STATE_VISIBLE,
collector_payments: STATE_VISIBLE,
tickets: STATE_VISIBLE,
inventory: STATE_LOCKED,
attendance: STATE_LOCKED,
payroll: STATE_LOCKED,
inventory: STATE_VISIBLE,
attendance: STATE_VISIBLE,
payroll: STATE_VISIBLE,
cash_in: STATE_VISIBLE,
expenses: STATE_VISIBLE,
expense_categories: STATE_VISIBLE,
cashier_attendance: STATE_VISIBLE,
technicians: STATE_LOCKED,
cashiers: STATE_LOCKED,
collectors: STATE_LOCKED,
technicians: STATE_VISIBLE,
cashiers: STATE_VISIBLE,
collectors: STATE_VISIBLE,
areas: STATE_VISIBLE,
update: STATE_VISIBLE,
vouchers_discounts: STATE_VISIBLE,
@@ -259,7 +259,7 @@ function enrichMenu(menu, states) {
locked,
hidden,
hrefResolved: menu.href,
lockedMessage: locked ? `Menu "${menu.labelDefault}" terkunci. Hubungi ${getFeatureContactPhone()} untuk mendapatkan password aktivasi.` : ''
lockedMessage: locked ? `Menu "${menu.labelDefault}" terkunci. Buka dari Pengaturan Sidebar.` : ''
};
if (Array.isArray(menu.children)) {
out.children = menu.children.map((ch) => enrichMenu(ch, states));

View File

@@ -129,7 +129,7 @@ document.addEventListener('DOMContentLoaded', () => {
<i class="bi bi-box-arrow-left"></i><span><%= t('common.logout', 'Logout') %></span>
</a>
<div class="mt-4 px-3 py-2 text-center" style="border-top: 1px solid rgba(255,255,255,0.1);">
<a href="https://gitea.oxpoe.qzz.io/oxpoe/open-isp" target="_blank" rel="noopener" style="color: #cbd5e1; font-size: 11px; text-decoration: none; font-weight: 700;">
<a href="https://gitea.oxpoe.xyz/oxpoe/open-isp" target="_blank" rel="noopener" style="color: #cbd5e1; font-size: 11px; text-decoration: none; font-weight: 700;">
OPEN-ISP BILLING SYSTEM
</a>
<div style="color:#64748b;font-size:10px;margin-top:3px;line-height:1.5">
@@ -163,7 +163,7 @@ document.addEventListener('DOMContentLoaded', () => {
<%= t('admin.lock.code_label','Kode aktivasi menu ini') %> <strong style="color:#86efac">GRATIS</strong> <%= t('admin.lock.wiki_note','— tanpa perlu donasi untuk membukanya.') %>
</div>
<div style="margin-top:14px;display:flex;flex-direction:column;gap:8px">
<a href="https://gitea.oxpoe.qzz.io/oxpoe/open-isp/wiki" target="_blank" rel="noopener" class="btn btn-p" style="width:100%;display:flex;align-items:center;justify-content:center;gap:8px">
<a href="https://gitea.oxpoe.xyz/oxpoe/open-isp/wiki" target="_blank" rel="noopener" class="btn btn-p" style="width:100%;display:flex;align-items:center;justify-content:center;gap:8px">
<i class="bi bi-git"></i> <%= t('admin.lock.get_code','Ambil Kode Aktivasi (Gratis)') %>
</a>
<a href="/admin/sidebar-settings" class="btn btn-g" style="width:100%;display:flex;align-items:center;justify-content:center;gap:8px" onclick="hideLockedMenuNotice()">

View File

@@ -43,7 +43,7 @@
</div>
<div class="card-bd">
<p class="hint" style="margin-top:0">
<%= t('admin.sb.intro', 'Setiap menu bisa diatur menjadi Tampil, Sembunyikan, atau Kunci. Menu yang dikunci akan meminta password khusus sebelum dibuka.') %>
<%= t('admin.sb.intro', 'Setiap menu bisa diatur menjadi Tampil atau Sembunyikan.') %>
</p>
<% if (canManageSidebar) { %>
@@ -76,7 +76,7 @@
<select class="fs" name="menu_state[<%= menu.key %>]">
<option value="visible" <%= menu.state === 'visible' ? 'selected' : '' %>><%= t('admin.sb.st_visible', 'Tampil') %></option>
<option value="hidden" <%= menu.state === 'hidden' ? 'selected' : '' %>><%= t('admin.sb.st_hidden', 'Sembunyikan') %></option>
<option value="locked" <%= menu.state === 'locked' ? 'selected' : '' %>><%= t('admin.sb.st_locked', 'Kunci') %></option>
</select>
</td>
</tr>
@@ -97,7 +97,7 @@
<select class="fs" name="menu_state[<%= ch.key %>]">
<option value="visible" <%= ch.state === 'visible' ? 'selected' : '' %>><%= t('admin.sb.st_visible', 'Tampil') %></option>
<option value="hidden" <%= ch.state === 'hidden' ? 'selected' : '' %>><%= t('admin.sb.st_hidden', 'Sembunyikan') %></option>
<option value="locked" <%= ch.state === 'locked' ? 'selected' : '' %>><%= t('admin.sb.st_locked', 'Kunci') %></option>
</select>
</td>
</tr>
@@ -108,12 +108,9 @@
</div>
<div class="sidebar-settings-save-grid" style="margin-top:16px">
<div class="fg" style="margin:0">
<label class="fl"><%= t('admin.sb.pass_label', 'Password Aktivasi (Seikhlasnya)') %></label>
<input type="password" class="fc" name="feature_password" placeholder="<%= t('admin.sb.pass_ph', 'Masukkan password aktivasi sebelum menyimpan') %>" required>
<div class="hint" style="margin-top:6px"><%= t('admin.sb.pass_hint', 'Perubahan status menu sidebar hanya akan disimpan jika password aktivasi benar.') %></div>
</div>
<div class="hint" style="align-self:center">
<%= t('admin.sb.no_pass', 'Belum punya kode aktivasi?') %> <a href="/donate" target="_blank" rel="noopener" style="color:var(--primary);font-weight:700;"><i class="bi bi-heart-fill me-1"></i> <%= t('admin.sb.get_donation', 'Dapatkan kode aktivasi GRATIS di halaman Dukungan OPEN-ISP') %></a> <%= t('admin.sb.or_contact', 'atau hubungi') %> <strong><%= featureContactPhone %></strong>.
<%= t('admin.sb.no_pass', 'Menu bisa ditampilkan/disembunyikan dari halaman ini.') %> <a href="/donate" target="_blank" rel="noopener" style="color:var(--primary);font-weight:700;"><i class="bi bi-heart-fill me-1"></i> <%= t('admin.sb.get_donation', 'Dukung pengembangan OPEN-ISP') %></a>.
</div>
</div>
<div style="display:flex;justify-content:flex-end;gap:10px;margin-top:16px;flex-wrap:wrap">
@@ -138,12 +135,12 @@
</div>
<div class="card-bd">
<div class="alert alert-s" style="margin-bottom:12px">
<i class="bi bi-info-circle"></i> <%= t('admin.sb.note_lock', 'Jika menu berstatus Kunci diklik dari sidebar, sistem menampilkan cara mengambil kode aktivasi GRATIS atau menghubungi') %> <strong><%= featureContactPhone %></strong>.
<i class="bi bi-info-circle"></i> <%= t('admin.sb.note_lock', 'Menu berstatus Kunci tidak dapat dibuka sampai diaktifkan dari halaman ini.') %>
</div>
<ul style="margin:0;padding-left:18px;display:grid;gap:8px">
<li><%= t('admin.sb.note1', 'Status Sembunyikan akan menghilangkan menu dari sidebar dan menolak akses URL langsung.') %></li>
<li><%= t('admin.sb.note2', 'Status Kunci tetap menampilkan menu, tetapi tidak bisa dibuka sampai statusnya diubah di halaman ini.') %></li>
<li><%= t('admin.sb.note3', 'Perubahan status menu hanya dapat disimpan setelah memasukkan password aktivasi yang benar.') %></li>
</ul>
</div>
</div>

View File

@@ -36,8 +36,8 @@
<h1 style="font-size:22px"><%= t('donate.title','Dukung OPEN-ISP') %></h1>
<p class="iso-sub"><%= settings.company_header || 'OPEN-ISP' %> • <%= t('donate.tagline','Donasi sukarela untuk pengembangan aplikasi open source (ISC)') %></p>
<div style="margin-top:14px;padding:12px 14px;border-radius:14px;background:rgba(173,255,47,.08);border:1px solid rgba(173,255,47,.25);text-align:left;font-size:12.5px;color:#cfe9a0">
<i class="bi bi-info-circle"></i> <strong><%= t('donate.menu_code_free','Kode aktivasi menu tersedia GRATIS') %></strong> <%= t('donate.free_hint','untuk semua — donasi') %> <strong><%= t('donate.not_required','tidak wajib') %></strong>.
<a href="https://gitea.oxpoe.qzz.io/oxpoe/open-isp/wiki" target="_blank" rel="noopener" style="color:#ADFF2F;font-weight:700;"> <%= t('donate.open_wiki','Buka Wiki') %></a>
<i class="bi bi-info-circle"></i> <strong><%= t('donate.menu_code_free','Semua menu sudah terbuka') %></strong> <%= t('donate.free_hint','— donasi bersifat sukarela dan') %> <strong><%= t('donate.not_required','tidak wajib') %></strong>.
<a href="https://gitea.oxpoe.xyz/oxpoe/open-isp/wiki" target="_blank" rel="noopener" style="color:#ADFF2F;font-weight:700;"> <%= t('donate.open_wiki','Buka Wiki') %></a>
</div>
</div>
@@ -70,10 +70,10 @@
</div>
<div class="field">
<label for="inputPhone"><i class="bi bi-whatsapp"></i> <%= t('donate.phone','Nomor WhatsApp * (untuk kode aktivasi)') %></label>
<label for="inputPhone"><i class="bi bi-whatsapp"></i> <%= t('donate.phone','Nomor WhatsApp') %></label>
<div class="wrap"><i class="bi bi-whatsapp lead-ic"></i>
<input type="tel" id="inputPhone" class="inp" placeholder="Contoh: 081234567890" required></div>
<div class="form-note"><%= t('donate.thanks_note','Ucapan terima kasih & kode aktivasi sidebar dikirim ke nomor ini.') %></div>
<div class="form-note"><%= t('donate.thanks_note','Ucapan terima kasih dikirim ke nomor ini.') %></div>
</div>
<div class="field">
@@ -105,7 +105,7 @@
<div id="paymentStatusBox" class="auth-alert info" style="justify-content:center;margin-top:14px">
<div style="text-align:center">
<div style="display:flex;align-items:center;justify-content:center;gap:8px"><div class="spin-pulse"></div><span style="font-weight:700" id="statusBoxText"><%= t('donate.waiting_payment','Menunggu Pembayaran Masuk…') %></span></div>
<div style="font-size:11.5px;margin-top:4px"><%= t('donate.auto_detect','Sistem otomatis mendeteksi transaksi & mengirim kode aktivasi ke WA Anda.') %></div>
<div style="font-size:11.5px;margin-top:4px"><%= t('donate.auto_detect','Sistem otomatis mendeteksi transaksi pembayaran.') %></div>
</div>
</div>
@@ -162,7 +162,7 @@
<span class="badge bp"><i class="bi bi-git"></i> <%= t('donate.code_free','KODE AKTIVASI GRATIS') %></span>
<span style="font-weight:700;font-size:14px"><%= t('donate.status','Status:') %> <span style="color:var(--warning);font-weight:800" id="statusText"><%= t('donate.waiting_donation','Menunggu Donasi Masuk') %></span></span>
</div>
<p class="muted" style="font-size:13.5px;margin:0"><i class="bi bi-info-circle" style="color:var(--info)"></i> <%= t('donate.menu_code','Kode aktivasi menu') %> <strong style="color:var(--primary)"><%= t('donate.free','GRATIS') %></strong> di <a href="https://gitea.oxpoe.qzz.io/oxpoe/open-isp/wiki" target="_blank" rel="noopener" style="color:var(--primary)"><%= t('donate.wiki','Wiki OPEN-ISP') %></a>. Donasi bersifat sukarela; jika berdonasi, kode juga otomatis dikirim ke WhatsApp Anda begitu pembayaran terdeteksi.</p>
<p class="muted" style="font-size:13.5px;margin:0"><i class="bi bi-info-circle" style="color:var(--info)"></i> <%= t('donate.menu_code','Kode aktivasi menu') %> <strong style="color:var(--primary)"><%= t('donate.free','GRATIS') %></strong> di <a href="https://gitea.oxpoe.xyz/oxpoe/open-isp/wiki" target="_blank" rel="noopener" style="color:var(--primary)"><%= t('donate.wiki','Wiki OPEN-ISP') %></a>. Donasi bersifat sukarela; jika berdonasi, kode juga otomatis dikirim ke WhatsApp Anda begitu pembayaran terdeteksi.</p>
</div>
<!-- AKTIVASI CARD -->
@@ -229,7 +229,7 @@
async function generateQris() {
if (isPaid) return;
var amt = parseInt(document.getElementById('inputAmount').value, 10) || 50000;
var phone = document.getElementById('inputPhone').value.trim() || '081947215703';
var phone = document.getElementById('inputPhone').value.trim();
var name = document.getElementById('inputName').value.trim() || 'Hamba Allah';
var notes = document.getElementById('inputNotes').value.trim();
try {