@takagaki/cortex-decisions-viewer 0.4.12 → 0.4.13

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 +35 -26
  2. package/package.json +1 -1
package/dist/render.js CHANGED
@@ -660,14 +660,12 @@ const CLIENT_JS = `
660
660
  var modal = el("div", { class: "modal" });
661
661
  modal.appendChild(el("h2", { class: "modal-title", text: isT ? "会議の文字起こしを追加" : "共有資料を追加" }));
662
662
  modal.appendChild(el("p", { class: "modal-desc", text: isT
663
- ? "文字起こしファイル(.txt / .docx 等)を選ぶか、下のテキスト欄に貼り付けてください。送信すると議事録を自動生成します。"
664
- : "資料ファイル(PDF / PPT / Excel 等)を選ぶか、下のテキスト欄に内容を貼り付けてください。送信すると Markdown 化して取り込みます。" }));
663
+ ? "文字起こしファイル(.txt / .docx 等)を選んで送信すると、議事録を自動生成します。"
664
+ : "資料ファイル(PDF / PPT / Excel 等)を選んで送信すると、Markdown 化して取り込みます。" }));
665
665
  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));
666
+ var nameInput = el("input", { type: "text", class: "modal-name", placeholder: "投入者として記録されます" });
667
+ modal.appendChild(fieldRow("ファイル(必須)", fileInput));
668
+ modal.appendChild(fieldRow("お名前(必須)", nameInput));
671
669
  var status = el("div", { class: "modal-status" });
672
670
  var cancelBtn = el("button", { class: "modal-cancel", text: "閉じる" });
673
671
  var submitBtn = el("button", { class: "ops-card-btn", text: "送信" });
@@ -679,40 +677,51 @@ const CLIENT_JS = `
679
677
  cancelBtn.addEventListener("click", close);
680
678
  overlay.addEventListener("click", function (e) { if (e.target === overlay) close(); });
681
679
  submitBtn.addEventListener("click", function () {
682
- submitIntake(kind, fileInput.files, textArea.value, nameInput.value, status, submitBtn);
680
+ submitIntake(kind, fileInput.files, nameInput.value, status, submitBtn);
683
681
  });
684
682
  }
685
- async function submitIntake(kind, fileList, text, submitter, status, submitBtn) {
683
+ async function submitIntake(kind, fileList, submitter, status, submitBtn) {
686
684
  var intake = SITE.intake;
687
685
  var files = fileList ? Array.prototype.slice.call(fileList) : [];
688
- if (!files.length && !(text && text.trim())) { status.textContent = "ファイルかテキストを入力してください。"; return; }
686
+ // 必須: お名前 ファイル
687
+ if (!submitter || !submitter.trim()) { status.textContent = "⚠ お名前を入力してください。"; return; }
688
+ if (!files.length) { status.textContent = "⚠ ファイルを選択してください。"; return; }
689
689
  submitBtn.disabled = true;
690
690
  var pfx = intake.url + (intake.url.indexOf("?") === -1 ? "?" : "&");
691
+ function fail(msg) { status.textContent = "✗ " + msg; submitBtn.disabled = false; }
691
692
  try {
692
693
  var uploaded = [];
693
694
  for (var i = 0; i < files.length; i++) {
694
695
  var f = files[i];
695
696
  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 });
697
+ var pres;
698
+ try {
699
+ pres = await fetch(pfx + "op=presign&t=" + encodeURIComponent(intake.token), {
700
+ method: "POST", headers: { "content-type": "application/json" },
701
+ body: JSON.stringify({ projectKey: intake.projectKey, filename: f.name, contentType: f.type || "application/octet-stream" }),
702
+ }).then(function (r) { return r.json().then(function (j) { return { ok: r.ok, j: j }; }); });
703
+ } catch (net) { return fail("サーバーに接続できませんでした。通信環境を確認して、もう一度お試しください。"); }
704
+ if (!pres.ok || !pres.j.url) return fail((pres.j && pres.j.message) || "アップロードURLの取得に失敗しました。対応していないファイル形式かもしれません。");
705
+ var put;
706
+ try {
707
+ put = await fetch(pres.j.url, { method: "PUT", headers: { "content-type": f.type || "application/octet-stream" }, body: f });
708
+ } catch (net2) { return fail("ファイルのアップロードに失敗しました(通信エラー)。もう一度お試しください。"); }
709
+ if (!put.ok) return fail("ファイルのアップロードに失敗しました(" + put.status + ")。ファイルのサイズ・形式をご確認ください。");
710
+ uploaded.push({ key: pres.j.key, filename: f.name });
704
711
  }
705
712
  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" ? "議事録" : "資料") + "が反映されます。";
713
+ var sub;
714
+ try {
715
+ sub = await fetch(pfx + "op=submit&t=" + encodeURIComponent(intake.token), {
716
+ method: "POST", headers: { "content-type": "application/json" },
717
+ body: JSON.stringify({ projectKey: intake.projectKey, kind: kind, files: uploaded, submitter: submitter.trim() }),
718
+ }).then(function (r) { return r.json().then(function (j) { return { ok: r.ok, j: j }; }); });
719
+ } catch (net3) { return fail("サーバーに接続できませんでした。もう一度お試しください。"); }
720
+ if (!sub.ok) return fail((sub.j && sub.j.message) || "取り込みに失敗しました。時間をおいて再度お試しください。");
721
+ status.textContent = "✓ 送信しました。数分後に" + (kind === "transcript" ? "議事録" : "資料") + "が反映されます。閉じて構いません。";
712
722
  submitBtn.textContent = "完了";
713
723
  } catch (e) {
714
- status.textContent = "✗ " + (e && e.message ? e.message : "エラーが発生しました");
715
- submitBtn.disabled = false;
724
+ fail(e && e.message ? e.message : "予期しないエラーが発生しました。");
716
725
  }
717
726
  }
718
727
 
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.13",
4
4
  "description": "Cortexの意思決定記録(Decisions/*.md)を静的サイトにビルドして閲覧する。各レコードに「Edit on GitHub」リンクを付与する。",
5
5
  "license": "UNLICENSED",
6
6
  "private": false,