@takagaki/cortex-decisions-viewer 0.4.63 → 0.4.64
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 +107 -4
- package/package.json +1 -1
package/dist/render.js
CHANGED
|
@@ -172,6 +172,36 @@ function externalCapability(type) {
|
|
|
172
172
|
return "開発";
|
|
173
173
|
return CAP_OTHER;
|
|
174
174
|
}
|
|
175
|
+
/**
|
|
176
|
+
* 貼られたURLから Backlog の接続先を読む。
|
|
177
|
+
*
|
|
178
|
+
* **クライアントへは .toString() で渡す。** テンプレート文字列の中に正規表現を
|
|
179
|
+
* 手で書くと、バックスラッシュが二重に潰れて別物になる(実際に
|
|
180
|
+
* `\\/` が `/` になり、クライアントJSが構文エラーで丸ごと落ちた)。
|
|
181
|
+
* 既存の sourceNeedsAttention / capabilityState と同じ流儀にする。
|
|
182
|
+
*
|
|
183
|
+
* **判定の正本は Lambda 側**(そちらが書き込む)。ここは確認文の表示用で、
|
|
184
|
+
* 食い違うと「画面はこう見せたのに別のものが書かれた」になるので、
|
|
185
|
+
* 同じ形かをテストで突き合わせている。
|
|
186
|
+
*/
|
|
187
|
+
function backlogTargetOf(input) {
|
|
188
|
+
const s = String(input == null ? "" : input).trim();
|
|
189
|
+
const m = s.match(/^https?:\/\/([a-z0-9-]+\.(?:backlog\.jp|backlog\.com|backlogtool\.com))\/(.*)$/i);
|
|
190
|
+
if (!m)
|
|
191
|
+
return null;
|
|
192
|
+
const domain = m[1].toLowerCase();
|
|
193
|
+
const rest = m[2];
|
|
194
|
+
// **数値のプロジェクトIDは弾く。** 取り違えの検査(艦隊のキーとの照合)を
|
|
195
|
+
// 迂回できてしまう。Backlog はドキュメントのURLをこの形でも出す
|
|
196
|
+
const num = /^[0-9]+$/;
|
|
197
|
+
const head = rest.match(/^(?:projects|document|wiki|find|board|gantt|git)\/([A-Za-z0-9_]+)(?:[/?#]|$)/);
|
|
198
|
+
if (head)
|
|
199
|
+
return num.test(head[1]) ? null : { domain: domain, projectKey: head[1].toUpperCase() };
|
|
200
|
+
const view = rest.match(/^view\/([A-Za-z0-9_]+)-\d+/);
|
|
201
|
+
if (view)
|
|
202
|
+
return num.test(view[1]) ? null : { domain: domain, projectKey: view[1].toUpperCase() };
|
|
203
|
+
return null;
|
|
204
|
+
}
|
|
175
205
|
function capabilityState(cap, ctx) {
|
|
176
206
|
// **能力→パイプラインの対応はここに持つ。** 呼び出し側に渡させると、
|
|
177
207
|
// クライアント側(この関数を .toString() で受け取る側)が同じ表を書き写すことになり、
|
|
@@ -1134,6 +1164,7 @@ const CLIENT_JS = `
|
|
|
1134
1164
|
// 直列化した先(ここ)で undefined を参照して壊れる。
|
|
1135
1165
|
var CAP_OTHER = ${JSON.stringify(CAP_OTHER)};
|
|
1136
1166
|
${externalCapability.toString()}
|
|
1167
|
+
${backlogTargetOf.toString()}
|
|
1137
1168
|
${sourceNeedsAttention.toString()}
|
|
1138
1169
|
${capabilityState.toString()}
|
|
1139
1170
|
// 「はじめに」セクションのチュートリアルデータ(ビルド時に埋め込み。ボタンURL・チャレンジ4の決定は解決済み)
|
|
@@ -1849,14 +1880,34 @@ ${capabilityState.toString()}
|
|
|
1849
1880
|
if (aliases.length) {
|
|
1850
1881
|
// **目印が無くても入る会議。** 既に走っていて改名を頼みにくい定例を、
|
|
1851
1882
|
// いまの名前のまま登録したもの。出さないと「なぜこれだけ入るのか」
|
|
1852
|
-
//
|
|
1853
|
-
|
|
1854
|
-
|
|
1883
|
+
// 「新しい定例をどこに足すのか」が画面から分からない。
|
|
1884
|
+
//
|
|
1885
|
+
// **1件ずつ外せるようにする。** 追加はできて削除はできない、だと
|
|
1886
|
+
// 間違えて登録した名前(日付つきのファイル名など)を消す手段が無い
|
|
1855
1887
|
col.appendChild(el("span", {
|
|
1856
1888
|
class: "ds-keys",
|
|
1857
|
-
text: "目印なしで取り込む会議:
|
|
1889
|
+
text: "目印なしで取り込む会議:",
|
|
1858
1890
|
title: "この名前の会議は、目印が無くてもこの案件に振り分けられます(大小文字・前後の空白は問いません。ファイル名に使えない記号(コロン・スラッシュ等)は同じものとして扱います)。既に走っている定例を改名せずに取り込むための登録です。",
|
|
1859
1891
|
}));
|
|
1892
|
+
var alist = el("div", { class: "ds-subitems" });
|
|
1893
|
+
aliases.forEach(function (a) {
|
|
1894
|
+
var row = el("div", { class: "ds-subitem" }, [el("span", { class: "ds-name", text: a })]);
|
|
1895
|
+
row.appendChild(removeButton({
|
|
1896
|
+
label: "この会議を外す",
|
|
1897
|
+
confirmLines: function () {
|
|
1898
|
+
return [
|
|
1899
|
+
"「" + a + "」を取り込み対象から外します。",
|
|
1900
|
+
"",
|
|
1901
|
+
"以後この名前の会議は、会議名に目印を入れない限り取り込まれません。",
|
|
1902
|
+
"",
|
|
1903
|
+
"外しますか?",
|
|
1904
|
+
];
|
|
1905
|
+
},
|
|
1906
|
+
build: function () { return { op: "remove-meeting-alias", alias: a }; },
|
|
1907
|
+
}));
|
|
1908
|
+
alist.appendChild(row);
|
|
1909
|
+
});
|
|
1910
|
+
col.appendChild(alist);
|
|
1860
1911
|
}
|
|
1861
1912
|
if (s.driveSync === false) {
|
|
1862
1913
|
col.appendChild(el("span", { class: "ds-drive-note", text: "Drive自動同期は未設定(手動で置いたファイルの変換のみ)" }));
|
|
@@ -2345,6 +2396,18 @@ ${capabilityState.toString()}
|
|
|
2345
2396
|
// 宣言で隠すと、動いているのに説明が出ない状態になる。
|
|
2346
2397
|
if (s.kind === "会議" && s.ingestState === "on") {
|
|
2347
2398
|
box.appendChild(meetingHowTo());
|
|
2399
|
+
// **改名を頼めない定例のための逃げ道。** 通常は会議名に【合図】を入れてもらうが、
|
|
2400
|
+
// 顧客が主催する定例では改名を頼めない。実際の会議名をそのまま登録して拾う
|
|
2401
|
+
box.appendChild(addForm({
|
|
2402
|
+
title: "+ 会議名をそのまま取り込み対象にする",
|
|
2403
|
+
placeholder: "例: GDO様 定例",
|
|
2404
|
+
requiredNote: "会議名を入力してください。",
|
|
2405
|
+
hint: "合図(【…】)を入れられない会議のための設定です。ここに入れた名前と**完全に一致する**会議だけが取り込まれます(部分一致はしません)。カレンダーに出ている会議名だけを入れてください——日付や「- Gemini によるメモ」のような後ろに付く文字列を含めると、どの会議とも一致しません。Bot の招待は別途必要です。",
|
|
2406
|
+
confirmLines: function (v) {
|
|
2407
|
+
return ["この名前の会議を取り込み対象にします。", "", v, "", "追加しますか?"];
|
|
2408
|
+
},
|
|
2409
|
+
build: function (alias) { return { op: "add-meeting-alias", alias: alias }; },
|
|
2410
|
+
}));
|
|
2348
2411
|
used = true;
|
|
2349
2412
|
} else if (s.kind === "会議" && usable("会議", "google-meet")) {
|
|
2350
2413
|
if (s.ingestState === "unset") {
|
|
@@ -2362,6 +2425,46 @@ ${capabilityState.toString()}
|
|
|
2362
2425
|
}
|
|
2363
2426
|
}
|
|
2364
2427
|
|
|
2428
|
+
// 課題管理: 接続先(ドメイン・プロジェクトキー)をURL1本で設定する。
|
|
2429
|
+
// **URLを貼らせる。** ドメインとキーを別々に入れさせると「スペースID」
|
|
2430
|
+
// 「プロジェクトキー」「プロジェクト名」の区別が付かず取り違える。
|
|
2431
|
+
// 実データでも cm1.backlog.jp と jleague.backlog.jp が混在している
|
|
2432
|
+
if (s.kind === "課題管理" && usable("課題管理", "backlog")) {
|
|
2433
|
+
// **設定ファイルが無い案件にはフォームを出さない。** 書き込み先が無いので
|
|
2434
|
+
// 貼っても 404 で終わる。三菱電機は tools が backlog なのに
|
|
2435
|
+
// backlog-settings.json が1つも無い(固定IP経由の同期で、UIからの投入は
|
|
2436
|
+
// 鍵と同じく対応していない)。会議・共有資料は unset / broken を文言で
|
|
2437
|
+
// 伝えてフォームを出さない形なので、課題管理だけ不揃いだった
|
|
2438
|
+
if (!s.url) {
|
|
2439
|
+
box.appendChild(el("p", { class: "sec-how", text: "この案件の課題管理の設定ファイル(backlog-settings.json)がまだありません。先に初回の同期を実行するか、担当者にご連絡ください。" }));
|
|
2440
|
+
used = true;
|
|
2441
|
+
} else box.appendChild(addForm({
|
|
2442
|
+
title: "接続先を変更",
|
|
2443
|
+
placeholder: "https://<スペース>.backlog.jp/projects/<プロジェクトキー>",
|
|
2444
|
+
requiredNote: "BacklogのURLを入力してください(プロジェクトキーが入った形。数字だけのURLは受け付けません)。",
|
|
2445
|
+
hint: "Backlog でこの案件のプロジェクトを開き、ブラウザのURLをそのまま貼ってください(課題の画面のURLでも構いません)。APIキーは下の「Backlog のAPIキー」から別に登録します。",
|
|
2446
|
+
confirmLines: function (v) {
|
|
2447
|
+
// **解析した結果を見せる。** 貼ったURLをそのまま出すと、どのプロジェクトを
|
|
2448
|
+
// 指すことになるかが確定前に分からない。実際 /projects/PJ-CORTEX は
|
|
2449
|
+
// ハイフンで切れて PJ と解釈される(黙って別プロジェクトを指す)
|
|
2450
|
+
var t = backlogTargetOf(v);
|
|
2451
|
+
return [
|
|
2452
|
+
"この案件が同期する Backlog プロジェクトを設定します。",
|
|
2453
|
+
"",
|
|
2454
|
+
"別のプロジェクトを指すと、次の同期で別案件の課題が入ります。",
|
|
2455
|
+
"",
|
|
2456
|
+
t ? t.domain + " / " + t.projectKey : v,
|
|
2457
|
+
"",
|
|
2458
|
+
"※ 変わるのは同期先だけです。ビューアからの起票先と Webhook の配送先は別途の対応が要ります。",
|
|
2459
|
+
"",
|
|
2460
|
+
"設定しますか?",
|
|
2461
|
+
];
|
|
2462
|
+
},
|
|
2463
|
+
build: function (url) { return { op: "set-backlog-target", url: url }; },
|
|
2464
|
+
}));
|
|
2465
|
+
used = true;
|
|
2466
|
+
}
|
|
2467
|
+
|
|
2365
2468
|
if (s.kind === "共有資料" && usable("共有資料", "google-drive")) {
|
|
2366
2469
|
if (s.driveState === "unset") {
|
|
2367
2470
|
box.appendChild(el("p", { class: "sec-how", text: "資料の同期設定がこのリポジトリにありません(materials-config.json)。先に設置が必要です。" }));
|
package/package.json
CHANGED