承認ステップApprovalStepsBeta

Approval-route timeline: each step's state (pending / current / approved / rejected / skipped) maps to a tone, icon, and accessible label, with actor, timestamp, and comment. For expense, ringi, and review approval workflows. Built on Timeline.

プレビュー

  1. 申請
    承認
  2. 一次承認(上長)
    差戻し

    勘定科目が交際費ではなく会議費です。修正のうえ再申請してください。

  3. 経理確認
    確認中
  4. 支払
    待ち

状態とバリエーション

経路の見え方は steps の各段の state と variant で決まります。state は印の色・アイコン・文字ラベルの3つを同時に切り替えるので、色が見えない人にも段の意味が伝わります。stateLabels は段の文字を差し替える口で、読み上げの文にも同じ文字が入ります。

まだ誰も動いていない経路

全部の段が pending のときは、これから誰の手を通るかだけが並びます。申請ボタンを押す前に経路を見せる画面がこれです。actor も timestamp も無いので、段の名前だけが残ります。

  1. 申請
    これから
  2. 一次承認(上長)
    これから
  3. 経理確認
    これから
  4. 支払
    これから

飛ばした段

金額が小さいなどの理由で承認が要らなかった段は skipped にします。消さずに残すのは、あとから経路を読む人に「省いた」と「まだ来ていない」を見分けてもらうためです。理由は actor に書けます。

  1. 申請
    承認
  2. 一次承認(上長)
    省略
  3. 経理確認
    確認中
  4. 支払
    待ち

密度を上げる

variant="compact" は文字を一段小さくします。経路が主役ではなく、明細の脇や一覧の行の中に添えるときに使います。段の数が多い経路でも縦に伸びすぎません。

  1. 申請
    承認
  2. 一次承認(上長)
    承認
  3. 経理確認
    確認中
  4. 支払
    待ち

Props

表は横にスクロールできます
プロパティ型初期値説明
stepsApprovalStep[]-Each step: { label, state, actor?, timestamp?, comment? }.
state (per step)"pending" | "current" | "approved" | "rejected" | "skipped"-Maps to a marker tone, icon, and text label (state is never colour-only).
stateLabelsPartial<Record<state, string>>-Localizable state text (also used in each step's aria-label).
variant"default" | "compact""default"Density.
classNamestring-Additional CSS class names.

Usage

import { ApprovalSteps, type ApprovalStep } from "@gunjo/ui"

const steps: ApprovalStep[] = [
  { label: "申請", state: "approved", actor: "山田 太郎", timestamp: "5/20 10:12" },
  { label: "一次承認(上長)", state: "rejected", actor: "佐藤 部長",
    timestamp: "5/20 14:40", comment: "勘定科目を会議費に修正のうえ再申請してください。" },
  { label: "経理確認", state: "current", actor: "経理部" },
  { label: "支払", state: "pending" },
]

export function Example() {
  return (
    <ApprovalSteps steps={steps}
      stateLabels={{ approved: "承認", rejected: "差戻し", current: "確認中", pending: "待ち" }} />
  )
}