Feature: Subscription-Tier-System (standard/pro/breeder + _test), has_pro_access(), Admin-Tier-UI (SW by-v734)
This commit is contained in:
parent
bcc7c27556
commit
71f29dcce0
8 changed files with 104 additions and 12 deletions
|
|
@ -3,7 +3,7 @@
|
|||
Router, State-Management, Navigation, Initialisierung.
|
||||
============================================================ */
|
||||
|
||||
const APP_VER = '733'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen
|
||||
const APP_VER = '734'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen
|
||||
const APP_VERSION = '1.4.0'; // ← semantische Version, wird bei make release gesetzt
|
||||
const IS_STAGING = location.hostname === 'staging.banyaro.app';
|
||||
|
||||
|
|
|
|||
|
|
@ -795,6 +795,9 @@ window.Page_admin = (() => {
|
|||
<span style="color:${u.rolle === 'admin' ? 'var(--c-danger)' : u.rolle === 'moderator' ? '#f59e0b' : 'var(--c-text-muted)'}">
|
||||
${_esc(u.rolle)}
|
||||
</span>
|
||||
· <span style="color:${u.subscription_tier && u.subscription_tier !== 'standard' ? 'var(--c-primary)' : 'var(--c-text-muted)'}">
|
||||
${_esc(u.subscription_tier || 'standard')}
|
||||
</span>
|
||||
· ${u.dog_count} Hund${u.dog_count !== 1 ? 'e' : ''}
|
||||
· ${u.thread_count} Threads
|
||||
</div>
|
||||
|
|
@ -823,6 +826,11 @@ window.Page_admin = (() => {
|
|||
title="Rolle ändern">
|
||||
<svg class="ph-icon"><use href="/icons/phosphor.svg#shield"></use></svg>
|
||||
</button>
|
||||
<button class="btn btn-sm btn-ghost adm-tier" data-uid="${u.id}"
|
||||
data-name="${_esc(u.name)}" data-tier="${_esc(u.subscription_tier || 'standard')}"
|
||||
title="Abo-Stufe ändern">
|
||||
<svg class="ph-icon"><use href="/icons/phosphor.svg#star"></use></svg>
|
||||
</button>
|
||||
<button class="btn btn-sm btn-ghost adm-delete" data-uid="${u.id}"
|
||||
data-name="${_esc(u.name)}" title="Löschen"
|
||||
style="color:var(--c-danger)">
|
||||
|
|
@ -847,6 +855,9 @@ window.Page_admin = (() => {
|
|||
el.querySelectorAll('.adm-rolle').forEach(btn => {
|
||||
btn.addEventListener('click', () => _changeRolle(btn.dataset.uid, btn.dataset.name, btn.dataset.rolle));
|
||||
});
|
||||
el.querySelectorAll('.adm-tier').forEach(btn => {
|
||||
btn.addEventListener('click', () => _changeTier(btn.dataset.uid, btn.dataset.name, btn.dataset.tier));
|
||||
});
|
||||
el.querySelectorAll('.adm-delete').forEach(btn => {
|
||||
btn.addEventListener('click', () => _deleteUser(btn.dataset.uid, btn.dataset.name));
|
||||
});
|
||||
|
|
@ -903,6 +914,44 @@ window.Page_admin = (() => {
|
|||
});
|
||||
}
|
||||
|
||||
async function _changeTier(uid, name, currentTier) {
|
||||
const tiers = ['standard', 'pro', 'breeder', 'standard_test', 'pro_test', 'breeder_test'];
|
||||
const tierLabels = {
|
||||
standard: 'Standard (kostenlos)',
|
||||
pro: 'Pro (bezahlt)',
|
||||
breeder: 'Breeder (Züchter)',
|
||||
standard_test: 'Standard Test (intern)',
|
||||
pro_test: 'Pro Test (intern)',
|
||||
breeder_test: 'Breeder Test (intern)',
|
||||
};
|
||||
UI.modal.open({
|
||||
title: `Abo-Stufe ändern: ${name}`,
|
||||
body: `
|
||||
<p style="font-size:var(--text-sm);color:var(--c-text-secondary);margin:0 0 var(--space-4)">
|
||||
Aktuelle Stufe: <strong>${currentTier}</strong>
|
||||
</p>
|
||||
<div style="display:flex;flex-direction:column;gap:var(--space-2)">
|
||||
${tiers.filter(t => t !== currentTier).map(t => `
|
||||
<button class="btn btn-secondary adm-tier-choice" data-tier="${t}" form="">
|
||||
${tierLabels[t]}
|
||||
</button>
|
||||
`).join('')}
|
||||
</div>
|
||||
`,
|
||||
});
|
||||
|
||||
document.querySelectorAll('.adm-tier-choice').forEach(btn => {
|
||||
btn.addEventListener('click', async () => {
|
||||
UI.modal.close();
|
||||
try {
|
||||
await API.patch(`/admin/users/${uid}`, { subscription_tier: btn.dataset.tier });
|
||||
UI.toast.success(`${name}: Abo-Stufe ist jetzt ${btn.dataset.tier}.`);
|
||||
_renderTab();
|
||||
} catch (e) { UI.toast.error(e.message); }
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
async function _deleteUser(uid, name) {
|
||||
const ok = await UI.modal.confirm({
|
||||
title: `${name} löschen?`,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue