Separate Brīdinājumi map selection from viewing warning detail

This commit is contained in:
b0txec
2026-08-22 21:41:52 +03:00
parent 57f5f96896
commit 6fbf672c50
2 changed files with 20 additions and 16 deletions
+9 -6
View File
@@ -54,12 +54,12 @@ export function Warnings() {
}));
const [selectedId, setSelectedId] = createSignal<string>();
const selectedWarning = createMemo(() => filteredWarnings().find(item => item.id === selectedId()));
const [detailOpen, setDetailOpen] = createSignal(false);
const openWarning = (id: string) => { setSelectedId(id); setDetailOpen(true); };
const closeDetail = () => setDetailOpen(false);
const [detailId, setDetailId] = createSignal<string>();
const detailWarning = createMemo(() => filteredWarnings().find(item => item.id === detailId()));
const closeDetail = () => setDetailId(undefined);
createEffect(() => {
if (!detailOpen()) return;
if (!detailId()) return;
const onKeyDown = (event: KeyboardEvent) => { if (event.key === 'Escape') closeDetail(); };
document.addEventListener('keydown', onKeyDown);
onCleanup(() => document.removeEventListener('keydown', onKeyDown));
@@ -128,15 +128,18 @@ export function Warnings() {
<Show when={!data.loading && !data.error && filteredWarnings().length === 0}><div class="inlineNotice">Izvēlētajam periodam nav aktīvu brīdinājumu. Karti joprojām var priekšskatīt, bet tajā nebūs iekrāsotu teritoriju.</div></Show>
<Show when={filteredWarnings().length > 0}><div class="warningSummary"><For each={filteredWarnings()}>{warning =>
<button type="button" class={`warningCard ${warningSeverity(warning.intensity)}`} classList={{ active: warning.id === selectedId() }} aria-pressed={warning.id === selectedId()} onClick={() => openWarning(warning.id)}>
<div class={`warningCard ${warningSeverity(warning.intensity)}`} classList={{ active: warning.id === selectedId() }}>
<input type="checkbox" class="warningCardCheck" checked={warning.id === selectedId()} title="Rādīt šo brīdinājumu kartē" aria-label={`Rādīt ${warning.phenomenon || 'šo brīdinājumu'} kartē`} onClick={() => setSelectedId(warning.id)}/>
<button type="button" class="warningCardOpen" onClick={() => setDetailId(warning.id)}>
<span class="warningCardIcon"><PhenomenonIcon phenomenon={warning.phenomenon}/></span>
<span class="warningCardText">{warning.phenomenon || 'Brīdinājums'}</span>
</button>
</div>
}</For></div></Show>
<section class="warningsPreview"><div class="mapToolbar"><div><strong>3. Kartes priekšskatījums</strong><span>{template().width} × {template().height} px eksports</span></div><button class="primary" disabled={data.loading || Boolean(data.error)} onClick={downloadPng}>Lejupielādēt PNG</button></div><div class="canvasFrame"><canvas ref={canvas} width={template().width} height={template().height}/></div></section>
<Show when={detailOpen() && selectedWarning()}>{warning =>
<Show when={detailWarning()}>{warning =>
<Portal>
<div class="warningBackdrop" onClick={closeDetail}>
<div class="warningModal" onClick={event => event.stopPropagation()}>
+8 -7
View File
@@ -1,9 +1,10 @@
.warningsPage{max-width:1900px}.warningsHeading{margin-bottom:18px}.warningsSetup{display:grid;grid-template-columns:260px minmax(0,1fr);gap:28px;padding:18px 0 24px;border-top:1px solid var(--border);border-bottom:1px solid var(--border)}.warningsSetup h2{margin:0 0 14px;font-size:20px}.warningFilterGrid{display:grid;grid-template-columns:220px 260px minmax(320px,1fr);gap:12px}.warningFilterGrid label{display:grid;gap:5px}.warningFilterGrid label span{font-size:12px;color:var(--text-muted)}.warningTitle input{width:100%}.warningsPreview{padding-top:24px}.warningsPreview canvas{display:block;width:100%;height:auto}.inlineNotice button{margin-left:14px}
.warningSummary{display:flex;flex-wrap:wrap;gap:10px;margin:18px 0}
.warningCard{position:relative;display:flex;align-items:center;height:44px;flex:0 1 190px;padding:0 16px 0 48px;border:1.5px solid var(--border);border-radius:12px;background:rgba(255,255,255,.65);overflow:hidden;appearance:none;font:inherit;color:var(--text);text-align:left;cursor:pointer;transition:border-color 200ms,box-shadow 200ms,transform 200ms}
.warningCard:hover{transform:translateY(-1px)}
.warningCardIcon{position:absolute;left:0;top:0;width:40px;height:100%;display:flex;align-items:center;justify-content:center;color:#fff;transition:width 300ms ease}
.warningCard{position:relative;display:flex;align-items:center;height:44px;flex:0 1 220px;border:1.5px solid var(--border);border-radius:12px;background:rgba(255,255,255,.65);overflow:hidden;transition:border-color 200ms,box-shadow 200ms}
.warningCardCheck{flex:0 0 auto;margin:0 0 0 12px}
.warningCardOpen{position:relative;flex:1 1 auto;align-self:stretch;display:flex;align-items:center;padding:0 14px 0 40px;border:none;background:none;appearance:none;font:inherit;color:var(--text);text-align:left;cursor:pointer}
.warningCardIcon{position:absolute;left:0;top:0;width:36px;height:100%;display:flex;align-items:center;justify-content:center;color:#fff;transition:width 300ms ease}
.warningCardText{position:relative;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:14px;font-weight:600;transition:color 300ms ease}
.warningCard.yellow{border-color:#caa000}
.warningCard.orange{border-color:#c1580f}
@@ -11,13 +12,13 @@
.warningCard.yellow .warningCardIcon{background:#caa000}
.warningCard.orange .warningCardIcon{background:#c1580f}
.warningCard.red .warningCardIcon{background:#b91c1c}
.warningCard:hover .warningCardIcon{width:100%}
.warningCard:hover .warningCardText{color:transparent}
.warningCard:active .warningCardIcon{filter:brightness(.88)}
.warningCardOpen:hover .warningCardIcon{width:100%}
.warningCardOpen:hover .warningCardText{color:transparent}
.warningCardOpen:active .warningCardIcon{filter:brightness(.88)}
.warningCard.active{background:rgba(255,255,255,.95);box-shadow:0 0 0 3px var(--accent-pale)}
.warningBackdrop{position:fixed;inset:0;z-index:1000;display:flex;align-items:center;justify-content:center;padding:24px;background:rgba(10,20,35,.55);backdrop-filter:blur(6px);animation:warningFadeIn 180ms ease}
.warningModal{position:relative;width:100%;max-width:640px;max-height:85vh;overflow-y:auto;padding:28px;border-radius:20px;background:var(--surface);box-shadow:var(--shadow-md);animation:warningPopIn 200ms ease}
.warningModal{position:relative;width:100%;max-width:900px;max-height:85vh;overflow-y:auto;padding:32px 36px;border-radius:20px;background:var(--surface);box-shadow:var(--shadow-md);animation:warningPopIn 200ms ease}
.warningModalClose{position:absolute;top:16px;right:16px;display:flex;align-items:center;justify-content:center;width:36px;height:36px;border:none;border-radius:50%;background:var(--surface-strong);color:var(--text-muted);cursor:pointer;transition:background 150ms,color 150ms}
.warningModalClose:hover{background:var(--accent-pale);color:var(--accent-strong)}
.warningModalHeader{display:flex;align-items:center;gap:14px;padding:0 32px 14px 0;margin-bottom:14px;border-bottom:1px solid var(--border)}