Merged PR 747: デザイン反映

## 概要
[Task3670: デザイン反映](https://paruru.nds-tyo.co.jp:8443/tfs/ReciproCollection/fa4924a4-d079-4fab-9fb5-a9a11eb205f0/_workitems/edit/3670)

- ユーザー一覧画面のヘッダーのスタイル修正
  - ブラウザのサイズに合わせて折り返すようにした
  - ユーザー一覧のテーブルを横スクロールできるように修正
- ライセンス履歴画面にパンくずリストを表示
- OptionItem更新ポップアップのスタイル修正
  - 端が切れてしまっていたため枠に収まるようにした
- Typistを「Selected」と「Pool」で選択するUIのスタイル修正
  - typist名やグループ名が長くてもチェックアイコンに重ならないようにした

## レビューポイント
- 特になし

## 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/Task3670?csf=1&web=1&e=zIcngJ
## 動作確認状況
- ローカルで確認

## 補足
- 相談、参考資料などがあれば
This commit is contained in:
saito.k 2024-02-14 01:50:38 +00:00
parent 73ef74770e
commit 25b7936bf4
5 changed files with 296 additions and 256 deletions

View File

@ -171,8 +171,11 @@ export const LicenseOrderHistory: React.FC<LicenseOrderHistoryProps> = (
<div>
<div className={styles.pageHeader}>
<h1 className={styles.pageTitle}>
{t(getTranslationID("orderHistoriesPage.label.title"))}
{t(getTranslationID("LicenseSummaryPage.label.title"))}
</h1>
<p className={styles.pageTx}>
{t(getTranslationID("orderHistoriesPage.label.orderHistory"))}
</p>
</div>
<section className={styles.license}>
<div>

View File

@ -147,104 +147,115 @@ const UserListPage: React.FC = (): JSX.Element => {
</a>
</li>
</ul>
<table className={`${styles.table} ${styles.user}`}>
<tbody>
<tr className={styles.tableHeader}>
<th className={styles.clm0}>{/** th is empty */}</th>
<th>{t(getTranslationID("userListPage.label.name"))}</th>
<th>{t(getTranslationID("userListPage.label.role"))}</th>
<th>
{t(getTranslationID("userListPage.label.authorID"))}
</th>
<th>
{t(getTranslationID("userListPage.label.encryption"))}
</th>
<th>
{t(getTranslationID("userListPage.label.prompt"))}
</th>
<th>
{t(getTranslationID("userListPage.label.typistGroup"))}
</th>
<th>{t(getTranslationID("userListPage.label.email"))}</th>
<th>
{t(getTranslationID("userListPage.label.status"))}
</th>
<th>
{t(getTranslationID("userListPage.label.expiration"))}
</th>
<th>
{t(getTranslationID("userListPage.label.remaining"))}
</th>
<th>
{t(getTranslationID("userListPage.label.autoRenew"))}
</th>
<th>
{t(getTranslationID("userListPage.label.notification"))}
</th>
<th>
{t(
getTranslationID("userListPage.label.emailVerified")
)}
</th>
</tr>
{!isLoading &&
users.map((user) => (
<tr key={user.email}>
<td className={styles.clm0}>
<ul className={styles.menuInTable}>
<li>
{/* eslint-disable-next-line jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions */}
<a
onClick={() => {
onUpdateOpen(user.id);
}}
>
{t(
getTranslationID(
"userListPage.label.editUser"
)
)}
</a>
</li>
{isTier5 && (
<>
<li>
{/* eslint-disable-next-line jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions */}
<a
onClick={() => {
onAllocateLicensePopupOpen(user);
}}
>
{t(
getTranslationID(
"userListPage.label.licenseAllocation"
)
)}
</a>
</li>
<li>
{/* eslint-disable-next-line jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions */}
<a
className={
user.licenseStatus ===
LICENSE_STATUS.NOLICENSE
? styles.isDisable
: ""
}
onClick={() => {
onLicenseDeallocation(user.id);
}}
>
{t(
getTranslationID(
"userListPage.label.licenseDeallocation"
)
)}
</a>
</li>
</>
)}
{/* CCB
<div className={styles.tableWrap}>
<table className={`${styles.table} ${styles.user}`}>
<tbody>
<tr className={styles.tableHeader}>
<th className={styles.clm0}>{/** th is empty */}</th>
<th>
{t(getTranslationID("userListPage.label.name"))}
</th>
<th>
{t(getTranslationID("userListPage.label.role"))}
</th>
<th>
{t(getTranslationID("userListPage.label.authorID"))}
</th>
<th>
{t(getTranslationID("userListPage.label.encryption"))}
</th>
<th>
{t(getTranslationID("userListPage.label.prompt"))}
</th>
<th>
{t(
getTranslationID("userListPage.label.typistGroup")
)}
</th>
<th>
{t(getTranslationID("userListPage.label.email"))}
</th>
<th>
{t(getTranslationID("userListPage.label.status"))}
</th>
<th>
{t(getTranslationID("userListPage.label.expiration"))}
</th>
<th>
{t(getTranslationID("userListPage.label.remaining"))}
</th>
<th>
{t(getTranslationID("userListPage.label.autoRenew"))}
</th>
<th>
{t(
getTranslationID("userListPage.label.notification")
)}
</th>
<th>
{t(
getTranslationID("userListPage.label.emailVerified")
)}
</th>
</tr>
{!isLoading &&
users.map((user) => (
<tr key={user.email}>
<td className={styles.clm0}>
<ul className={styles.menuInTable}>
<li>
{/* eslint-disable-next-line jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions */}
<a
onClick={() => {
onUpdateOpen(user.id);
}}
>
{t(
getTranslationID(
"userListPage.label.editUser"
)
)}
</a>
</li>
{isTier5 && (
<>
<li>
{/* eslint-disable-next-line jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions */}
<a
onClick={() => {
onAllocateLicensePopupOpen(user);
}}
>
{t(
getTranslationID(
"userListPage.label.licenseAllocation"
)
)}
</a>
</li>
<li>
{/* eslint-disable-next-line jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions */}
<a
className={
user.licenseStatus ===
LICENSE_STATUS.NOLICENSE
? styles.isDisable
: ""
}
onClick={() => {
onLicenseDeallocation(user.id);
}}
>
{t(
getTranslationID(
"userListPage.label.licenseDeallocation"
)
)}
</a>
</li>
</>
)}
{/* CCB
<li>
<a href="">
{t(
@ -255,57 +266,58 @@ const UserListPage: React.FC = (): JSX.Element => {
</a>
</li>
*/}
</ul>
</td>
<td> {user.name}</td>
<td>{user.role}</td>
<td>{user.authorId}</td>
<td>{boolToElement(user.encryption)}</td>
<td>{boolToElement(user.prompt)}</td>
<td>{arrayToElement(user.typistGroupName)}</td>
<td>{user.email}</td>
<td>
<span
className={
user.licenseStatus ===
LICENSE_STATUS.NOLICENSE ||
user.licenseStatus === LICENSE_STATUS.ALERT
? styles.isAlert
: ""
}
>
{getLicenseStatus(user.licenseStatus)}
</span>
</td>
<td>
<span
className={
user.licenseStatus === LICENSE_STATUS.ALERT
? styles.isAlert
: ""
}
>
{user.expiration ?? "-"}
</span>
</td>
<td>
<span
className={
user.licenseStatus === LICENSE_STATUS.ALERT
? styles.isAlert
: ""
}
>
{user.remaining ?? "-"}
</span>
</td>
<td>{boolToElement(user.autoRenew)}</td>
<td>{boolToElement(user.notification)}</td>
<td>{boolToElement(user.emailVerified)}</td>
</tr>
))}
</tbody>
</table>
</ul>
</td>
<td> {user.name}</td>
<td>{user.role}</td>
<td>{user.authorId}</td>
<td>{boolToElement(user.encryption)}</td>
<td>{boolToElement(user.prompt)}</td>
<td>{arrayToElement(user.typistGroupName)}</td>
<td>{user.email}</td>
<td>
<span
className={
user.licenseStatus ===
LICENSE_STATUS.NOLICENSE ||
user.licenseStatus === LICENSE_STATUS.ALERT
? styles.isAlert
: ""
}
>
{getLicenseStatus(user.licenseStatus)}
</span>
</td>
<td>
<span
className={
user.licenseStatus === LICENSE_STATUS.ALERT
? styles.isAlert
: ""
}
>
{user.expiration ?? "-"}
</span>
</td>
<td>
<span
className={
user.licenseStatus === LICENSE_STATUS.ALERT
? styles.isAlert
: ""
}
>
{user.remaining ?? "-"}
</span>
</td>
<td>{boolToElement(user.autoRenew)}</td>
<td>{boolToElement(user.notification)}</td>
<td>{boolToElement(user.emailVerified)}</td>
</tr>
))}
</tbody>
</table>
</div>
{!isLoading && users.length === 0 && (
<p
style={{

View File

@ -128,107 +128,132 @@ export const EditOptionItemsPopup: React.FC<EditOptionItemsPopupProps> = (
<dl className={`${styles.formList} ${styles.hasbg}`}>
<dd className={styles.full}>
<div className={styles.tableWrap}>
<table className={styles.table}>
<tr className={styles.tableHeader}>
<th className={styles.noLine}>
{t(getTranslationID("worktypeIdSetting.label.itemLabel"))}
</th>
<th className={styles.noLine}>
{t(
getTranslationID("worktypeIdSetting.label.defaultValue")
)}
</th>
<th>
{t(
getTranslationID("worktypeIdSetting.label.initialValue")
)}
</th>
</tr>
{optionItems?.map((item) => (
<tr key={`optionItem_${item.id}`}>
<td>
<input
type="text"
maxLength={16}
name="itemLabel"
value={item.itemLabel}
className={styles.formInput}
onChange={(e) => {
const { value } = e.target;
// optionItemsの更新
const newOptionItem = {
...item,
itemLabel: value,
};
onChangeOptionItem(newOptionItem);
}}
/>
</td>
<td>
<select
name="defaultValueType"
className={styles.formInput}
value={item.defaultValueType}
onChange={(e) => {
const { value } = e.target;
// optionItemsの更新
const newOptionItem = {
...item,
defaultValueType: value,
};
onChangeOptionItem(newOptionItem);
}}
>
<option
value={OPTION_ITEMS_DEFAULT_VALUE_TYPE.DEFAULT}
>
{t(
getTranslationID(
"worktypeIdSetting.label.default"
)
)}
</option>
<option value={OPTION_ITEMS_DEFAULT_VALUE_TYPE.BLANK}>
{t(
getTranslationID("worktypeIdSetting.label.blank")
)}
</option>
<option
value={OPTION_ITEMS_DEFAULT_VALUE_TYPE.LAST_INPUT}
>
{t(
getTranslationID(
"worktypeIdSetting.label.lastInput"
)
)}
</option>
</select>
</td>
<td>
{item.defaultValueType ===
OPTION_ITEMS_DEFAULT_VALUE_TYPE.DEFAULT ? (
<table className={`${styles.table} ${styles.optionItem}`}>
<tbody>
<tr className={styles.tableHeader}>
<th className={styles.noLine}>
{t(
getTranslationID("worktypeIdSetting.label.itemLabel")
)}
</th>
<th className={styles.noLine}>
{t(
getTranslationID(
"worktypeIdSetting.label.defaultValue"
)
)}
</th>
<th>
{t(
getTranslationID(
"worktypeIdSetting.label.initialValue"
)
)}
</th>
</tr>
{optionItems?.map((item) => (
<tr key={`optionItem_${item.id}`}>
<td>
<input
type="text"
maxLength={20}
name="initialValue"
value={item.initialValue}
maxLength={16}
name="itemLabel"
value={item.itemLabel}
className={styles.formInput}
onChange={(e) => {
const { value } = e.target;
// optionItemsの更新
const newOptionItem = {
...item,
initialValue: value,
itemLabel: value,
};
onChangeOptionItem(newOptionItem);
}}
/>
) : (
"-"
)}
</td>
<td>
<select
name="defaultValueType"
className={styles.formInput}
value={item.defaultValueType}
onChange={(e) => {
const { value } = e.target;
// optionItemsの更新
const newOptionItem = {
...item,
defaultValueType: value,
};
onChangeOptionItem(newOptionItem);
}}
>
<option
value={OPTION_ITEMS_DEFAULT_VALUE_TYPE.DEFAULT}
>
{t(
getTranslationID(
"worktypeIdSetting.label.default"
)
)}
</option>
<option
value={OPTION_ITEMS_DEFAULT_VALUE_TYPE.BLANK}
>
{t(
getTranslationID(
"worktypeIdSetting.label.blank"
)
)}
</option>
<option
value={OPTION_ITEMS_DEFAULT_VALUE_TYPE.LAST_INPUT}
>
{t(
getTranslationID(
"worktypeIdSetting.label.lastInput"
)
)}
</option>
</select>
</td>
<td>
{item.defaultValueType ===
OPTION_ITEMS_DEFAULT_VALUE_TYPE.DEFAULT ? (
<input
type="text"
maxLength={20}
name="initialValue"
value={item.initialValue}
className={styles.formInput}
onChange={(e) => {
const { value } = e.target;
// optionItemsの更新
const newOptionItem = {
...item,
initialValue: value,
};
onChangeOptionItem(newOptionItem);
}}
/>
) : (
"-"
)}
</td>
</tr>
))}
<tr>
<td colSpan={3}>
<span
className={`${styles.formComment} ${styles.alignCenter}`}
>
{t(
getTranslationID(
"worktypeIdSetting.label.optionItemTerms"
)
)}
</span>
</td>
</tr>
))}
</tbody>
</table>
{isPushSaveButton && hasInvalidOptionItems && (
<span className={`${styles.formError} ${styles.alignCenter}`}>
@ -248,14 +273,6 @@ export const EditOptionItemsPopup: React.FC<EditOptionItemsPopupProps> = (
)}
</span>
)}
<span
style={{ display: "block" }}
className={`${styles.formComment} ${styles.alignCenter}`}
>
{t(
getTranslationID("worktypeIdSetting.label.optionItemTerms")
)}
</span>
</div>
</dd>
<dd className={`${styles.full} ${styles.alignCenter}`}>

View File

@ -1130,6 +1130,9 @@ h3 + .brCrumb .tlIcon {
.modal .form .table.backup td:first-child {
padding: 0.6rem 0.2rem;
}
.modal .form .table.optionItem select {
width: 123px;
}
.modal .form .pagenation {
margin-bottom: 1.5rem;
padding-right: 2.5%;
@ -1597,15 +1600,6 @@ _:-ms-lang(x)::-ms-backdrop,
left: 0;
z-index: 2;
}
.account .table.user,
.user .table.user,
.license .table.user,
.dictation .table.user,
.partners .table.user,
.workflow .table.user,
.support .table.user {
margin-bottom: 5rem;
}
.account .table.user th::after,
.user .table.user th::after,
.license .table.user th::after,
@ -1626,6 +1620,16 @@ _:-ms-lang(x)::-ms-backdrop,
vertical-align: top;
}
.user .table {
margin-bottom: 0;
}
.user .tableWrap {
max-width: calc(100vw - 5.1rem);
max-height: 90vh;
overflow-x: scroll;
margin-bottom: 5rem;
}
.account .listVertical {
margin-bottom: 3rem;
}
@ -2488,10 +2492,13 @@ tr.isSelected .menuInTable li a.isDisable {
.formChange ul.chooseMember li input + label,
.formChange ul.holdMember li input + label {
display: block;
padding: 0.2rem 0 0.2rem 1.5rem;
padding: 0.4rem 0 0.4rem 1.5rem;
margin-right: 0;
background: url(../assets/images/circle.svg) no-repeat left center;
background-size: 1.3rem;
white-space: pre-line;
word-break: break-all;
line-height: 1.3;
}
.formChange ul.chooseMember li input + label:hover,
.formChange ul.holdMember li input + label:hover {
@ -2501,7 +2508,7 @@ tr.isSelected .menuInTable li a.isDisable {
}
.formChange ul.chooseMember li input:checked + label,
.formChange ul.holdMember li input:checked + label {
padding: 0.2rem 1rem 0.2rem 0;
padding: 0.4rem 1.5rem 0.4rem 0;
background: url(../assets/images/check_circle_fill.svg) no-repeat right center;
background-size: 1.3rem;
}

View File

@ -74,6 +74,7 @@ declare const classNames: {
readonly table: "table";
readonly tableHeader: "tableHeader";
readonly backup: "backup";
readonly optionItem: "optionItem";
readonly pagenation: "pagenation";
readonly encryptionPass: "encryptionPass";
readonly pageHeader: "pageHeader";