masaaki 1203d6bb99 Merged PR 148: 画面実装(第5階層用ライセンス情報)
## 概要
[Task1842: 画面実装(第5階層用ライセンス情報)](https://paruru.nds-tyo.co.jp:8443/tfs/ReciproCollection/fa4924a4-d079-4fab-9fb5-a9a11eb205f0/_workitems/edit/1842)

- 第5階層用ライセンス情報画面の本実装を行いました
- ボタン押下確認のため、遷移後の画面(注文履歴画面、カードライセンス取り込みポップアップ)も仮実装しています
- このPull Requestでの対象外
 ・api.ts、app.module.scss → openapi.json及びデザイナさんcssを取り込んだもののため
 ・cardLicenseImportPopup.tsx、LicenseOrderHistoryPage → 仮実装画面のため
 ・licenseOrderフォルダ構成を変更しただけのため

## レビューポイント
- License周りの構成について見直しを行っています。
 これまではfeatures/licenseの直下にstateやoperationを配置していましたが、
 LicenseページとURLを同じくする画面が増えるため、サブフォルダを作っています。
 features/license
                      /licenseOrder   // これまで直下にあったもの
                      /licenseSummary // 今回作成したもの
 構成について問題ないか確認をお願いします。

## 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/Task1842?csf=1&web=1&e=OdR2mR

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

## 補足
- 特にありません
2023-06-13 07:07:06 +00:00

218 lines
8.0 KiB
TypeScript

import React, { useCallback, useEffect, useState } from "react";
import { UpdateTokenTimer } from "components/auth/updateTokenTimer";
import Footer from "components/footer";
import Header from "components/header";
import styles from "styles/app.module.scss";
import { getTranslationID } from "translation";
import { useTranslation } from "react-i18next";
import { AppDispatch } from "app/store";
import { useDispatch, useSelector } from "react-redux";
import {
getLicenseSummaryAsync,
selecLicenseSummaryInfo,
} from "features/license/licenseSummary";
import postAdd from "../../assets/images/post_add.svg";
import history from "../../assets/images/history.svg";
import key from "../../assets/images/key.svg";
import lock from "../../assets/images/lock.svg";
import lockOpen from "../../assets/images/lock_open.svg";
import { LicenseOrderPopup } from "./licenseOrderPopup";
import { CardLicenseImportPopup } from "./cardLicenseImportPopup";
const LicenseSummary: React.FC = (): JSX.Element => {
const dispatch: AppDispatch = useDispatch();
const [t] = useTranslation();
// popup制御関係
const [islicenseOrderPopupOpen, setIslicenseOrderPopupOpen] = useState(false);
const [isCardLicenseImportPopupOpen, setIsCardLicenseImportPopupOpen] =
useState(false);
const onlicenseOrderOpen = useCallback(() => {
setIslicenseOrderPopupOpen(true);
}, [setIslicenseOrderPopupOpen]);
const onCardLicenseImportOpen = useCallback(() => {
setIsCardLicenseImportPopupOpen(true);
}, [setIsCardLicenseImportPopupOpen]);
// apiからの値取得関係
const licenseSummaryInfo = useSelector(selecLicenseSummaryInfo);
useEffect(() => {
dispatch(getLicenseSummaryAsync());
}, [dispatch]);
return (
<>
{/* isPopupOpenがfalseの場合はポップアップのhtmlを生成しないように対応。これによりポップアップは都度生成されて初期化の考慮が減る */}
{islicenseOrderPopupOpen && (
<LicenseOrderPopup
onClose={() => {
setIslicenseOrderPopupOpen(false);
}}
/>
)}
{isCardLicenseImportPopupOpen && (
<CardLicenseImportPopup
onClose={() => {
setIsCardLicenseImportPopupOpen(false);
}}
/>
)}
<div className={styles.wrap}>
<Header userName="XXXXXX" />
<UpdateTokenTimer />
<main className={styles.main}>
<div className="">
<div className={styles.pageHeader}>
<h1 className={styles.pageTitle}>
{t(getTranslationID("LicenseSummaryPage.label.title"))}
</h1>
</div>
<section className={styles.license}>
<div>
<h2 className="">
{t(getTranslationID("LicenseSummaryPage.label.subTitle"))}
</h2>
<ul className={styles.menuAction}>
<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={onlicenseOrderOpen}
>
<img src={postAdd} alt="" className={styles.menuIcon} />
{t(
getTranslationID(
"LicenseSummaryPage.label.orderLicense"
)
)}
</a>
</li>
<li>
<a
href="/licenseOrderHistory"
className={`${styles.menuLink} ${styles.isActive}`}
>
<img src={history} alt="" className={styles.menuIcon} />
{t(
getTranslationID(
"LicenseSummaryPage.label.orderHistory"
)
)}
</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={onCardLicenseImportOpen}
>
<img src={key} alt="" className={styles.menuIcon} />
{t(
getTranslationID(
"LicenseSummaryPage.label.importLicenseKey"
)
)}
</a>
</li>
</ul>
<dl className={`${styles.listVertical} ${styles.marginBtm5}`}>
<dt>
{t(
getTranslationID("LicenseSummaryPage.label.totalLicense")
)}
</dt>
<dd>{licenseSummaryInfo.totalLicense}</dd>
<dt>
{t(
getTranslationID(
"LicenseSummaryPage.label.allocatedLicense"
)
)}
</dt>
<dd>{licenseSummaryInfo.allocatedLicense}</dd>
<dt>
{t(
getTranslationID(
"LicenseSummaryPage.label.reusableLicense"
)
)}
</dt>
<dd>{licenseSummaryInfo.reusableLicense}</dd>
<dt>
{t(
getTranslationID("LicenseSummaryPage.label.freeLicense")
)}
</dt>
<dd>{licenseSummaryInfo.freeLicense}</dd>
<dt>
{t(
getTranslationID(
"LicenseSummaryPage.label.expiringWithin14daysLicense"
)
)}
</dt>
<dd>{licenseSummaryInfo.expiringWithin14daysLicense}</dd>
<dt>
{t(
getTranslationID(
"LicenseSummaryPage.label.issueRequesting"
)
)}
</dt>
<dd>{licenseSummaryInfo.issueRequesting}</dd>
<dt>
{t(
getTranslationID(
"LicenseSummaryPage.label.numberOfRequesting"
)
)}
</dt>
<dd>{licenseSummaryInfo.numberOfRequesting}</dd>
<dt>
{t(getTranslationID("LicenseSummaryPage.label.shortage"))}
</dt>
<dd>{licenseSummaryInfo.shortage}</dd>
<dt>
{t(
getTranslationID("LicenseSummaryPage.label.storageSize")
)}
</dt>
<dd>{licenseSummaryInfo.storageSize}GB</dd>
<dt>
{t(getTranslationID("LicenseSummaryPage.label.usedSize"))}
</dt>
<dd>{licenseSummaryInfo.usedSize}GB</dd>
<dt>
{t(
getTranslationID("LicenseSummaryPage.label.accountLock")
)}
</dt>
<dd>
{licenseSummaryInfo.isAccountLock && (
<img src={lock} alt="" className={styles.icCheckCircle} />
)}
{!licenseSummaryInfo.isAccountLock && (
<img
src={lockOpen}
alt=""
className={styles.icCheckCircle}
/>
)}
</dd>
</dl>
</div>
</section>
</div>
</main>
<Footer />
</div>
</>
);
};
export default LicenseSummary;