2D-карта (станции, заявки) и вкладка «Заявки»

Новая вкладка «Заявки»: показ заявок за интервал на 2D-карте,
создание заявки рисованием полигона на карте с формой параметров
(Оптика/РСА) и удаление выбранной заявки (createRequest/deleteRequest,
RequestCreatePanel/RequestDetailsPanel, polygonToWkt). В Tgu2DMapView
добавлен изолированный режим рисования полигона.

2D-карта: панели информации о станции и о заявках, слой станций
(stationsApi), поддержка выбора объектов через спатиальный индекс.
Список слоёв упрощён — трасса/полоса/маркеры КА убраны из переключателя,
по умолчанию включены работы плана, станции и заявки.
This commit is contained in:
Дмитрий Соловьев
2026-06-01 22:17:50 +03:00
parent 715b5108d6
commit 0128c5569c
26 changed files with 1851 additions and 96 deletions
@@ -16,7 +16,7 @@
.tgu-toolbar__row {
display: flex;
align-items: end;
align-items: center;
gap: 0.75rem;
min-height: 4.4rem;
padding: 0.75rem 1rem 0.65rem;
@@ -53,8 +53,9 @@
}
.tgu-field {
display: grid;
gap: 0.25rem;
display: flex;
align-items: center;
gap: 0.45rem;
color: var(--text-muted);
font-size: 0.72rem;
}
@@ -114,7 +115,6 @@
.tgu-tabs {
display: inline-flex;
gap: 0.15rem;
align-self: center;
border: 1px solid var(--line);
border-radius: 7px;
padding: 0.18rem;
@@ -219,6 +219,17 @@
border-right: 1px solid var(--line);
}
.tgu-sidebar__legend {
border-top: 1px solid var(--line);
margin-top: auto;
}
.tgu-sidebar__legend .tgu-legend {
flex-direction: column;
align-items: flex-start;
padding: 0.75rem 1rem;
}
.tgu-panel-heading {
display: flex;
justify-content: space-between;
@@ -344,7 +355,6 @@
.tgu-timeline__svg {
display: block;
width: 100%;
min-height: 26rem;
border: 1px solid var(--line);
border-radius: 8px;
background: #151819;
@@ -832,6 +842,18 @@
stroke-width: 2;
}
.tgu-2d-map__overlay circle {
fill: rgba(104, 195, 189, 0.12);
stroke: rgba(130, 222, 216, 0.9);
stroke-width: 2;
}
.tgu-2d-map__overlay circle.is-selected {
fill: rgba(240, 173, 46, 0.15);
stroke: #f0ad2e;
stroke-width: 2.5;
}
.tgu-2d-map__tooltip {
position: absolute;
z-index: 8;
@@ -998,6 +1020,7 @@
}
.tgu-map-requests-filter .tgu-field {
display: grid;
grid-template-columns: 2rem minmax(0, 1fr);
align-items: center;
}
@@ -1059,3 +1082,266 @@
background: rgba(192, 128, 255, 0.25);
border-color: rgba(192, 128, 255, 0.85);
}
/* ── Requests-at-point panel ───────────────────────────── */
.tgu-map-content.has-requests-panel {
grid-template-columns: 19rem minmax(0, 1fr) 20rem;
}
.tgu-map-requests-panel {
display: flex;
flex-direction: column;
min-height: 0;
overflow: hidden;
border-left: 1px solid var(--line);
background: var(--bg-panel);
}
.tgu-map-requests-list {
display: flex;
flex: 1;
flex-direction: column;
gap: 1px;
overflow-y: auto;
background: var(--line-soft);
}
.tgu-map-request-row {
display: flex;
gap: 0.65rem;
align-items: flex-start;
width: 100%;
padding: 0.6rem 0.9rem;
border: none;
background: var(--bg-panel);
color: var(--text);
cursor: pointer;
text-align: left;
}
.tgu-map-request-row:hover {
background: var(--bg-hover);
}
.tgu-map-request-row.is-selected {
background: rgba(240, 173, 46, 0.1);
outline: 1px solid rgba(240, 173, 46, 0.4);
outline-offset: -1px;
}
.tgu-map-request-row__type {
flex-shrink: 0;
align-self: center;
width: 1rem;
height: 0.4rem;
border-radius: 3px;
border: 1.5px dashed;
}
.tgu-map-request-row__body {
display: flex;
flex-direction: column;
gap: 0.15rem;
min-width: 0;
}
.tgu-map-request-row__name {
overflow: hidden;
color: var(--text);
font-size: 0.82rem;
font-weight: 600;
text-overflow: ellipsis;
white-space: nowrap;
}
.tgu-map-request-row__meta {
color: var(--text-dim);
font-size: 0.72rem;
line-height: 1.4;
}
.tgu-map-request-details {
display: flex;
flex-direction: column;
gap: 0.5rem;
overflow-y: auto;
border-top: 1px solid var(--line);
padding: 0.75rem 0.9rem;
}
.tgu-map-request-details .tgu-map-panel__label {
margin-bottom: 0.1rem;
}
.tgu-map-request-details__grid {
display: grid;
grid-template-columns: auto 1fr;
gap: 0.3rem 0.8rem;
margin: 0;
}
.tgu-map-request-details__grid dt {
color: var(--text-dim);
font-size: 0.72rem;
font-weight: 600;
white-space: nowrap;
line-height: 1.5;
}
.tgu-map-request-details__grid dd {
overflow-wrap: anywhere;
margin: 0;
color: var(--text);
font-size: 0.8rem;
line-height: 1.5;
}
@media (max-width: 1100px) {
.tgu-map-content.has-requests-panel {
grid-template-columns: 1fr;
}
.tgu-map-requests-panel {
max-height: 18rem;
border-left: 0;
border-top: 1px solid var(--line);
}
}
/* ── Вкладка «Заявки» ───────────────────────────────────── */
.tgu-map-content.has-side-panel {
grid-template-columns: 19rem minmax(0, 1fr) 24rem;
}
.tgu-map-overlay--hint {
border-color: rgba(104, 195, 189, 0.5);
color: #bdeee9;
}
/* Черновой полигон при рисовании заявки */
.tgu-2d-map__overlay .tgu-2d-map__draft-fill {
fill: rgba(240, 173, 46, 0.16);
stroke: #f0ad2e;
stroke-width: 2;
stroke-dasharray: 6 4;
}
.tgu-2d-map__overlay .tgu-2d-map__draft-line {
fill: none;
stroke: #f0ad2e;
stroke-width: 2;
stroke-dasharray: 6 4;
}
.tgu-2d-map__overlay .tgu-2d-map__draft-vertex {
fill: #f0ad2e;
stroke: #1a1c1e;
stroke-width: 1.5;
}
/* Панель-форма создания заявки */
.tgu-requests-form__body {
display: flex;
flex: 1;
flex-direction: column;
gap: 0.2rem;
overflow-y: auto;
}
.tgu-requests-form__section {
display: grid;
gap: 0.5rem;
padding: 0.75rem 0.9rem;
border-bottom: 1px solid var(--line-soft);
}
.tgu-requests-field {
display: grid;
grid-template-columns: 9rem minmax(0, 1fr);
gap: 0.5rem;
align-items: center;
font-size: 0.8rem;
}
.tgu-requests-field > span {
color: var(--text-dim);
font-size: 0.74rem;
}
.tgu-requests-field input,
.tgu-requests-field select {
width: 100%;
min-height: 1.9rem;
border: 1px solid var(--line);
border-radius: 6px;
padding: 0.25rem 0.45rem;
background: #101214;
color: var(--text);
font-size: 0.8rem;
}
.tgu-requests-field input:focus,
.tgu-requests-field select:focus {
outline: none;
border-color: rgba(104, 195, 189, 0.6);
}
.tgu-requests-checkbox {
display: flex;
gap: 0.5rem;
align-items: center;
color: var(--text);
font-size: 0.8rem;
}
.tgu-requests-checkbox input {
accent-color: var(--accent);
}
.tgu-requests-form__block-toggle {
font-weight: 650;
}
.tgu-requests-form__block {
display: grid;
gap: 0.5rem;
padding: 0.55rem 0.6rem;
border: 1px solid var(--line-soft);
border-radius: 7px;
background: #111416;
}
.tgu-requests-form__actions {
display: flex;
flex-wrap: wrap;
gap: 0.35rem;
}
.tgu-requests-form__hint {
color: var(--text-dim);
font-size: 0.75rem;
line-height: 1.4;
}
.tgu-requests-form__geo-status {
color: var(--text);
font-size: 0.78rem;
font-weight: 650;
}
.tgu-requests-form__footer {
padding: 0.75rem 0.9rem;
border-top: 1px solid var(--line);
}
.tgu-requests-form__footer .tgu-button {
width: 100%;
}
@media (max-width: 1100px) {
.tgu-map-content.has-side-panel {
grid-template-columns: 1fr;
}
}