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
+15 -41
View File
@@ -446,43 +446,7 @@
</style>
</head>
<body>
<nav class="navbar">
<div class="container">
<a href="/" class="logo">🎮 CS2 Simulator</a>
<div class="nav-links">
{% if user and not is_public %}
<a href="/cases" class="nav-link">Кейсы</a>
<a href="/contracts" class="nav-link">Контракты</a>
<a href="/upgrade" class="nav-link">🆙 Апгрейд</a>
<a href="/crash" class="nav-link">💥 Crash</a>
<a href="/profile" class="nav-link active">Профиль</a>
<a href="/activity" class="nav-link">📰 Лента</a>
<a href="/achievements" class="nav-link">🏆 Достижения</a>
<span class="user-balance">{{ "%.2f"|format(user.balance) }} ₽</span>
<button onclick="toggleSound()" class="btn btn-outline" id="soundToggle" title="Звук">🔊</button>
<button onclick="toggleSafeMode()" class="btn btn-outline" id="safeModeToggle" title="Режим записи">🎙️</button>
<button onclick="logout()" class="btn btn-outline">Выйти</button>
{% elif user %}
<a href="/cases" class="nav-link">Кейсы</a>
<a href="/contracts" class="nav-link">Контракты</a>
<a href="/upgrade" class="nav-link">🆙 Апгрейд</a>
<a href="/activity" class="nav-link">📰 Лента</a>
<span class="user-balance">{{ "%.2f"|format(user.balance) }} ₽</span>
<button onclick="toggleSound()" class="btn btn-outline" id="soundToggle" title="Звук">🔊</button>
<button onclick="toggleSafeMode()" class="btn btn-outline" id="safeModeToggle" title="Режим записи">🎙️</button>
<button onclick="logout()" class="btn btn-outline">Выйти</button>
{% else %}
<a href="/cases" class="nav-link">Кейсы</a>
<a href="/contracts" class="nav-link">Контракты</a>
<a href="/upgrade" class="nav-link">🆙 Апгрейд</a>
<a href="/activity" class="nav-link">📰 Лента</a>
<button onclick="toggleSafeMode()" class="btn btn-outline" id="safeModeToggle" title="Режим записи">🎙️</button>
<a href="/login" class="btn btn-outline">Войти</a>
<a href="/register" class="btn btn-primary">Регистрация</a>
{% endif %}
</div>
</div>
</nav>
{% include "_nav.html" %}
<main class="container">
<div class="profile-layout">
@@ -519,18 +483,17 @@
</div>
{% if not is_public %}
<div class="stat-card">
<div class="stat-value">{{ "%.0f"|format(balance) }} ₽</div>
<div class="stat-value">{{ balance|money }} ₽</div>
<div class="stat-label">Баланс</div>
</div>
{% endif %}
</div>
{% if not is_public %}
<!-- Инвентарь -->
<div>
<div class="section-title">🎒 Инвентарь <span style="font-size:0.78rem;font-weight:400;color:var(--text-dim);font-family:'Rajdhani',sans-serif;">— {{ inventory_items|length }} предметов</span></div>
{% if inventory_items %}
{% if not is_public and inventory_items %}
<div class="inventory-actions">
<div class="selection-controls">
<label class="select-all-checkbox">
@@ -562,7 +525,9 @@
<input type="text" id="searchInput" class="filter-select" style="min-width:150px;" placeholder="Поиск..." oninput="filterItems()">
<button onclick="resetFilters()" class="btn btn-outline" style="font-size:0.72rem;padding:0.35rem 0.8rem;">Сброс</button>
</div>
{% endif %}
{% if inventory_items %}
<div class="inventory-grid-detailed" id="inventoryGrid">
{% for item in inventory_items %}
<div class="inventory-skin-card rarity-{{ item.rarity|lower|replace(' ', '-') }}"
@@ -571,10 +536,12 @@
data-type="{{ item.type }}"
data-name="{{ item.name|lower }}"
data-price="{{ item.price_rub or 100 }}">
{% if not is_public %}
<input type="checkbox" class="item-select-checkbox"
onchange="onItemSelect(this)"
data-id="{{ item.id }}"
data-price="{{ item.price_rub or 100 }}">
{% endif %}
<div class="skin-image-container">
<img src="{{ item.image_url or '/static/placeholder.png' }}"
alt="{{ item.name }}"
@@ -591,11 +558,13 @@
<span>{{ item.wear }}</span>
</div>
<div class="skin-details" style="margin-top:3px;color:var(--success-color);">
<span>💰 {{ "%.0f"|format(item.price_rub or 100) }} ₽</span>
<span>💰 {{ (item.price_rub or 100)|money }} ₽</span>
</div>
{% if not is_public %}
<div class="item-actions">
<button onclick="sellSingleItem({{ item.id }})" class="btn-sell-single">Продать</button>
</div>
{% endif %}
</div>
</div>
{% endfor %}
@@ -604,12 +573,17 @@
<div class="empty-state-large">
<div class="empty-icon">📭</div>
<h3>Инвентарь пуст</h3>
{% if is_public %}
<p>У пользователя пока нет предметов.</p>
{% else %}
<p>Откройте кейсы, чтобы получить первые предметы!</p>
<a href="/cases" class="btn btn-primary">Открыть кейсы</a>
{% endif %}
</div>
{% endif %}
</div>
{% if not is_public %}
<!-- Модалка массовой продажи -->
<div id="bulkSellModal" class="bulk-sell-modal" style="display:none;">
<div class="bulk-sell-content">