2人確認CoSignBeta
2人目の確認者、確認項目、署名済み状態をまとめて扱うダブルチェック用の入力です。
プレビュー
麻薬: モルヒネ 10mg
主担当: 田中(ns-tanaka)
薬剤名・規格・用量を確認した患者・指示を確認した
ヒント: 確認者IDに ns-tanaka を入れると同一人物ガードが働きます。
状態とバリエーション
未署名
確認項目をすべて選び、主担当者と異なる ID を入力すると署名できます。
麻薬: モルヒネ 10mg
主担当: 田中(ns-tanaka)
薬剤名・規格・用量を確認した患者・指示を確認した
ヒント: 確認者IDに ns-tanaka を入れると同一人物ガードが働きます。
理由必須
例外対応やリスクの高い操作では、理由入力を署名前に必須にできます。
麻薬: モルヒネ 10mg
主担当: 田中(ns-tanaka)
薬剤名・規格・用量を確認した患者・指示を確認した
ヒント: 確認者IDに ns-tanaka を入れると同一人物ガードが働きます。
署名済み
value がある場合は、確認者と時刻を持つ読み取り専用状態として表示します。
麻薬: モルヒネ 10mg
主担当: 田中(ns-tanaka)
2人確認 済確認者: ns-sato
操作のガード
後続の実行ボタンは、2人確認が完了するまで無効化し、理由をツールチップで説明します。
患者・指示を確認した
プロパティ
表は横にスクロールできます
| プロパティ | 型 | 初期値 | 説明 |
|---|---|---|---|
| primaryId | string | - | 主担当者の ID です。確認者が同一人物にならないように判定します。 |
| attestations | CoSignAttestation[] | - | 署名前に確認するチェック項目です。すべて選択されるまで署名できません。 |
| value | CoSignValue | undefined | - | 署名済みの値です。値がある場合は読み取り専用の署名済み状態になります。 |
| onSign | (value: CoSignValue) => void | - | 2人目が署名した時に呼ばれます。 |
| requireReason | boolean | false | 署名前に理由入力を必須にします。 |
| signerLabel / reasonLabel / samePersonError | ReactNode | - | 確認者 ID、理由、同一人物エラーの文言です。 |
| labels | { sign?, signed?, pending?, signerOf?, signDisabledAttestations?, signDisabledSigner?, signDisabledReason? } | - | ボタン、署名済み表示、確認者表示、署名ボタンの無効理由を差し替えます。 |
| CoSignBadge | { value?: CoSignValue } | - | 署名済み/未署名を短いバッジとして表示する補助コンポーネントです。 |
使い方
import * as React from "react";
import { CoSign, CoSignBadge, type CoSignValue } from "@gunjo/ui";
export function MedicationDoubleCheck() {
const [value, setValue] = React.useState<CoSignValue | undefined>();
return (
<div className="flex w-full max-w-md flex-col gap-3 rounded-lg border bg-card p-4">
<div className="flex items-center justify-between gap-3">
<div className="text-sm">
<p className="font-medium text-foreground">麻薬: モルヒネ 10mg</p>
<p className="text-muted-foreground">主担当: 田中(ns-tanaka)</p>
</div>
<CoSignBadge value={value} signedLabel="2人確認 済" pendingLabel="2人確認 要" />
</div>
<CoSign
primaryId="ns-tanaka"
attestations={[
{ id: "drug", label: "薬剤名・規格・用量を確認した" },
{ id: "patient", label: "患者・指示を確認した" },
]}
value={value}
onSign={setValue}
/>
{value ? (
<button
type="button"
className="self-end text-xs text-muted-foreground underline"
onClick={() => setValue(undefined)}
>
リセット
</button>
) : (
<p className="text-xs text-muted-foreground">
ヒント: 確認者IDに ns-tanaka を入れると同一人物ガードが働きます。
</p>
)}
</div>
);
}設計の判断(UIXHERO)
「いつ・なぜ使うか」の判断は、姉妹サイト UIXHERO の記事で解説しています。