@takagaki/cortex-decisions-viewer 0.4.12 → 0.4.14

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.
Files changed (2) hide show
  1. package/dist/render.js +50 -26
  2. package/package.json +1 -1
package/dist/render.js CHANGED
@@ -370,6 +370,10 @@ button.ops-card-btn:disabled { opacity: .6; cursor: default; }
370
370
  background: var(--surface); color: var(--muted); font-size: 13px; font-weight: 600; cursor: pointer;
371
371
  }
372
372
  .modal-cancel:hover { background: var(--bg); }
373
+ .modal-ok { color: #047857; font-weight: 600; }
374
+ .modal-paths { margin-top: 8px; display: flex; flex-direction: column; gap: 4px; }
375
+ .modal-paths-label { font-size: 12px; color: var(--muted); }
376
+ .modal-path { font-size: 12.5px; word-break: break-all; color: var(--accent); }
373
377
  .summary-box { background: var(--accent-weak); border: 1px solid #dce6fb; border-radius: var(--radius); padding: 12px 16px; color: #1e3a8a; }
374
378
  .deciders { display: flex; flex-wrap: wrap; gap: 8px; }
375
379
  .refs { margin: 0; padding-left: 18px; }
@@ -660,14 +664,12 @@ const CLIENT_JS = `
660
664
  var modal = el("div", { class: "modal" });
661
665
  modal.appendChild(el("h2", { class: "modal-title", text: isT ? "会議の文字起こしを追加" : "共有資料を追加" }));
662
666
  modal.appendChild(el("p", { class: "modal-desc", text: isT
663
- ? "文字起こしファイル(.txt / .docx 等)を選ぶか、下のテキスト欄に貼り付けてください。送信すると議事録を自動生成します。"
664
- : "資料ファイル(PDF / PPT / Excel 等)を選ぶか、下のテキスト欄に内容を貼り付けてください。送信すると Markdown 化して取り込みます。" }));
667
+ ? "文字起こしファイル(.txt / .docx 等)を選んで送信すると、議事録を自動生成します。"
668
+ : "資料ファイル(PDF / PPT / Excel 等)を選んで送信すると、Markdown 化して取り込みます。" }));
665
669
  var fileInput = el("input", { type: "file", multiple: "multiple", class: "modal-file" });
666
- var nameInput = el("input", { type: "text", class: "modal-name", placeholder: "お名前(任意・投入者として記録されます)" });
667
- var textArea = el("textarea", { class: "modal-text", rows: "5", placeholder: isT ? "(任意)文字起こしテキストを直接貼り付け" : "(任意)テキスト内容やメモを直接入力" });
668
- modal.appendChild(fieldRow("ファイル", fileInput));
669
- modal.appendChild(fieldRow("お名前", nameInput));
670
- modal.appendChild(fieldRow("テキスト(自由入力)", textArea));
670
+ var nameInput = el("input", { type: "text", class: "modal-name", placeholder: "投入者として記録されます" });
671
+ modal.appendChild(fieldRow("ファイル(必須)", fileInput));
672
+ modal.appendChild(fieldRow("お名前(必須)", nameInput));
671
673
  var status = el("div", { class: "modal-status" });
672
674
  var cancelBtn = el("button", { class: "modal-cancel", text: "閉じる" });
673
675
  var submitBtn = el("button", { class: "ops-card-btn", text: "送信" });
@@ -679,40 +681,62 @@ const CLIENT_JS = `
679
681
  cancelBtn.addEventListener("click", close);
680
682
  overlay.addEventListener("click", function (e) { if (e.target === overlay) close(); });
681
683
  submitBtn.addEventListener("click", function () {
682
- submitIntake(kind, fileInput.files, textArea.value, nameInput.value, status, submitBtn);
684
+ submitIntake(kind, fileInput.files, nameInput.value, status, submitBtn);
683
685
  });
684
686
  }
685
- async function submitIntake(kind, fileList, text, submitter, status, submitBtn) {
687
+ async function submitIntake(kind, fileList, submitter, status, submitBtn) {
686
688
  var intake = SITE.intake;
687
689
  var files = fileList ? Array.prototype.slice.call(fileList) : [];
688
- if (!files.length && !(text && text.trim())) { status.textContent = "ファイルかテキストを入力してください。"; return; }
690
+ // 必須: お名前 ファイル
691
+ if (!submitter || !submitter.trim()) { status.textContent = "⚠ お名前を入力してください。"; return; }
692
+ if (!files.length) { status.textContent = "⚠ ファイルを選択してください。"; return; }
689
693
  submitBtn.disabled = true;
690
694
  var pfx = intake.url + (intake.url.indexOf("?") === -1 ? "?" : "&");
695
+ function fail(msg) { status.textContent = "✗ " + msg; submitBtn.disabled = false; }
691
696
  try {
692
697
  var uploaded = [];
693
698
  for (var i = 0; i < files.length; i++) {
694
699
  var f = files[i];
695
700
  status.textContent = "アップロード中… (" + (i + 1) + "/" + files.length + ") " + f.name;
696
- var pres = await fetch(pfx + "op=presign&t=" + encodeURIComponent(intake.token), {
697
- method: "POST", headers: { "content-type": "application/json" },
698
- body: JSON.stringify({ projectKey: intake.projectKey, filename: f.name, contentType: f.type || "application/octet-stream" }),
699
- }).then(function (r) { return r.json(); });
700
- if (!pres.url) throw new Error(pres.message || "アップロードURLの取得に失敗しました");
701
- var put = await fetch(pres.url, { method: "PUT", headers: { "content-type": f.type || "application/octet-stream" }, body: f });
702
- if (!put.ok) throw new Error("アップロードに失敗しました (" + put.status + ")");
703
- uploaded.push({ key: pres.key, filename: f.name });
701
+ var pres;
702
+ try {
703
+ pres = await fetch(pfx + "op=presign&t=" + encodeURIComponent(intake.token), {
704
+ method: "POST", headers: { "content-type": "application/json" },
705
+ body: JSON.stringify({ projectKey: intake.projectKey, filename: f.name, contentType: f.type || "application/octet-stream" }),
706
+ }).then(function (r) { return r.json().then(function (j) { return { ok: r.ok, j: j }; }); });
707
+ } catch (net) { return fail("サーバーに接続できませんでした。通信環境を確認して、もう一度お試しください。"); }
708
+ if (!pres.ok || !pres.j.url) return fail((pres.j && pres.j.message) || "アップロードURLの取得に失敗しました。対応していないファイル形式かもしれません。");
709
+ var put;
710
+ try {
711
+ put = await fetch(pres.j.url, { method: "PUT", headers: { "content-type": f.type || "application/octet-stream" }, body: f });
712
+ } catch (net2) { return fail("ファイルのアップロードに失敗しました(通信エラー)。もう一度お試しください。"); }
713
+ if (!put.ok) return fail("ファイルのアップロードに失敗しました(" + put.status + ")。ファイルのサイズ・形式をご確認ください。");
714
+ uploaded.push({ key: pres.j.key, filename: f.name });
704
715
  }
705
716
  status.textContent = "取り込み中…";
706
- var sub = await fetch(pfx + "op=submit&t=" + encodeURIComponent(intake.token), {
707
- method: "POST", headers: { "content-type": "application/json" },
708
- body: JSON.stringify({ projectKey: intake.projectKey, kind: kind, files: uploaded, text: text || "", submitter: submitter || "" }),
709
- }).then(function (r) { return r.json().then(function (j) { return { ok: r.ok, j: j }; }); });
710
- if (!sub.ok) throw new Error((sub.j && sub.j.message) || "取り込みに失敗しました");
711
- status.textContent = "✓ 送信しました。数分後に" + (kind === "transcript" ? "議事録" : "資料") + "が反映されます。";
717
+ var sub;
718
+ try {
719
+ sub = await fetch(pfx + "op=submit&t=" + encodeURIComponent(intake.token), {
720
+ method: "POST", headers: { "content-type": "application/json" },
721
+ body: JSON.stringify({ projectKey: intake.projectKey, kind: kind, files: uploaded, submitter: submitter.trim() }),
722
+ }).then(function (r) { return r.json().then(function (j) { return { ok: r.ok, j: j }; }); });
723
+ } catch (net3) { return fail("サーバーに接続できませんでした。もう一度お試しください。"); }
724
+ if (!sub.ok) return fail((sub.j && sub.j.message) || "取り込みに失敗しました。時間をおいて再度お試しください。");
725
+ status.textContent = "";
726
+ status.appendChild(el("div", { class: "modal-ok", text: "✓ 送信しました。数分後に" + (kind === "transcript" ? "議事録" : "資料") + "が反映されます。" }));
727
+ var paths = (sub.j && sub.j.committed) || [];
728
+ if (paths.length && sub.j.repo) {
729
+ var br = SITE.branch || "main";
730
+ var box = el("div", { class: "modal-paths" }, [el("div", { class: "modal-paths-label", text: "保存先(GitHub):" })]);
731
+ paths.forEach(function (p) {
732
+ var href = "https://github.com/" + sub.j.repo + "/blob/" + encodeURIComponent(br) + "/" + p.split("/").map(encodeURIComponent).join("/");
733
+ box.appendChild(el("a", { class: "modal-path", href: href, target: "_blank", rel: "noopener", text: p }));
734
+ });
735
+ status.appendChild(box);
736
+ }
712
737
  submitBtn.textContent = "完了";
713
738
  } catch (e) {
714
- status.textContent = "✗ " + (e && e.message ? e.message : "エラーが発生しました");
715
- submitBtn.disabled = false;
739
+ fail(e && e.message ? e.message : "予期しないエラーが発生しました。");
716
740
  }
717
741
  }
718
742
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@takagaki/cortex-decisions-viewer",
3
- "version": "0.4.12",
3
+ "version": "0.4.14",
4
4
  "description": "Cortexの意思決定記録(Decisions/*.md)を静的サイトにビルドして閲覧する。各レコードに「Edit on GitHub」リンクを付与する。",
5
5
  "license": "UNLICENSED",
6
6
  "private": false,