@takagaki/cortex-decisions-viewer 0.10.6 → 0.10.7
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 +119 -8
- package/package.json +1 -1
package/dist/render.js
CHANGED
|
@@ -5807,6 +5807,47 @@ ${nextStateDelay.toString()}
|
|
|
5807
5807
|
}).join(",");
|
|
5808
5808
|
}
|
|
5809
5809
|
|
|
5810
|
+
/**
|
|
5811
|
+
* Figmaファイル1件の「取り込み」の行(接続状態ストア・段C第二弾)。**無ければ null。**
|
|
5812
|
+
* 表示は Backlog と同じ ingestedEl を通す(状態から文言を決める規則は1つだけ持つ)。
|
|
5813
|
+
*
|
|
5814
|
+
* 🔴 **鍵は正規化しない**——ingestedStateOf(課題管理)との意図的な違い。Figma の
|
|
5815
|
+
* ファイルキーは**大小を区別する不透明ID**で、揃えにいくと別のファイルを同じものと見る。
|
|
5816
|
+
* logic.mjs の figmaFileKey も trim だけで大小を保ち、applyAddFigmaFile の重複判定も完全一致。
|
|
5817
|
+
* 突き合わせが成立する根拠は「人が大小を揃えること」ではなく、**書き手(同期ジョブ)と
|
|
5818
|
+
* 画面(figmaFiles)が同じ figma.json の同じ値を読むこと**。
|
|
5819
|
+
*/
|
|
5820
|
+
function designIngestedStateOf(key) {
|
|
5821
|
+
var rows = LIVE_STATE;
|
|
5822
|
+
var want = String(key || "");
|
|
5823
|
+
if (!rows || !rows.length || !want) return null;
|
|
5824
|
+
for (var i = 0; i < rows.length; i++) {
|
|
5825
|
+
var r = rows[i];
|
|
5826
|
+
// cap と question の両方で絞る。片方だけだと、同じ ref を持つ別の問いの行
|
|
5827
|
+
//(別能力の行・将来 design に増える別の question)を取り込みとして読む
|
|
5828
|
+
if (!r || r.cap !== "design" || r.question !== "ingested") continue;
|
|
5829
|
+
if (r.ref === want) return r;
|
|
5830
|
+
}
|
|
5831
|
+
return null;
|
|
5832
|
+
}
|
|
5833
|
+
|
|
5834
|
+
/**
|
|
5835
|
+
* いま一覧に出ている Figma ファイルの「取り込み」をひとつの文字列にする(liveList の sig 用)。
|
|
5836
|
+
*
|
|
5837
|
+
* 🔴 **ファイル一覧のJSONだけでは足りない。** モーダルを開くとその能力の状況をもう一度
|
|
5838
|
+
* 取りに行くので、**応答が返る前に開いた人は取り込みの行を1件も持っていない**。届いた応答で
|
|
5839
|
+
* ファイルの集合は変わらないため、一覧だけを署名にすると liveList の早期return が描き直しを
|
|
5840
|
+
* 飛ばし、**閉じて開き直すまで空のまま**になる。空表示は「まだ誰も測っていない」と
|
|
5841
|
+
* 見分けが付かないので、この機能が殺そうとしている「取り込みの失敗を黙る」欠陥が
|
|
5842
|
+
* 別の経路で復活する(課題管理側の ingestSigOf と同じ理由)。
|
|
5843
|
+
*/
|
|
5844
|
+
function designIngestSigOf(list) {
|
|
5845
|
+
return (list || []).map(function (f) {
|
|
5846
|
+
var r = designIngestedStateOf(f && f.key);
|
|
5847
|
+
return r ? r.status + "@" + r.at : "-";
|
|
5848
|
+
}).join(",");
|
|
5849
|
+
}
|
|
5850
|
+
|
|
5810
5851
|
/**
|
|
5811
5852
|
* 「課題管理」カードの接続先(一覧+追加+削除・#127)。
|
|
5812
5853
|
*
|
|
@@ -6295,15 +6336,57 @@ ${nextStateDelay.toString()}
|
|
|
6295
6336
|
// **一覧は開いたままでも差し替わる箱に入れる(段階1)。** 追加は「モーダルを開いたまま」
|
|
6296
6337
|
// 行われるので、ここが固定だと足したファイルは閉じるまで画面に出ない
|
|
6297
6338
|
var figsOf = function () { return (internalSourceOf("デザイン") || {}).figmaFiles || []; };
|
|
6298
|
-
|
|
6339
|
+
/**
|
|
6340
|
+
* 外し終えたファイルの鍵。**一覧の箱の外に置く(段C第二弾)。**
|
|
6341
|
+
*
|
|
6342
|
+
* 外した行には取り消し線を引き、ボタンだけを無効にする。その印は行の closure に
|
|
6343
|
+
* あるので**描き直しで作り直される**——取り込みの状態を署名に混ぜたことで
|
|
6344
|
+
* LIVE_STATE の到着でも描き直しが走るようになり、ここに覚えておかないと
|
|
6345
|
+
* **外したばかりの行が生き返り、二度押しで「登録されていません」になる**
|
|
6346
|
+
*(削除は取り消せないので、押せる見た目に戻すのがいちばん悪い)。
|
|
6347
|
+
*
|
|
6348
|
+
* **効くのは短い。** 段A補(subtractRemovedRegistered)以降、外した行は次の
|
|
6349
|
+
* op=state が返った時点で一覧から消える。だからこの印が要るのは
|
|
6350
|
+
* **①保存の応答から次の op=state までの数秒**と、**②op=state が取れない案件**
|
|
6351
|
+
*(古い Lambda・通信失敗で、夜間の一覧が翌朝まで残る)だけ。
|
|
6352
|
+
*
|
|
6353
|
+
* 🔴 **一覧から消えた鍵は落とす(下の prune)。** 消えた=サーバが削除を認めた
|
|
6354
|
+
* ということなので、この印は役目を終えている。**持ち続けると、押し間違いに気づいて
|
|
6355
|
+
* 同じファイルを貼り直した人の行が、復活した瞬間に「外し済み」で描かれて操作不能に
|
|
6356
|
+
* なる**(回復手段はモーダルを開き直すことだけで、その手掛かりが画面に無い)。
|
|
6357
|
+
* 追加の口から鍵を落とす手もあるが、あちらが受け取るのは URL で、鍵に直すには
|
|
6358
|
+
* サーバ側の figmaFileKey を画面にもう1つ持つことになる(同じ規則が2箇所に増える)。
|
|
6359
|
+
*/
|
|
6360
|
+
var figsRemoved = [];
|
|
6361
|
+
/**
|
|
6362
|
+
* いま送信中の行(鍵 → 行の節点)。**描き直しでも作り直さず、この節点を使い続ける。**
|
|
6363
|
+
*
|
|
6364
|
+
* 取り込みの状態を署名に混ぜたことで、**op=config の応答待ちの最中に op=state が
|
|
6365
|
+
* 届くと行が作り直される**窓ができた。作り直すと「保存中…」と押せない状態を持つ
|
|
6366
|
+
* 節点が捨てられ、**返事が来る前にもう一度押せてしまう**。押している当人の行だけを
|
|
6367
|
+
* 据え置き、他の行の取り込み表示は普段どおり追いつかせる(removeButton の onBusy)。
|
|
6368
|
+
*/
|
|
6369
|
+
var figSending = {};
|
|
6370
|
+
// **署名に取り込みの状態も混ぜる(段C第二弾)。** 一覧のJSONだけだと、応答が返る前に
|
|
6371
|
+
// モーダルを開いた人には取り込みが1件も出ない(designIngestSigOf の項に経緯)
|
|
6372
|
+
box.appendChild(liveList("デザイン", function () {
|
|
6373
|
+
return JSON.stringify(figsOf()) + "|" + designIngestSigOf(figsOf());
|
|
6374
|
+
}, function (listBox) {
|
|
6299
6375
|
var figs = figsOf();
|
|
6376
|
+
// **一覧から消えた鍵は「外し済み」から落とす**(figsRemoved の項に経緯)。
|
|
6377
|
+
// サーバが削除を認めた印なので、ここから先に同じ鍵が現れたら**貼り直された別の登録**
|
|
6378
|
+
var figKeys = figs.map(function (f) { return f.key; });
|
|
6379
|
+
figsRemoved = figsRemoved.filter(function (k) { return figKeys.indexOf(k) >= 0; });
|
|
6300
6380
|
// **残り件数は「押した時点」で数える。** 一覧(figs)は夜間バッチのスナップショットで、
|
|
6301
6381
|
// このページを開いている間はもちろん、その日のうちに再読み込みしても更新されない。
|
|
6302
6382
|
// 描画時点の件数で判定すると、3件を1件ずつ外していったとき最後の1件でも警告が出ない。
|
|
6303
|
-
|
|
6383
|
+
// **描き直しでも外した分を引いたままにする**(figsRemoved の項に経緯)
|
|
6384
|
+
var figsLeft = figs.filter(function (f) { return figsRemoved.indexOf(f.key) < 0; }).length;
|
|
6304
6385
|
if (figs.length) {
|
|
6305
6386
|
var flist = el("div", { class: "ds-list" });
|
|
6306
6387
|
figs.forEach(function (f) {
|
|
6388
|
+
// 送信中の行は作り直さない(figSending の項に経緯)
|
|
6389
|
+
if (figSending[f.key]) { flist.appendChild(figSending[f.key]); return; }
|
|
6307
6390
|
// **Slack / GitHub の行と同じ構造にする(ds-card > ds-card-main >
|
|
6308
6391
|
// ds-icon + ds-type + ds-name)。** extSourceCard は呼ばない——
|
|
6309
6392
|
// あちらは type / gate / origin など外部ソース固有の判断を抱えている。
|
|
@@ -6314,6 +6397,8 @@ ${nextStateDelay.toString()}
|
|
|
6314
6397
|
el("span", { class: "ds-type", text: "Figma" }),
|
|
6315
6398
|
dsNameEl(f.name || f.key, "https://www.figma.com/design/" + f.key),
|
|
6316
6399
|
]),
|
|
6400
|
+
// このファイルの取り込みが最後にどうなったか(段C)。測っていなければ null
|
|
6401
|
+
ingestedEl(designIngestedStateOf(f.key)),
|
|
6317
6402
|
]);
|
|
6318
6403
|
row.appendChild(removeButton({
|
|
6319
6404
|
label: "このファイルを外す",
|
|
@@ -6339,9 +6424,21 @@ ${nextStateDelay.toString()}
|
|
|
6339
6424
|
onDone: function () {
|
|
6340
6425
|
// **クラスのハード代入をやめる**(片方だけ直し忘れる形を構造的に消す)
|
|
6341
6426
|
row.classList.add("ds-removed");
|
|
6427
|
+
if (figsRemoved.indexOf(f.key) < 0) figsRemoved.push(f.key);
|
|
6342
6428
|
figsLeft -= 1;
|
|
6343
6429
|
},
|
|
6430
|
+
// 確認〜応答のあいだ、この行だけ描き直しの対象から外す(figSending の項に経緯)
|
|
6431
|
+
onBusy: function (on) {
|
|
6432
|
+
if (on) figSending[f.key] = row;
|
|
6433
|
+
else delete figSending[f.key];
|
|
6434
|
+
},
|
|
6344
6435
|
}));
|
|
6436
|
+
// 描き直しのあとも「外した」ことが分かる形に戻す(figsRemoved の項に経緯)
|
|
6437
|
+
if (figsRemoved.indexOf(f.key) >= 0) {
|
|
6438
|
+
row.classList.add("ds-removed");
|
|
6439
|
+
var doneBtn = row.querySelector(".ds-toggle-btn");
|
|
6440
|
+
if (doneBtn) doneBtn.disabled = true;
|
|
6441
|
+
}
|
|
6345
6442
|
flist.appendChild(row);
|
|
6346
6443
|
});
|
|
6347
6444
|
listBox.appendChild(flist);
|
|
@@ -6775,7 +6872,14 @@ ${nextStateDelay.toString()}
|
|
|
6775
6872
|
* 成功しても一覧からは消さない。接続状況は夜間バッチのスナップショットで、消したつもりの行が
|
|
6776
6873
|
* 翌朝まで残るのが正しい状態のため——行に取り消し線を引き、ボタンだけを無効にする
|
|
6777
6874
|
* (二度押しすると「登録されていません」で失敗するので、押せなくする)。
|
|
6778
|
-
*
|
|
6875
|
+
* **押している間(確認〜応答)を呼び出し側に知らせる(onBusy)。**
|
|
6876
|
+
* 一覧を差し替える口では、この間に描き直しが走るとこの行ごと作り直され、
|
|
6877
|
+
* 「保存中…」と押せない状態を持つ節点が捨てられる——**二度押しできる見た目に戻る**。
|
|
6878
|
+
* 削除は取り消せないので、行を差し替える側はこの間だけ元の節点を使い続けること。
|
|
6879
|
+
* **確認の前から数える**(確認モーダルの戻り先もこの節点なので、途中で捨てると
|
|
6880
|
+
* 「いいえ」を押した人のフォーカスの戻り先が消える)。
|
|
6881
|
+
*
|
|
6882
|
+
* @param opts { label, confirmLines(), build(), onDone(), onBusy(bool) }
|
|
6779
6883
|
*/
|
|
6780
6884
|
function removeButton(opts) {
|
|
6781
6885
|
var wrap = el("div", { class: "ds-toggle" });
|
|
@@ -6783,11 +6887,18 @@ ${nextStateDelay.toString()}
|
|
|
6783
6887
|
var msg = el("div", { class: "ds-toggle-msg" });
|
|
6784
6888
|
|
|
6785
6889
|
btn.addEventListener("click", async function () {
|
|
6786
|
-
if (
|
|
6787
|
-
|
|
6788
|
-
|
|
6789
|
-
|
|
6790
|
-
|
|
6890
|
+
if (opts.onBusy) opts.onBusy(true);
|
|
6891
|
+
// **finally で必ず倒す。** 断られた・通信に失敗した経路で立てっぱなしにすると、
|
|
6892
|
+
// 呼び出し側はその行を永久に差し替えられなくなる(sendConfig は自分で捕まえるので投げない)
|
|
6893
|
+
try {
|
|
6894
|
+
if (!(await confirmDanger(opts.confirmLines(), { returnTo: btn }))) { msg.textContent = ""; return; }
|
|
6895
|
+
await sendConfig(opts.build(), msg, btn, function () {
|
|
6896
|
+
btn.disabled = true;
|
|
6897
|
+
if (opts.onDone) opts.onDone();
|
|
6898
|
+
});
|
|
6899
|
+
} finally {
|
|
6900
|
+
if (opts.onBusy) opts.onBusy(false);
|
|
6901
|
+
}
|
|
6791
6902
|
});
|
|
6792
6903
|
|
|
6793
6904
|
wrap.appendChild(btn);
|
package/package.json
CHANGED