## 概要 [Task2720: データ取得失敗時に各一覧表示画面の表示がそろっていない](https://paruru.nds-tyo.co.jp:8443/tfs/ReciproCollection/fa4924a4-d079-4fab-9fb5-a9a11eb205f0/_workitems/edit/2720) - 元PBI or タスクへのリンク(内容・目的などはそちらにあるはず) - 何をどう変更したか、追加したライブラリなど - 各一覧表示画面で値0件およびデータ取得エラー時に表示する挙動を統一 ※Accountに関しては自アカウント情報の表示のため値0件はないとみて、特に本タスクの実装 は必要ないと判断しました。 →対応としてはデータ取得エラー時のスナックバー表示のみ ※Userも自アカウント情報が表示されるため上記と同じ実装にする予定でしたが、スナックバーと0件表示ができました。  ・〇はそれぞれの検証条件をクリアできているという意味です。 ・「データ取得エラーとする」は通常ではAccount、License、Userは値が0件となることはなく、データベースエラーの場合のみと考えたので、値が0件=データ取得エラーとしました。 ・「スナックバー表示のみ」はデータ取得エラーが発生した場合、スナックバー表示のみで対応するという意味です。 ・「表示できない」はデータベースを切った状態だと、子アカウントのorderhistoryが表示されないため、表示できないと記載しました。 - dictationSlice.tsでbuilder.addCase(getSortColumnAsync.rejected, (state) => { state.apps.isLoading = false; を実装したのは、修正前はデータベースを切った状態だとロードのぐるぐるが消えずにいました。原因はgetSortColumnAsyncにrejectの場合、isLordingをfalseにする実装がなかったためです。 以上のことから上記実装を追加しました。 - このPull Requestでの対象/対象外 - 影響範囲(他の機能にも影響があるか) ## レビューポイント - 特にレビューしてほしい箇所 - 軽微なものや自明なものは記載不要 - 修正範囲が大きい場合などに記載 - 全体的にや仕様を満たしているか等は本当に必要な時のみ記載 ## UIの変更 - Before/Afterのスクショなど - スクショ置き場 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/Task2720?csf=1&web=1&e=MBNgO8 ## 動作確認状況 - ローカルで確認 ## 補足 - 相談、参考資料などがあれば
130 lines
4.6 KiB
TypeScript
130 lines
4.6 KiB
TypeScript
import React, { useEffect, useState } from "react";
|
|
import { useDispatch, useSelector } from "react-redux";
|
|
import { AppDispatch } from "app/store";
|
|
import Header from "components/header";
|
|
import { UpdateTokenTimer } from "components/auth/updateTokenTimer";
|
|
import { useTranslation } from "react-i18next";
|
|
import { getTranslationID } from "translation";
|
|
import undo from "assets/images/undo.svg";
|
|
import styles from "styles/app.module.scss";
|
|
import addTemplate from "assets/images/template_add.svg";
|
|
import progress_activit from "assets/images/progress_activit.svg";
|
|
import {
|
|
selectTemplates,
|
|
listTemplateAsync,
|
|
selectIsLoading,
|
|
} from "features/workflow/template";
|
|
import { AddTemplateFilePopup } from "./addTemplateFilePopup";
|
|
|
|
export const TemplateFilePage: React.FC = () => {
|
|
const dispatch: AppDispatch = useDispatch();
|
|
const [t] = useTranslation();
|
|
const templates = useSelector(selectTemplates);
|
|
const isLoading = useSelector(selectIsLoading);
|
|
|
|
// 追加Popupの表示制御
|
|
const [isShowAddPopup, setIsShowAddPopup] = useState<boolean>(false);
|
|
|
|
useEffect(() => {
|
|
dispatch(listTemplateAsync());
|
|
}, [dispatch]);
|
|
|
|
return (
|
|
<>
|
|
{isShowAddPopup && (
|
|
<AddTemplateFilePopup
|
|
onClose={() => {
|
|
setIsShowAddPopup(false);
|
|
}}
|
|
/>
|
|
)}
|
|
<div className={styles.wrap}>
|
|
<Header userName="XXXXXXXX" />
|
|
<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("templateFilePage.label.title"))}
|
|
</p>
|
|
</div>
|
|
</div>
|
|
<section className={styles.workflow}>
|
|
<div>
|
|
<ul className={`${styles.menuAction} ${styles.worktype}`}>
|
|
<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={() => {
|
|
setIsShowAddPopup(true);
|
|
}}
|
|
>
|
|
<img src={addTemplate} alt="" className={styles.menuIcon} />
|
|
{t(getTranslationID("templateFilePage.label.addTemplate"))}
|
|
</a>
|
|
</li>
|
|
</ul>
|
|
<table className={`${styles.table} ${styles.template}`}>
|
|
<tr className={styles.tableHeader}>
|
|
<th className={styles.noLine}>
|
|
{t(getTranslationID("templateFilePage.label.fileName"))}
|
|
</th>
|
|
<th>{/** empty th */}</th>
|
|
</tr>
|
|
{templates?.map((template) => (
|
|
<tr key={template.id}>
|
|
<td>{template.name}</td>
|
|
<td>
|
|
<ul className={`${styles.menuAction} ${styles.inTable}`}>
|
|
<li>
|
|
<a
|
|
href=""
|
|
className={`${styles.menuLink} ${styles.isActive}`}
|
|
>
|
|
{t(getTranslationID("common.label.delete"))}
|
|
</a>
|
|
</li>
|
|
</ul>
|
|
</td>
|
|
</tr>
|
|
))}
|
|
{!isLoading &&
|
|
(templates === undefined || templates.length === 0) && (
|
|
<p
|
|
style={{
|
|
margin: "10px",
|
|
textAlign: "center",
|
|
}}
|
|
>
|
|
{t(getTranslationID("common.message.listEmpty"))}
|
|
</p>
|
|
)}
|
|
{isLoading && (
|
|
<img
|
|
src={progress_activit}
|
|
className={styles.icLoading}
|
|
alt="Loading"
|
|
/>
|
|
)}
|
|
</table>
|
|
</div>
|
|
</section>
|
|
</main>
|
|
</div>
|
|
</>
|
|
);
|
|
};
|