- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
// SPDX-FileCopyrightText: 2024 Shota FUJI <pockawoooh@gmail.com>
// SPDX-License-Identifier: AGPL-3.0-only
import * as proto from "@bufbuild/protobuf";
import { Badge, type BadgeProps, Text } from "@radix-ui/themes";
import { WorkRecordSchema } from "@yamori/proto/yamori/work_record/v1/work_record_pb.js";
import { RecordKindSchema } from "@yamori/proto/yamori/work_record/v1/record_kind_pb.js";
import { type AbbreviationsSchema } from "@yamori/proto/yamori/workspace/v1/abbreviations_pb.js";
import { type FC } from "react";
const ResponsiveBadge: FC<BadgeProps> = ({ children, ...rest }) => {
return (
<Badge {...rest}>
<Text truncate>{children}</Text>
</Badge>
);
};
interface RecordKindBadgeProps {
abbreviations?: proto.MessageShape<typeof AbbreviationsSchema>;
record: proto.MessageShape<typeof RecordKindSchema>;
}
const RecordKindBadge: FC<RecordKindBadgeProps & BadgeProps> = ({
abbreviations,
record,
...rest
}) => {
switch (record.kind.case) {
case "worked":
return (
<ResponsiveBadge {...rest} color="blue">
{abbreviations?.worked || "出勤"}
</ResponsiveBadge>
);
case "dayOff":
return (
<ResponsiveBadge {...rest} color="red">
{abbreviations?.dayoff || "休日"}
</ResponsiveBadge>
);
case "skipped":
return (
<ResponsiveBadge {...rest} color="amber">
{abbreviations?.skipWork || "欠勤"}
</ResponsiveBadge>
);
case "paidLeave":
return (
<ResponsiveBadge {...rest} color="green">
{abbreviations?.paidLeave || "有給休暇"}
</ResponsiveBadge>
);
case "workspaceDefinedLeave":
return (
<ResponsiveBadge
{...rest}
color={
record.kind.value.currentRevision?.snapshot?.isWorkerDeemedToBeWorked
? "green"
: "amber"
}
>
{record.kind.value.abbreviationName || record.kind.value.displayName || "休暇"}
</ResponsiveBadge>
);
default:
return null;
}
};
export interface WorkRecordBadgesProps
extends Pick<
BadgeProps,
"size" | "m" | `m${"t" | "b" | "r" | "l" | "x" | "y"}` | "style" | "className"
> {
abbreviations?: proto.MessageShape<typeof AbbreviationsSchema>;
workRecord: proto.MessageShape<typeof WorkRecordSchema>;
}
export const WorkRecordBadges: FC<WorkRecordBadgesProps> = ({
abbreviations,
workRecord,
...rest
}) => {
switch (workRecord.kind.case) {
case "dayWhole":
return (
<RecordKindBadge
{...rest}
abbreviations={abbreviations}
record={workRecord.kind.value}
/>
);
case "dayHalved":
return (
<>
{workRecord.kind.value.am && (
<RecordKindBadge
{...rest}
abbreviations={abbreviations}
record={workRecord.kind.value.am}
/>
)}
{workRecord.kind.value.pm && (
<RecordKindBadge
{...rest}
abbreviations={abbreviations}
record={workRecord.kind.value.pm}
/>
)}
</>
);
default:
return null;
}
};