Corp/backend/static/css/components/recipientPicker.css
Игорь Надеин ff9b094dd7 fix: improve recipient picker - load all users with avatars
RecipientPicker (заявления):
- Added pagination support to load ALL users (not just first page)
- Added avatar images from media URLs instead of base64
- Falls back to initials when no avatar available
- Loads users in batches of 100 per page

RecipientPickerHandler (чаты):
- Added pagination support for full user list
- Keeps existing avatar display logic
- Loads 100 users per page when not searching
- Limits to 20 results when searching

CSS improvements:
- Added styles for avatar images (.user-avatar-img)
- Added placeholder styles for initials
- Proper object-fit and border-radius for avatars
2025-12-08 12:09:32 +03:00

292 lines
5.3 KiB
CSS
Raw 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.

/* Recipient Picker - Email-style Component */
.recipient-picker-email {
font-size: 0.9375rem;
}
/* Строка получателей (To:/CC:/Отделы:) */
.recipient-row {
display: flex;
align-items: flex-start;
gap: 0.75rem;
padding: 0.75rem 0;
border-bottom: 1px solid var(--bs-border-color);
}
.recipient-row:last-child {
border-bottom: none;
}
/* Метка (To:/CC:/Отделы:) */
.recipient-label {
min-width: 80px;
padding-top: 0.5rem;
color: var(--bs-secondary);
font-weight: 500;
display: flex;
align-items: center;
gap: 0.5rem;
margin: 0;
}
.recipient-label i {
font-size: 1.1em;
}
/* Поле ввода */
.recipient-field {
flex: 1;
display: flex;
align-items: flex-start;
gap: 0.5rem;
flex-wrap: wrap;
}
/* Wrapper для chips + input */
.recipient-input-wrapper {
flex: 1;
min-width: 300px;
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.375rem;
padding: 0.375rem 0.5rem;
background: var(--bs-body-bg);
border: 1px solid var(--bs-border-color);
border-radius: var(--bs-border-radius);
position: relative;
transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
}
.recipient-input-wrapper:focus-within {
border-color: var(--bs-primary);
box-shadow: 0 0 0 0.15rem rgba(var(--bs-primary-rgb), 0.15);
}
/* Input внутри wrapper */
.recipient-input {
flex: 1;
min-width: 200px;
border: none;
outline: none;
padding: 0.25rem;
font-size: inherit;
background: transparent;
}
.recipient-input::placeholder {
color: var(--bs-secondary-color);
opacity: 0.7;
}
/* Chips (выбранные пользователи/отделы) */
.recipient-chip {
display: inline-flex;
align-items: center;
gap: 0.375rem;
padding: 0.25rem 0.5rem;
background: var(--bs-primary);
color: white;
border-radius: 1rem;
font-size: 0.875rem;
white-space: nowrap;
transition: background-color 0.15s;
}
.recipient-chip:hover {
background: var(--bs-primary-dark, #0056b3);
}
.recipient-chip.chip-cc {
background: var(--bs-secondary);
}
.recipient-chip.chip-cc:hover {
background: var(--bs-secondary-dark, #5a6268);
}
.chip-remove {
background: none;
border: none;
padding: 0;
color: white;
cursor: pointer;
display: flex;
align-items: center;
opacity: 0.8;
transition: opacity 0.15s;
}
.chip-remove:hover {
opacity: 1;
}
.chip-remove i {
font-size: 1.1em;
line-height: 1;
}
/* Chips для отделов */
.recipient-chips {
display: inline-flex;
flex-wrap: wrap;
gap: 0.375rem;
align-items: center;
}
/* Dropdown с autocomplete */
.recipient-dropdown {
position: absolute;
top: 100%;
left: 0;
right: 0;
margin-top: 0.25rem;
background: white;
border: 1px solid var(--bs-border-color);
border-radius: var(--bs-border-radius);
box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
max-height: 300px;
overflow-y: auto;
z-index: 1050;
}
.dropdown-item-user {
display: flex;
align-items: center;
gap: 0.75rem;
padding: 0.625rem 1rem;
cursor: pointer;
transition: background-color 0.15s;
}
.dropdown-item-user:hover {
background-color: var(--bs-light);
}
.dropdown-item-empty {
padding: 0.75rem 1rem;
color: var(--bs-secondary);
text-align: center;
font-size: 0.875rem;
}
/* Аватар пользователя */
.user-avatar-small {
width: 32px;
height: 32px;
border-radius: 50%;
background: var(--bs-primary);
color: white;
display: flex;
align-items: center;
justify-content: center;
font-weight: 600;
font-size: 0.75rem;
flex-shrink: 0;
overflow: hidden;
}
/* Изображение аватара */
.user-avatar-img {
width: 100%;
height: 100%;
object-fit: cover;
border-radius: 50%;
}
/* Плейсхолдер с инициалами */
.user-avatar-placeholder {
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
background: var(--bs-primary);
color: white;
font-weight: 600;
font-size: 0.75rem;
}
/* Информация о пользователе */
.user-info {
flex: 1;
min-width: 0;
}
.user-name {
font-weight: 500;
color: var(--bs-body-color);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.user-subtitle {
font-size: 0.8125rem;
color: var(--bs-secondary);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
/* Подсказки */
.alert-sm {
padding: 0.5rem 0.75rem;
margin-top: 0.75rem;
font-size: 0.875rem;
}
/* Адаптивность */
@media (max-width: 768px) {
.recipient-row {
flex-direction: column;
gap: 0.5rem;
}
.recipient-label {
min-width: auto;
padding-top: 0;
}
.recipient-input-wrapper {
min-width: 100%;
}
.recipient-input {
min-width: 150px;
}
}
@media (max-width: 576px) {
.recipient-chip {
font-size: 0.8125rem;
padding: 0.2rem 0.4rem;
}
.user-avatar-small {
width: 28px;
height: 28px;
font-size: 0.7rem;
}
.dropdown-item-user {
padding: 0.5rem 0.75rem;
}
}
/* Темная тема (если нужна) */
@media (prefers-color-scheme: dark) {
.recipient-input-wrapper {
background: var(--bs-dark);
border-color: var(--bs-gray-700);
}
.recipient-dropdown {
background: var(--bs-dark);
border-color: var(--bs-gray-700);
}
.dropdown-item-user:hover {
background-color: var(--bs-gray-800);
}
}