i18n: terjemahkan sisa fragmen hint (billing/map/cash_in/acs/areas/kolektor/pelanggan/radius/diskon/wlc/preview/broadcast/packages/reports/whatsapp/settings)
This commit is contained in:
1 parent
fd6f1ebd93
commit
aca2ea06e3
16 files changed
+155
-63
No files matched your search
+1
-1
@@ -266,7 +266,7 @@
|
||||
<button class="btn btn-p btn-sm" onclick="loadAcsLogs()"><i class="bi bi-arrow-clockwise"></i> <%= t('admin.acs.reload','Muat Ulang') %></button>
|
||||
<span style="font-size:12px; color:var(--muted);">Log diambil dari tiap ACS (Built-in: riwayat task; GenieACS: <code>/faults</code>).</span>
|
||||
</div>
|
||||
<div id="acsLogContainer"><div class="text-muted" style="padding:12px;">Pilih filter lalu klik "<%= t('admin.acs.reload','Muat Ulang') %>" untuk memuat log.</div></div>
|
||||
<div id="acsLogContainer"><div class="text-muted" style="padding:12px;">Pilih filter lalu klik "<%= t('admin.acs.reload','Muat Ulang') %>"<%= t('admin.acs.load_log',' untuk memuat log.') %></div></div>
|
||||
</div>
|
||||
</div>
|
||||
<footer style="margin-top: 30px; padding: 20px; text-align: center; color: var(--muted); font-size: 12px; border-top: 1px solid var(--border);">
|
||||
|
||||
@@ -49,7 +49,7 @@
|
||||
</thead>
|
||||
<tbody>
|
||||
<% if (!areas || areas.length === 0) { %>
|
||||
<tr><td colspan="6" class="text-center text-muted" style="padding:24px">Belum ada data area. Klik "<%= t('admin.ar.add','Tambah Area Baru') %>" untuk membuat area.</td></tr>
|
||||
<tr><td colspan="6" class="text-center text-muted" style="padding:24px">Belum ada data area. Klik "<%= t('admin.ar.add','Tambah Area Baru') %>"<%= t('admin.ar.create_area',' untuk membuat area.') %></td></tr>
|
||||
<% } else { %>
|
||||
<% areas.forEach((a, idx) => { %>
|
||||
<tr>
|
||||
|
||||
@@ -303,7 +303,7 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="fg"><label class="fl"><%= t('admin.bill.note_optional','Catatan (opsional)') %></label><input class="fc" name="note" placeholder="<%= t('admin.bill.ph_note','mis. kompensasi gangguan') %>"></div>
|
||||
<div class="hint"><i class="bi bi-info-circle"></i> Persen dihitung dari harga dasar (sebelum PPN/USO). Kode unik QRIS akan digenerate ulang.</div>
|
||||
<div class="hint"><i class="bi bi-info-circle"></i><%= t('admin.bill.pct_hint',' Persen dihitung dari harga dasar (sebelum PPN/USO). Kode unik QRIS akan digenerate ulang.') %></div>
|
||||
</div>
|
||||
<div class="mf">
|
||||
<button type="button" class="btn btn-g" onclick="closeModal('discModal')">Batal</button>
|
||||
|
||||
@@ -115,7 +115,7 @@
|
||||
|
||||
<div class="card mb16">
|
||||
<div class="card-hd"><h6><i class="bi bi-send-check"></i> <%= t('admin.bc.send_title','Kirim Tagihan Sekarang (Manual — bila Auto OFF)') %></h6></div>
|
||||
<form method="POST" action="/admin/whatsapp/send-billing-now" onsubmit="return confirm('Kirim tagihan sekarang ke pelanggan belum bayar?');">
|
||||
<form method="POST" action="/admin/whatsapp/send-billing-now" onsubmit="return confirm('Kirim tagihan sekarang ke pelanggan <%= t('admin.bc.unpaid','belum bayar') %>?');">
|
||||
<div class="card-bd">
|
||||
<div style="display:flex;gap:14px;flex-wrap:wrap">
|
||||
<div class="fg"><label class="fl"><i class="bi bi-calendar-event"></i> <%= t('admin.bc.isolir_date','Tanggal Isolir') %></label>
|
||||
@@ -145,7 +145,7 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div style="font-size:11px;color:var(--muted);margin-top:6px"><i class="bi bi-info-circle"></i> Kirim ke pelanggan <b>belum bayar</b> pada tanggal isolir terpilih. Gunakan <b>Random</b> agar tidak dianggap spam/di-ban.</div>
|
||||
<div style="font-size:11px;color:var(--muted);margin-top:6px"><i class="bi bi-info-circle"></i><%= t('admin.bc.send_to',' Kirim ke pelanggan ') %><b><%= t('admin.bc.unpaid','belum bayar') %></b><%= t('admin.bc.on_date',' pada tanggal isolir terpilih. Gunakan ') %><b>Random</b> agar tidak dianggap spam/di-ban.</div>
|
||||
</div>
|
||||
<div class="card-bd" style="border-top:1px solid var(--border);background:var(--bg2);display:flex;justify-content:space-between;align-items:center;gap:10px;flex-wrap:wrap">
|
||||
<div id="bsResult" style="font-size:12px" class="text-muted"></div>
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
<h6><i class="bi bi-list-ul"></i> <%= t('admin.col.list','Daftar Kolektor') %></h6>
|
||||
</div>
|
||||
<div class="hint" style="padding:12px 16px 0 16px;font-size:12px;color:var(--muted)">
|
||||
Pengaturan approval pembayaran berlaku per akun kolektor. `<%= t('admin.col.direct','Langsung Lunas') %>` berarti pembayaran dari kolektor langsung melunasi invoice, sedangkan `<%= t('admin.col.approval','Perlu Approval') %>` berarti harus disetujui admin atau kasir terlebih dahulu.
|
||||
Pengaturan approval pembayaran berlaku per akun kolektor. `<%= t('admin.col.direct','Langsung Lunas') %><%= t('admin.col.mode_hint','` berarti pembayaran dari kolektor langsung melunasi invoice, sedangkan `') %><%= t('admin.col.approval','Perlu Approval') %>` berarti harus disetujui admin atau kasir terlebih dahulu.
|
||||
</div>
|
||||
<div style="padding:12px 16px 0 16px;display:flex;gap:10px;flex-wrap:wrap">
|
||||
<select id="collectorModeFilter" class="fs" style="max-width:220px">
|
||||
|
||||
@@ -318,7 +318,7 @@
|
||||
</td>
|
||||
<td>
|
||||
<% if (c.status==='active') { %><span class="badge bs"><i class="bi bi-circle-fill" style="font-size:7px"></i><%= t('admin.customers.filter.active', 'Aktif') %></span>
|
||||
<% } else if (c.status==='suspended') { %><% if (c.deactivate_cause==='auto_unpaid') { %><span class="badge bd" title="<%= t('admin.cust.inactive','Nonaktif') %> otomatis: menunggak <%= c.unpaid_streak %> bulan"><i class="bi bi-person-x"></i> <%= t('admin.cust.inactive','Nonaktif') %> (auto)</span><% } else { %><span class="badge bw"><%= t('admin.customers.filter.suspended', 'Suspend') %></span><% } %>
|
||||
<% } else if (c.status==='suspended') { %><% if (c.deactivate_cause==='auto_unpaid') { %><span class="badge bd" title="<%= t('admin.cust.inactive','Nonaktif') %><%= t('admin.cust.reg_auto',' otomatis: menunggak ') %><%= c.unpaid_streak %> bulan"><i class="bi bi-person-x"></i> <%= t('admin.cust.inactive','Nonaktif') %> (auto)</span><% } else { %><span class="badge bw"><%= t('admin.customers.filter.suspended', 'Suspend') %></span><% } %>
|
||||
<% } else { %><span class="badge bm"><%= t('admin.customers.filter.inactive', 'Nonaktif') %></span><% } %>
|
||||
<% if (c.status === 'inactive' && (c.reg_total || c.reg_due_date || c.reg_voucher_code)) { %>
|
||||
<div style="font-size:10px;margin-top:4px;color:var(--muted)">
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
<% } %>
|
||||
|
||||
<div class="alert alert-w mb-3">
|
||||
<i class="bi bi-info-circle-fill"></i> <strong>Informasi:</strong> Halaman ini digunakan untuk mencatat kas masuk / pemasukan <strong>selain</strong> dari pembayaran tagihan pelanggan (misal: modal awal, penjualan perangkat bekas, dll). Pendapatan tagihan pelanggan sudah otomatis dicatat di laporan.
|
||||
<i class="bi bi-info-circle-fill"></i> <strong>Informasi:</strong><%= t('admin.cashin.info',' Halaman ini digunakan untuk mencatat kas masuk / pemasukan ') %><strong>selain</strong> dari pembayaran tagihan pelanggan (misal: modal awal, penjualan perangkat bekas, dll). Pendapatan tagihan pelanggan sudah otomatis dicatat di laporan.
|
||||
</div>
|
||||
|
||||
<%
|
||||
|
||||
+1
-1
@@ -907,7 +907,7 @@
|
||||
</div>
|
||||
<div class="mbody">
|
||||
<div id="cable-drawing-map"></div>
|
||||
<p class="text-muted mt-2 small"><i class="bi bi-info-circle"></i> Tarik titik oranye untuk mengubah jalur. Klik tombol di bawah untuk menambah titik lekukan.</p>
|
||||
<p class="text-muted mt-2 small"><i class="bi bi-info-circle"></i> <%= t('admin.map.route_hint','Tarik titik oranye untuk mengubah jalur. Klik tombol di bawah untuk menambah titik lekukan.') %></p>
|
||||
</div>
|
||||
<div class="mf">
|
||||
<button type="button" class="btn btn-sm btn-outline-primary" onclick="addMorePoints()"><i class="bi bi-plus-circle"></i> Tambah Titik Lekukan</button>
|
||||
|
||||
@@ -190,7 +190,7 @@
|
||||
<% if (typeof profileMode !== 'undefined' && profileMode === 'radius-attributes') { %>
|
||||
<i class="bi bi-broadcast"></i> <%- t('admin.pkg.mode_radius_hint','Mode RADIUS: rate-limit & IP dari <b>atribut RADIUS</b> — profil PPP MikroTik tidak dibuat otomatis.') %>
|
||||
<% } else { %>
|
||||
<i class="bi bi-router"></i> Profil PPP MikroTik akan <b>dibuat/diperbarui otomatis</b> dari speed paket<% if (typeof profileMode !== 'undefined' && profileMode === 'radius-profile') { %> (mode RADIUS pakai profil MikroTik)<% } %>.
|
||||
<i class="bi bi-router"></i><%= t('admin.pkg.profile_a',' Profil PPP MikroTik akan ') %><b><%= t('admin.pkg.profile_b','dibuat/diperbarui otomatis') %></b> dari speed paket<% if (typeof profileMode !== 'undefined' && profileMode === 'radius-profile') { %><%= t('admin.pkg.profile_c',' (mode RADIUS pakai profil MikroTik)') %><% } %>.
|
||||
<% } %>
|
||||
</div>
|
||||
|
||||
@@ -232,7 +232,7 @@
|
||||
</div>
|
||||
<div class="hint" style="margin-top:6px;font-size:11px">
|
||||
<i class="bi bi-speedometer2"></i> <%- t('admin.pkg.ratelimit_hint','Rate-limit asli (MikroTik & RADIUS):') %> <b class="mono" id="ratePreview" style="color:var(--primary)">-</b>
|
||||
<span style="color:var(--muted)">— format <span class="mono">rx/tx</span> (+ burst: <span class="mono">rx/tx rxB/txB rxT/txT time</span>). Nilai sama dipakai untuk profil MikroTik <b>dan</b> atribut RADIUS.</span>
|
||||
<span style="color:var(--muted)">— format <span class="mono">rx/tx</span> (+ burst: <span class="mono">rx/tx rxB/txB rxT/txT time</span><%= t('admin.pkg.fup_hint','). Nilai sama dipakai untuk profil MikroTik ') %><b>dan</b> atribut RADIUS.</span>
|
||||
</div>
|
||||
|
||||
<!-- Kecepatan UpTo / Maximum Burst Rate (Opsional Manual) -->
|
||||
@@ -260,7 +260,7 @@
|
||||
</div>
|
||||
<div class="flex ai-c" style="gap:8px;margin-top:4px">
|
||||
<input type="checkbox" name="prorate_first_invoice" id="add_prorate" value="1">
|
||||
<label for="add_prorate" style="margin:0;font-size:12px">Prorata tagihan <strong>pertama</strong> jika pasang di tengah bulan (proporsi sisa hari, perlu tanggal pasang di data pelanggan)</label>
|
||||
<label for="add_prorate" style="margin:0;font-size:12px"><%= t('admin.pkg.prorata_a','Prorata tagihan ') %><strong>pertama</strong><%= t('admin.pkg.prorata_b',' jika pasang di tengah bulan (proporsi sisa hari, perlu tanggal pasang di data pelanggan)') %></label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -92,7 +92,7 @@
|
||||
|
||||
<!-- ═══ C. REKAP PER BULAN (AUDIT) ═══ -->
|
||||
<div class="card mb16">
|
||||
<div class="card-hd"><h6><i class="bi bi-calendar3"></i> Rekap Laba / Rugi per Bulan <%= filterYear %> <span class="text-muted" style="font-weight:400;font-size:11.5px">— export & cetak tiap bulan</span></h6></div>
|
||||
<div class="card-hd"><h6><i class="bi bi-calendar3"></i> Rekap Laba / Rugi per Bulan <%= filterYear %> <span class="text-muted" style="font-weight:400;font-size:11.5px"><%- t('admin.rep.export_hint','— export & cetak tiap bulan') %></span></h6></div>
|
||||
<div class="tbl-wrap">
|
||||
<table class="dtbl">
|
||||
<thead>
|
||||
@@ -150,7 +150,7 @@
|
||||
</table>
|
||||
</div>
|
||||
<div class="card-bd" style="padding-top:0">
|
||||
<div class="hint"><i class="bi bi-info-circle"></i> Baris <b>TOTAL</b> = penjumlahan tiap bulan; cocokkan dengan <b>Laporan Laba / Rugi</b> (tahun) di atas untuk audit.</div>
|
||||
<div class="hint"><i class="bi bi-info-circle"></i> Baris <b>TOTAL</b><%= t('admin.rep.sum_hint',' = penjumlahan tiap bulan; cocokkan dengan ') %><b>Laporan Laba / Rugi</b><%= t('admin.rep.audit_hint',' (tahun) di atas untuk audit.') %></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -215,7 +215,7 @@
|
||||
|
||||
<!-- ═══ G. PENGATURAN PAJAK & RETRIBUSI (collapsible) ═══ -->
|
||||
<details class="card">
|
||||
<summary class="card-hd"><h6 style="margin:0"><i class="bi bi-percent"></i> Pengaturan Pajak & Retribusi <span class="text-muted" style="font-weight:400;font-size:11.5px">— dihitung otomatis</span></h6></summary>
|
||||
<summary class="card-hd"><h6 style="margin:0"><i class="bi bi-percent"></i> Pengaturan Pajak & Retribusi <span class="text-muted" style="font-weight:400;font-size:11.5px"><%= t('admin.rep.calc_hint','— dihitung otomatis') %></span></h6></summary>
|
||||
<div class="card-bd">
|
||||
<form method="POST" action="/admin/reports/finance">
|
||||
<div class="form-row" style="grid-template-columns:repeat(auto-fit,minmax(160px,1fr))">
|
||||
|
||||
+10
-10
@@ -222,7 +222,7 @@
|
||||
<div class="fg">
|
||||
<label class="fl"><%= t('admin.set.public_url','URL Publik Aplikasi (Public Base URL)') %></label>
|
||||
<input class="fc" name="public_base_url" value="<%= settings.public_base_url || '' %>" placeholder="https://portal.domain-anda.com">
|
||||
<div style="font-size:10px; color:var(--muted); margin-top:4px">Digunakan untuk menyusun tautan login pelanggan yang dikirim via WhatsApp. Contoh: <span class="mono">https://portal.domain-anda.com</span></div>
|
||||
<div style="font-size:10px; color:var(--muted); margin-top:4px"><%= t('admin.set.link_hint','Digunakan untuk menyusun tautan login pelanggan yang dikirim via WhatsApp. Contoh: ') %><span class="mono">https://portal.domain-anda.com</span></div>
|
||||
</div>
|
||||
<div class="fg">
|
||||
<label class="fl"><%= t('admin.set.id_prefix','Prefix ID Pelanggan') %></label>
|
||||
@@ -445,7 +445,7 @@
|
||||
<div class="fg">
|
||||
<label class="fl"><%= t('admin.set.wa_numbers','Nomor Admin WA (Pisahkan dengan koma)') %></label>
|
||||
<input class="fc" name="whatsapp_admin_numbers" value="<%= (settings.whatsapp_admin_numbers || []).join(', ') %>" placeholder="6281xxx, 6282xxx">
|
||||
<div style="font-size:10px; color:var(--muted); margin-top:4px">Nomor admin akan menerima notifikasi monitoring sistem. Nomor teknisi diambil otomatis dari <a href="/admin/technicians" style="color:var(--brand);font-weight:600">Data Teknisi</a>.</div>
|
||||
<div style="font-size:10px; color:var(--muted); margin-top:4px"><%= t('admin.set.wa_numbers_hint','Nomor admin akan menerima notifikasi monitoring sistem. Nomor teknisi diambil otomatis dari ') %><a href="/admin/technicians" style="color:var(--brand);font-weight:600">Data Teknisi</a>.</div>
|
||||
</div>
|
||||
<div class="fg">
|
||||
<label class="fl"><%= t('admin.set.wa_delay','Jeda Antar Pesan Broadcast (Detik)') %></label>
|
||||
@@ -465,7 +465,7 @@
|
||||
<div style="display:flex; gap:10px; align-items:flex-end; flex-wrap:wrap">
|
||||
<div style="flex:1 1 200px">
|
||||
<input class="fc" type="file" id="brand_portal_file" accept="image/png,image/jpeg,image/jpg,image/webp">
|
||||
<div style="font-size:10px; color:var(--muted); margin-top:4px">PNG/JPG/WebP, maks 2MB. PNG/JPEG otomatis dioptimalkan. Dipakai di halaman login & portal pelanggan.</div>
|
||||
<div style="font-size:10px; color:var(--muted); margin-top:4px"><%- t('admin.set.logo_hint','PNG/JPG/WebP, maks 2MB. PNG/JPEG otomatis dioptimalkan. Dipakai di halaman login & portal pelanggan.') %></div>
|
||||
</div>
|
||||
<button class="btn btn-s" type="button" onclick="uploadBrandLogo('portal', this)" style="height:38px"><i class="bi bi-upload"></i> Upload</button>
|
||||
</div>
|
||||
@@ -495,7 +495,7 @@
|
||||
<div style="display:flex; gap:10px; align-items:flex-end; flex-wrap:wrap">
|
||||
<div style="flex:1 1 200px">
|
||||
<input class="fc" type="file" id="brand_pwa_file" accept="image/png,image/jpeg,image/jpg,image/webp">
|
||||
<div style="font-size:10px; color:var(--muted); margin-top:4px">Setelah upload, ikon PWA (192/512/maskable/apple-touch) & favicon otomatis dibuat ulang dari gambar ini. Sebaiknya gambar persegi (1:1).</div>
|
||||
<div style="font-size:10px; color:var(--muted); margin-top:4px"><%- t('admin.set.pwa_icon_hint','Setelah upload, ikon PWA (192/512/maskable/apple-touch) & favicon otomatis dibuat ulang dari gambar ini. Sebaiknya gambar persegi (1:1).') %></div>
|
||||
</div>
|
||||
<button class="btn btn-s" type="button" onclick="uploadBrandLogo('pwa', this)" style="height:38px"><i class="bi bi-upload"></i> Upload</button>
|
||||
<button class="btn btn-g" type="button" onclick="regenPwaIcons(this)" style="height:38px"><i class="bi bi-phone"></i> Buat Ulang Ikon</button>
|
||||
@@ -517,7 +517,7 @@
|
||||
<div style="display:flex; gap:10px; align-items:flex-end; flex-wrap:wrap">
|
||||
<div style="flex:1 1 200px">
|
||||
<input class="fc" type="file" id="brand_hero_file" accept="image/png,image/jpeg,image/jpg,image/webp">
|
||||
<div style="font-size:10px; color:var(--muted); margin-top:4px">PNG/JPEG otomatis dikonversi ke <b>WebP</b> (+ fallback JPEG) agar lebih ringan. Rasio disarankan 16:10 (mis. 1600×1000).</div>
|
||||
<div style="font-size:10px; color:var(--muted); margin-top:4px"><%= t('admin.set.hero_hint','PNG/JPEG otomatis dikonversi ke ') %><b>WebP</b> (+ fallback JPEG) agar lebih ringan. Rasio disarankan 16:10 (mis. 1600×1000).</div>
|
||||
</div>
|
||||
<button class="btn btn-s" type="button" onclick="uploadBrandLogo('hero', this)" style="height:38px"><i class="bi bi-upload"></i> Upload</button>
|
||||
</div>
|
||||
@@ -548,7 +548,7 @@
|
||||
<div class="fg">
|
||||
<label class="fl"><%= t('admin.set.speed_link','Link Speed Test') %></label>
|
||||
<input class="fc" name="speedtest_url" id="speedtest_url_input" value="<%= settings.speedtest_url || '' %>" placeholder="https://speed.domain-anda.com">
|
||||
<div style="font-size:10px; color:var(--muted); margin-top:4px">Bisa <b>internal</b> (LibreSpeed / OpenSpeedTest self-hosted) atau <b>eksternal</b> (Ookla Custom, Cloudflare, Google Fiber, dll). Harus bisa diakses <b>public</b>. Jika dikosongkan, dashboard pelanggan menampilkan <i>"Speedtest belum di setup"</i>.</div>
|
||||
<div style="font-size:10px; color:var(--muted); margin-top:4px">Bisa <b>internal</b><%= t('admin.set.speedtest_hint2',' (LibreSpeed / OpenSpeedTest self-hosted) atau ') %><b>eksternal</b> (Ookla Custom, Cloudflare, Google Fiber, dll). Harus bisa diakses <b>public</b><%= t('admin.set.speedtest_hint3','. Jika dikosongkan, dashboard pelanggan menampilkan ') %><i><%= t('admin.set.speedtest_notset','"Speedtest belum di setup"') %></i>.</div>
|
||||
</div>
|
||||
<div class="fg">
|
||||
<label class="fl"><%= t('admin.set.speed_mode','Mode Tampilan di Dashboard Pelanggan') %></label>
|
||||
@@ -556,7 +556,7 @@
|
||||
<option value="iframe" <%= (settings.speedtest_mode || 'iframe') === 'iframe' ? 'selected' : '' %>><%= t('admin.set.sp_mode_iframe','Embed / iframe — untuk provider yang mengizinkan') %></option>
|
||||
<option value="tab" <%= settings.speedtest_mode === 'tab' ? 'selected' : '' %>><%= t('admin.set.sp_mode_tab','Buka Tab Baru — untuk provider yang memblokir iframe') %></option>
|
||||
</select>
|
||||
<div style="font-size:10px; color:var(--muted); margin-top:4px">Di halaman pelanggan tersedia tombol <b>Muat Ulang</b> (reload speed test) & <b>Bersihkan Cache</b>.</div>
|
||||
<div style="font-size:10px; color:var(--muted); margin-top:4px"><%= t('admin.set.speedtest_btn_hint','Di halaman pelanggan tersedia tombol ') %><b>Muat Ulang</b> (reload speed test) & <b>Bersihkan Cache</b>.</div>
|
||||
</div>
|
||||
<script>
|
||||
function applySpeedtestPreset(v) {
|
||||
@@ -579,12 +579,12 @@
|
||||
<div class="fg">
|
||||
<label class="fl"><%= t('admin.set.repo_link','Link Repositori Proyek (GitHub)') %></label>
|
||||
<input class="fc" name="project_url" value="<%= settings.project_url || 'https://github.com/oxpoe/open-isp' %>" placeholder="https://github.com/oxpoe/open-isp">
|
||||
<div style="font-size:10px; color:var(--muted); margin-top:4px">Dipakai untuk tautan <b>Repo</b>, <b>Form/Issue</b> (<code>/issues/new/choose</code>), <b>Wiki</b>, dan <b>Lisensi</b> di landing page.</div>
|
||||
<div style="font-size:10px; color:var(--muted); margin-top:4px"><%= t('admin.set.repo_hint','Dipakai untuk tautan ') %><b>Repo</b>, <b>Form/Issue</b> (<code>/issues/new/choose</code>), <b>Wiki</b>, dan <b>Lisensi</b> di landing page.</div>
|
||||
</div>
|
||||
<div class="fg">
|
||||
<label class="fl"><%= t('admin.set.uptime_link','Link Uptime Website (Status)') %></label>
|
||||
<input class="fc" name="uptime_url" value="<%= settings.uptime_url || '' %>" placeholder="https://status.domain-anda.com">
|
||||
<div style="font-size:10px; color:var(--muted); margin-top:4px">Dipakai untuk tombol/redirect <b><%= t('common.status','Status') %></b> di landing page. Jika dikosongkan, landing page <b>tidak menampilkan tab Status</b>.</div>
|
||||
<div style="font-size:10px; color:var(--muted); margin-top:4px"><%= t('admin.set.uptime_hint','Dipakai untuk tombol/redirect ') %><b><%= t('common.status','Status') %></b> di landing page. Jika dikosongkan, landing page <b>tidak menampilkan tab Status</b>.</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -696,7 +696,7 @@
|
||||
<div style="margin-top:10px; display:flex; gap:12px; align-items:center; flex-wrap:wrap">
|
||||
<div style="font-size:10px; color:var(--muted)">Preview:</div>
|
||||
<img src="<%= settings.qris_static_qr_url %>" alt="QRIS" style="height:72px; width:72px; object-fit:contain; background:#fff; border-radius:12px; padding:8px; border:1px solid rgba(0,0,0,0.08)">
|
||||
<div style="font-size:10px; color:var(--muted)">Gunakan tombol <span style="font-weight:700">QR</span> di menu Billing untuk membuat nominal unik per invoice.</div>
|
||||
<div style="font-size:10px; color:var(--muted)">Gunakan tombol <span style="font-weight:700">QR</span><%= t('admin.set.qris_unique_hint',' di menu Billing untuk membuat nominal unik per invoice.') %></div>
|
||||
</div>
|
||||
<% } %>
|
||||
|
||||
|
||||
@@ -87,10 +87,10 @@
|
||||
</div>
|
||||
|
||||
<div class="fg mb12">
|
||||
<label class="fl">API Endpoint URL (Default: <code>https://api.fonnte.com/send</code> atau URL Server Self-Hosted)</label>
|
||||
<label class="fl">API Endpoint URL (Default: <code>https://api.fonnte.com/send</code><%= t('admin.wa.selfhost',' atau URL Server Self-Hosted)') %></label>
|
||||
<input class="fc" name="fonnte_api_url" value="<%= fonnteSettings.fonnte_api_url %>" placeholder="https://api.fonnte.com/send">
|
||||
<div style="font-size: 11px; color: var(--muted); margin-top: 4px;">
|
||||
<i class="bi bi-info-circle"></i> Gunakan <code>https://api.fonnte.com/send</code> untuk Fonnte Cloud, atau ubah ke domain/IP server mandiri jika menggunakan <b>Fonnte Self-Hosted</b> (misal: <code>http://192.168.1.100:8000/send</code>).
|
||||
<i class="bi bi-info-circle"></i> Gunakan <code>https://api.fonnte.com/send</code><%= t('admin.wa.fonnte_hint',' untuk Fonnte Cloud, atau ubah ke domain/IP server mandiri jika menggunakan ') %><b>Fonnte Self-Hosted</b> (misal: <code>http://192.168.1.100:8000/send</code>).
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -177,7 +177,7 @@
|
||||
</div>
|
||||
<div style="margin-top:12px;padding:12px;border-radius:10px;background:rgba(173,255,47,.06);border:1px solid var(--primary-glow);">
|
||||
<div class="fw6" style="font-size:12.5px;color:var(--primary);margin-bottom:6px;"><i class="bi bi-qr-code"></i> Login WhatsApp (Scan QR)</div>
|
||||
<div style="font-size:11.5px;color:var(--muted);margin-bottom:8px">Klik tombol, lalu buka WhatsApp → Perangkat Tertaut → Tautkan perangkat, scan QR. QR berlaku ~30 detik & diperbarui otomatis.</div>
|
||||
<div style="font-size:11.5px;color:var(--muted);margin-bottom:8px"><%- t('admin.wa.qr_hint','Klik tombol, lalu buka WhatsApp → Perangkat Tertaut → Tautkan perangkat, scan QR. QR berlaku ~30 detik & diperbarui otomatis.') %></div>
|
||||
<button type="button" class="btn btn-p btn-sm" onclick="showGowaQr()"><i class="bi bi-qr-code-scan"></i> Tampilkan QR</button>
|
||||
<a href="<%= gowaUiUrl %>" target="_blank" rel="noopener" class="btn btn-g btn-sm" style="margin-left:6px"><i class="bi bi-box-arrow-up-right"></i> Buka UI GOWA</a>
|
||||
<div id="gowa_qr_wrap" style="display:none;margin-top:10px;text-align:center">
|
||||
@@ -187,7 +187,7 @@
|
||||
</div>
|
||||
<div style="margin-top:12px;padding:12px;border-radius:10px;background:rgba(56,189,248,0.08);border:1px solid rgba(56,189,248,0.25);">
|
||||
<div class="fw6" style="font-size:12.5px;color:var(--info,#38BDF8);margin-bottom:6px;"><i class="bi bi-broadcast"></i> Webhook Pesan Masuk (Live Chat)</div>
|
||||
<div style="font-size:11.5px;color:var(--muted);margin-bottom:8px">Set di GOWA: <code>WHATSAPP_WEBHOOK=<URL di bawah></code> dan <code>WHATSAPP_WEBHOOK_SECRET=<secret></code>, lalu restart GOWA. <strong>Catatan:</strong> bot WA <em>tidak</em> membalas perintah lagi — WhatsApp hanya untuk <strong>notifikasi</strong>. Interaksi cepat (menu admin/teknisi) kini dipindah ke <strong>Telegram</strong>.</div>
|
||||
<div style="font-size:11.5px;color:var(--muted);margin-bottom:8px">Set di GOWA: <code>WHATSAPP_WEBHOOK=<URL di bawah></code> dan <code>WHATSAPP_WEBHOOK_SECRET=<secret></code>, lalu restart GOWA. <strong>Catatan:</strong> bot WA <em>tidak</em><%= t('admin.wa.notif_only',' membalas perintah lagi — WhatsApp hanya untuk ') %><strong>notifikasi</strong>. Interaksi cepat (menu admin/teknisi) kini dipindah ke <strong>Telegram</strong>.</div>
|
||||
<div class="form-row mb12">
|
||||
<div class="fg" style="flex:2;">
|
||||
<label class="fl">Webhook URL (tempel ke GOWA)</label>
|
||||
|
||||
@@ -269,7 +269,7 @@ async function openChat(phone, name) {
|
||||
async function loadChatMessages(phone, showSpinner = false) {
|
||||
const container = document.getElementById('chatMessages');
|
||||
if (showSpinner) {
|
||||
container.innerHTML = `<div class="text-center text-muted" style="margin:auto;"><i class="bi bi-arrow-repeat spin"></i> Memuat pesan...</div>`;
|
||||
container.innerHTML = `<div class="text-center text-muted" style="margin:auto;"><i class="bi bi-arrow-repeat spin"></i><%= t('admin.wlc.loading',' Memuat pesan...') %></div>`;
|
||||
}
|
||||
|
||||
try {
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
</div>
|
||||
|
||||
<div class="alert alert-s" style="margin-bottom:14px">
|
||||
<i class="bi bi-info-circle"></i> Preview semua <b>pesan otomatis</b> dengan data contoh — <b><%= sample.nama %></b> (<%= sample.id %>), paket <%= sample.paket %>. Variabel <span class="mono">{{...}}</span> diisi otomatis saat benar-benar dikirim.
|
||||
<i class="bi bi-info-circle"></i> Preview semua <b><%= t('admin.wp.auto','pesan otomatis') %></b><%= t('admin.wp.sample',' dengan data contoh — ') %><b><%= sample.nama %></b> (<%= sample.id %>), paket <%= sample.paket %>. Variabel <span class="mono">{{...}}</span> diisi otomatis saat benar-benar dikirim.
|
||||
</div>
|
||||
|
||||
<div class="wp-grid">
|
||||
|
||||
Reference in new issue
Block a user