Доработка отображения текущего плана
This commit is contained in:
+3
@@ -165,6 +165,9 @@ class SlotService(webClientBuilderProvider: ObjectProvider<WebClient.Builder>) {
|
||||
.block()
|
||||
?: emptyList()
|
||||
|
||||
fun bookedByIds(bookedSlotIds: List<Long>): List<BookedSlotDetailsDTO> =
|
||||
bookedDetailsByIds(bookedSlotIds)
|
||||
|
||||
fun bookedDetailsByIds(bookedSlotIds: List<Long>): List<BookedSlotDetailsDTO> {
|
||||
val ids = bookedSlotIds.filter { it > 0 }.distinct().toSet()
|
||||
if (ids.isEmpty()) {
|
||||
|
||||
@@ -329,16 +329,41 @@
|
||||
|
||||
function bookedSlotDetails(mode) {
|
||||
const slotIds = Array.isArray(mode.bookedSlotIds) ? mode.bookedSlotIds : [];
|
||||
const slots = slotIds.map((slotId) => {
|
||||
const rows = slotIds.map((slotId) => {
|
||||
const slot = state.bookedSlotsById[slotId];
|
||||
if (!slot) {
|
||||
return `<span class="current-plans-detail-token">#${escapeHtml(slotId)}</span>`;
|
||||
return `<tr><td class="current-plans-id">#${escapeHtml(slotId)}</td><td colspan="6">Детали слота не найдены</td></tr>`;
|
||||
}
|
||||
return `<span class="current-plans-detail-token">#${escapeHtml(slot.bookedSlotId)} · slot ${escapeHtml(slot.slotNum)} · cycle ${escapeHtml(slot.cycle)} · sat ${escapeHtml(slot.satelliteId)}</span>`;
|
||||
return `
|
||||
<tr>
|
||||
<td class="current-plans-id">#${escapeHtml(slot.bookedSlotId)}</td>
|
||||
<td>${formatDateTime(slot.timeStart)}</td>
|
||||
<td>${formatDuration(slot.durationSeconds)}</td>
|
||||
<td>${escapeHtml(slot.slotNum ?? '—')}</td>
|
||||
<td>${escapeHtml(slot.cycle ?? '—')}</td>
|
||||
<td>${escapeHtml(slot.satelliteId ?? '—')}</td>
|
||||
<td>${escapeHtml(slot.status || '—')}</td>
|
||||
</tr>`;
|
||||
}).join('');
|
||||
|
||||
return `
|
||||
<div class="current-plans-detail-title">Забронированные слоты (${slotIds.length})</div>
|
||||
<div class="current-plans-detail-list">${slots}</div>`;
|
||||
<div class="table-responsive">
|
||||
<table class="table table-sm mb-0 current-plans-detail-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>ID</th>
|
||||
<th>Начало</th>
|
||||
<th>Длительность</th>
|
||||
<th>Слот</th>
|
||||
<th>Цикл</th>
|
||||
<th>Спутник</th>
|
||||
<th>Статус</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>${rows}</tbody>
|
||||
</table>
|
||||
</div>`;
|
||||
}
|
||||
|
||||
function dropDetails(mode) {
|
||||
@@ -741,6 +766,21 @@
|
||||
return number.toLocaleString('ru-RU', {maximumFractionDigits: 2});
|
||||
}
|
||||
|
||||
function formatDuration(seconds) {
|
||||
const totalSeconds = Number(seconds);
|
||||
if (!Number.isFinite(totalSeconds)) return '—';
|
||||
|
||||
const rounded = Math.max(0, Math.round(totalSeconds));
|
||||
const hours = Math.floor(rounded / 3600);
|
||||
const minutes = Math.floor((rounded % 3600) / 60);
|
||||
const remainingSeconds = rounded % 60;
|
||||
const pad = (number) => String(number).padStart(2, '0');
|
||||
|
||||
return hours > 0
|
||||
? `${hours}:${pad(minutes)}:${pad(remainingSeconds)}`
|
||||
: `${minutes}:${pad(remainingSeconds)}`;
|
||||
}
|
||||
|
||||
function toDateTimeLocalValue(date) {
|
||||
const pad = (number) => String(number).padStart(2, '0');
|
||||
return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}T${pad(date.getHours())}:${pad(date.getMinutes())}`;
|
||||
|
||||
Reference in New Issue
Block a user