Corp/backend/static/scss/components/_rightbar-calendar.scss
Игорь Надеин 28e2f1615f feat: реализован drag & drop для перемещения событий между календарями
- Создан модуль calendarEventDragDrop.js с классами DragDropState и CalendarUtils
- Реализовано перетаскивание событий между календарями через модальное окно
- Добавлена кнопка 'Переместить все' для массового перемещения
- Модальное окно отображает источник и цель перемещения
- Поддержка legacy-календарей (company/department/personal)
- Добавлены стили для подсветки drop-target (папки и календари)
- Backend: исправлена обработка null значений в serializer
- Backend: добавлен endpoint list_raw для получения немодерируемых событий
- Использованы стандартные Bootstrap стили для модалов
- Исправлено всплытие событий dragover/drop (stopPropagation)
- Эмодзи иконки для типов календарей (����)
- Toast уведомления об успехе/ошибках перемещения
2026-02-12 15:59:53 +03:00

328 lines
7.9 KiB
SCSS
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* rightbar-calendar.scss
* Стили для компонента правой панели с календарем
* Включает стили для FullCalendar, вертикальной ленты недели и модалов событий
*/
/* =====================================
БАЗА КАЛЕНДАРЯ
===================================== */
.calendar-wrap {
min-height: 360px;
border-radius: 10px;
overflow: hidden;
background: var(--bs-body-bg);
box-shadow: inset 0 1px 3px color-mix(in srgb, var(--bs-body-color), transparent 92%);
border: 0;
}
.rightbar-card {
height: 100%;
display: flex;
flex-direction: column;
border-radius: 16px;
overflow: hidden;
border: 1px solid color-mix(in srgb, var(--bs-border-color), transparent 10%);
background: var(--bs-body-bg);
box-shadow: 0 1px 2px rgba(0,0,0,.04), 0 8px 24px rgba(0,0,0,.08);
min-height: 0;
.card-header {
flex: 0 0 auto;
background: var(--bs-tertiary-bg);
border-bottom: 1px solid var(--bs-border-color);
padding: var(--space-1) var(--space-2);
}
.card-body {
flex: 1 1 auto;
min-height: 0;
overflow-y: auto;
-webkit-overflow-scrolling: touch;
padding: var(--space-2);
}
}
// Поддержка многострочного header при длинных названиях отделов
.min-w-0 {
min-width: 0;
}
/* =====================================
DESKTOP STICKY LAYOUT
===================================== */
// На десктопе rightbar становится sticky с фиксированной высотой
// Высота = 100vh - navbar - 2*отступ (сверху и снизу)
// top = navbar + отступ сверху
// Не перемещается с основным скролом страницы, скролл только внутри .card-body
@media (min-width: 992px) {
.rightbar {
position: sticky;
top: calc(var(--navbar-h) + var(--layout-padding-y, 12px));
height: calc(100dvh - var(--navbar-h) - 2 * var(--layout-padding-y, 12px));
overflow: hidden;
// padding управляется через Bootstrap классы в шаблоне (px-0, py-3 и т.д.)
}
}
/* =====================================
FULLCALENDAR — КОМПАКТНО
===================================== */
.fc {
font-size: 0.7rem;
--fc-border-color: var(--bs-border-color);
--fc-page-bg-color: transparent;
--fc-neutral-bg-color: transparent;
--fc-today-bg-color: color-mix(in srgb, var(--bs-primary), transparent 85%);
--fc-event-bg-color: var(--bs-primary);
--fc-event-border-color: var(--bs-primary);
--fc-event-text-color: var(--bs-body-bg);
// Убираем границы
.fc-theme-standard .fc-scrollgrid {
border: 0 !important;
}
.fc-theme-standard td,
.fc-theme-standard th {
border: 0 !important;
}
// Toolbar
.fc-toolbar {
padding: var(--space-2);
background: var(--bs-tertiary-bg);
border-bottom: 1px solid var(--bs-border-color);
justify-content: space-between;
}
.fc-toolbar-title {
font-size: 1rem;
font-weight: 600;
color: var(--bs-body-color);
}
.fc-button {
border-radius: 8px;
font-size: .82rem;
padding: var(--space-1);
background: transparent;
border: none;
color: var(--bs-primary);
&:hover {
background: rgba(var(--bs-primary-rgb), .1);
}
}
// Day cells
.fc-daygrid-day-frame {
padding: 2px 3px !important;
}
.fc-daygrid-day-number {
font-size: .82rem;
width: 100%;
height: 1.6rem;
display: flex;
align-items: center;
justify-content: center;
font-weight: 600;
color: var(--bs-body-color);
text-decoration: none !important;
}
.fc-day-today {
background: none !important;
// Стили для бейджа текущего дня перенесены в _calendar-events.scss
// чтобы избежать конфликтов
}
.fc-day-other .fc-daygrid-day-number {
opacity: .4;
}
// Events
.fc-daygrid-day-events {
padding: 0 2px 2px !important;
row-gap: 2px !important;
}
.fc-daygrid-event-harness {
margin: 0 0 2px 0 !important;
}
.fc-daygrid-event {
border-radius: 6px;
padding: var(--space-1) !important;
line-height: 1.02 !important;
background: color-mix(in srgb, var(--bs-primary), var(--bs-body-bg) 75%);
border: 1px solid color-mix(in srgb, var(--bs-primary), transparent 60%);
color: var(--bs-body-color);
.fc-event-time {
display: none !important;
}
.fc-event-title {
font-size: .62rem !important;
line-height: 1.02 !important;
letter-spacing: -0.2px;
font-weight: 600;
font-family: "Arial Narrow","Roboto Condensed",system-ui,-apple-system,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;
display: -webkit-box !important;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
overflow: hidden !important;
white-space: normal !important;
text-overflow: ellipsis;
max-height: calc(1.02em * 3);
}
}
}
/* =====================================
ВЕРТИКАЛЬНАЯ ЛЕНТА НЕДЕЛИ
===================================== */
.week-strip-header {
margin-top: var(--space-2);
display: flex;
align-items: center;
justify-content: space-between;
color: var(--bs-secondary-color);
font-size: .8rem;
}
.week-vertical {
margin-top: var(--space-1);
display: flex;
flex-direction: column;
gap: var(--space-1);
.week-row {
display: grid;
grid-template-columns: 56px 1fr;
align-items: start;
gap: var(--space-1);
padding: var(--space-1);
border-radius: 12px;
background: color-mix(in srgb, var(--bs-primary), var(--bs-body-bg) 86%);
border: 1px solid color-mix(in srgb, var(--bs-primary), transparent 70%);
&:hover {
background: color-mix(in srgb, var(--bs-primary), var(--bs-body-bg) 82%);
}
}
.content {
.title {
font-size: .8rem;
font-weight: 600;
color: var(--bs-body-color);
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
text-overflow: ellipsis;
white-space: normal;
}
.meta {
margin-top: .15rem;
font-size: .72rem;
color: var(--bs-secondary-color);
}
}
}
.date-badge {
display: grid;
place-items: center;
border-radius: 10px;
padding: .35rem .25rem;
background: color-mix(in srgb, var(--bs-primary), var(--bs-body-bg) 92%);
border: 1px solid color-mix(in srgb, var(--bs-primary), transparent 75%);
text-align: center;
line-height: 1.05;
.dow {
font-size: .7rem;
font-weight: 700;
color: var(--bs-primary);
text-transform: uppercase;
}
.md {
font-size: .74rem;
font-weight: 700;
color: var(--bs-body-color);
}
}
/* =====================================
OFFCANVAS (МОБАЙЛ)
===================================== */
#rightbarOffcanvas {
height: 100dvh;
height: 100svh;
.offcanvas-body {
display: flex;
flex-direction: column;
gap: var(--space-1);
height: calc(100dvh - var(--rb-offcanvas-head, 56px));
height: calc(100svh - var(--rb-offcanvas-head, 56px));
min-height: 0;
overflow-y: auto;
-webkit-overflow-scrolling: touch;
overscroll-behavior: contain;
}
.calendar-wrap {
flex: 0 0 auto;
}
.week-vertical {
flex: 0 0 auto;
}
}
/* =====================================
COLOR PICKER (PALETTE)
===================================== */
.color-swatch {
width: 26px;
height: 26px;
border: 1px solid var(--bs-border-color);
border-radius: 9999px;
padding: 0;
cursor: pointer;
background: transparent;
&.active {
outline: 2px solid var(--bs-primary);
outline-offset: 2px;
}
}
/* =====================================
EVENT DETAILS MODAL
===================================== */
.color-dot {
width: 12px;
height: 12px;
border-radius: 9999px;
display: inline-block;
vertical-align: middle;
margin-right: 6px;
border: 1px solid #00000022;
}