@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.
- package/LICENSE +21 -0
- package/README.md +150 -0
- package/dist/client.d.mts +449 -0
- package/dist/client.d.ts +449 -0
- package/dist/client.js +7 -0
- package/dist/client.js.map +1 -0
- package/dist/client.mjs +7 -0
- package/dist/client.mjs.map +1 -0
- package/dist/index.d.mts +42 -0
- package/dist/index.d.ts +42 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +2 -0
- package/dist/index.mjs.map +1 -0
- package/dist/logger-D3krZrNK.d.mts +29 -0
- package/dist/logger-D3krZrNK.d.ts +29 -0
- package/dist/server.d.mts +1515 -0
- package/dist/server.d.ts +1515 -0
- package/dist/server.js +10 -0
- package/dist/server.js.map +1 -0
- package/dist/server.mjs +10 -0
- package/dist/server.mjs.map +1 -0
- package/dist/sse-schema-CK7cUnEo.d.ts +1986 -0
- package/dist/sse-schema-yl5AaSsj.d.mts +1986 -0
- package/dist/types-CVhwLhSN.d.mts +76 -0
- package/dist/types-CVhwLhSN.d.ts +76 -0
- package/package.json +108 -0
- package/src/client/components/business-day-thumb-overlay.tsx +19 -0
- package/src/client/components/daily-report-comment-item.tsx +81 -0
- package/src/client/components/daily-report-comment-section.tsx +166 -0
- package/src/client/components/daily-report-detail-list.tsx +676 -0
- package/src/client/components/daily-report-edit-form.tsx +81 -0
- package/src/client/components/daily-report-list.tsx +1024 -0
- package/src/client/components/daily-report-page.tsx +147 -0
- package/src/client/components/daily-report-resolved-content.tsx +139 -0
- package/src/client/components/unread-indicator.tsx +13 -0
- package/src/client/config-context.tsx +129 -0
- package/src/client/contexts/daily-report-action-context.tsx +910 -0
- package/src/client/hooks/use-daily-report-comments.ts +73 -0
- package/src/client/hooks/use-daily-report-sse-connection.ts +86 -0
- package/src/client/hooks/use-daily-report.spec.ts +155 -0
- package/src/client/hooks/use-daily-report.ts +426 -0
- package/src/client/hooks/use-dynamic-viewport-height.ts +127 -0
- package/src/client/route-helpers.ts +76 -0
- package/src/client/ui/button.tsx +42 -0
- package/src/client/ui/cn.ts +14 -0
- package/src/client/ui/input.tsx +21 -0
- package/src/client/ui/label.tsx +16 -0
- package/src/client/ui/switch.tsx +19 -0
- package/src/client/ui/tabs.tsx +40 -0
- package/src/client/ui/textarea.tsx +19 -0
- package/src/client/utils/constants.ts +29 -0
- package/src/client.ts +21 -0
- package/src/index.ts +10 -0
- package/src/server/cache.ts +165 -0
- package/src/server/etag.ts +18 -0
- package/src/server/external-source.ts +60 -0
- package/src/server/handlers.ts +543 -0
- package/src/server/ports.ts +68 -0
- package/src/server/response.ts +37 -0
- package/src/server/schema.ts +266 -0
- package/src/server/service.spec.ts +97 -0
- package/src/server/service.ts +1308 -0
- package/src/server/sse-reader.spec.ts +55 -0
- package/src/server/sse-reader.ts +223 -0
- package/src/server.ts +83 -0
- package/src/shared/business-date.spec.ts +61 -0
- package/src/shared/business-date.ts +84 -0
- package/src/shared/comment-adapter.ts +78 -0
- package/src/shared/logger.ts +47 -0
- package/src/shared/sse-schema.ts +147 -0
- package/src/shared/text-utils.ts +57 -0
- 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
|
+
}
|