@takagaki/cortex-decisions-viewer 0.4.21 → 0.4.23
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 +7 -0
- package/dist/render.js +89 -22
- package/package.json +1 -1
package/dist/build.js
CHANGED
|
@@ -145,6 +145,10 @@ async function readFleetSources(repoRoot) {
|
|
|
145
145
|
label: String(s.label ?? ""),
|
|
146
146
|
url: s.url != null ? String(s.url) : undefined,
|
|
147
147
|
lastSync: s.lastSync != null ? String(s.lastSync) : undefined,
|
|
148
|
+
matchKeys: Array.isArray(s.matchKeys)
|
|
149
|
+
? s.matchKeys.map((k) => String(k)).filter(Boolean)
|
|
150
|
+
: undefined,
|
|
151
|
+
driveSync: typeof s.driveSync === "boolean" ? s.driveSync : undefined,
|
|
148
152
|
}))
|
|
149
153
|
: undefined;
|
|
150
154
|
const pipelines = Array.isArray(obj.pipelines)
|
|
@@ -154,6 +158,9 @@ async function readFleetSources(repoRoot) {
|
|
|
154
158
|
id: String(p.id ?? ""),
|
|
155
159
|
label: String(p.label ?? ""),
|
|
156
160
|
lastSuccess: p.lastSuccess != null ? String(p.lastSuccess) : undefined,
|
|
161
|
+
lastConclusion: p.lastConclusion != null ? String(p.lastConclusion) : undefined,
|
|
162
|
+
lastRun: p.lastRun != null ? String(p.lastRun) : undefined,
|
|
163
|
+
applicable: typeof p.applicable === "boolean" ? p.applicable : undefined,
|
|
157
164
|
}))
|
|
158
165
|
: undefined;
|
|
159
166
|
return { externalSources, internalSources, pipelines };
|
package/dist/render.js
CHANGED
|
@@ -343,6 +343,23 @@ a.ds-name { color: var(--accent); }
|
|
|
343
343
|
a.ds-name:hover { text-decoration: underline; }
|
|
344
344
|
.ds-note { color: var(--muted); font-size: 12px; line-height: 1.7; margin: 6px 0 0; }
|
|
345
345
|
.ds-sync { font-size: 12.5px; color: var(--muted); font-variant-numeric: tabular-nums; flex: 0 0 auto; }
|
|
346
|
+
.ds-col { display: flex; flex-direction: column; gap: 3px; min-width: 0; flex: 1 1 auto; }
|
|
347
|
+
.ds-keys { font-size: 12px; color: var(--muted); line-height: 1.6; }
|
|
348
|
+
.ds-drive-note { font-size: 12px; color: #6b7280; line-height: 1.6; }
|
|
349
|
+
.ds-group { border: none; margin: 0; }
|
|
350
|
+
.ds-group > summary {
|
|
351
|
+
display: flex; align-items: center; flex-wrap: wrap; gap: 8px 12px; cursor: pointer;
|
|
352
|
+
background: var(--surface); border: 1px solid var(--border); border-radius: 12px;
|
|
353
|
+
padding: 14px 16px; box-shadow: var(--shadow); font-size: 14.5px; font-weight: 600; color: var(--text);
|
|
354
|
+
list-style: none;
|
|
355
|
+
}
|
|
356
|
+
.ds-group > summary::-webkit-details-marker { display: none; }
|
|
357
|
+
.ds-group > summary::after { content: "▸"; margin-left: auto; color: var(--muted); font-size: 12px; }
|
|
358
|
+
.ds-group[open] > summary::after { content: "▾"; }
|
|
359
|
+
.ds-group[open] > summary { border-bottom-left-radius: 0; border-bottom-right-radius: 0; }
|
|
360
|
+
.ds-group > .ds-list { margin-top: 8px; padding-left: 12px; border-left: 2px solid var(--border); }
|
|
361
|
+
.badge.ds-sum-ok { background: #e9f7ef; color: #1f7a45; }
|
|
362
|
+
.badge.ds-sum-warn { background: #fef3c7; color: #92400e; border: 1px solid #fcd34d; }
|
|
346
363
|
.ds-badges { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; flex: 0 0 auto; }
|
|
347
364
|
.badge.ds-gold { background: #fef3c7; color: #92400e; border: 1px solid #fcd34d; }
|
|
348
365
|
.badge.ds-excluded { background: #eceef1; color: #6b7280; }
|
|
@@ -359,6 +376,7 @@ a.ds-name:hover { text-decoration: underline; }
|
|
|
359
376
|
}
|
|
360
377
|
.ds-pipe-label { font-size: 14px; font-weight: 600; color: var(--text); }
|
|
361
378
|
.ds-pipe-time { font-size: 12.5px; color: var(--muted); font-variant-numeric: tabular-nums; }
|
|
379
|
+
.ds-pipe-status { font-size: 13px; line-height: 1; flex: 0 0 auto; }
|
|
362
380
|
/* ---- 操作タブ ---- */
|
|
363
381
|
.ops-intro { color: var(--muted); font-size: 14px; line-height: 1.8; margin: 4px 0 8px; }
|
|
364
382
|
.ops-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 14px; }
|
|
@@ -717,7 +735,9 @@ const CLIENT_JS = `
|
|
|
717
735
|
function renderDataSources() {
|
|
718
736
|
var internals = SITE.internalSources || [];
|
|
719
737
|
var sources = SITE.externalSources || [];
|
|
720
|
-
|
|
738
|
+
// tools宣言上この案件の対象外(applicable: false)のパイプラインは載せない
|
|
739
|
+
// (スキップ正常終了のrunが成功表示に見えるため)。フィールド無しは従来どおり表示する。
|
|
740
|
+
var pipes = (SITE.pipelines || []).filter(function (p) { return p.applicable !== false; });
|
|
721
741
|
if (!internals.length && !sources.length && !pipes.length) return; // すべて無ければセクションごと出さない
|
|
722
742
|
|
|
723
743
|
var sec = el("section", { class: "datasources" });
|
|
@@ -728,11 +748,26 @@ const CLIENT_JS = `
|
|
|
728
748
|
sec.appendChild(el("div", { class: "ds-sub", text: "リポジトリ内の情報源(自動同期)" }));
|
|
729
749
|
var ilist = el("div", { class: "ds-list" });
|
|
730
750
|
internals.forEach(function (s) {
|
|
751
|
+
// ラベルの下に補足行(会議の照合キー・Drive未設定の注記)を重ねられるよう縦組みにする
|
|
752
|
+
var col = el("div", { class: "ds-col" }, [ dsNameEl(s.label || "", s.url) ]);
|
|
753
|
+
var keys = s.matchKeys || [];
|
|
754
|
+
if (keys.length) {
|
|
755
|
+
var shown = keys.slice(0, 5).join(" / ");
|
|
756
|
+
if (keys.length > 5) shown += " 他" + (keys.length - 5) + "件";
|
|
757
|
+
col.appendChild(el("span", {
|
|
758
|
+
class: "ds-keys",
|
|
759
|
+
text: "取り込み対象の会議名: " + shown,
|
|
760
|
+
title: "会議名にこれらの語が含まれていると、自動でこのCortexに取り込まれます",
|
|
761
|
+
}));
|
|
762
|
+
}
|
|
763
|
+
if (s.driveSync === false) {
|
|
764
|
+
col.appendChild(el("span", { class: "ds-drive-note", text: "Drive自動同期は未設定(手動で置いたファイルの変換のみ)" }));
|
|
765
|
+
}
|
|
731
766
|
var card = el("div", { class: "ds-card" }, [
|
|
732
767
|
el("div", { class: "ds-card-main" }, [
|
|
733
768
|
el("span", { class: "ds-icon", text: DS_KIND_ICON[s.kind] || "📁" }),
|
|
734
769
|
el("span", { class: "ds-type", text: s.kind || "" }),
|
|
735
|
-
|
|
770
|
+
col,
|
|
736
771
|
]),
|
|
737
772
|
s.lastSync && dsFmtTime(s.lastSync)
|
|
738
773
|
? el("span", { class: "ds-sync", text: "最終同期: " + dsFmtTime(s.lastSync) })
|
|
@@ -746,27 +781,36 @@ const CLIENT_JS = `
|
|
|
746
781
|
|
|
747
782
|
if (sources.length) {
|
|
748
783
|
sec.appendChild(el("div", { class: "ds-sub", text: "外部ソース(ライブ参照)" }));
|
|
749
|
-
|
|
784
|
+
// ツール(type)別にグループ化し、多いグループ(4件以上)は折りたたむ
|
|
785
|
+
var groups = [];
|
|
786
|
+
var byType = {};
|
|
750
787
|
sources.forEach(function (s) {
|
|
751
|
-
var
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
else if (s.gold === false) badges.appendChild(el("span", { class: "badge ds-excluded", text: "除外" }));
|
|
755
|
-
if (s.notify === true) badges.appendChild(el("span", { class: "badge ds-notify", text: "通知先" }));
|
|
756
|
-
var gate = DS_GATE[s.gate] || DS_GATE["unknown"];
|
|
757
|
-
var gateEl = el("span", { class: "ds-gate " + gate.cls, text: gate.text });
|
|
758
|
-
var card = el("div", { class: "ds-card" }, [
|
|
759
|
-
el("div", { class: "ds-card-main" }, [
|
|
760
|
-
el("span", { class: "ds-icon", text: meta.icon }),
|
|
761
|
-
el("span", { class: "ds-type", text: meta.label }),
|
|
762
|
-
dsNameEl(s.name || "", s.url),
|
|
763
|
-
]),
|
|
764
|
-
badges,
|
|
765
|
-
gateEl,
|
|
766
|
-
]);
|
|
767
|
-
list.appendChild(card);
|
|
788
|
+
var g = byType[s.type];
|
|
789
|
+
if (!g) { g = { type: s.type, items: [] }; byType[s.type] = g; groups.push(g); }
|
|
790
|
+
g.items.push(s);
|
|
768
791
|
});
|
|
769
|
-
|
|
792
|
+
var UNIT = { "slack": "チャンネル", "github-issues": "リポジトリ", "github-discussions": "リポジトリ" };
|
|
793
|
+
var wrap = el("div", { class: "ds-list" });
|
|
794
|
+
groups.forEach(function (g) {
|
|
795
|
+
var meta = DS_TYPE[g.type] || { icon: "🔗", label: g.type || "その他" };
|
|
796
|
+
var cards = el("div", { class: "ds-list" });
|
|
797
|
+
g.items.forEach(function (s) { cards.appendChild(extSourceCard(s, meta)); });
|
|
798
|
+
if (g.items.length >= 4) {
|
|
799
|
+
// 折りたたみ(既定は閉)。summaryに件数と状態の要約を出す
|
|
800
|
+
var bad = 0;
|
|
801
|
+
g.items.forEach(function (s) { if (s.gate !== "ok") bad++; });
|
|
802
|
+
var sum = el("summary", {}, [
|
|
803
|
+
el("span", { text: meta.icon + " " + meta.label + "(" + g.items.length + (UNIT[g.type] || "件") + ")" }),
|
|
804
|
+
bad === 0
|
|
805
|
+
? el("span", { class: "badge ds-sum-ok", text: "接続OK" })
|
|
806
|
+
: el("span", { class: "badge ds-sum-warn", text: "⚠️ " + bad + "件に問題" }),
|
|
807
|
+
]);
|
|
808
|
+
wrap.appendChild(el("details", { class: "ds-group" }, [sum, cards]));
|
|
809
|
+
} else {
|
|
810
|
+
while (cards.firstChild) wrap.appendChild(cards.firstChild);
|
|
811
|
+
}
|
|
812
|
+
});
|
|
813
|
+
sec.appendChild(wrap);
|
|
770
814
|
}
|
|
771
815
|
|
|
772
816
|
if (pipes.length) {
|
|
@@ -774,7 +818,13 @@ const CLIENT_JS = `
|
|
|
774
818
|
var plist = el("div", { class: "ds-pipes" });
|
|
775
819
|
pipes.forEach(function (p) {
|
|
776
820
|
var t = p.lastSuccess ? dsFmtTime(p.lastSuccess) : "";
|
|
777
|
-
var children = [
|
|
821
|
+
var children = [];
|
|
822
|
+
if (p.lastConclusion === "success") {
|
|
823
|
+
children.push(el("span", { class: "ds-pipe-status", text: "✅", title: "直近の実行は成功しています" }));
|
|
824
|
+
} else if (p.lastConclusion === "failure") {
|
|
825
|
+
children.push(el("span", { class: "ds-pipe-status", text: "❌", title: "直近の実行が失敗しています" }));
|
|
826
|
+
}
|
|
827
|
+
children.push(el("span", { class: "ds-pipe-label", text: p.label || p.id || "" }));
|
|
778
828
|
if (t) children.push(el("span", { class: "ds-pipe-time", text: "最終成功: " + t }));
|
|
779
829
|
plist.appendChild(el("div", { class: "ds-pipe" }, children));
|
|
780
830
|
});
|
|
@@ -783,6 +833,23 @@ const CLIENT_JS = `
|
|
|
783
833
|
|
|
784
834
|
app.appendChild(sec);
|
|
785
835
|
}
|
|
836
|
+
// 外部ソース1件のカード(グループ化表示・展開表示の両方から使う)
|
|
837
|
+
function extSourceCard(s, meta) {
|
|
838
|
+
var badges = el("div", { class: "ds-badges" });
|
|
839
|
+
if (s.gold === true) badges.appendChild(el("span", { class: "badge ds-gold", text: "Gold昇格の読み取り対象" }));
|
|
840
|
+
else if (s.gold === false) badges.appendChild(el("span", { class: "badge ds-excluded", text: "除外" }));
|
|
841
|
+
if (s.notify === true) badges.appendChild(el("span", { class: "badge ds-notify", text: "通知先" }));
|
|
842
|
+
var gate = DS_GATE[s.gate] || DS_GATE["unknown"];
|
|
843
|
+
return el("div", { class: "ds-card" }, [
|
|
844
|
+
el("div", { class: "ds-card-main" }, [
|
|
845
|
+
el("span", { class: "ds-icon", text: meta.icon }),
|
|
846
|
+
el("span", { class: "ds-type", text: meta.label }),
|
|
847
|
+
dsNameEl(s.name || "", s.url),
|
|
848
|
+
]),
|
|
849
|
+
badges,
|
|
850
|
+
el("span", { class: "ds-gate " + gate.cls, text: gate.text }),
|
|
851
|
+
]);
|
|
852
|
+
}
|
|
786
853
|
|
|
787
854
|
// ---------- 操作タブ(Cortex自体への操作。まずは取り込み。今後この受け皿に機能を足す) ----------
|
|
788
855
|
function renderOps() {
|
package/package.json
CHANGED