@takagaki/cortex-decisions-viewer 0.12.90 → 0.12.92

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/build.js CHANGED
@@ -972,6 +972,11 @@ async function readGoldProposals(repoRoot) {
972
972
  const why = optionalText(row.why);
973
973
  if (why)
974
974
  proposal.why = why;
975
+ // その場で記録できるカードの印(cortex-engine #699 F7b)。**値は "portal" だけ**を通す
976
+ // (語彙の外は無い扱い=今の指示文のボタンのまま)。20260920-686 の「新しい欄を通さない」を
977
+ // この 1 欄だけ覆した(決定ログ 20260925-699-f7b.md)
978
+ if (row.decide === "portal")
979
+ proposal.decide = "portal";
975
980
  const list = byPath.get(recordPath);
976
981
  if (list)
977
982
  list.push(proposal);
package/dist/render.js CHANGED
@@ -4998,6 +4998,14 @@ button.site-icon[aria-busy="true"] .site-icon-plus { opacity: 0; }
4998
4998
  .ai-same-btn:hover { background: rgba(194,94,63,0.92); text-decoration: none; }
4999
4999
  .ai-diff-btn { background: #fff; color: var(--text); border: 1px solid var(--border); }
5000
5000
  .ai-diff-btn:hover { background: #f3f4f6; text-decoration: none; }
5001
+ /* その場で記録するボタン(#699 F7b)。見た目は指示文のリンクと同じ */
5002
+ .ip-decide-btn { cursor: pointer; font-family: inherit; line-height: inherit; }
5003
+ .ip-decide-btn:disabled { opacity: 0.6; cursor: default; }
5004
+ .ip-choice > button { align-self: flex-start; }
5005
+ .ip-decide-msg { flex-basis: 100%; font-size: 12.5px; line-height: 1.6; }
5006
+ .ip-decide-msg:empty { display: none; }
5007
+ .ip-decide-msg.is-error { color: #b45309; }
5008
+ .ip-decided { font-size: 13px; font-weight: 600; color: #15803d; }
5001
5009
  /* 「AIで編集」と同じ見た目にそろえる(同じ行き先・同じ仕組みなので、別物に見せない) */
5002
5010
  .ai-apply-btn {
5003
5011
  display: inline-block; padding: 6px 14px; border-radius: 999px;
@@ -7885,6 +7893,109 @@ ${calendarAddUrl.toString()}
7885
7893
  }
7886
7894
  return ul;
7887
7895
  }
7896
+ /** 今の 2 つの選択(AI への指示文のリンク+押すと何が起きるか) */
7897
+ function ipAiChoices(rec, sectionName, one, typed) {
7898
+ return [
7899
+ el("div", { class: "ip-choice" }, [
7900
+ ipSameBtn(rec, sectionName, rec.title, one, typed),
7901
+ el("div", { class: "ip-choice-note", text: "承認すると、翌晩からこの人の活動としてまとめて数えます" }),
7902
+ ]),
7903
+ el("div", { class: "ip-choice" }, [
7904
+ ipDiffBtn(rec, sectionName, rec.title, one, typed),
7905
+ el("div", { class: "ip-choice-note", text: "承認すると、翌晩からこの人に結び付けません" }),
7906
+ ]),
7907
+ ];
7908
+ }
7909
+ /**
7910
+ * その場で記録できるか(cortex-engine #699 F7b)。engine がカードに decide: "portal" を付け、
7911
+ * claim_key があり、intake の口と名乗り券(ポータルの Cookie)があるときだけ。
7912
+ * 🔴 **券が無いときは今の指示文のリンクに倒す**(押しても ACTOR_REQUIRED で断られるだけ)
7913
+ */
7914
+ function ipCanDecide(one) {
7915
+ return !!(one && one.decide === "portal" && ipText(one.claim_key) && SITE.intake && actorTicket());
7916
+ }
7917
+ /**
7918
+ * 断られたときの 1 行(code ごとに一手)。**帯は症状・行は一手・繰り返さない。**
7919
+ * final: 押し直しても同じ答えになる(ボタンを畳む)/false: 時間をおけば通りうる(ボタンを残す)
7920
+ */
7921
+ var IP_DECIDE_DENIED = {
7922
+ SELF_DECIDED: { text: "ご本人が決めています", final: true },
7923
+ ADMIN_DECIDED: { text: "管理者が決めています", final: true },
7924
+ FORBIDDEN: { text: "この案件のメンバーだけが決められます", final: true },
7925
+ ROLE_FORBIDDEN: { text: "この案件のメンバーだけが決められます", final: true },
7926
+ TENANT_MISMATCH: { text: "別の組織の人です。管理者に頼んでください", final: true },
7927
+ LINKED_TO_OTHER: { text: "ほかの人に結ばれています。管理者に頼んでください", final: true },
7928
+ DENIED_FIRST: { text: "先に「別人」と決まっています。管理者に頼んでください", final: true },
7929
+ ACTOR_REQUIRED: { text: "ポータルからこの案件を開き直してください", final: true },
7930
+ ACTOR_INVALID: { text: "ポータルからこの案件を開き直してください", final: true },
7931
+ ACTOR_PROJECT_MISMATCH: { text: "ポータルからこの案件を開き直してください", final: true },
7932
+ ACCESS_REVOKED: { text: "ポータルからこの案件を開き直してください", final: true },
7933
+ };
7934
+ var IP_DECIDE_RETRY = "いま記録できません。時間をおいて押してください";
7935
+ /**
7936
+ * [同じ人です][別人です]を intake の identity-decide を呼ぶボタンにする(#699 F7b)。
7937
+ * 押した後はカードの中でその場で「記録しました(翌晩から反映)」に置き換える。
7938
+ * SUBJECT_UNRESOLVED(ポータルが 1 人に決められない)と EMAIL_ID(メールを含む ID)は今の指示文のリンクに戻す
7939
+ */
7940
+ function ipDecideActions(rec, sectionName, one, typed) {
7941
+ var claimKey = one.claim_key;
7942
+ var box = el("div", { class: "ip-actions ip-decide" });
7943
+ var msg = el("div", { class: "ip-decide-msg" });
7944
+ var sameBtn = el("button", { type: "button", class: "ai-same-btn ip-decide-btn", text: "同じ人です" });
7945
+ var diffBtn = el("button", { type: "button", class: "ai-diff-btn ip-decide-btn", text: "別人です" });
7946
+ var busy = false;
7947
+ function settle(node) {
7948
+ while (box.firstChild) box.removeChild(box.firstChild);
7949
+ box.appendChild(node);
7950
+ }
7951
+ function press(decision, btn) {
7952
+ if (busy) return;
7953
+ busy = true;
7954
+ var other = btn === sameBtn ? diffBtn : sameBtn;
7955
+ other.disabled = true;
7956
+ var endBusy = beginBusy(btn, "記録中…");
7957
+ msg.textContent = "";
7958
+ var done = function (res) {
7959
+ var j = (res && res.j) || {};
7960
+ if (res && res.ok && j.ok === true) {
7961
+ settle(el("div", { class: "ip-decided", text: "記録しました(翌晩から反映)" }));
7962
+ return;
7963
+ }
7964
+ var code = typeof j.code === "string" ? j.code : "";
7965
+ // 主語が 1 人に決まらない・メールを含む ID は、ここでは決められない=今の指示文のリンクに戻す
7966
+ if (code === "SUBJECT_UNRESOLVED" || code === "EMAIL_ID") {
7967
+ box.className = "ip-actions";
7968
+ while (box.firstChild) box.removeChild(box.firstChild);
7969
+ ipAiChoices(rec, sectionName, one, typed).forEach(function (n) { box.appendChild(n); });
7970
+ return;
7971
+ }
7972
+ var denied = Object.prototype.hasOwnProperty.call(IP_DECIDE_DENIED, code) ? IP_DECIDE_DENIED[code] : null;
7973
+ if (denied && denied.final) {
7974
+ settle(el("div", { class: "ip-decide-msg is-error", text: denied.text }));
7975
+ return;
7976
+ }
7977
+ endBusy();
7978
+ other.disabled = false;
7979
+ busy = false;
7980
+ msg.className = "ip-decide-msg is-error";
7981
+ msg.textContent = IP_DECIDE_RETRY;
7982
+ };
7983
+ intakeJson(callIntake("identity-decide", { op: "identity-decide", claim_key: claimKey, decision: decision }))
7984
+ .then(done, function () { done({ ok: false, j: { code: "UNAVAILABLE" } }); });
7985
+ }
7986
+ sameBtn.addEventListener("click", function () { press("confirm", sameBtn); });
7987
+ diffBtn.addEventListener("click", function () { press("deny", diffBtn); });
7988
+ box.appendChild(el("div", { class: "ip-choice" }, [
7989
+ sameBtn,
7990
+ el("div", { class: "ip-choice-note", text: "押すと記録します。翌晩からこの人の活動としてまとめて数えます" }),
7991
+ ]));
7992
+ box.appendChild(el("div", { class: "ip-choice" }, [
7993
+ diffBtn,
7994
+ el("div", { class: "ip-choice-note", text: "押すと記録します。翌晩からこの人に結び付けません" }),
7995
+ ]));
7996
+ box.appendChild(msg);
7997
+ return box;
7998
+ }
7888
7999
  /** 「同じ人ですか」のカード 1 枚。**ボタンはカードごと**(束ねる側からは外してある) */
7889
8000
  function ipCard(rec, sectionName, one, typed) {
7890
8001
  // 見出し(常に画面で組む)→ 理由の 1 行 → 根拠 → 2 つの選択 → くわしく(残りの文と問い合わせ用の ID)
@@ -7896,16 +8007,11 @@ ${calendarAddUrl.toString()}
7896
8007
  ]);
7897
8008
  var ev = proposalEvidenceList(one);
7898
8009
  if (ev) item.appendChild(ev);
7899
- item.appendChild(el("div", { class: "ip-actions" }, [
7900
- el("div", { class: "ip-choice" }, [
7901
- ipSameBtn(rec, sectionName, rec.title, one, typed),
7902
- el("div", { class: "ip-choice-note", text: "承認すると、翌晩からこの人の活動としてまとめて数えます" }),
7903
- ]),
7904
- el("div", { class: "ip-choice" }, [
7905
- ipDiffBtn(rec, sectionName, rec.title, one, typed),
7906
- el("div", { class: "ip-choice-note", text: "承認すると、翌晩からこの人に結び付けません" }),
7907
- ]),
7908
- ]));
8010
+ // その場で記録できるカード(decide: "portal"・名乗り券あり)だけ intake を呼ぶボタンにする(#699 F7b)。
8011
+ // それ以外は今の指示文のリンクのまま(1 バイトも変えない)
8012
+ item.appendChild(ipCanDecide(one)
8013
+ ? ipDecideActions(rec, sectionName, one, typed)
8014
+ : el("div", { class: "ip-actions" }, ipAiChoices(rec, sectionName, one, typed)));
7909
8015
  // 🔴 **ID の値は「くわしく」の中にだけ置く**(問い合わせ用。判断は見出しと根拠でする)。
7910
8016
  // リンクにしてよい形(許可リストで検査・Slack と Backlog は行き先のドメインが 1 つに
7911
8017
  // 決まるときだけ)は「つながっている ID」と同じ規則で決める
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@takagaki/cortex-decisions-viewer",
3
- "version": "0.12.90",
3
+ "version": "0.12.92",
4
4
  "description": "Cortexの意思決定記録(Decisions/*.md)を静的サイトにビルドして閲覧する。各レコードに「Edit on GitHub」リンクを付与する。",
5
5
  "license": "UNLICENSED",
6
6
  "private": false,