@takagaki/cortex-decisions-viewer 0.12.109 → 0.12.110
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/render.js +104 -9
- package/package.json +1 -1
package/dist/render.js
CHANGED
|
@@ -4912,6 +4912,9 @@ button.site-icon[aria-busy="true"] .site-icon-plus { opacity: 0; }
|
|
|
4912
4912
|
cursor: pointer; transition: border-color .12s, transform .12s;
|
|
4913
4913
|
}
|
|
4914
4914
|
.card:hover { border-color: var(--accent); }
|
|
4915
|
+
/* 前へ/次へで移った後に一覧へ戻ったときの、今開いていたカードの目印(分類B・オーナー指摘)。
|
|
4916
|
+
新しい見た目は作らず、.card:hover と同じ強調(アクセント色の枠)を使い回す */
|
|
4917
|
+
.card.is-returned-to { border-color: var(--accent); }
|
|
4915
4918
|
.card-meta { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; font-size: 12.5px; color: var(--muted); margin-bottom: 6px; }
|
|
4916
4919
|
/* card-title はカードの見出し(#1 新しいタブでも開けるよう <a> にした)。見た目は元の <div> と揃える */
|
|
4917
4920
|
.card-title { display: block; font-size: 16px; font-weight: 650; margin: 2px 0 6px; color: var(--text); }
|
|
@@ -8596,6 +8599,11 @@ ${calendarAddUrl.toString()}
|
|
|
8596
8599
|
// ⚠ 詳細→詳細(後述の前へ/次へ)では更新しない。** 更新すると、何件か読み進めてから
|
|
8597
8600
|
// 一覧へ戻ったときに「最後に見ていた詳細でのスクロール位置」に飛んでしまう。
|
|
8598
8601
|
// 一覧に戻る行き先は常に「一覧を離れたときの位置」でなければならない
|
|
8602
|
+
//
|
|
8603
|
+
// ⚠ ただし前へ/次へを使った後は、この「離れたときの位置」より下の pagerNavUsed /
|
|
8604
|
+
// currentDetailId(オーナー指摘・分類B 2026-10-02)が優先する。** 前へ/次へで
|
|
8605
|
+
// 10件先へ移ってから「一覧へ戻る」と、離れたときの位置ではなく今開いている記録の
|
|
8606
|
+
// カードの位置へ戻るべき、という指摘のため
|
|
8599
8607
|
var savedListScrollY = 0;
|
|
8600
8608
|
// どのタブの一覧で覚えた位置か(実装レビュー②)。** route() は詳細を描くとき、その記録の
|
|
8601
8609
|
// 種類で listState.tab を書き換える(例: 用語集の一覧からウィキリンクで決定の詳細へ移ると
|
|
@@ -8606,17 +8614,89 @@ ${calendarAddUrl.toString()}
|
|
|
8606
8614
|
// 直前に描いたのが詳細(not foundも含む)か一覧か。popstate(ブラウザの戻る/進む)は
|
|
8607
8615
|
// go() を通らないので、この印で「詳細→一覧」の遷移だけを見分けて復元する
|
|
8608
8616
|
var lastWasDetail = false;
|
|
8617
|
+
// 今の詳細(currentDetailId)に着いた最後の移動が、前へ/次へ(buildDetailPager の
|
|
8618
|
+
// navBtn)経由だったか(オーナー指摘・分類B 2026-10-02。実装レビューで、前へ/次への
|
|
8619
|
+
// 後に本文中のウィキリンクを挟む等の「直前だけ別経路」のときに古い値が残っていた不具合
|
|
8620
|
+
// が見つかり、go() の呼び出しごとに毎回立て直す形に直した)。一覧へ戻るとき true なら、
|
|
8621
|
+
// savedListScrollY ではなく今開いている記録(currentDetailId)のカードの位置へ戻す
|
|
8622
|
+
var pagerNavUsed = false;
|
|
8623
|
+
// 今いる詳細のレコードID(renderDetail/renderGenericDetail の先頭で更新)。
|
|
8624
|
+
// pagerNavUsed と組みで、一覧へ戻るときにどのカードへ戻せばよいかを覚える
|
|
8625
|
+
var currentDetailId = null;
|
|
8609
8626
|
if ("scrollRestoration" in history) history.scrollRestoration = "manual";
|
|
8610
8627
|
|
|
8611
|
-
|
|
8628
|
+
/**
|
|
8629
|
+
* 今のタブで一覧に並んでいる順(絞り込み後)。前へ/次へ(pagerOrder/buildDetailPager)
|
|
8630
|
+
* と同じ並びを使う——ここだけ別の並びにすると、戻ったときのページ・位置が実際の
|
|
8631
|
+
* 一覧とずれる
|
|
8632
|
+
*/
|
|
8633
|
+
function currentTabFilteredItems() {
|
|
8634
|
+
if (listState.tab === "decisions") return filteredDecisions();
|
|
8635
|
+
return filteredGenericItems(findTab(listState.tab));
|
|
8636
|
+
}
|
|
8637
|
+
|
|
8638
|
+
/**
|
|
8639
|
+
* 前へ/次へで今開いている記録(currentDetailId)が、一覧の何ページ目に出るか。
|
|
8640
|
+
* 絞り込みに現れない(#2 のフォールバックと同じ状況)ときは null——その場合は
|
|
8641
|
+
* カードが一覧に無いので、呼び出し側は今までどおりの位置に任せる
|
|
8642
|
+
*/
|
|
8643
|
+
function pageOfCurrentDetail() {
|
|
8644
|
+
var items = currentTabFilteredItems();
|
|
8645
|
+
for (var i = 0; i < items.length; i++) {
|
|
8646
|
+
if (items[i].id === currentDetailId) return Math.floor(i / PAGE_SIZE) + 1;
|
|
8647
|
+
}
|
|
8648
|
+
return null;
|
|
8649
|
+
}
|
|
8650
|
+
|
|
8651
|
+
/**
|
|
8652
|
+
* 今開いているページの中から id のカードを探し、画面に入る位置へスクロールして
|
|
8653
|
+
* 少しだけ目立たせる(.is-returned-to は .card:hover と同じ強調の使い回し。新しい
|
|
8654
|
+
* 見た目は作らない)。見つからなければ何もせず false——呼び出し側が今までどおりの
|
|
8655
|
+
* 位置(savedListScrollY)にフォールバックする
|
|
8656
|
+
*/
|
|
8657
|
+
function scrollToDetailCard(id) {
|
|
8658
|
+
var cards = document.querySelectorAll(".card[data-record-id]");
|
|
8659
|
+
var card = null;
|
|
8660
|
+
for (var i = 0; i < cards.length; i++) {
|
|
8661
|
+
if (cards[i].getAttribute("data-record-id") === id) { card = cards[i]; break; }
|
|
8662
|
+
}
|
|
8663
|
+
if (!card) return false;
|
|
8664
|
+
if (card.scrollIntoView) card.scrollIntoView({ block: "center" });
|
|
8665
|
+
card.classList.add("is-returned-to");
|
|
8666
|
+
setTimeout(function () { card.classList.remove("is-returned-to"); }, 1500);
|
|
8667
|
+
return true;
|
|
8668
|
+
}
|
|
8669
|
+
|
|
8670
|
+
/**
|
|
8671
|
+
* @param viaPager buildDetailPager の navBtn(前へ/次へ)からの呼び出しだけ true。
|
|
8672
|
+
* ⚠ **直前の1回だけを見る(実装レビューで判明)。** 前へ/次へを何度か使った後でも、
|
|
8673
|
+
* 間に本文中のウィキリンク等(viaPager 無し)を1回でも挟めば、その時点で false に
|
|
8674
|
+
* 戻す——戻すのは「今の詳細(currentDetailId)に着いた最後の移動」の種類であって、
|
|
8675
|
+
* 一覧を離れてから1回でも前へ/次へを使ったか、ではない。でないと、前へ/次へ→
|
|
8676
|
+
* ウィキリンクで別の記録へ、と移ってから一覧へ戻ったときに、ウィキリンクで着いた
|
|
8677
|
+
* 記録が「前へ/次へで着いた」ことになってしまう
|
|
8678
|
+
*/
|
|
8679
|
+
function go(id, viaPager) {
|
|
8612
8680
|
// 一覧から詳細へ移るときだけ、今の一覧のスクロール位置とタブを覚える
|
|
8613
8681
|
if (id && !lastWasDetail) { savedListScrollY = window.scrollY; savedListTab = listState.tab; }
|
|
8682
|
+
// 前へ/次へを使った後に一覧へ戻るなら、今開いている記録のカードが出るページへ
|
|
8683
|
+
var usePagerTarget = !id && pagerNavUsed && currentDetailId;
|
|
8684
|
+
if (usePagerTarget) { var p = pageOfCurrentDetail(); if (p) listState.page = p; }
|
|
8614
8685
|
var url = id ? "?id=" + encodeURIComponent(id) : tabUrl(listState.tab);
|
|
8615
|
-
|
|
8686
|
+
// viaPager を履歴に残す。ブラウザの戻る/進む(popstate)は go() を通らないので、
|
|
8687
|
+
// その着地が前へ/次へ経由だったかを後から知る手がかりがここにしか無い
|
|
8688
|
+
history.pushState({ viaPager: !!viaPager }, "", url);
|
|
8616
8689
|
route();
|
|
8617
|
-
//
|
|
8618
|
-
|
|
8619
|
-
|
|
8690
|
+
// 詳細は常に先頭から。一覧は、前へ/次へを使っていれば今の記録のカードへ、
|
|
8691
|
+
// 使っていなければ離れたときと同じタブに戻るときだけ元の位置へ
|
|
8692
|
+
if (id) {
|
|
8693
|
+
pagerNavUsed = !!viaPager;
|
|
8694
|
+
window.scrollTo(0, 0);
|
|
8695
|
+
} else {
|
|
8696
|
+
if (!(usePagerTarget && scrollToDetailCard(currentDetailId))) {
|
|
8697
|
+
window.scrollTo(0, listState.tab === savedListTab ? savedListScrollY : 0);
|
|
8698
|
+
}
|
|
8699
|
+
}
|
|
8620
8700
|
}
|
|
8621
8701
|
|
|
8622
8702
|
var listState = { tab: DEFAULT_TAB, q: "", category: "", month: "", status: "", page: 1 };
|
|
@@ -20190,7 +20270,8 @@ ${calendarAddUrl.toString()}
|
|
|
20190
20270
|
if (!isPlainClick(ev)) { ev.stopPropagation(); return; }
|
|
20191
20271
|
ev.preventDefault();
|
|
20192
20272
|
ev.stopPropagation();
|
|
20193
|
-
|
|
20273
|
+
// 前へ/次へを使ったので、一覧へ戻るときは今の記録のカードの位置へ(オーナー指摘・分類B 2026-10-02)
|
|
20274
|
+
go(rec.id, true);
|
|
20194
20275
|
});
|
|
20195
20276
|
return a;
|
|
20196
20277
|
}
|
|
@@ -20224,6 +20305,7 @@ ${calendarAddUrl.toString()}
|
|
|
20224
20305
|
// ---------- 汎用詳細 ----------
|
|
20225
20306
|
function renderGenericDetail(r) {
|
|
20226
20307
|
lastWasDetail = true;
|
|
20308
|
+
currentDetailId = r.id;
|
|
20227
20309
|
app.innerHTML = "";
|
|
20228
20310
|
countEl.textContent = "";
|
|
20229
20311
|
|
|
@@ -20923,6 +21005,7 @@ ${calendarAddUrl.toString()}
|
|
|
20923
21005
|
// ---------- Decision詳細 ----------
|
|
20924
21006
|
function renderDetail(d) {
|
|
20925
21007
|
lastWasDetail = true;
|
|
21008
|
+
currentDetailId = d.id;
|
|
20926
21009
|
app.innerHTML = "";
|
|
20927
21010
|
countEl.textContent = "";
|
|
20928
21011
|
|
|
@@ -21014,6 +21097,8 @@ ${calendarAddUrl.toString()}
|
|
|
21014
21097
|
|
|
21015
21098
|
function renderNotFound(id) {
|
|
21016
21099
|
lastWasDetail = true;
|
|
21100
|
+
// 実在しない記録なので、戻る先のカードは無い(今までどおりの位置にフォールバックさせる)
|
|
21101
|
+
currentDetailId = null;
|
|
21017
21102
|
app.innerHTML = "";
|
|
21018
21103
|
var back = el("a", { class: "detail-back", href: "?", text: "← 一覧へ戻る" });
|
|
21019
21104
|
back.addEventListener("click", function (ev) { ev.preventDefault(); go(null); });
|
|
@@ -21500,19 +21585,29 @@ ${calendarAddUrl.toString()}
|
|
|
21500
21585
|
|
|
21501
21586
|
// ブラウザの「戻る」「進む」。go() を通らないので、ここで一覧⇄詳細のスクロールだけ別に見る
|
|
21502
21587
|
// (#1 ブラウザの戻るでも一覧のスクロール位置を保つ)
|
|
21503
|
-
window.addEventListener("popstate", function () {
|
|
21588
|
+
window.addEventListener("popstate", function (ev) {
|
|
21504
21589
|
var goingToId = getParam("id");
|
|
21505
21590
|
var cameFromDetail = lastWasDetail;
|
|
21506
21591
|
// 「進む」で一覧→詳細に戻ることもある(戻る→スクロール→進む、で位置が古くなる実装レビュー③)。
|
|
21507
21592
|
// go() と同じ条件で、そのときの一覧の位置とタブを覚え直す
|
|
21508
21593
|
if (goingToId && !cameFromDetail) { savedListScrollY = window.scrollY; savedListTab = listState.tab; }
|
|
21594
|
+
// ブラウザの「戻る」で一覧へ戻るときも、go() と同じく前へ/次へを使っていたら
|
|
21595
|
+
// 今開いている記録のカードが出るページへ(オーナー指摘・分類B 2026-10-02)
|
|
21596
|
+
var usePagerTarget = !goingToId && cameFromDetail && pagerNavUsed && currentDetailId;
|
|
21597
|
+
if (usePagerTarget) { var p = pageOfCurrentDetail(); if (p) listState.page = p; }
|
|
21509
21598
|
route();
|
|
21510
21599
|
if (!goingToId && cameFromDetail) {
|
|
21511
|
-
//
|
|
21512
|
-
|
|
21600
|
+
// 一覧へ戻る。前へ/次へを使っていれば今の記録のカードへ、使っていなければ
|
|
21601
|
+
// 離れたときと同じタブのときだけ元の位置へ(違えば先頭)
|
|
21602
|
+
if (!(usePagerTarget && scrollToDetailCard(currentDetailId))) {
|
|
21603
|
+
window.scrollTo(0, listState.tab === savedListTab ? savedListScrollY : 0);
|
|
21604
|
+
}
|
|
21513
21605
|
} else if (goingToId) {
|
|
21514
21606
|
// 詳細はブラウザの戻る/進むでも常に先頭から
|
|
21515
21607
|
// (scrollRestoration を manual にしたので、ここで明示しないとブラウザがどこへも戻さない)
|
|
21608
|
+
// pagerNavUsed も go() と同じく、この着地が前へ/次へ経由だったか(history.state.viaPager)
|
|
21609
|
+
// で立て直す——go() を通らない popstate では、ここだけがその情報を持っている
|
|
21610
|
+
pagerNavUsed = !!(ev.state && ev.state.viaPager);
|
|
21516
21611
|
window.scrollTo(0, 0);
|
|
21517
21612
|
}
|
|
21518
21613
|
});
|
package/package.json
CHANGED