Initialer Laravel Commit für BetiX
Some checks failed
linter / quality (push) Has been cancelled
tests / ci (8.4) (push) Has been cancelled
tests / ci (8.5) (push) Has been cancelled

This commit is contained in:
2026-04-04 18:01:50 +02:00
commit 0280278978
374 changed files with 65210 additions and 0 deletions

View File

@@ -0,0 +1,139 @@
<script setup lang="ts">
import { Head, useForm } from '@inertiajs/vue3';
import { onMounted, nextTick } from 'vue';
import AdminLayout from '@/layouts/admin/CasinoAdminLayout.vue';
const props = defineProps<{
settings: {
pin_max_attempts: number;
pin_lock_minutes: number;
min_tx_btx: number;
max_tx_btx: number;
daily_max_btx: number;
actions_per_minute: number;
reason_required: boolean;
};
defaults: Record<string, any>;
}>();
const form = useForm({
pin_max_attempts: props.settings.pin_max_attempts ?? 5,
pin_lock_minutes: props.settings.pin_lock_minutes ?? 15,
min_tx_btx: props.settings.min_tx_btx ?? 0.0001,
max_tx_btx: props.settings.max_tx_btx ?? 100000,
daily_max_btx: props.settings.daily_max_btx ?? 100000,
actions_per_minute: props.settings.actions_per_minute ?? 20,
reason_required: props.settings.reason_required ?? true,
});
async function submit() {
await form.post('/admin/wallets/settings', { preserveScroll: true });
}
onMounted(() => {
nextTick(() => { if ((window as any).lucide) (window as any).lucide.createIcons(); });
});
</script>
<template>
<AdminLayout>
<Head title="Admin Wallet Einstellungen" />
<section class="content">
<div class="wrap">
<div class="panel">
<header class="page-head">
<div class="head-flex">
<div class="title-group">
<div class="title">Wallet/Vault Einstellungen</div>
<p class="subtitle">PINPolicy, Limits, Throttles und Vorgaben für manuelle Anpassungen.</p>
</div>
<div class="actions">
<button class="btn primary" @click="submit" :disabled="form.processing">
<i data-lucide="save"></i>
Speichern
</button>
</div>
</div>
</header>
<div class="grid">
<div class="card">
<h3>Vault PIN Policy</h3>
<div class="row">
<label>Max Fehlversuche</label>
<input type="number" min="1" max="20" v-model.number="form.pin_max_attempts" />
</div>
<div class="row">
<label>Sperrdauer (Minuten)</label>
<input type="number" min="1" max="1440" v-model.number="form.pin_lock_minutes" />
</div>
</div>
<div class="card">
<h3>TransferLimits (BTX)</h3>
<div class="row">
<label>Minimum pro Transaktion</label>
<input type="number" step="0.0001" min="0" v-model.number="form.min_tx_btx" />
</div>
<div class="row">
<label>Maximum pro Transaktion</label>
<input type="number" step="0.0001" min="0" v-model.number="form.max_tx_btx" />
</div>
<div class="row">
<label>Tagesmaximum</label>
<input type="number" step="0.0001" min="0" v-model.number="form.daily_max_btx" />
</div>
</div>
<div class="card">
<h3>Throttling</h3>
<div class="row">
<label>Aktionen pro Minute</label>
<input type="number" min="1" max="600" v-model.number="form.actions_per_minute" />
</div>
</div>
<div class="card">
<h3>Manuelle Anpassungen</h3>
<div class="row checkbox">
<label>
<input type="checkbox" v-model="form.reason_required" />
Grund verpflichtend
</label>
</div>
<small>Empfohlen aktiviert: Alle manuellen Gutschriften/Abzüge erfordern einen dokumentierten Grund.</small>
</div>
</div>
<div class="foot">
<button class="btn primary" @click="submit" :disabled="form.processing">
<i data-lucide="save"></i>
Speichern
</button>
</div>
</div>
</div>
</section>
</AdminLayout>
</template>
<style scoped>
.content { padding: 20px; }
.wrap { max-width: 1100px; margin: 0 auto; }
.panel { background: #0f0f10; border: 1px solid #18181b; border-radius: 12px; padding: 16px; }
.page-head .title { font-size: 22px; font-weight: 700; }
.subtitle { color: #a1a1aa; margin-top: 4px; }
.actions { display: flex; gap: 10px; }
.grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; margin-top: 16px; }
@media (max-width: 900px) { .grid { grid-template-columns: 1fr; } }
.card { background: #0b0b0c; border: 1px solid #1f1f22; border-radius: 10px; padding: 14px; }
.card h3 { margin: 0 0 10px 0; font-size: 16px; }
.row { display: grid; grid-template-columns: 220px 1fr; align-items: center; gap: 10px; margin: 10px 0; }
.row.checkbox { grid-template-columns: 1fr; }
label { font-weight: 600; color: #cbd5e1; }
input, select { width: 100%; background: #0b0b0c; border: 1px solid #1f1f22; border-radius: 8px; padding: 10px; color: #e5e7eb; }
.btn { background: #1f2937; border: 1px solid #374151; color: #e5e7eb; padding: 8px 14px; border-radius: 8px; cursor: pointer; }
.btn.primary { background: #ff007a; border-color: #ff2b8f; color: white; }
.foot { display: flex; justify-content: flex-end; margin-top: 16px; }
</style>