@aiquants/daily-report 0.1.1

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 (73) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +150 -0
  3. package/dist/client.d.mts +449 -0
  4. package/dist/client.d.ts +449 -0
  5. package/dist/client.js +7 -0
  6. package/dist/client.js.map +1 -0
  7. package/dist/client.mjs +7 -0
  8. package/dist/client.mjs.map +1 -0
  9. package/dist/index.d.mts +42 -0
  10. package/dist/index.d.ts +42 -0
  11. package/dist/index.js +2 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/index.mjs +2 -0
  14. package/dist/index.mjs.map +1 -0
  15. package/dist/logger-D3krZrNK.d.mts +29 -0
  16. package/dist/logger-D3krZrNK.d.ts +29 -0
  17. package/dist/server.d.mts +1515 -0
  18. package/dist/server.d.ts +1515 -0
  19. package/dist/server.js +10 -0
  20. package/dist/server.js.map +1 -0
  21. package/dist/server.mjs +10 -0
  22. package/dist/server.mjs.map +1 -0
  23. package/dist/sse-schema-CK7cUnEo.d.ts +1986 -0
  24. package/dist/sse-schema-yl5AaSsj.d.mts +1986 -0
  25. package/dist/types-CVhwLhSN.d.mts +76 -0
  26. package/dist/types-CVhwLhSN.d.ts +76 -0
  27. package/package.json +108 -0
  28. package/src/client/components/business-day-thumb-overlay.tsx +19 -0
  29. package/src/client/components/daily-report-comment-item.tsx +81 -0
  30. package/src/client/components/daily-report-comment-section.tsx +166 -0
  31. package/src/client/components/daily-report-detail-list.tsx +676 -0
  32. package/src/client/components/daily-report-edit-form.tsx +81 -0
  33. package/src/client/components/daily-report-list.tsx +1024 -0
  34. package/src/client/components/daily-report-page.tsx +147 -0
  35. package/src/client/components/daily-report-resolved-content.tsx +139 -0
  36. package/src/client/components/unread-indicator.tsx +13 -0
  37. package/src/client/config-context.tsx +129 -0
  38. package/src/client/contexts/daily-report-action-context.tsx +910 -0
  39. package/src/client/hooks/use-daily-report-comments.ts +73 -0
  40. package/src/client/hooks/use-daily-report-sse-connection.ts +86 -0
  41. package/src/client/hooks/use-daily-report.spec.ts +155 -0
  42. package/src/client/hooks/use-daily-report.ts +426 -0
  43. package/src/client/hooks/use-dynamic-viewport-height.ts +127 -0
  44. package/src/client/route-helpers.ts +76 -0
  45. package/src/client/ui/button.tsx +42 -0
  46. package/src/client/ui/cn.ts +14 -0
  47. package/src/client/ui/input.tsx +21 -0
  48. package/src/client/ui/label.tsx +16 -0
  49. package/src/client/ui/switch.tsx +19 -0
  50. package/src/client/ui/tabs.tsx +40 -0
  51. package/src/client/ui/textarea.tsx +19 -0
  52. package/src/client/utils/constants.ts +29 -0
  53. package/src/client.ts +21 -0
  54. package/src/index.ts +10 -0
  55. package/src/server/cache.ts +165 -0
  56. package/src/server/etag.ts +18 -0
  57. package/src/server/external-source.ts +60 -0
  58. package/src/server/handlers.ts +543 -0
  59. package/src/server/ports.ts +68 -0
  60. package/src/server/response.ts +37 -0
  61. package/src/server/schema.ts +266 -0
  62. package/src/server/service.spec.ts +97 -0
  63. package/src/server/service.ts +1308 -0
  64. package/src/server/sse-reader.spec.ts +55 -0
  65. package/src/server/sse-reader.ts +223 -0
  66. package/src/server.ts +83 -0
  67. package/src/shared/business-date.spec.ts +61 -0
  68. package/src/shared/business-date.ts +84 -0
  69. package/src/shared/comment-adapter.ts +78 -0
  70. package/src/shared/logger.ts +47 -0
  71. package/src/shared/sse-schema.ts +147 -0
  72. package/src/shared/text-utils.ts +57 -0
  73. package/src/shared/types.ts +76 -0
@@ -0,0 +1,81 @@
1
+ import { useEffect, useRef, useState } from "react"
2
+ import type { DailyReportDetail } from "../../shared/types"
3
+ import { useDailyReportActionContext } from "../contexts/daily-report-action-context"
4
+ import { Button } from "../ui/button"
5
+ import { Input } from "../ui/input"
6
+ import { Label } from "../ui/label"
7
+ import { Textarea } from "../ui/textarea"
8
+
9
+ type DailyReportEditFormProps = {
10
+ report: DailyReportDetail
11
+ onCancel?: () => void
12
+ onPublishSuccess?: () => void
13
+ }
14
+
15
+ export const DailyReportEditForm = ({ report, onCancel, onPublishSuccess }: DailyReportEditFormProps) => {
16
+ const { updateReport, publishReport } = useDailyReportActionContext()
17
+ const [title, setTitle] = useState(report.subject ?? "")
18
+ const [content, setContent] = useState(report.content ?? "")
19
+ const [isSaving, setIsSaving] = useState(false)
20
+
21
+ // 同一レポート編集中に SSE/キャッシュ更新でフォームがリセットされるのを防止するための ID 追跡
22
+ const syncedReportIdRef = useRef(report.reportHubId)
23
+
24
+ // レポート切り替え時のみフォーム状態を同期する (同一レポートのキャッシュ更新ではリセットしない)
25
+ useEffect(() => {
26
+ if (report.reportHubId !== syncedReportIdRef.current) {
27
+ setTitle(report.subject ?? "")
28
+ setContent(report.content ?? "")
29
+ syncedReportIdRef.current = report.reportHubId
30
+ }
31
+ }, [report.reportHubId, report.subject, report.content])
32
+
33
+ const handleSave = async () => {
34
+ setIsSaving(true)
35
+ try {
36
+ await updateReport(report.reportHubId, { title, content }, report.date ?? "")
37
+ } finally {
38
+ setIsSaving(false)
39
+ }
40
+ }
41
+
42
+ const handlePublish = async () => {
43
+ setIsSaving(true)
44
+ try {
45
+ // Ensure latest changes are saved before publishing
46
+ await updateReport(report.reportHubId, { title, content }, report.date ?? "")
47
+ await publishReport(report.reportHubId, report.date ?? "")
48
+ onPublishSuccess?.()
49
+ } finally {
50
+ setIsSaving(false)
51
+ }
52
+ }
53
+
54
+ return (
55
+ <div className="space-y-6 p-1">
56
+ <div className="space-y-2">
57
+ <Label htmlFor={`report-title-${report.reportHubId}`}>タイトル</Label>
58
+ <Input id={`report-title-${report.reportHubId}`} value={title} onChange={(e) => setTitle(e.target.value)} placeholder="日報のタイトルを入力" disabled={isSaving} />
59
+ </div>
60
+
61
+ <div className="space-y-2">
62
+ <Label htmlFor={`report-content-${report.reportHubId}`}>内容</Label>
63
+ <Textarea id={`report-content-${report.reportHubId}`} value={content} onChange={(e) => setContent(e.target.value)} placeholder="日報の内容を入力" className="min-h-50" disabled={isSaving} />
64
+ </div>
65
+
66
+ <div className="flex justify-end gap-2">
67
+ {onCancel && (
68
+ <Button variant="outline" onClick={onCancel} disabled={isSaving}>
69
+ キャンセル
70
+ </Button>
71
+ )}
72
+ <Button variant="secondary" onClick={handleSave} disabled={isSaving}>
73
+ 保存
74
+ </Button>
75
+ <Button onClick={handlePublish} disabled={isSaving}>
76
+ 公開
77
+ </Button>
78
+ </div>
79
+ </div>
80
+ )
81
+ }