df137e1074
Три новых виджета к кастомизируемому дашборду: - upcoming — праздники, отпуска, ДР, смены и встречи на 2 недели вперёд; переиспользует сборщики календаря (с их логикой видимости) через новый calendar_service.upcoming_events() - my_hr_requests — статусы моих кадровых заявок (отпуск/больничный/отгул) - my_tickets — мои открытые обращения в IT-поддержку Все три — в реестре DASHBOARD_WIDGETS, доступны в настройке дашборда и наборах по умолчанию. Тесты: реестр, контекст HR-заявок, рендер виджетов. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
25 lines
2.2 KiB
HTML
25 lines
2.2 KiB
HTML
{% load i18n %}
|
|
<div class="dashboard-widget" data-widget="upcoming" style="background: var(--color-card); border-radius: 0.75rem; border: 1px solid var(--color-border); box-shadow: 0 1px 2px rgb(0 0 0 / 0.05);">
|
|
<div style="padding: 1.25rem 1.5rem; border-bottom: 1px solid var(--color-border);">
|
|
<h3 style="font-weight: 600; color: var(--color-card-foreground); font-size: 0.9375rem;">{% trans "Ближайшие события" %}</h3>
|
|
<p style="font-size: 0.8125rem; color: var(--color-muted-foreground); margin-top: 0.125rem;">{% trans "Праздники, отпуска, дни рождения и смены — на 2 недели вперёд" %}</p>
|
|
</div>
|
|
<div>
|
|
{% for event in upcoming_events %}
|
|
<div style="display: flex; align-items: center; gap: 0.875rem; padding: 0.75rem 1.5rem; {% if not forloop.last %}border-bottom: 1px solid var(--color-border);{% endif %}">
|
|
<div style="width: 3rem; flex-shrink: 0; text-align: center;">
|
|
<div style="font-size: 1.125rem; font-weight: 700; color: var(--color-foreground); line-height: 1;">{{ event.date|date:"d" }}</div>
|
|
<div style="font-size: 0.6875rem; color: var(--color-muted-foreground); text-transform: uppercase;">{{ event.date|date:"M" }}</div>
|
|
</div>
|
|
<span style="width: 0.5rem; height: 0.5rem; border-radius: 50%; background: {{ event.dot }}; flex-shrink: 0;"></span>
|
|
<div style="flex: 1; min-width: 0; font-size: 0.875rem; color: var(--color-card-foreground); white-space: nowrap; overflow: hidden; text-overflow: ellipsis;">{{ event.label }}</div>
|
|
</div>
|
|
{% empty %}
|
|
<div style="padding: 1.5rem; text-align: center; color: var(--color-muted-foreground); font-size: 0.8125rem;">{% trans "Ближайших событий нет" %}</div>
|
|
{% endfor %}
|
|
</div>
|
|
<div style="padding: 0.875rem 1.5rem; border-top: 1px solid var(--color-border);">
|
|
<a href="/calendar/" hx-get="/calendar/" hx-target="#main-content" hx-push-url="/calendar/" hx-indicator="#loader" style="font-size: 0.8125rem; color: var(--color-primary); text-decoration: none; font-weight: 500;">{% trans "Календарь" %} →</a>
|
|
</div>
|
|
</div>
|