From 0d0f624a3f13af3f69a6543f218366ab5db51523 Mon Sep 17 00:00:00 2001 From: "maruyama.t" Date: Wed, 7 Feb 2024 07:34:53 +0000 Subject: [PATCH 1/6] =?UTF-8?q?Merged=20PR=20733:=20=E3=83=A9=E3=82=A4?= =?UTF-8?q?=E3=82=BB=E3=83=B3=E3=82=B9=E8=87=AA=E5=8B=95=E5=89=B2=E3=82=8A?= =?UTF-8?q?=E5=BD=93=E3=81=A6=E3=81=AEFunctions=E3=81=8C=E3=82=A8=E3=83=A9?= =?UTF-8?q?=E3=83=BC=E3=81=AB=E3=81=AA=E3=81=A3=E3=81=A6=E3=81=84=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 概要 [Task3631: ライセンス自動割り当てのFunctionsがエラーになっている](https://paruru.nds-tyo.co.jp:8443/tfs/ReciproCollection/fa4924a4-d079-4fab-9fb5-a9a11eb205f0/_workitems/edit/3631) ユーザーテーブルからライセンスアラートを削除したが、Functionsの追従が漏れていた ## レビューポイント - とくになし ## 動作確認状況 - ローカルで確認 ## 補足 - 相談、参考資料などがあれば --- dictation_function/src/entity/user.entity.ts | 3 --- dictation_function/src/test/common/utility.ts | 2 -- 2 files changed, 5 deletions(-) diff --git a/dictation_function/src/entity/user.entity.ts b/dictation_function/src/entity/user.entity.ts index 78d2c7d..10032d4 100644 --- a/dictation_function/src/entity/user.entity.ts +++ b/dictation_function/src/entity/user.entity.ts @@ -40,9 +40,6 @@ export class User { @Column({ default: true }) auto_renew: boolean; - @Column({ default: true }) - license_alert: boolean; - @Column({ default: true }) notification: boolean; diff --git a/dictation_function/src/test/common/utility.ts b/dictation_function/src/test/common/utility.ts index 512d975..f675ed7 100644 --- a/dictation_function/src/test/common/utility.ts +++ b/dictation_function/src/test/common/utility.ts @@ -48,7 +48,6 @@ export const makeTestUser = async ( accepted_dpa_version: d?.accepted_dpa_version ?? "1.0", email_verified: d?.email_verified ?? true, auto_renew: d?.auto_renew ?? true, - license_alert: d?.license_alert ?? true, notification: d?.notification ?? true, encryption: d?.encryption ?? true, encryption_password: d?.encryption_password, @@ -117,7 +116,6 @@ export const makeTestAccount = async ( accepted_dpa_version: d?.accepted_dpa_version ?? "1.0", email_verified: d?.email_verified ?? true, auto_renew: d?.auto_renew ?? true, - license_alert: d?.license_alert ?? true, notification: d?.notification ?? true, encryption: d?.encryption ?? true, encryption_password: d?.encryption_password ?? "password", From 7ca4249f042520d1de66ace48e4f15539bc69cb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B9=AF=E6=9C=AC=20=E9=96=8B?= Date: Fri, 9 Feb 2024 08:12:26 +0000 Subject: [PATCH 2/6] =?UTF-8?q?Merged=20PR=20742:=20=E3=83=AD=E3=82=B0?= =?UTF-8?q?=E3=82=A2=E3=82=A6=E3=83=88=E3=81=9B=E3=81=9A=E3=81=AB=E8=AA=8D?= =?UTF-8?q?=E8=A8=BC=E5=88=87=E3=82=8C=E3=81=BE=E3=81=A7=E5=BE=85=E3=81=A3?= =?UTF-8?q?=E3=81=9F=E5=BE=8C=E3=81=ABTOP=E3=83=9A=E3=83=BC=E3=82=B8?= =?UTF-8?q?=E3=81=8B=E3=82=89=E3=83=AD=E3=82=B0=E3=82=A4=E3=83=B3=E3=81=97?= =?UTF-8?q?=E3=82=88=E3=81=86=E3=81=A8=E3=81=99=E3=82=8B=E3=81=A8=E3=82=A8?= =?UTF-8?q?=E3=83=A9=E3=83=BC=E3=81=8C=E7=99=BA=E7=94=9F=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 概要 [Task3680: ログアウトせずに認証切れまで待った後にTOPページからログインしようとするとエラーが発生する](https://paruru.nds-tyo.co.jp:8443/tfs/ReciproCollection/fa4924a4-d079-4fab-9fb5-a9a11eb205f0/_workitems/edit/3680) - 現象 - ブラウザバック対策のコードで、アクセストークンの寿命を意識せずにログイン後画面に遷移していたため、リフレッシュトークンとアクセストークンの再発行がSkipされた上で寿命が切れたトークンを使うような状態でログイン後画面に遷移してしまっていた - 対応 - /login, /authで、アクセストークンチェック→IdTokenを使ったログイン中プロセスかチェック の順番を変更 - 有効なアクセストークンがあったとしても、再ログインをしてるのであればリフレッシュトークン等の再発行を実施する形に変更 ## レビューポイント - Bugの現象が解消する以外の挙動の変更が発生してしまわないか - 特にブラウザバック等 - 実装方法で問題がありそうな部分はないか - 不要なTokenのクリア等はないか ## UIの変更 - なし ## 動作確認状況 - ローカルで確認 ## 補足 - **可能であればローカルで挙動を確認していただきたいです** - .env.local の `ACCESS_TOKEN_LIFETIME_WEB` を60(=1分)とかにすれば確認はしやすいはず --- dictation_client/src/App.tsx | 13 ++---- dictation_client/src/common/token.ts | 13 ++++++ dictation_client/src/main.tsx | 11 ++++- dictation_client/src/pages/AuthPage/index.tsx | 41 +---------------- .../src/pages/ErrorPage/index.tsx | 4 +- .../src/pages/LoginPage/index.tsx | 45 ++++++++++--------- 6 files changed, 53 insertions(+), 74 deletions(-) diff --git a/dictation_client/src/App.tsx b/dictation_client/src/App.tsx index 9f35aca..1d47893 100644 --- a/dictation_client/src/App.tsx +++ b/dictation_client/src/App.tsx @@ -1,8 +1,6 @@ import AppRouter from "AppRouter"; import { BrowserRouter } from "react-router-dom"; -import { PublicClientApplication } from "@azure/msal-browser"; -import { MsalProvider, useMsal } from "@azure/msal-react"; -import { msalConfig } from "common/msalConfig"; +import { useMsal } from "@azure/msal-react"; import { useEffect, useLayoutEffect } from "react"; import { useDispatch, useSelector } from "react-redux"; import globalAxios, { AxiosError, AxiosResponse } from "axios"; @@ -19,7 +17,6 @@ const App = (): JSX.Element => { const { instance } = useMsal(); // eslint-disable-next-line @typescript-eslint/no-unused-vars const [t, i18n] = useTranslation(); - const pca = new PublicClientApplication(msalConfig); useEffect(() => { const id = globalAxios.interceptors.response.use( (response: AxiosResponse) => response, @@ -70,11 +67,9 @@ const App = (): JSX.Element => { dispatch(closeSnackbar()); }} /> - - - - - + + + ); }; diff --git a/dictation_client/src/common/token.ts b/dictation_client/src/common/token.ts index ac7c3e9..88e42d3 100644 --- a/dictation_client/src/common/token.ts +++ b/dictation_client/src/common/token.ts @@ -76,3 +76,16 @@ export const getIdTokenFromLocalStorage = ( } return null; }; + +// JWTが有効期限切れかどうかを判定する +export const isTokenExpired = (token: string | null): boolean => { + if (token == null) { + return true; + } + const tokenObject = JSON.parse(atob(token.split(".")[1])); + if (isToken(tokenObject)) { + const now = Math.floor(Date.now() / 1000); + return tokenObject.exp < now; + } + return true; +}; diff --git a/dictation_client/src/main.tsx b/dictation_client/src/main.tsx index 1aac073..924f95b 100644 --- a/dictation_client/src/main.tsx +++ b/dictation_client/src/main.tsx @@ -3,18 +3,25 @@ import React from "react"; import { createRoot } from "react-dom/client"; import { I18nextProvider } from "react-i18next"; import { Provider } from "react-redux"; +import { PublicClientApplication } from "@azure/msal-browser"; +import { msalConfig } from "common/msalConfig"; +import { MsalProvider } from "@azure/msal-react"; import App from "./App"; import * as serviceWorker from "./serviceWorker"; import i18n from "./i18n"; +const pca = new PublicClientApplication(msalConfig); + const container = document.getElementById("root"); if (container) { const root = createRoot(container); root.render( - - + + + + ); diff --git a/dictation_client/src/pages/AuthPage/index.tsx b/dictation_client/src/pages/AuthPage/index.tsx index e8d81f9..c891d0f 100644 --- a/dictation_client/src/pages/AuthPage/index.tsx +++ b/dictation_client/src/pages/AuthPage/index.tsx @@ -10,14 +10,6 @@ import { import React, { useEffect } from "react"; import { useDispatch, useSelector } from "react-redux"; import { useNavigate } from "react-router-dom"; -import { - clearToken, - isAdminUser, - isApproveTier, - isStandardUser, - loadAccessToken, -} from "features/auth"; -import { TIERS } from "components/auth/constants"; const AuthPage: React.FC = (): JSX.Element => { const { instance } = useMsal(); @@ -34,38 +26,7 @@ const AuthPage: React.FC = (): JSX.Element => { (async () => { try { - // ログイン済みの場合、ログイン後の遷移先を決定する - if (loadAccessToken()) { - // 第一~第四階層の管理者はライセンス画面へ遷移 - if ( - isApproveTier([ - TIERS.TIER1, - TIERS.TIER2, - TIERS.TIER3, - TIERS.TIER4, - ]) && - isAdminUser() - ) { - navigate("/license"); - return; - } - // 第五階層の管理者はユーザー画面へ遷移 - if (isApproveTier([TIERS.TIER5]) && isAdminUser()) { - navigate("/user"); - return; - } - // 一般ユーザーはdictationPageへ遷移 - if (isStandardUser()) { - navigate("/dictations"); - return; - } - // それ以外は認証エラー画面へ遷移 - instance.logoutRedirect({ - postLogoutRedirectUri: "/AuthError", - }); - clearToken(); - return; - } + // idTokenが有効セットされているかを確認する const loginResult = await instance.handleRedirectPromise(); if (loginResult && loginResult.account) { const { homeAccountId, idTokenClaims } = loginResult.account; diff --git a/dictation_client/src/pages/ErrorPage/index.tsx b/dictation_client/src/pages/ErrorPage/index.tsx index 4592ea0..6d82f50 100644 --- a/dictation_client/src/pages/ErrorPage/index.tsx +++ b/dictation_client/src/pages/ErrorPage/index.tsx @@ -1,8 +1,10 @@ import React from "react"; +import { Link } from "react-router-dom"; export const AuthErrorPage = (): JSX.Element => (
-

ログインに失敗しました

+

login failed


+ return to TopPage
); diff --git a/dictation_client/src/pages/LoginPage/index.tsx b/dictation_client/src/pages/LoginPage/index.tsx index c335bd3..8727452 100644 --- a/dictation_client/src/pages/LoginPage/index.tsx +++ b/dictation_client/src/pages/LoginPage/index.tsx @@ -1,6 +1,6 @@ import { useMsal } from "@azure/msal-react"; import { AppDispatch } from "app/store"; -import { isIdToken } from "common/token"; +import { isIdToken, isTokenExpired } from "common/token"; import { clearToken, isAdminUser, @@ -52,10 +52,10 @@ const LoginPage: React.FC = (): JSX.Element => { instance.logoutRedirect({ postLogoutRedirectUri: "/AuthError", }); - clearToken(); - }, [instance, navigate]); + dispatch(clearToken()); + }, [instance, navigate, dispatch]); - const tokenSet = useCallback( + const tokenSetAndNavigate = useCallback( async (idToken: string) => { // ログイン処理呼び出し const { meta, payload } = await dispatch(loginAsync({ idToken })); @@ -96,31 +96,32 @@ const LoginPage: React.FC = (): JSX.Element => { useEffect(() => { // idTokenStringがあるか⇒認証中 - // accessTokenがある場合⇒ログイン済み - // どちらもなければ直打ち + // accessTokenがある場合⇒ログイン済みなのにブラウザバックでログイン画面に戻ってきた場合 + // どちらもなければURL直打ち (async () => { - if (loadAccessToken()) { - navigateToLoginedPage(); - return; + // ローカルストレージにidTokenがある場合は取得する + let idTokenString: string | null = null; + if (localStorageKeyforIdToken !== null) { + idTokenString = localStorage.getItem(localStorageKeyforIdToken); } - // AADB2Cのログイン画面とLoginPageを経由していない場合はトップページに遷移する - if (!localStorageKeyforIdToken) { - navigate("/"); - return; - } - const idTokenString = localStorage.getItem(localStorageKeyforIdToken); - + // idTokenがない(=正常なログインプロセス中でない)場合は有効なアクセストークンを所持しているか確認し、 + // 有効であればログイン画面に遷移 or 無効であればトップページに遷移 if (idTokenString === null) { - navigate("/"); + const token = loadAccessToken(); + // アクセストークンがない or 有効期限切れ場合はトップページに遷移 + if (isTokenExpired(token)) { + navigate("/"); + } else { + // 有効なアクセストークンがある場合はログイン画面に遷移 + navigateToLoginedPage(); + } return; } - if (idTokenString) { - const idTokenObject = JSON.parse(idTokenString); - if (isIdToken(idTokenObject)) { - await tokenSet(idTokenObject.secret); - } + const idTokenObject = JSON.parse(idTokenString); + if (isIdToken(idTokenObject)) { + await tokenSetAndNavigate(idTokenObject.secret); } })(); // 画面描画後のみ実行するため引数を設定しない From a9d326c234d663931bad4d3765ab5d1e0c653ded Mon Sep 17 00:00:00 2001 From: "makabe.t" Date: Fri, 9 Feb 2024 09:58:06 +0000 Subject: [PATCH 3/6] =?UTF-8?q?Merged=20PR=20740:=20=E3=83=88=E3=83=A9?= =?UTF-8?q?=E3=82=A4=E3=82=A2=E3=83=AB=E3=83=A9=E3=82=A4=E3=82=BB=E3=83=B3?= =?UTF-8?q?=E3=82=B9=E3=82=92=E6=9C=89=E5=8A=B9=E3=81=AB=E3=81=97=E3=81=A6?= =?UTF-8?q?=E3=82=82=E6=9C=89=E5=8A=B9=E5=8C=96=E3=83=A1=E3=83=BC=E3=83=AB?= =?UTF-8?q?=E3=81=8C=E5=B1=8A=E3=81=8B=E3=81=AA=E3=81=84=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 概要 [Task3651: トライアルライセンスを有効にしても有効化メールが届かない対応](https://paruru.nds-tyo.co.jp:8443/tfs/ReciproCollection/fa4924a4-d079-4fab-9fb5-a9a11eb205f0/_workitems/edit/3651) - ライセンス割り当て時のメール(U-108)について、ディーラーが設定されていない場合にはディーラー関連の文言を表示しないように修正しました。 ## レビューポイント - メッセージ内容は適切でしょうか? - ディーラーの取り扱いは適切でしょうか? ## UIの変更 - なし ## 動作確認状況 - ローカルで確認 --- .../src/features/users/users.service.ts | 10 +-- .../src/gateways/sendgrid/sendgrid.service.ts | 57 +++++++++++---- .../templates/template_U_108_no_parent.html | 69 +++++++++++++++++++ .../templates/template_U_108_no_parent.txt | 41 +++++++++++ 4 files changed, 158 insertions(+), 19 deletions(-) create mode 100644 dictation_server/src/templates/template_U_108_no_parent.html create mode 100644 dictation_server/src/templates/template_U_108_no_parent.txt diff --git a/dictation_server/src/features/users/users.service.ts b/dictation_server/src/features/users/users.service.ts index 359f163..6b58912 100644 --- a/dictation_server/src/features/users/users.service.ts +++ b/dictation_server/src/features/users/users.service.ts @@ -1073,13 +1073,13 @@ export class UsersService { const { parent_account_id: dealerId } = await this.accountsRepository.findAccountById(context, accountId); - if (dealerId == null) { - throw new Error(`dealer is null. account_id=${accountId}`); + let dealerName: string | null = null; + if (dealerId !== null) { + const { company_name } = + await this.accountsRepository.findAccountById(context, dealerId); + dealerName = company_name; } - const { company_name: dealerName } = - await this.accountsRepository.findAccountById(context, dealerId); - const { companyName, adminEmails } = await this.getAccountInformation( context, accountId, diff --git a/dictation_server/src/gateways/sendgrid/sendgrid.service.ts b/dictation_server/src/gateways/sendgrid/sendgrid.service.ts index 985c7b1..17fa39b 100644 --- a/dictation_server/src/gateways/sendgrid/sendgrid.service.ts +++ b/dictation_server/src/gateways/sendgrid/sendgrid.service.ts @@ -41,6 +41,9 @@ export class SendGridService { private readonly templateU107Text: string; private readonly templateU108Html: string; private readonly templateU108Text: string; + // U-108のテンプレート差分(親アカウントがない場合) + private readonly templateU108NoParentHtml: string; + private readonly templateU108NoParentText: string; private readonly templateU109Html: string; private readonly templateU109Text: string; private readonly templateU111Html: string; @@ -118,6 +121,17 @@ export class SendGridService { path.resolve(__dirname, `../../templates/template_U_108.txt`), 'utf-8', ); + this.templateU108NoParentHtml = readFileSync( + path.resolve( + __dirname, + `../../templates/template_U_108_no_parent.html`, + ), + 'utf-8', + ); + this.templateU108NoParentText = readFileSync( + path.resolve(__dirname, `../../templates/template_U_108_no_parent.txt`), + 'utf-8', + ); this.templateU109Html = readFileSync( path.resolve(__dirname, `../../templates/template_U_109.html`), 'utf-8', @@ -462,7 +476,7 @@ export class SendGridService { userMail: string, customerAdminMails: string[], customerAccountName: string, - dealerAccountName: string, + dealerAccountName: string | null, ): Promise { this.logger.log( `[IN] [${context.getTrackingId()}] ${this.sendMailWithU108.name}`, @@ -471,19 +485,34 @@ export class SendGridService { const subject = 'License Assigned Notification [U-108]'; const url = new URL(this.appDomain).href; - // メールの本文を作成する - const html = this.templateU108Html - .replaceAll(CUSTOMER_NAME, customerAccountName) - .replaceAll(DEALER_NAME, dealerAccountName) - .replaceAll(USER_NAME, userName) - .replaceAll(USER_EMAIL, userMail) - .replaceAll(TOP_URL, url); - const text = this.templateU108Text - .replaceAll(CUSTOMER_NAME, customerAccountName) - .replaceAll(DEALER_NAME, dealerAccountName) - .replaceAll(USER_NAME, userName) - .replaceAll(USER_EMAIL, userMail) - .replaceAll(TOP_URL, url); + let html: string; + let text: string; + + if (dealerAccountName === null) { + html = this.templateU108NoParentHtml + .replaceAll(CUSTOMER_NAME, customerAccountName) + .replaceAll(USER_NAME, userName) + .replaceAll(USER_EMAIL, userMail) + .replaceAll(TOP_URL, url); + text = this.templateU108NoParentText + .replaceAll(CUSTOMER_NAME, customerAccountName) + .replaceAll(USER_NAME, userName) + .replaceAll(USER_EMAIL, userMail) + .replaceAll(TOP_URL, url); + } else { + html = this.templateU108Html + .replaceAll(CUSTOMER_NAME, customerAccountName) + .replaceAll(DEALER_NAME, dealerAccountName) + .replaceAll(USER_NAME, userName) + .replaceAll(USER_EMAIL, userMail) + .replaceAll(TOP_URL, url); + text = this.templateU108Text + .replaceAll(CUSTOMER_NAME, customerAccountName) + .replaceAll(DEALER_NAME, dealerAccountName) + .replaceAll(USER_NAME, userName) + .replaceAll(USER_EMAIL, userMail) + .replaceAll(TOP_URL, url); + } const ccAddress = customerAdminMails.includes(userMail) ? [] : [userMail]; diff --git a/dictation_server/src/templates/template_U_108_no_parent.html b/dictation_server/src/templates/template_U_108_no_parent.html new file mode 100644 index 0000000..b8b6b8b --- /dev/null +++ b/dictation_server/src/templates/template_U_108_no_parent.html @@ -0,0 +1,69 @@ + + + License Assigned Notification [U-108] + + +
+

<English>

+

Dear $CUSTOMER_NAME$,

+

+ Please be informed that a license has been assigned to the following + user.
+ - User Name: $USER_NAME$
+ - Email: $USER_EMAIL$ +

+

+ Please log in to ODMS Cloud to verify the license expiration date.
+ URL: $TOP_URL$ +

+

+ If you have received this e-mail in error, please delete this e-mail + from your system.
+ This is an automatically generated e-mail and this mailbox is not + monitored. Please do not reply. +

+
+
+

<Deutsch>

+

Sehr geehrte(r) $CUSTOMER_NAME$,

+

+ Bitte beachten Sie, dass dem folgenden Benutzer eine Lizenz zugewiesen + wurde.
+ - Nutzername: $USER_NAME$
+ - Email: $USER_EMAIL$ +

+

+ Bitte melden Sie sich bei ODMS Cloud an, um das Ablaufdatum der Lizenz + zu überprüfen.
+ URL: $TOP_URL$ +

+

+ Wenn Sie diese E-Mail fälschlicherweise erhalten haben, löschen Sie + diese E-Mail bitte aus Ihrem System.
+ Dies ist eine automatisch generierte E-Mail und dieses Postfach wird + nicht überwacht. Bitte nicht antworten. +

+
+
+

<Français>

+

Chère/Cher $CUSTOMER_NAME$,

+

+ Veuillez être informé qu'une licence a été attribuée à l'utilisateur + suivant.
+ - Nom d'utilisateur: $USER_NAME$
+ - Email: $USER_EMAIL$ +

+

+ Veuillez vous connecter à ODMS Cloud pour vérifier la date d'expiration + de la licence.
+ URL: $TOP_URL$ +

+

+ Si vous avez reçu cet e-mail par erreur, veuillez supprimer cet e-mail + de votre système.
+ Il s'agit d'un e-mail généré automatiquement et cette boîte aux lettres + n'est pas surveillée. Merci de ne pas répondre. +

+
+ + diff --git a/dictation_server/src/templates/template_U_108_no_parent.txt b/dictation_server/src/templates/template_U_108_no_parent.txt new file mode 100644 index 0000000..b0ce4a2 --- /dev/null +++ b/dictation_server/src/templates/template_U_108_no_parent.txt @@ -0,0 +1,41 @@ + + +Dear $CUSTOMER_NAME$, + +Please be informed that a license has been assigned to the following user. + - User Name: $USER_NAME$ + - Email: $USER_EMAIL$ + +Please log in to ODMS Cloud to verify the license expiration date. +URL: $TOP_URL$ + +If you have received this e-mail in error, please delete this e-mail from your system. +This is an automatically generated e-mail and this mailbox is not monitored. Please do not reply. + + + +Sehr geehrte(r) $CUSTOMER_NAME$, + +Bitte beachten Sie, dass dem folgenden Benutzer eine Lizenz zugewiesen wurde. + - Nutzername: $USER_NAME$ + - Email: $USER_EMAIL$ + +Bitte melden Sie sich bei ODMS Cloud an, um das Ablaufdatum der Lizenz zu überprüfen. +URL: $TOP_URL$ + +Wenn Sie diese E-Mail fälschlicherweise erhalten haben, löschen Sie diese E-Mail bitte aus Ihrem System. +Dies ist eine automatisch generierte E-Mail und dieses Postfach wird nicht überwacht. Bitte nicht antworten. + + + +Chère/Cher $CUSTOMER_NAME$, + +Veuillez être informé qu'une licence a été attribuée à l'utilisateur suivant. + - Nom d'utilisateur: $USER_NAME$ + - Email: $USER_EMAIL$ + +Veuillez vous connecter à ODMS Cloud pour vérifier la date d'expiration de la licence. +URL: $TOP_URL$ + +Si vous avez reçu cet e-mail par erreur, veuillez supprimer cet e-mail de votre système. +Il s'agit d'un e-mail généré automatiquement et cette boîte aux lettres n'est pas surveillée. Merci de ne pas répondre. \ No newline at end of file From 9cc9a3bd94d260d752176815b4c546438a201fd3 Mon Sep 17 00:00:00 2001 From: "saito.k" Date: Tue, 13 Feb 2024 02:12:00 +0000 Subject: [PATCH 4/6] =?UTF-8?q?Merged=20PR=20744:=20=E3=82=BF=E3=82=B9?= =?UTF-8?q?=E3=82=AF=E4=B8=80=E8=A6=A7=E7=94=BB=E9=9D=A2=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 概要 [Task3672: タスク一覧画面修正](https://paruru.nds-tyo.co.jp:8443/tfs/ReciproCollection/fa4924a4-d079-4fab-9fb5-a9a11eb205f0/_workitems/edit/3672) - タスク一覧の表示項目制御用のチェックボックスの操作可能範囲を修正 - 「Comment」のチェックボックスをリテラルまで押せるようにした - タスク一覧のPriorityがHighの時の表示を変更した - 行を赤く表示→文字を赤く表示 ## レビューポイント - 修正する箇所の認識は合っているか ## 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/Task3672?csf=1&web=1&e=nSX5B0 ## 動作確認状況 - ローカルで確認 ## 補足 - 相談、参考資料などがあれば --- .../src/pages/DictationPage/displayInfo.tsx | 1 + .../src/pages/DictationPage/index.tsx | 15 +++++++-------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/dictation_client/src/pages/DictationPage/displayInfo.tsx b/dictation_client/src/pages/DictationPage/displayInfo.tsx index 74224b9..6a688e4 100644 --- a/dictation_client/src/pages/DictationPage/displayInfo.tsx +++ b/dictation_client/src/pages/DictationPage/displayInfo.tsx @@ -353,6 +353,7 @@ export const DisPlayInfo: React.FC = (): JSX.Element => {