@takagaki/cortex-decisions-viewer 0.12.137 → 0.12.138

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.
@@ -22,6 +22,7 @@ exports.PENDING_OPS_LIMITS = void 0;
22
22
  exports.pendingKindsTable = pendingKindsTable;
23
23
  exports.pendingOpsKey = pendingOpsKey;
24
24
  exports.pendingSlackChannelId = pendingSlackChannelId;
25
+ exports.pendingSlackUrl = pendingSlackUrl;
25
26
  exports.pendingIsSpaceRef = pendingIsSpaceRef;
26
27
  exports.pendingGoogleChatSpaceRef = pendingGoogleChatSpaceRef;
27
28
  exports.pendingRepo = pendingRepo;
@@ -115,6 +116,18 @@ function pendingSlackChannelId(input) {
115
116
  const client = s.match(/^https?:\/\/app\.slack\.com\/client\/[TE][A-Z0-9]{6,20}\/([CG][A-Z0-9]{6,})/);
116
117
  return client ? client[1] : null;
117
118
  }
119
+ /**
120
+ * Slack のチャンネル URL(リンク用)。貼られた URL が `<ドメイン>.slack.com/archives/<ID>` で、ID が
121
+ * 対象のチャンネルと同じならそれを正規化して返す。取れなければ `https://slack.com/archives/<ID>`
122
+ * (夜のまとめ=サーバの logic.mjs と同じ形)。**夜のまとめの `url` が来たらそちらが正**で、これは仮置き用。
123
+ */
124
+ function pendingSlackUrl(input, id) {
125
+ const cid = String(id == null ? "" : id);
126
+ const m = String(input == null ? "" : input).trim().match(/^https:\/\/([a-z0-9][a-z0-9-]*)\.slack\.com\/archives\/([CG][A-Z0-9]{6,})(?:[/?#]|$)/);
127
+ if (m && m[2] === cid && m[1] !== "app")
128
+ return "https://" + m[1] + ".slack.com/archives/" + cid;
129
+ return cid ? "https://slack.com/archives/" + cid : "";
130
+ }
118
131
  /**
119
132
  * スペース ref の形(サーバの `GOOGLE_CHAT_SPACE_REF` の写し)。ずれは parity テストが固定する。
120
133
  *
@@ -269,6 +282,9 @@ function pendingOpOf(payload, ctx) {
269
282
  case "add-channel": {
270
283
  const id = pendingSlackChannelId(payload.url);
271
284
  const data = { name: pendingLabel(payload.name) || id };
285
+ // 貼られた URL でリンクにする(追加直後・接続を確認する前から)。ドメインが取れなければ共通の形
286
+ if (id)
287
+ data.url = pendingSlackUrl(payload.url, id);
272
288
  if (payload.workspace)
273
289
  data.workspace = String(payload.workspace);
274
290
  // **どの組織のチャンネルかは、サーバの実測を応答から受け取る(#391)。**
@@ -286,7 +302,14 @@ function pendingOpOf(payload, ctx) {
286
302
  return make("slack", "remove", payload.ref);
287
303
  case "refresh-channel-name": {
288
304
  const name = pendingLabel(payload.name);
289
- return name ? make("slack", "update", payload.ref, { name: name }) : null;
305
+ if (!name)
306
+ return null;
307
+ // 接続を確認できた行は、チャンネルの URL も揃える(行に url が無いときだけ効く・合成の項)
308
+ const data = { name: name };
309
+ const url = pendingSlackUrl(payload.url, payload.ref);
310
+ if (url)
311
+ data.url = url;
312
+ return make("slack", "update", payload.ref, data);
290
313
  }
291
314
  case "set-notify": {
292
315
  if (typeof payload.value !== "boolean")
@@ -370,7 +393,7 @@ function sanitizePendingOps(raw, projectKey) {
370
393
  const src = e.payload && typeof e.payload === "object" ? e.payload : {};
371
394
  // 通してよい payload の欄(葉は文字列か、notify だけ真偽値)。関数の中に置くのは、
372
395
  // クライアントへ toString() で流し込んだ先でも同じ一覧を参照できるようにするため
373
- const fields = ["name", "workspace", "notify", "domain", "projectKey", "type", "slackOrg"];
396
+ const fields = ["name", "workspace", "notify", "domain", "projectKey", "type", "slackOrg", "url"];
374
397
  for (const f of fields) {
375
398
  if (!Object.prototype.hasOwnProperty.call(src, f))
376
399
  continue;
@@ -378,6 +401,11 @@ function sanitizePendingOps(raw, projectKey) {
378
401
  if (src[f] === true || src[f] === false)
379
402
  payload[f] = src[f];
380
403
  }
404
+ else if (f === "url") {
405
+ // href に入る値。localStorage から読み戻すので、Slack のチャンネル URL の形だけ通す
406
+ if (typeof src[f] === "string" && /^https:\/\/(?:[a-z0-9][a-z0-9-]*\.)?slack\.com\/archives\/[CG][A-Z0-9]{6,}$/.test(src[f]))
407
+ payload[f] = src[f];
408
+ }
381
409
  else if (typeof src[f] === "string")
382
410
  payload[f] = src[f];
383
411
  }
@@ -735,6 +763,8 @@ function pendingExternalRow(e) {
735
763
  row.type = "slack";
736
764
  row.name = p.name || e.targetId;
737
765
  row.ref = e.targetId;
766
+ if (typeof p.url === "string" && p.url)
767
+ row.url = p.url;
738
768
  // channels.json に書いた行= derived(dev-sources 側の宣言ではない)
739
769
  row.origin = "derived";
740
770
  if (p.workspace)
@@ -859,6 +889,9 @@ function applyPendingOps(view, list) {
859
889
  const patch = {};
860
890
  if (e.kind === "slack" && typeof p.name === "string" && p.name)
861
891
  patch.name = p.name;
892
+ // 夜のまとめの url が正。無い行にだけ仮置きの url を足す
893
+ if (e.kind === "slack" && typeof p.url === "string" && p.url && !externals[idx].url)
894
+ patch.url = p.url;
862
895
  if (typeof p.notify === "boolean")
863
896
  patch.notify = p.notify;
864
897
  externals[idx] = Object.assign({}, externals[idx], patch);
package/dist/render.js CHANGED
@@ -6388,6 +6388,7 @@ var PENDING_OPS_SETTLE_MS = ${JSON.stringify(pending_ops_1.PENDING_OPS_LIMITS.se
6388
6388
  var PENDING_KINDS = ${JSON.stringify((0, pending_ops_1.pendingKindsTable)())};
6389
6389
  ${pending_ops_1.pendingOpsKey.toString()}
6390
6390
  ${pending_ops_1.pendingSlackChannelId.toString()}
6391
+ ${pending_ops_1.pendingSlackUrl.toString()}
6391
6392
  ${pending_ops_1.pendingGoogleChatSpaceRef.toString()}
6392
6393
  ${pending_ops_1.pendingRepo.toString()}
6393
6394
  ${pending_ops_1.pendingFigmaKey.toString()}
@@ -14187,7 +14188,7 @@ ${calendarAddUrl.toString()}
14187
14188
  callIntake("config", payload).then(function (res) {
14188
14189
  if (!res.ok) return;
14189
14190
  // 仮置き(#388): リロードしても新しい名前で出る。送っていない name を判定用に添える
14190
- notePendingOp({ op: "refresh-channel-name", ref: s.ref, name: r.name });
14191
+ notePendingOp({ op: "refresh-channel-name", ref: s.ref, name: r.name, url: s.url || "" });
14191
14192
  // 一覧は夜間のスナップショットなので、その場では変わらない。行だけ追いつかせる
14192
14193
  var nameEl = card.querySelector(".ds-name");
14193
14194
  if (nameEl) nameEl.textContent = slackDisplayName(r.name);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@takagaki/cortex-decisions-viewer",
3
- "version": "0.12.137",
3
+ "version": "0.12.138",
4
4
  "description": "Cortexの意思決定記録(Decisions/*.md)を静的サイトにビルドして閲覧する。各レコードに「Edit on GitHub」リンクを付与する。",
5
5
  "license": "UNLICENSED",
6
6
  "private": false,