Changes
4 changed files (+193/-57)
-
-
@@ -30,17 +30,50 @@ leaveDefinitions: [{ id: { value: "lv-foo" }, displayName: "産前産後休業", isWorkerDeemedToBeWorked: true, currentRevision: { revisionId: { value: "lr-foo-foo" }, startAt: { year: 1947, month: 9, day: 1 }, snapshot: { isWorkerDeemedToBeWorked: true }, }, revisions: [ { revisionId: { value: "lr-foo-foo" }, startAt: { year: 1947, month: 9, day: 1 }, snapshot: { isWorkerDeemedToBeWorked: true }, }, ], }, { id: { value: "lv-bar" }, displayName: "忌引", isWorkerDeemedToBeWorked: false, currentRevision: { revisionId: { value: "lr-bar-foo" }, startAt: { year: 2010, month: 10, day: 1 }, snapshot: { isWorkerDeemedToBeWorked: false }, }, revisions: [ { revisionId: { value: "lr-bar-foo" }, startAt: { year: 2010, month: 10, day: 1 }, snapshot: { isWorkerDeemedToBeWorked: false }, }, { revisionId: { value: "lr-bar-bar" }, startAt: { year: 2100, month: 10, day: 1 }, snapshot: { isWorkerDeemedToBeWorked: true }, }, ], }, { id: { value: "lv-baz" }, displayName: "リフレッシュ休暇", isWorkerDeemedToBeWorked: true, revisions: [ { revisionId: { value: "lr-baz-foo" }, startAt: { year: 2010, month: 10, day: 1 }, snapshot: { isWorkerDeemedToBeWorked: true }, }, ], }, ], },
-
-
-
@@ -2,12 +2,28 @@ // SPDX-FileCopyrightText: 2024 Shota FUJI <pockawoooh@gmail.com>// SPDX-License-Identifier: AGPL-3.0-only import { CardStackPlusIcon } from "@radix-ui/react-icons"; import { Badge, Box, Code, DataList, Flex } from "@radix-ui/themes"; import { Badge, Box, Code, DataList, Flex, Select } from "@radix-ui/themes"; import { type Leave } from "@yamori/proto/yamori/work_record/v1/leave_pb.js"; import { type FC, type ReactNode } from "react"; import { type LeaveRevision } from "@yamori/proto/yamori/work_record/v1/leave_revision_pb.js"; import { type Date } from "@yamori/proto/yamori/type/v1/date_pb.js"; import { type FC, type ReactNode, useState } from "react"; import * as HelpDialog from "../../../components/HelpDialog.ts"; interface DateDisplayProps { date: Date; } const DateDisplay: FC<DateDisplayProps> = ({ date }) => { return [ date.year > 0 && date.year.toString(), date.month > 0 && date.month.toString(), date.day > 0 && date.day.toString(), ] .filter((x): x is string => typeof x === "string") .join("/"); }; export interface ListItemProps { leaveDefinition: Leave;
-
@@ -15,6 +31,10 @@ pageTitle: ReactNode;} export const ListItem: FC<ListItemProps> = ({ leaveDefinition, pageTitle }) => { const [revision, setRevision] = useState<LeaveRevision | null>( () => leaveDefinition.currentRevision ?? leaveDefinition.revisions[0] ?? null, ); return ( <Box role="listitem"> <DataList.Root orientation="vertical">
-
@@ -22,61 +42,101 @@ <DataList.Item><DataList.Label>種別名</DataList.Label> <DataList.Value>{leaveDefinition.displayName}</DataList.Value> </DataList.Item> <DataList.Item> <DataList.Label>年次有給休暇付与の出勤率計算時の扱い</DataList.Label> <DataList.Value> <Flex mt="1" align="center" gap="1"> {leaveDefinition.isWorkerDeemedToBeWorked ? ( <HelpDialog.Root> <Badge color="grass"> <CardStackPlusIcon /> 出勤扱い </Badge> <HelpDialog.Trigger>出勤扱い休暇休業の説明</HelpDialog.Trigger> <HelpDialog.Content> <HelpDialog.Title>出勤扱いの休暇・休業</HelpDialog.Title> <HelpDialog.Description> 年次有給休暇を付与する際の出勤率計算時、この休暇・休業を行った日は出勤したものとして扱います。 </HelpDialog.Description> {leaveDefinition.revisions.length > 0 && ( <DataList.Item> <DataList.Label>バージョン</DataList.Label> <DataList.Value> <Select.Root defaultValue={revision?.revisionId?.value} onValueChange={(id) => { const match = leaveDefinition.revisions.find( (rev) => rev.revisionId?.value === id, ); if (match) { setRevision(match); } }} > <Select.Trigger /> <Select.Content> {leaveDefinition.revisions.map((rev) => { if (!rev.revisionId || !rev.startAt) { return null; } <HelpDialog.Paragraph> 79 日出勤した所定労働日 100 日の労働者が {leaveDefinition.displayName ? `「${leaveDefinition.displayName}」` : "この休暇・休業"} を行った場合、その時点での出勤率は{" "} <Code>80出勤日 / 100所定労働日 = 80%</Code> となります。 </HelpDialog.Paragraph> </HelpDialog.Content> </HelpDialog.Root> ) : ( <HelpDialog.Root> <Badge color="gray">出勤率計上なし</Badge> <HelpDialog.Trigger>出勤率計上なしの休暇休業の説明</HelpDialog.Trigger> <HelpDialog.Content> <HelpDialog.Title>出勤率計上なしの休暇・休業</HelpDialog.Title> <HelpDialog.Description> 年次有給休暇を付与する際の出勤率計算時、この休暇・休業を行った日は欠勤と同様に扱います。 </HelpDialog.Description> return ( <Select.Item key={rev.revisionId.value} value={rev.revisionId.value} > <DateDisplay date={rev.startAt} />~ </Select.Item> ); })} </Select.Content> </Select.Root> </DataList.Value> </DataList.Item> )} {revision && ( <DataList.Item> <DataList.Label>年次有給休暇付与の出勤率計算時の扱い</DataList.Label> <DataList.Value> <Flex mt="1" align="center" gap="1"> {revision.snapshot?.isWorkerDeemedToBeWorked ? ( <HelpDialog.Root> <Badge color="grass"> <CardStackPlusIcon /> 出勤扱い </Badge> <HelpDialog.Trigger>出勤扱い休暇休業の説明</HelpDialog.Trigger> <HelpDialog.Content> <HelpDialog.Title>出勤扱いの休暇・休業</HelpDialog.Title> <HelpDialog.Description> 年次有給休暇を付与する際の出勤率計算時、この休暇・休業を行った日は出勤したものとして扱います。 </HelpDialog.Description> <HelpDialog.Paragraph> 79 日出勤した所定労働日 100 日の労働者が {leaveDefinition.displayName ? `「${leaveDefinition.displayName}」` : "この休暇・休業"} を行った場合、その時点での出勤率は{" "} <Code>79出勤日 / 100所定労働日 = 79%</Code> となります。 </HelpDialog.Paragraph> <HelpDialog.Paragraph> 79 日出勤した所定労働日 100 日の労働者が {leaveDefinition.displayName ? `「${leaveDefinition.displayName}」` : "この休暇・休業"} を行った場合、その時点での出勤率は{" "} <Code>80出勤日 / 100所定労働日 = 80%</Code> となります。 </HelpDialog.Paragraph> </HelpDialog.Content> </HelpDialog.Root> ) : ( <HelpDialog.Root> <Badge color="gray">出勤率計上なし</Badge> <HelpDialog.Trigger> 出勤率計上なしの休暇休業の説明 </HelpDialog.Trigger> <HelpDialog.Content> <HelpDialog.Title>出勤率計上なしの休暇・休業</HelpDialog.Title> <HelpDialog.Description> 年次有給休暇を付与する際の出勤率計算時、この休暇・休業を行った日は欠勤と同様に扱います。 </HelpDialog.Description> <HelpDialog.Paragraph size="2" color="gray"> このバッジは{pageTitle}以外では表示されません。 </HelpDialog.Paragraph> </HelpDialog.Content> </HelpDialog.Root> )} </Flex> </DataList.Value> </DataList.Item> <HelpDialog.Paragraph> 79 日出勤した所定労働日 100 日の労働者が {leaveDefinition.displayName ? `「${leaveDefinition.displayName}」` : "この休暇・休業"} を行った場合、その時点での出勤率は{" "} <Code>79出勤日 / 100所定労働日 = 79%</Code> となります。 </HelpDialog.Paragraph> <HelpDialog.Paragraph size="2" color="gray"> このバッジは{pageTitle}以外では表示されません。 </HelpDialog.Paragraph> </HelpDialog.Content> </HelpDialog.Root> )} </Flex> </DataList.Value> </DataList.Item> )} </DataList.Root> </Box> );
-
-
-
@@ -22,11 +22,45 @@ id: { value: "lv-foo" },displayName: "なにかの休業", isWorkerDeemedToBeWorked: true, updateKey: { key: new Uint8Array([]) }, currentRevision: { revisionId: { value: "lr-bar" }, startAt: { year: 2000, month: 1, day: 2 }, snapshot: { isWorkerDeemedToBeWorked: true }, }, revisions: [ { revisionId: { value: "lr-foo" }, startAt: { year: 1999, month: 4, day: 1 }, snapshot: { isWorkerDeemedToBeWorked: false }, }, { revisionId: { value: "lr-bar" }, startAt: { year: 2000, month: 1, day: 2 }, snapshot: { isWorkerDeemedToBeWorked: true }, }, { revisionId: { value: "lr-baz" }, startAt: { year: 3000, month: 9, day: 9 }, snapshot: { isWorkerDeemedToBeWorked: false }, }, ], }, { id: { value: "lv-bar" }, displayName: "なにかの休暇", isWorkerDeemedToBeWorked: false, currentRevision: { revisionId: { value: "lr-qux" }, startAt: { year: 2020, month: 2, day: 29 }, snapshot: { isWorkerDeemedToBeWorked: false }, }, revisions: [ { revisionId: { value: "lr-qux" }, startAt: { year: 2020, month: 2, day: 29 }, snapshot: { isWorkerDeemedToBeWorked: false }, }, ], }, ], });
-
-
-
@@ -4,6 +4,7 @@import "../../../polyfill.ts"; import { Button, Flex, Separator, Spinner, Text } from "@radix-ui/themes"; import { LeaveSchema } from "@yamori/proto/yamori/work_record/v1/leave_pb.js"; import { GetRequestSchema } from "@yamori/proto/yamori/workspace/v1/get_request_pb.js"; import { GetResponseSchema } from "@yamori/proto/yamori/workspace/v1/get_response_pb.js"; import {
-
@@ -35,6 +36,14 @@ data: {workspaceId: id, readMask: { fields: [WorkspaceSchema.field.leaveDefinitions.number], leaveDefinitionsMask: { fields: [ LeaveSchema.field.id.number, LeaveSchema.field.displayName.number, LeaveSchema.field.currentRevision.number, LeaveSchema.field.revisions.number, ], }, }, }, },
-