Dildo items, admin fixes, UI refactor

- Add 85 custom Dildo items (knife/skin pattern names, various rarities)
- Create Dildo Case config (hidden, items obtained via contracts)
- Fix admin user_detail.html nested script tag (Notify fallback removed)
- Fix admin cases.html embedded script tag
- Add notifications.js to admin base.html
- Fix admin users.html: use counts instead of relationship lists
- Replace old money format with |money filter across all templates
- Standardize nav partial (_nav.html) with active_page highlighting
- Fix RARITY_COLORS rename in activity sidebar
- Fix toast animation (forwards) and remove duplicate CSS
- Replace showToast() with Notify.* in upgrade page
- Add cs2_simulator.db and *.log to .gitignore
- Create remote-deploy.sh with DB exclusion
This commit is contained in:
root
2026-07-05 16:15:12 +00:00
parent 50535ec777
commit 3fe8a47e04
25 changed files with 2669 additions and 390 deletions
+20 -25
View File
@@ -172,40 +172,37 @@
</button>
<script>
document.addEventListener('DOMContentLoaded', async () => {
document.addEventListener('DOMContentLoaded', () => {
const list = document.getElementById('activitySidebarList');
const sidebar = document.getElementById('activitySidebar');
document.body.classList.add('has-activity-sidebar');
// Восстанавливаем состояние из localStorage
if (localStorage.getItem('sidebar_closed') === 'true') {
sidebar.classList.add('closed');
document.body.classList.add('sidebar-closed');
document.getElementById('activityToggleBtn').classList.add('visible');
}
async function loadActivities() {
try {
const res = await fetch('/web/api/activity?limit=10');
const data = await res.json();
if (data.success && data.activities) {
renderActivities(data.activities);
}
} catch (e) {
if (list) list.innerHTML = '<div style="text-align:center;padding:2rem;color:var(--text-secondary);">Не удалось загрузить</div>';
}
function loadActivities() {
fetch('/web/api/activity?limit=10')
.then(r => r.json())
.then(data => {
if (data.success && data.activities) {
renderActivities(data.activities);
}
})
.catch(() => {
if (list && !list.querySelector('.activity-sidebar-item')) {
list.innerHTML = '<div style="text-align:center;padding:2rem;color:var(--text-secondary);font-size:0.85rem;">Не удалось загрузить</div>';
}
});
}
WS.on('online_count', (data) => {
document.getElementById('onlineCount').textContent = data.online || 0;
const el = document.getElementById('onlineCount');
if (el) el.textContent = data.online || 0;
});
WS.on('connected', () => {
loadActivities();
});
await loadActivities();
WS.on('activity', (data) => {
const act = data.activity;
if (!act || !list) return;
@@ -219,14 +216,12 @@ document.addEventListener('DOMContentLoaded', async () => {
}
});
// Periodic refresh every 30s to catch missed activities
setInterval(loadActivities, 30000);
WS.on('connected', loadActivities);
// Expose for manual refresh from other pages
window.refreshActivityFeed = loadActivities;
loadActivities();
});
const RARITY_COLORS = {
const ACTIVITY_RARITY_COLORS = {
'consumer-grade': '#b0b0b0', 'industrial-grade': '#5e98d9',
'mil-spec': '#4b69ff', 'mil-spec-grade': '#4b69ff',
'restricted': '#8847ff', 'classified': '#d32ce6',
@@ -245,7 +240,7 @@ function createActivityItem(act) {
item.style.cursor = 'pointer';
const raritySlug = (act.data && act.data.rarity || '').toLowerCase().replace(/ /g, '-').replace(/_/g, '-').replace(/™/g, '');
const rarityColor = RARITY_COLORS[raritySlug] || '';
const rarityColor = ACTIVITY_RARITY_COLORS[raritySlug] || '';
if (rarityColor) {
item.style.background = `rgba(${hexToRgb(rarityColor)}, 0.08)`;
}