@takagaki/cortex-decisions-viewer 0.12.50 → 0.12.52
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 +252 -13
- package/package.json +1 -1
package/dist/render.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.STATE_CONFIRMING = exports.UNSETTLED_LIMITS = exports.ALREADY_REGISTERED = exports.LIVE_CONFIRM_LIMITS = exports.CLAUDE_CODE_LINK = void 0;
|
|
3
|
+
exports.STATE_CONFIRMING = exports.PROBE_WAIT_TIMEOUT_TEXT = exports.UNSETTLED_LIMITS = exports.ALREADY_REGISTERED = exports.LIVE_CONFIRM_LIMITS = exports.CLAUDE_CODE_LINK = void 0;
|
|
4
4
|
exports.renderSite = renderSite;
|
|
5
5
|
exports.renderSiteWithAssets = renderSiteWithAssets;
|
|
6
6
|
exports.viewerAssetSources = viewerAssetSources;
|
|
@@ -28,6 +28,7 @@ exports.unsettledRegisteredCount = unsettledRegisteredCount;
|
|
|
28
28
|
exports.registeredRowsToAdd = registeredRowsToAdd;
|
|
29
29
|
exports.subtractRemovedRegistered = subtractRemovedRegistered;
|
|
30
30
|
exports.mergeRegisteredFleet = mergeRegisteredFleet;
|
|
31
|
+
exports.probeWaitPhase = probeWaitPhase;
|
|
31
32
|
exports.nextStateDelay = nextStateDelay;
|
|
32
33
|
exports.sanitizeSecretsNow = sanitizeSecretsNow;
|
|
33
34
|
exports.secretStateFromNow = secretStateFromNow;
|
|
@@ -1623,6 +1624,44 @@ const UNSETTLED_POLL_MS = 60 * 1000;
|
|
|
1623
1624
|
* 書き換えられ、toString() で流し込んだ先には exports が無い)。
|
|
1624
1625
|
*/
|
|
1625
1626
|
exports.UNSETTLED_LIMITS = { ttlMs: UNSETTLED_TTL_MS, pollMs: UNSETTLED_POLL_MS };
|
|
1627
|
+
/**
|
|
1628
|
+
* 「接続を確認」(dispatch 種別)を押したあと、結果が届いたか(#523 S3・設計レビュー🔴2)。
|
|
1629
|
+
*
|
|
1630
|
+
* Backlog / Drive / Figma の確認は**その案件の同期を1回起こす**ので、答えは接続状態
|
|
1631
|
+
* ストアの行として数分〜十数分後に届く。押した瞬間には何も変わらない。
|
|
1632
|
+
*
|
|
1633
|
+
* 🔴 **壁時計で判定しない。** 「押した時刻より新しい行」で見ると、画面の時計とサーバの
|
|
1634
|
+
* 時計がずれている端末で**永久に届かない**(または、届く前に届いたことになる)。
|
|
1635
|
+
* 押す前にその行の `at` を控え、**辞書順でそれより大きい `at` の行**が来たら差し替える
|
|
1636
|
+
* ——ストアの `at` は正規化済みの ISO 8601(Z・ミリ秒)なので、辞書順=時刻順。
|
|
1637
|
+
*
|
|
1638
|
+
* 上限は `UNSETTLED_TTL_MS`(15分・仮置きと同じ)。過ぎたら**待てば出ると言い続けない**。
|
|
1639
|
+
*
|
|
1640
|
+
* @param wait { at: 押す前に控えた行の `at`(無ければ ""), startedAt: 押した時刻 }
|
|
1641
|
+
* @param row いまのその ref の**いちばん新しい行**(問いは問わない。無ければ null)
|
|
1642
|
+
* ——押して起きるのは同期そのものなので、答えが `reachable` とは限らない
|
|
1643
|
+
* @returns "arrived" | "timeout" | "waiting"(`wait` が無ければ "")
|
|
1644
|
+
*/
|
|
1645
|
+
function probeWaitPhase(wait, row, now) {
|
|
1646
|
+
if (!wait)
|
|
1647
|
+
return "";
|
|
1648
|
+
const base = String((wait && wait.at) || "");
|
|
1649
|
+
const at = String((row && row.at) || "");
|
|
1650
|
+
if (at && at > base)
|
|
1651
|
+
return "arrived";
|
|
1652
|
+
const started = Number((wait && wait.startedAt) || 0);
|
|
1653
|
+
// 端末の時計が戻った回(NTP 補正)は待ち続けない——`nextStateDelay` と同じ理由で、
|
|
1654
|
+
// 経過が負なら期限の判定に使わずに待ちを続ける
|
|
1655
|
+
const age = now - started;
|
|
1656
|
+
if (Number.isFinite(age) && age >= UNSETTLED_TTL_MS)
|
|
1657
|
+
return "timeout";
|
|
1658
|
+
return "waiting";
|
|
1659
|
+
}
|
|
1660
|
+
/**
|
|
1661
|
+
* 待ちが上限に達したときの1文(#523 S3・決定8)。**「もう少しお待ちください」と言わない**
|
|
1662
|
+
* ——15分待って届かないなら、待つのではなく実行状況を見に行く番。
|
|
1663
|
+
*/
|
|
1664
|
+
exports.PROBE_WAIT_TIMEOUT_TEXT = "まだ結果が届いていません(Actions の実行状況を確認してください)。";
|
|
1626
1665
|
/**
|
|
1627
1666
|
* 次に取り直すまでの ms。もう取り直す必要が無ければ null。
|
|
1628
1667
|
*
|
|
@@ -3912,6 +3951,9 @@ a.ds-tile:hover { text-decoration: none; }
|
|
|
3912
3951
|
(flex: 1 1 100%)——状態バッジの横に押し込むと、いちばん読ませたい一文が
|
|
3913
3952
|
カード幅に負けて省略される。状態の語より弱く、しかし読める大きさで出す */
|
|
3914
3953
|
.ds-gate-help { flex: 1 1 100%; margin: 4px 0 0; font-size: 12px; line-height: 1.7; color: #6b7280; }
|
|
3954
|
+
/* 「接続を確認」(dispatch)を押したあとの返事(#523 S3)。**必ず自分の行を占める**
|
|
3955
|
+
——行の途中に挟むと ID と「外す」が案内文の下へ落ちる(.ds-gate-help と同じ理由) */
|
|
3956
|
+
.ds-probe-wait { flex: 1 1 100%; margin: 4px 0 0; font-size: 12px; line-height: 1.7; color: #6b7280; }
|
|
3915
3957
|
/* 管理者への依頼文(#521)。手順が複数行あるので details に畳む——開いたまま出すと、
|
|
3916
3958
|
1行のはずの案内(.ds-gate-help / .ds-probe-help)が一覧を占領する */
|
|
3917
3959
|
.ds-gate-request { margin-top: 4px; }
|
|
@@ -4403,6 +4445,10 @@ var ALREADY_REGISTERED_SUFFIX = ${JSON.stringify(ALREADY_REGISTERED_SUFFIX)};
|
|
|
4403
4445
|
${isAlreadyRegistered.toString()}
|
|
4404
4446
|
var UNSETTLED_TTL_MS = ${JSON.stringify(UNSETTLED_TTL_MS)};
|
|
4405
4447
|
var UNSETTLED_POLL_MS = ${JSON.stringify(UNSETTLED_POLL_MS)};
|
|
4448
|
+
// dispatch の「接続を確認」の待ち(#523 S3)。**判定は1つの関数に閉じる**——
|
|
4449
|
+
// 画面側に書き写すと、押した行と一覧の判定が別々にずれる(🔴2 の壁時計に戻る)
|
|
4450
|
+
${probeWaitPhase.toString()}
|
|
4451
|
+
var PROBE_WAIT_TIMEOUT_TEXT = ${JSON.stringify(exports.PROBE_WAIT_TIMEOUT_TEXT)};
|
|
4406
4452
|
${sanitizeRegisteredNow.toString()}
|
|
4407
4453
|
${chatRowsToAdd.toString()}
|
|
4408
4454
|
${gchatRowsToAdd.toString()}
|
|
@@ -6691,7 +6737,14 @@ ${calendarAddUrl.toString()}
|
|
|
6691
6737
|
no_token: { text: "管理者の設定が必要です", cls: "ds-gate-muted" },
|
|
6692
6738
|
},
|
|
6693
6739
|
issues: { no_token: { text: "APIキーが未登録です", cls: "ds-gate-muted" } },
|
|
6694
|
-
design: {
|
|
6740
|
+
design: {
|
|
6741
|
+
no_token: { text: "トークンが未登録です", cls: "ds-gate-muted" },
|
|
6742
|
+
// 「アクセス不可」では、トークンの失効なのかキーの誤りなのかが行から辿れない(#523 S4)。
|
|
6743
|
+
// 直し方は書き手(engine の figma-gate の写し)が理由(「トークンが無効か…(HTTP 403)」/
|
|
6744
|
+
// 「ファイルが見つかりません(HTTP 404…)」)として運ぶので、**help は持たせない**
|
|
6745
|
+
// (持たせると理由と 2 段になり「繰り返さない」に反する。理由は appendReachableReason が出す)
|
|
6746
|
+
unreachable: { text: "ファイルを読めません", cls: "ds-gate-warn" },
|
|
6747
|
+
},
|
|
6695
6748
|
};
|
|
6696
6749
|
/**
|
|
6697
6750
|
* その能力の行に出す「届くか」の語。**能力ごとの言い換えが無ければ 「DS_GATE」 のまま。**
|
|
@@ -7061,7 +7114,13 @@ ${calendarAddUrl.toString()}
|
|
|
7061
7114
|
}
|
|
7062
7115
|
|
|
7063
7116
|
if (cal.phase === "pending") {
|
|
7064
|
-
|
|
7117
|
+
// **承認された直後の人が最初に見る 1 行**(#540)。実際にかかるのはたいてい数分で、
|
|
7118
|
+
// 15 分ごとの便を 1 本待つと十数分になる。**最長だけを出すと「20 分待つのか」と読める**
|
|
7119
|
+
// ——待たされている感じを実際より大きくしない。止まったときは stale が別の文を出す
|
|
7120
|
+
box.appendChild(el("p", {
|
|
7121
|
+
class: "mt-cal-note",
|
|
7122
|
+
text: "作成中です(数分〜十数分。自動で更新されます)",
|
|
7123
|
+
}));
|
|
7065
7124
|
return;
|
|
7066
7125
|
}
|
|
7067
7126
|
|
|
@@ -7143,7 +7202,9 @@ ${calendarAddUrl.toString()}
|
|
|
7143
7202
|
// 画面が言い換えると 2 枚になる(片方だけ古くなる)
|
|
7144
7203
|
if (!res.ok) return fail((res.j && res.j.message) || "依頼できませんでした。しばらくしてからもう一度お試しください。");
|
|
7145
7204
|
msg.className = "ds-toggle-msg is-ok";
|
|
7146
|
-
|
|
7205
|
+
// 待ちの言い方は行から描く 1 行(pending)と揃える(#540)。
|
|
7206
|
+
// 片方だけ「最長 20 分」だと、同じ待ちが 2 通りに見える
|
|
7207
|
+
msg.textContent = "✓ 依頼しました。作成中です(数分〜十数分)。";
|
|
7147
7208
|
// **押したことを覚える(#452)。** 下の取り直しで箱ごと作り直されると
|
|
7148
7209
|
// この 1 行は消えるので、消えない側(行から描く 1 行)に引き継ぐ
|
|
7149
7210
|
if (kind === "share") CALENDAR_SHARE_PRESSED = true;
|
|
@@ -7161,7 +7222,7 @@ ${calendarAddUrl.toString()}
|
|
|
7161
7222
|
openConfirm(
|
|
7162
7223
|
[
|
|
7163
7224
|
"cortex-notetaker が「" + (SITE.title || "この案件") + "」のカレンダーを作り、案件の社内メンバーに予定作成の権限で共有します。",
|
|
7164
|
-
"
|
|
7225
|
+
"できるまで数分〜十数分かかります。",
|
|
7165
7226
|
],
|
|
7166
7227
|
{ okLabel: "作る", okDanger: false, returnTo: btn },
|
|
7167
7228
|
).then(function (yes) {
|
|
@@ -8603,7 +8664,11 @@ ${calendarAddUrl.toString()}
|
|
|
8603
8664
|
function refreshStateTimer() {
|
|
8604
8665
|
var n = unsettledNow();
|
|
8605
8666
|
var cal = calendarPollWanted();
|
|
8606
|
-
|
|
8667
|
+
// 「接続を確認」(dispatch)の結果待ちも取り直しを回す理由になる(#523 S3)。
|
|
8668
|
+
// **仮置きの数(unsettledNow)には1件も入らない**——押した行は既に登録済みなので、
|
|
8669
|
+
// これを見ないと押した人は15分間なにも更新されない画面を見ることになる
|
|
8670
|
+
var probing = probeWaitsPending();
|
|
8671
|
+
if (!n && !cal && !probing) {
|
|
8607
8672
|
if (stateTimer) { clearTimeout(stateTimer); stateTimer = null; }
|
|
8608
8673
|
stateSince = null;
|
|
8609
8674
|
return;
|
|
@@ -8614,7 +8679,9 @@ ${calendarAddUrl.toString()}
|
|
|
8614
8679
|
// カレンダー待ちは**仮置きの15分の期限に載せない**(作成の約束は20分で、載せると
|
|
8615
8680
|
// 最後の5分だけ静かに止まる=文言が嘘になる時間帯ができる)。依頼の時刻から測った
|
|
8616
8681
|
// 期限は calendarPollWanted が持っているので、ここは間隔だけを決める
|
|
8617
|
-
|
|
8682
|
+
// 確認の結果待ちも**仮置きの15分の期限に載せない**(期限は待ちごとに
|
|
8683
|
+
// 「押した時刻」から測ってあり、「probeWaitsPending」 が切る)。ここは間隔だけ
|
|
8684
|
+
var delay = cal || probing ? UNSETTLED_POLL_MS : nextStateDelay(n, stateSince, Date.now());
|
|
8618
8685
|
if (delay == null) return;
|
|
8619
8686
|
stateTimer = setTimeout(stateTick, delay);
|
|
8620
8687
|
}
|
|
@@ -10847,11 +10914,165 @@ ${calendarAddUrl.toString()}
|
|
|
10847
10914
|
return row;
|
|
10848
10915
|
}
|
|
10849
10916
|
|
|
10850
|
-
|
|
10917
|
+
/* -------------------------------------------------------------------------
|
|
10918
|
+
* dispatch の「接続を確認」(#523 S3・Backlog / Drive / Figma)
|
|
10919
|
+
* -------------------------------------------------------------------------
|
|
10920
|
+
* Slack / GitHub / Google Chat の確認(「probeSection」)は中央がその場で叩いて
|
|
10921
|
+
* 答えを返すが、この3つは**中央が鍵を読まない**(#105 決定5)ので、押すと
|
|
10922
|
+
* その案件の同期が1回起きるだけ。答えは接続状態ストアの行として後から届く。
|
|
10923
|
+
*
|
|
10924
|
+
* だから画面がすることは3つ:
|
|
10925
|
+
* 1. 押す前にその行の 「at」 を控える(🔴2・壁時計を使わない)
|
|
10926
|
+
* 2. 「確認を開始しました」を出して、取り直し(op=state)を回す
|
|
10927
|
+
* 3. 控えた 「at」 より新しい行が届いたら、待ちを解いて札を描き直す
|
|
10928
|
+
* ——札そのものは 「appendReachableChip」 が描くので、ここは待ちの表示だけ
|
|
10929
|
+
* ----------------------------------------------------------------------- */
|
|
10930
|
+
|
|
10931
|
+
/**
|
|
10932
|
+
* 押した行ごとの待ち。**行の DOM ではなくここに持つ**——一覧は取り直しのたびに
|
|
10933
|
+
* 作り直されるので、行に持たせると押した直後の1回で消える。
|
|
10934
|
+
*/
|
|
10935
|
+
var PROBE_WAITS = {};
|
|
10936
|
+
|
|
10937
|
+
/** 待ちの鍵。**札の突き合わせと同じ畳み方**(「stateRefKey」)にする */
|
|
10938
|
+
function probeWaitKey(capId, ref) {
|
|
10939
|
+
return capId + "\\u0001" + (stateRefKey(capId, ref, "") || String(ref || ""));
|
|
10940
|
+
}
|
|
10941
|
+
|
|
10942
|
+
/** その行の待ち(無ければ null)。**期限切れも返す**(文言を出し分けるのは呼び手) */
|
|
10943
|
+
function probeWaitOf(capId, ref) {
|
|
10944
|
+
return PROBE_WAITS[probeWaitKey(capId, ref)] || null;
|
|
10945
|
+
}
|
|
10946
|
+
|
|
10947
|
+
/**
|
|
10948
|
+
* その接続先の**いちばん新しい行**(問いは問わない)。待ちの基準と到着の判定に使う。
|
|
10949
|
+
*
|
|
10950
|
+
* 🔴 **「届くか」の行だけを見ない。** 押すと起きるのは同期そのものなので、
|
|
10951
|
+
* 届いた答えが 「reachable」 とは限らない——Backlog / Drive / Figma とも回によっては
|
|
10952
|
+
* 片方しか動かない(Backlog の webhook 起点は「取り込み」だけ、Drive の先出しは「届くか」だけ)。
|
|
10953
|
+
* 「届くか」だけを見ると、**同期が終わって行が更新されているのに15分待たせる**。
|
|
10954
|
+
*/
|
|
10955
|
+
function probeLatestRow(capId, ref) {
|
|
10956
|
+
var rows = LIVE_STATE;
|
|
10957
|
+
if (!rows || !rows.length || !capId) return null;
|
|
10958
|
+
var want = stateRefKey(capId, ref, "");
|
|
10959
|
+
if (!want) return null;
|
|
10960
|
+
var best = null;
|
|
10961
|
+
for (var i = 0; i < rows.length; i++) {
|
|
10962
|
+
var r = rows[i];
|
|
10963
|
+
if (!r || r.cap !== capId) continue;
|
|
10964
|
+
if (stateRefKey(capId, r.ref, r.workspace) !== want) continue;
|
|
10965
|
+
if (!best || String(r.at || "") > String(best.at || "")) best = r;
|
|
10966
|
+
}
|
|
10967
|
+
return best;
|
|
10968
|
+
}
|
|
10969
|
+
|
|
10970
|
+
/**
|
|
10971
|
+
* その行の待ちの相。届いていれば待ちを**その場で解く**(次の描き直しで札だけが残る)。
|
|
10972
|
+
*/
|
|
10973
|
+
function probeWaitPhaseOf(capId, ref) {
|
|
10974
|
+
var key = probeWaitKey(capId, ref);
|
|
10975
|
+
var wait = PROBE_WAITS[key];
|
|
10976
|
+
if (!wait) return "";
|
|
10977
|
+
var phase = probeWaitPhase(wait, probeLatestRow(capId, ref), Date.now());
|
|
10978
|
+
if (phase === "arrived") delete PROBE_WAITS[key];
|
|
10979
|
+
return phase;
|
|
10980
|
+
}
|
|
10981
|
+
|
|
10982
|
+
/** まだ結果を待っている行があるか(取り直しを続けるかの判断・「refreshStateTimer」) */
|
|
10983
|
+
function probeWaitsPending() {
|
|
10984
|
+
var now = Date.now();
|
|
10985
|
+
for (var key in PROBE_WAITS) {
|
|
10986
|
+
if (!Object.prototype.hasOwnProperty.call(PROBE_WAITS, key)) continue;
|
|
10987
|
+
var w = PROBE_WAITS[key];
|
|
10988
|
+
// **鍵から ref を戻さない。** 待ちに控えてある能力と ref をそのまま使う
|
|
10989
|
+
if (probeWaitPhase(w, probeLatestRow(w.cap, w.ref), now) === "waiting") return true;
|
|
10990
|
+
}
|
|
10991
|
+
return false;
|
|
10992
|
+
}
|
|
10993
|
+
|
|
10994
|
+
/**
|
|
10995
|
+
* 能力 → 「op=probe」 に送る種別。**画面の能力名をそのまま送らない**
|
|
10996
|
+
* (サーバの受け口はレジストリの id で、「materials」 ではなく 「drive」)。
|
|
10997
|
+
* **空を返した能力にはボタンが出ない。**
|
|
10998
|
+
*/
|
|
10999
|
+
function dispatchProbeTypeOf(capId) {
|
|
11000
|
+
return { issues: "backlog", materials: "drive", design: "figma" }[String(capId || "")] || "";
|
|
11001
|
+
}
|
|
11002
|
+
|
|
11003
|
+
/**
|
|
11004
|
+
* 接続先1件の「接続を確認」(ボタン+待ちの1文)を行に足す。
|
|
11005
|
+
*
|
|
11006
|
+
* **ボタンは行の中**(Slack の行と同じ・2026-08-20 の「1行が2段になる」を繰り返さない)。
|
|
11007
|
+
* 待ちの1文は 「.ds-gate-help」 で行の最後に落とす(「appendReachableReason」 の項)。
|
|
11008
|
+
*/
|
|
11009
|
+
function appendDispatchProbe(row, capId, ref) {
|
|
11010
|
+
var type = dispatchProbeTypeOf(capId);
|
|
11011
|
+
// **書き込み経路が無ければ出さない**(押しても何も起きないボタンを置かない)
|
|
11012
|
+
if (!type || !SITE.intake || !ref) return row;
|
|
11013
|
+
var btn = el("button", { class: "ds-toggle-btn", type: "button", text: "接続を確認" });
|
|
11014
|
+
// 🔴 **「ds-gate-help」 を付けない。** あれは「最後に測った理由」の1段で、
|
|
11015
|
+
// 行の補足が1段であることを見張る検査(#523 S1)が数えている。待ちの1文は
|
|
11016
|
+
// 別の話(押した人へのその場の返事)なので、専用の class を持たせる
|
|
11017
|
+
var note = el("p", { class: "ds-probe-wait" });
|
|
11018
|
+
var phase = probeWaitPhaseOf(capId, ref);
|
|
11019
|
+
var wait = probeWaitOf(capId, ref);
|
|
11020
|
+
if (phase === "waiting") note.textContent = (wait && wait.message) || "";
|
|
11021
|
+
else if (phase === "timeout") note.textContent = PROBE_WAIT_TIMEOUT_TEXT;
|
|
11022
|
+
else note.hidden = true;
|
|
11023
|
+
|
|
11024
|
+
btn.addEventListener("click", async function () {
|
|
11025
|
+
var endBusy = beginBusy(btn, "確認中…");
|
|
11026
|
+
note.hidden = false;
|
|
11027
|
+
note.textContent = "確認中…";
|
|
11028
|
+
// 🔴 **押す前に、いまの行の 「at」 を控える(🔴2)。** 行が無ければ空文字
|
|
11029
|
+
//(どんな 「at」 が来ても「新しい」と読める)
|
|
11030
|
+
var before = probeLatestRow(capId, ref);
|
|
11031
|
+
var key = probeWaitKey(capId, ref);
|
|
11032
|
+
try {
|
|
11033
|
+
var res = await callIntake("probe", { type: type, ref: ref });
|
|
11034
|
+
var j = await res.json().catch(function () { return {}; });
|
|
11035
|
+
if (!res.ok || j.queued === false) {
|
|
11036
|
+
// サーバの文言をそのまま出す(回数制限・鍵未登録・ロール未登録・起動失敗)
|
|
11037
|
+
note.textContent = j.message || "確認できませんでした。";
|
|
11038
|
+
delete PROBE_WAITS[key];
|
|
11039
|
+
endBusy();
|
|
11040
|
+
return;
|
|
11041
|
+
}
|
|
11042
|
+
PROBE_WAITS[key] = {
|
|
11043
|
+
cap: capId, ref: ref,
|
|
11044
|
+
at: (before && before.at) || "",
|
|
11045
|
+
startedAt: Date.now(),
|
|
11046
|
+
message: j.message || "",
|
|
11047
|
+
};
|
|
11048
|
+
note.textContent = j.message || "";
|
|
11049
|
+
// 待っているあいだは取り直しを回す(届いた行で一覧が描き直される)
|
|
11050
|
+
refreshStateTimer();
|
|
11051
|
+
} catch (e) {
|
|
11052
|
+
note.textContent = "通信に失敗しました。";
|
|
11053
|
+
delete PROBE_WAITS[key];
|
|
11054
|
+
}
|
|
11055
|
+
endBusy();
|
|
11056
|
+
});
|
|
11057
|
+
row.appendChild(btn);
|
|
11058
|
+
row.appendChild(note);
|
|
11059
|
+
return row;
|
|
11060
|
+
}
|
|
11061
|
+
|
|
11062
|
+
/**
|
|
11063
|
+
* 一覧に出ている接続先の「届くか」をひとつの文字列にする(描き直しの要否の判定用)。
|
|
11064
|
+
*
|
|
11065
|
+
* **待ちの相も混ぜる(#523 S3)。** 混ぜないと、15分の上限に達しても一覧が
|
|
11066
|
+
* 作り直されず、「確認を開始しました」が出たまま止まる(待てば出ると言い続ける形)。
|
|
11067
|
+
*/
|
|
10851
11068
|
function reachSigOf(capId, refs) {
|
|
11069
|
+
var now = Date.now();
|
|
10852
11070
|
return (refs || []).map(function (ref) {
|
|
10853
|
-
var
|
|
10854
|
-
|
|
11071
|
+
var id = ref && ref.ref != null ? ref.ref : ref;
|
|
11072
|
+
var r = reachableStateOf(capId, id, ref && ref.workspace);
|
|
11073
|
+
var w = probeWaitOf(capId, id);
|
|
11074
|
+
// 待っている行は**いちばん新しい行**で相を決める(「probeLatestRow」 の項)
|
|
11075
|
+
return (r ? r.status + "@" + r.at : "-") + (w ? "/" + probeWaitPhase(w, probeLatestRow(capId, id), now) : "");
|
|
10855
11076
|
}).join(",");
|
|
10856
11077
|
}
|
|
10857
11078
|
|
|
@@ -10974,7 +11195,12 @@ ${calendarAddUrl.toString()}
|
|
|
10974
11195
|
// 理由の1段は**行の最後**(ボタンより後ろ)に置く(appendReachableReason の項)
|
|
10975
11196
|
var issuesRef = issuesRefOf(t.domain, t.projectKey);
|
|
10976
11197
|
appendReachableChip(row, "issues", issuesRef);
|
|
10977
|
-
|
|
11198
|
+
// 「接続を確認」(#523 S3)。**外す権限が無くても押せる**——読むだけの操作で、
|
|
11199
|
+
// 押せる人を絞らない(決定7)。ボタンの並びは Slack の行と同じ(外すボタンの後ろ)
|
|
11200
|
+
if (!editable) {
|
|
11201
|
+
appendDispatchProbe(row, "issues", issuesRef);
|
|
11202
|
+
return appendReachableReason(row, "issues", issuesRef);
|
|
11203
|
+
}
|
|
10978
11204
|
var btn = el("button", { class: "ds-toggle-btn ds-danger", type: "button", text: "この接続先を外す" });
|
|
10979
11205
|
btn.addEventListener("click", async function () {
|
|
10980
11206
|
// **最後の1件かどうかは「押した時点」で数える。** 描画時の件数で決めると、
|
|
@@ -10994,6 +11220,7 @@ ${calendarAddUrl.toString()}
|
|
|
10994
11220
|
sendConfig(payload, msg, btn, null, targetsHooks());
|
|
10995
11221
|
});
|
|
10996
11222
|
row.appendChild(btn);
|
|
11223
|
+
appendDispatchProbe(row, "issues", issuesRef);
|
|
10997
11224
|
return appendReachableReason(row, "issues", issuesRef);
|
|
10998
11225
|
}
|
|
10999
11226
|
|
|
@@ -11466,6 +11693,11 @@ ${calendarAddUrl.toString()}
|
|
|
11466
11693
|
// **クラスのハード代入をやめる**(片方だけ直し忘れる形を構造的に消す)
|
|
11467
11694
|
onDone: function () { row.classList.add("ds-removed"); },
|
|
11468
11695
|
}));
|
|
11696
|
+
// 「接続を確認」(#523 S3)。押すと資料の同期が1回起き、共有が外れていれば
|
|
11697
|
+
// 「フォルダを開けません…」が数分〜十数分後にこの行へ出る。
|
|
11698
|
+
// **並びは Slack の行と同じ**(外すボタンの後ろ)——先に置くと、行の1つ目の
|
|
11699
|
+
// ボタンが入れ替わる(既存のテストが「1つ目=外す」で掴んでいるのと同じ読み順)
|
|
11700
|
+
appendDispatchProbe(row, "materials", id);
|
|
11469
11701
|
// 理由の1段は行の最後(ID と「このフォルダを外す」の後ろ・appendReachableReason の項)
|
|
11470
11702
|
appendReachableReason(row, "materials", id);
|
|
11471
11703
|
dlist.appendChild(row);
|
|
@@ -11596,7 +11828,8 @@ ${calendarAddUrl.toString()}
|
|
|
11596
11828
|
// このファイルの取り込みが最後にどうなったか(段C)。測っていなければ null
|
|
11597
11829
|
ingestedEl(designIngestedStateOf(f.key), "デザイン"),
|
|
11598
11830
|
]);
|
|
11599
|
-
// このファイルに届くか(#523 S1)。書き手は S4
|
|
11831
|
+
// このファイルに届くか(#523 S1)。書き手は engine の同期(#523 S4・engine #329)。
|
|
11832
|
+
// 行が無いファイル(まだ一度も同期していない)には何も出ない。
|
|
11600
11833
|
// 理由の1段は行の最後に置く(appendReachableReason の項)
|
|
11601
11834
|
appendReachableChip(row, "design", f.key);
|
|
11602
11835
|
row.appendChild(removeButton({
|
|
@@ -11632,6 +11865,10 @@ ${calendarAddUrl.toString()}
|
|
|
11632
11865
|
else delete figSending[f.key];
|
|
11633
11866
|
},
|
|
11634
11867
|
}));
|
|
11868
|
+
// 「接続を確認」(#523 S3)。押すとデザイン同期が1回起き、engine の同期が
|
|
11869
|
+
// 「届くか」と「取り込み」の行を書く(#523 S4・engine #329)。届いたら札が差し替わる。
|
|
11870
|
+
// 並びは Slack の行と同じ(外すボタンの後ろ)
|
|
11871
|
+
appendDispatchProbe(row, "design", f.key);
|
|
11635
11872
|
appendReachableReason(row, "design", f.key);
|
|
11636
11873
|
// 描き直しのあとも「外した」ことが分かる形に戻す(figsRemoved の項に経緯)
|
|
11637
11874
|
if (figsRemoved.indexOf(f.key) >= 0) {
|
|
@@ -12727,7 +12964,9 @@ ${calendarAddUrl.toString()}
|
|
|
12727
12964
|
// 判定と文面は infra/lambda/shared/github-gate.mjs 側(画面に分岐を持たせない)。
|
|
12728
12965
|
// **Google Chat は #347(同じ理由)。** スペースにアプリを追加した人が、その場で
|
|
12729
12966
|
// 直ったことを確かめられる。判定は infra/lambda/shared/google-chat-gate.mjs 側。
|
|
12730
|
-
// Backlog / Figma / Drive
|
|
12967
|
+
// **Backlog / Figma / Drive は「接続を確認」の型が違う**(#523 S3・レジストリの
|
|
12968
|
+
// 「probe: dispatch」)。中央が叩くのではなく案件の同期を起こすので、ここではなく
|
|
12969
|
+
// それぞれの一覧の行が 「appendDispatchProbe」 で出す。
|
|
12731
12970
|
//
|
|
12732
12971
|
// **origin === "explicit" でも出す。** 確認は読むだけで、どの登録ファイル由来かに
|
|
12733
12972
|
// 関係なく効く(書き込みになる「表示名を更新する」だけが由来で出し分かれる)
|
package/package.json
CHANGED