Weiter am Chastity Ingame gearbeitet
Some checks failed
Host-Based Deploy (Java 21 Fix) / build-and-run (push) Has been cancelled
Some checks failed
Host-Based Deploy (Java 21 Fix) / build-and-run (push) Has been cancelled
This commit is contained in:
@@ -7,6 +7,7 @@
|
||||
<title>Keyholder – xXx Sphere</title>
|
||||
<link rel="stylesheet" href="/css/variables.css">
|
||||
<link rel="stylesheet" href="/css/style.css">
|
||||
<link rel="stylesheet" href="/css/time-picker.css">
|
||||
<style>
|
||||
.lock-list { display:flex; flex-direction:column; gap:0.5rem; margin-top:0.5rem; }
|
||||
|
||||
@@ -80,27 +81,6 @@
|
||||
.violation-item:last-child { border-bottom:none; }
|
||||
|
||||
/* Zeitpicker (für Freeze-Dialog) */
|
||||
.time-picker { display:flex; align-items:center; gap:0.5rem; }
|
||||
.tp-seg { display:flex; flex-direction:column; align-items:center; gap:0.2rem; }
|
||||
.tp-seg-row { display:flex; align-items:center; gap:0.25rem; }
|
||||
.tp-seg button {
|
||||
width:26px; height:26px;
|
||||
background:var(--color-secondary); border:1px solid var(--color-muted);
|
||||
border-radius:5px; cursor:pointer; font-size:1rem; font-weight:700;
|
||||
color:var(--color-text); display:flex; align-items:center; justify-content:center;
|
||||
padding:0; flex-shrink:0;
|
||||
}
|
||||
.tp-seg button:hover { background:var(--color-primary); color:#fff; border-color:var(--color-primary); }
|
||||
.tp-seg input {
|
||||
width:30px; text-align:center;
|
||||
background:var(--color-secondary); border:1px solid var(--color-muted);
|
||||
border-radius:4px; color:var(--color-text);
|
||||
font-size:0.95rem; font-weight:600; font-family:monospace;
|
||||
padding:0.18rem 0; box-sizing:border-box;
|
||||
}
|
||||
.tp-seg .tp-label { font-size:0.65rem; color:var(--color-muted); text-transform:uppercase; letter-spacing:0.04em; }
|
||||
.tp-colon { font-size:1.1rem; font-weight:700; color:var(--color-muted); margin-bottom:1rem; }
|
||||
|
||||
/* ── Tab-Navigation ── */
|
||||
.kh-tabs { display:flex; gap:0; border-bottom:2px solid var(--color-secondary); margin-bottom:1.25rem; }
|
||||
.kh-tab {
|
||||
@@ -311,32 +291,9 @@
|
||||
<div style="font-size:0.72rem;font-weight:700;color:var(--color-primary);text-transform:uppercase;letter-spacing:0.06em;margin-bottom:0.4rem;">Annahme-Frist</div>
|
||||
|
||||
<div class="time-picker">
|
||||
<div class="tp-seg">
|
||||
<div class="tp-seg-row">
|
||||
<button type="button" onclick="atTpChange(-1,'d')">−</button>
|
||||
<input type="text" id="at_d" value="0" readonly>
|
||||
<button type="button" onclick="atTpChange(1,'d')">+</button>
|
||||
</div>
|
||||
<span class="tp-label">Tage</span>
|
||||
</div>
|
||||
<span class="tp-colon">:</span>
|
||||
<div class="tp-seg">
|
||||
<div class="tp-seg-row">
|
||||
<button type="button" onclick="atTpChange(-1,'h')">−</button>
|
||||
<input type="text" id="at_h" value="01" readonly>
|
||||
<button type="button" onclick="atTpChange(1,'h')">+</button>
|
||||
</div>
|
||||
<span class="tp-label">Stunden</span>
|
||||
</div>
|
||||
<span class="tp-colon">:</span>
|
||||
<div class="tp-seg">
|
||||
<div class="tp-seg-row">
|
||||
<button type="button" onclick="atTpChange(-1,'m')">−</button>
|
||||
<input type="text" id="at_m" value="00" readonly>
|
||||
<button type="button" onclick="atTpChange(1,'m')">+</button>
|
||||
</div>
|
||||
<span class="tp-label">Minuten</span>
|
||||
</div>
|
||||
<div class="tp-seg"><div class="tp-seg-row"><button type="button" onclick="tpChange('at',-1,'d')">−</button><input type="text" id="at_d" value="0" readonly><button type="button" onclick="tpChange('at',1,'d')">+</button></div><span class="tp-label">Tage</span></div>
|
||||
<div class="tp-seg"><div class="tp-seg-row"><button type="button" onclick="tpChange('at',-1,'h')">−</button><input type="text" id="at_h" value="01" readonly><button type="button" onclick="tpChange('at',1,'h')">+</button></div><span class="tp-label">Stunden</span></div>
|
||||
<div class="tp-seg"><div class="tp-seg-row"><button type="button" onclick="tpChange('at',-1,'m')">−</button><input type="text" id="at_m" value="00" readonly><button type="button" onclick="tpChange('at',1,'m')">+</button></div><span class="tp-label">Minuten</span></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -350,32 +307,9 @@
|
||||
</label>
|
||||
<div id="atPenaltyFreezeFields" style="padding-left:1.6rem;opacity:0.4;pointer-events:none;transition:opacity 0.15s;">
|
||||
<div class="time-picker">
|
||||
<div class="tp-seg">
|
||||
<div class="tp-seg-row">
|
||||
<button type="button" onclick="atFreezeTpChange(-1,'d')">−</button>
|
||||
<input type="text" id="atf_d" value="0" readonly>
|
||||
<button type="button" onclick="atFreezeTpChange(1,'d')">+</button>
|
||||
</div>
|
||||
<span class="tp-label">Tage</span>
|
||||
</div>
|
||||
<span class="tp-colon">:</span>
|
||||
<div class="tp-seg">
|
||||
<div class="tp-seg-row">
|
||||
<button type="button" onclick="atFreezeTpChange(-1,'h')">−</button>
|
||||
<input type="text" id="atf_h" value="04" readonly>
|
||||
<button type="button" onclick="atFreezeTpChange(1,'h')">+</button>
|
||||
</div>
|
||||
<span class="tp-label">Stunden</span>
|
||||
</div>
|
||||
<span class="tp-colon">:</span>
|
||||
<div class="tp-seg">
|
||||
<div class="tp-seg-row">
|
||||
<button type="button" onclick="atFreezeTpChange(-1,'m')">−</button>
|
||||
<input type="text" id="atf_m" value="00" readonly>
|
||||
<button type="button" onclick="atFreezeTpChange(1,'m')">+</button>
|
||||
</div>
|
||||
<span class="tp-label">Minuten</span>
|
||||
</div>
|
||||
<div class="tp-seg"><div class="tp-seg-row"><button type="button" onclick="tpChange('atf',-1,'d')">−</button><input type="text" id="atf_d" value="0" readonly><button type="button" onclick="tpChange('atf',1,'d')">+</button></div><span class="tp-label">Tage</span></div>
|
||||
<div class="tp-seg"><div class="tp-seg-row"><button type="button" onclick="tpChange('atf',-1,'h')">−</button><input type="text" id="atf_h" value="04" readonly><button type="button" onclick="tpChange('atf',1,'h')">+</button></div><span class="tp-label">Stunden</span></div>
|
||||
<div class="tp-seg"><div class="tp-seg-row"><button type="button" onclick="tpChange('atf',-1,'m')">−</button><input type="text" id="atf_m" value="00" readonly><button type="button" onclick="tpChange('atf',1,'m')">+</button></div><span class="tp-label">Minuten</span></div>
|
||||
</div>
|
||||
</div>
|
||||
<label style="display:flex;align-items:center;gap:0.6rem;font-size:0.88rem;cursor:pointer;">
|
||||
@@ -409,32 +343,9 @@
|
||||
<strong style="color:var(--color-text);">Hinweis:</strong> Während des Einfrierens können keine weiteren Karten gezogen werden.
|
||||
</p>
|
||||
<div class="time-picker">
|
||||
<div class="tp-seg">
|
||||
<div class="tp-seg-row">
|
||||
<button type="button" onclick="freezeTpChange(-1,'d')">−</button>
|
||||
<input type="text" id="freeze_d" value="0" readonly>
|
||||
<button type="button" onclick="freezeTpChange(1,'d')">+</button>
|
||||
</div>
|
||||
<span class="tp-label">Tage</span>
|
||||
</div>
|
||||
<span class="tp-colon">:</span>
|
||||
<div class="tp-seg">
|
||||
<div class="tp-seg-row">
|
||||
<button type="button" onclick="freezeTpChange(-1,'h')">−</button>
|
||||
<input type="text" id="freeze_h" value="04" readonly>
|
||||
<button type="button" onclick="freezeTpChange(1,'h')">+</button>
|
||||
</div>
|
||||
<span class="tp-label">Stunden</span>
|
||||
</div>
|
||||
<span class="tp-colon">:</span>
|
||||
<div class="tp-seg">
|
||||
<div class="tp-seg-row">
|
||||
<button type="button" onclick="freezeTpChange(-1,'m')">−</button>
|
||||
<input type="text" id="freeze_m" value="00" readonly>
|
||||
<button type="button" onclick="freezeTpChange(1,'m')">+</button>
|
||||
</div>
|
||||
<span class="tp-label">Minuten</span>
|
||||
</div>
|
||||
<div class="tp-seg"><div class="tp-seg-row"><button type="button" onclick="tpChange('freeze',-1,'d')">−</button><input type="text" id="freeze_d" value="0" readonly><button type="button" onclick="tpChange('freeze',1,'d')">+</button></div><span class="tp-label">Tage</span></div>
|
||||
<div class="tp-seg"><div class="tp-seg-row"><button type="button" onclick="tpChange('freeze',-1,'h')">−</button><input type="text" id="freeze_h" value="04" readonly><button type="button" onclick="tpChange('freeze',1,'h')">+</button></div><span class="tp-label">Stunden</span></div>
|
||||
<div class="tp-seg"><div class="tp-seg-row"><button type="button" onclick="tpChange('freeze',-1,'m')">−</button><input type="text" id="freeze_m" value="00" readonly><button type="button" onclick="tpChange('freeze',1,'m')">+</button></div><span class="tp-label">Minuten</span></div>
|
||||
</div>
|
||||
<div id="freezeModalError" style="display:none;font-size:0.85rem;color:#e74c3c;"></div>
|
||||
<div style="display:flex;gap:0.6rem;justify-content:flex-end;">
|
||||
@@ -462,8 +373,9 @@
|
||||
<script src="/js/card-defs.js"></script>
|
||||
<script src="/js/card-display.js"></script>
|
||||
<script src="/js/icons.js"></script>
|
||||
<script src="/js/nav.js"></script>
|
||||
<script src="/js/nav.js"></script>
|
||||
<script src="/js/social-sidebar.js"></script>
|
||||
<script src="/js/time-picker.js"></script>
|
||||
<script>
|
||||
function esc(s) { const d = document.createElement('div'); d.textContent = s ?? ''; return d.innerHTML; }
|
||||
|
||||
@@ -1095,41 +1007,6 @@
|
||||
let assignTaskLockId = null;
|
||||
let assignTaskSelectedIdx = null;
|
||||
|
||||
function atTpChange(delta, seg) {
|
||||
let d = parseInt(document.getElementById('at_d').value) || 0;
|
||||
let h = parseInt(document.getElementById('at_h').value) || 0;
|
||||
let m = parseInt(document.getElementById('at_m').value) || 0;
|
||||
if (seg === 'm') m += delta; else if (seg === 'h') h += delta; else d += delta;
|
||||
if (m >= 60) { h += Math.floor(m/60); m = m%60; }
|
||||
if (m < 0) { const b = Math.ceil(-m/60); h -= b; m += b*60; }
|
||||
if (h >= 24) { d += Math.floor(h/24); h = h%24; }
|
||||
if (h < 0) { const b = Math.ceil(-h/24); d -= b; h += b*24; }
|
||||
if (d < 0) d = 0;
|
||||
document.getElementById('at_d').value = d;
|
||||
document.getElementById('at_h').value = String(h).padStart(2,'0');
|
||||
document.getElementById('at_m').value = String(m).padStart(2,'0');
|
||||
}
|
||||
|
||||
function atFreezeTpChange(delta, seg) {
|
||||
let d = parseInt(document.getElementById('atf_d').value) || 0;
|
||||
let h = parseInt(document.getElementById('atf_h').value) || 0;
|
||||
let m = parseInt(document.getElementById('atf_m').value) || 0;
|
||||
if (seg === 'm') m += delta; else if (seg === 'h') h += delta; else d += delta;
|
||||
if (m >= 60) { h += Math.floor(m/60); m = m%60; }
|
||||
if (m < 0) { const b = Math.ceil(-m/60); h -= b; m += b*60; }
|
||||
if (h >= 24) { d += Math.floor(h/24); h = h%24; }
|
||||
if (h < 0) { const b = Math.ceil(-h/24); d -= b; h += b*24; }
|
||||
if (d < 0) d = 0;
|
||||
document.getElementById('atf_d').value = d;
|
||||
document.getElementById('atf_h').value = String(h).padStart(2,'0');
|
||||
document.getElementById('atf_m').value = String(m).padStart(2,'0');
|
||||
}
|
||||
|
||||
function atTpToMinutes(prefix) {
|
||||
return (parseInt(document.getElementById(prefix+'_d').value)||0) * 24*60
|
||||
+ (parseInt(document.getElementById(prefix+'_h').value)||0) * 60
|
||||
+ (parseInt(document.getElementById(prefix+'_m').value)||0);
|
||||
}
|
||||
|
||||
function atRedChange(delta) {
|
||||
const inp = document.getElementById('atRedCount');
|
||||
@@ -1273,7 +1150,7 @@
|
||||
errEl.style.display = '';
|
||||
return;
|
||||
}
|
||||
const deadlineMinutes = atTpToMinutes('at');
|
||||
const deadlineMinutes = tpToMinutes('at');
|
||||
if (deadlineMinutes < 1) {
|
||||
errEl.textContent = 'Bitte eine Annahme-Frist angeben.';
|
||||
errEl.style.display = '';
|
||||
@@ -1286,7 +1163,7 @@
|
||||
errEl.style.display = '';
|
||||
return;
|
||||
}
|
||||
const penaltyFreezeMinutes = freezeEnabled ? atTpToMinutes('atf') : null;
|
||||
const penaltyFreezeMinutes = freezeEnabled ? tpToMinutes('atf') : null;
|
||||
const penaltyRedCards = redEnabled ? parseInt(document.getElementById('atRedCount').value) || 1 : null;
|
||||
|
||||
try {
|
||||
@@ -1363,31 +1240,6 @@
|
||||
let freezeTargetLockId = null;
|
||||
let unfreezeTargetLockId = null;
|
||||
|
||||
// Zeitpicker-Logik (Dauer)
|
||||
function freezeTpChange(delta, seg) {
|
||||
let d = parseInt(document.getElementById('freeze_d').value) || 0;
|
||||
let h = parseInt(document.getElementById('freeze_h').value) || 0;
|
||||
let m = parseInt(document.getElementById('freeze_m').value) || 0;
|
||||
if (seg === 'm') m += delta;
|
||||
else if (seg === 'h') h += delta;
|
||||
else if (seg === 'd') d += delta;
|
||||
if (m >= 60) { h += Math.floor(m / 60); m = m % 60; }
|
||||
if (m < 0) { const b = Math.ceil(-m / 60); h -= b; m += b * 60; }
|
||||
if (h >= 24) { d += Math.floor(h / 24); h = h % 24; }
|
||||
if (h < 0) { const b = Math.ceil(-h / 24); d -= b; h += b * 24; }
|
||||
if (d < 0) d = 0;
|
||||
document.getElementById('freeze_d').value = d;
|
||||
document.getElementById('freeze_h').value = String(h).padStart(2, '0');
|
||||
document.getElementById('freeze_m').value = String(m).padStart(2, '0');
|
||||
}
|
||||
|
||||
function freezeTpToMinutes() {
|
||||
const d = parseInt(document.getElementById('freeze_d').value) || 0;
|
||||
const h = parseInt(document.getElementById('freeze_h').value) || 0;
|
||||
const m = parseInt(document.getElementById('freeze_m').value) || 0;
|
||||
return d * 24 * 60 + h * 60 + m;
|
||||
}
|
||||
|
||||
function openFreezeModal(lockId) {
|
||||
freezeTargetLockId = lockId;
|
||||
// Default: 4h
|
||||
@@ -1405,7 +1257,7 @@
|
||||
|
||||
async function submitFreeze() {
|
||||
const lockId = freezeTargetLockId;
|
||||
const minutes = freezeTpToMinutes();
|
||||
const minutes = tpToMinutes('freeze');
|
||||
const errEl = document.getElementById('freezeModalError');
|
||||
if (minutes < 1) {
|
||||
errEl.textContent = 'Bitte eine Dauer von mindestens 1 Minute angeben.';
|
||||
@@ -1485,26 +1337,6 @@
|
||||
let _pendingTaskIndex = null;
|
||||
let _pendingLockId = null;
|
||||
|
||||
function ctpFreezeTpChange(delta, seg) {
|
||||
let d = parseInt(document.getElementById('ctpf_d').value) || 0;
|
||||
let h = parseInt(document.getElementById('ctpf_h').value) || 0;
|
||||
let m = parseInt(document.getElementById('ctpf_m').value) || 0;
|
||||
if (seg === 'm') m += delta; else if (seg === 'h') h += delta; else d += delta;
|
||||
if (m >= 60) { h += Math.floor(m/60); m = m%60; }
|
||||
if (m < 0) { const b = Math.ceil(-m/60); h -= b; m += b*60; }
|
||||
if (h >= 24) { d += Math.floor(h/24); h = h%24; }
|
||||
if (h < 0) { const b = Math.ceil(-h/24); d -= b; h += b*24; }
|
||||
if (d < 0) d = 0;
|
||||
document.getElementById('ctpf_d').value = d;
|
||||
document.getElementById('ctpf_h').value = String(h).padStart(2,'0');
|
||||
document.getElementById('ctpf_m').value = String(m).padStart(2,'0');
|
||||
}
|
||||
|
||||
function ctpFreezeToMinutes() {
|
||||
return (parseInt(document.getElementById('ctpf_d').value)||0) * 24*60
|
||||
+ (parseInt(document.getElementById('ctpf_h').value)||0) * 60
|
||||
+ (parseInt(document.getElementById('ctpf_m').value)||0);
|
||||
}
|
||||
|
||||
function ctpRedChange(delta) {
|
||||
const inp = document.getElementById('ctpRedCount');
|
||||
@@ -1566,7 +1398,7 @@
|
||||
}
|
||||
document.getElementById('ctpPenaltyError').style.display = 'none';
|
||||
|
||||
const freezeVal = freezeEnabled ? (ctpFreezeToMinutes() || null) : null;
|
||||
const freezeVal = freezeEnabled ? (tpToMinutes('ctpf') || null) : null;
|
||||
const redVal = redEnabled ? (parseInt(document.getElementById('ctpRedCount').value) || null) : null;
|
||||
try {
|
||||
const res = await fetch(
|
||||
@@ -1865,32 +1697,9 @@
|
||||
</label>
|
||||
<div id="ctpPenaltyFreezeFields" style="padding-left:1.6rem;opacity:0.4;pointer-events:none;transition:opacity 0.15s;">
|
||||
<div class="time-picker">
|
||||
<div class="tp-seg">
|
||||
<div class="tp-seg-row">
|
||||
<button type="button" onclick="ctpFreezeTpChange(-1,'d')">−</button>
|
||||
<input type="text" id="ctpf_d" value="0" readonly>
|
||||
<button type="button" onclick="ctpFreezeTpChange(1,'d')">+</button>
|
||||
</div>
|
||||
<span class="tp-label">Tage</span>
|
||||
</div>
|
||||
<span class="tp-colon">:</span>
|
||||
<div class="tp-seg">
|
||||
<div class="tp-seg-row">
|
||||
<button type="button" onclick="ctpFreezeTpChange(-1,'h')">−</button>
|
||||
<input type="text" id="ctpf_h" value="04" readonly>
|
||||
<button type="button" onclick="ctpFreezeTpChange(1,'h')">+</button>
|
||||
</div>
|
||||
<span class="tp-label">Stunden</span>
|
||||
</div>
|
||||
<span class="tp-colon">:</span>
|
||||
<div class="tp-seg">
|
||||
<div class="tp-seg-row">
|
||||
<button type="button" onclick="ctpFreezeTpChange(-1,'m')">−</button>
|
||||
<input type="text" id="ctpf_m" value="00" readonly>
|
||||
<button type="button" onclick="ctpFreezeTpChange(1,'m')">+</button>
|
||||
</div>
|
||||
<span class="tp-label">Minuten</span>
|
||||
</div>
|
||||
<div class="tp-seg"><div class="tp-seg-row"><button type="button" onclick="tpChange('ctpf',-1,'d')">−</button><input type="text" id="ctpf_d" value="0" readonly><button type="button" onclick="tpChange('ctpf',1,'d')">+</button></div><span class="tp-label">Tage</span></div>
|
||||
<div class="tp-seg"><div class="tp-seg-row"><button type="button" onclick="tpChange('ctpf',-1,'h')">−</button><input type="text" id="ctpf_h" value="04" readonly><button type="button" onclick="tpChange('ctpf',1,'h')">+</button></div><span class="tp-label">Stunden</span></div>
|
||||
<div class="tp-seg"><div class="tp-seg-row"><button type="button" onclick="tpChange('ctpf',-1,'m')">−</button><input type="text" id="ctpf_m" value="00" readonly><button type="button" onclick="tpChange('ctpf',1,'m')">+</button></div><span class="tp-label">Minuten</span></div>
|
||||
</div>
|
||||
</div>
|
||||
<label style="display:flex;align-items:center;gap:0.6rem;font-size:0.88rem;cursor:pointer;">
|
||||
|
||||
Reference in New Issue
Block a user