maruyama.t e9541e22a2 Merged PR 523: 画面修正(ヘッダー右上にユーザー名を表示)
## 概要
[Task2920: 画面修正](https://paruru.nds-tyo.co.jp:8443/tfs/ReciproCollection/fa4924a4-d079-4fab-9fb5-a9a11eb205f0/_workitems/edit/2920)

- 元PBI or タスクへのリンク(内容・目的などはそちらにあるはず)
- 何をどう変更したか、追加したライブラリなど
ログイン時に、API(getMyUser)を呼び出し、フラグをtrueにして結果をstateに保存する。
フラグで管理する目的は、ページ遷移時に再度API呼び出しを行わないようにするため。

- このPull Requestでの対象/対象外
サインアウト部分は対象外→別タスクにて対応

- 影響範囲(他の機能にも影響があるか)
既存の各ページのヘッダー部分

## レビューポイント
- component/header配下にSliceを追加すると循環参照になってしまうのを避けるため、feature/login配下にSlice及び各処理を追加した、妥当か。

## UIの変更
- https://ndstokyo.sharepoint.com/:f:/r/sites/Piranha/Shared%20Documents/General/OMDS/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88/Task2920?csf=1&web=1&e=AQgVug

## 動作確認状況
- ローカルで確認

## 補足
- 相談、参考資料などがあれば
2023-10-31 09:02:19 +00:00

172 lines
6.2 KiB
TypeScript

import React, { useCallback, useEffect, useState } from "react";
import Header from "components/header";
import Footer from "components/footer";
import styles from "styles/app.module.scss";
import { UpdateTokenTimer } from "components/auth/updateTokenTimer";
import progress_activit from "assets/images/progress_activit.svg";
import undo from "assets/images/undo.svg";
import group_add from "assets/images/group_add.svg";
import { useDispatch, useSelector } from "react-redux";
import {
selectTypistGroups,
selectIsLoading,
listTypistGroupsAsync,
} from "features/workflow/typistGroup";
import { AppDispatch } from "app/store";
import { useTranslation } from "react-i18next";
import { getTranslationID } from "translation";
import { selectDelegatedAccessToken } from "features/auth/selectors";
import { DelegationBar } from "components/delegate";
import { EditTypistGroupPopup } from "./editTypistGroupPopup";
import { AddTypistGroupPopup } from "./addTypistGroupPopup";
const TypistGroupSettingPage: React.FC = (): JSX.Element => {
const dispatch: AppDispatch = useDispatch();
const [t] = useTranslation();
// 代行操作用のトークンを取得する
const delegatedAccessToken = useSelector(selectDelegatedAccessToken);
const isLoading = useSelector(selectIsLoading);
const typistGroup = useSelector(selectTypistGroups);
const [isAddPopupOpen, setIsAddPopupOpen] = useState(false);
const [isEditPopupOpen, setIsEditPopupOpen] = useState(false);
const [editTypistGroupId, setEditTypistGroupId] = useState<number>(NaN);
const onAddPopupOpen = useCallback(() => {
// typist一覧を取得
setIsAddPopupOpen(true);
}, [setIsAddPopupOpen]);
const onEditPopupOpen = useCallback(
(typistGroupId: number) => {
setEditTypistGroupId(typistGroupId);
setIsEditPopupOpen(true);
},
[setIsEditPopupOpen]
);
useEffect(() => {
dispatch(listTypistGroupsAsync());
}, [dispatch]);
return (
<>
<AddTypistGroupPopup
onClose={() => {
setIsAddPopupOpen(false);
}}
isOpen={isAddPopupOpen}
/>
<EditTypistGroupPopup
onClose={() => {
setIsEditPopupOpen(false);
}}
isOpen={isEditPopupOpen}
typistGroupId={editTypistGroupId}
/>
<div
className={`${styles.wrap} ${
delegatedAccessToken ? styles.manage : ""
}`}
>
{
// 代行操作中の場合は、代行操作バーを表示する
// TODO 代行操作中の会社名と、代行操作用のトークンを取得があれば表示するという風にする(別タスクで)
delegatedAccessToken && (
<DelegationBar delegatedCompanyName="XXXXXX" />
)
}
<Header />
<UpdateTokenTimer />
<main className={styles.main}>
<div>
<div className={styles.pageHeader}>
<h1 className={styles.pageTitle}>
{t(getTranslationID("workflowPage.label.title"))}
</h1>
<p className={styles.pageTx}>{` ${t(
getTranslationID("typistGroupSetting.label.title")
)}`}</p>
</div>
<section className={styles.workflow}>
<div>
<ul className={styles.menuAction}>
<li>
<a
href="/workflow"
className={`${styles.menuLink} ${styles.isActive}`}
>
<img src={undo} alt="" className={styles.menuIcon} />
{t(getTranslationID("common.label.return"))}
</a>
</li>
<li>
{/* eslint-disable-next-line jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions */}
<a
className={`${styles.menuLink} ${styles.isActive}`}
onClick={onAddPopupOpen}
>
<img src={group_add} alt="" className={styles.menuIcon} />
{t(getTranslationID("typistGroupSetting.label.addGroup"))}
</a>
</li>
</ul>
<table className={`${styles.table} ${styles.group}`}>
<tr className={styles.tableHeader}>
<th className={styles.noLine}>
{t(
getTranslationID("typistGroupSetting.label.groupName")
)}
</th>
<th>{/** empty th */}</th>
</tr>
{!isLoading && typistGroup.length === 0 ? (
<p style={{ margin: "10px", textAlign: "center" }}>
{t(getTranslationID("common.message.listEmpty"))}
</p>
) : (
typistGroup.map((group) => (
<tr key={group.id}>
<td>{group.name}</td>
<td>
<ul
className={`${styles.menuAction} ${styles.inTable}`}
>
<li>
{/* eslint-disable-next-line jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions */}
<a
className={`${styles.menuLink} ${styles.isActive}`}
onClick={() => {
onEditPopupOpen(group.id);
}}
>
{t(getTranslationID("common.label.edit"))}
</a>
</li>
</ul>
</td>
</tr>
))
)}
</table>
{isLoading && (
<img
src={progress_activit}
className={styles.icLoading}
alt="Loading"
/>
)}
</div>
</section>
</div>
</main>
<Footer />
</div>
</>
);
};
export default TypistGroupSettingPage;