Merged PR 662: [OMDS様要望] タスク一覧画面の日時表示を変えたい(修正タスク)

## 概要
[Task3362: [OMDS様要望] タスク一覧画面の日時表示を変えたい(修正タスク)](https://paruru.nds-tyo.co.jp:8443/tfs/ReciproCollection/fa4924a4-d079-4fab-9fb5-a9a11eb205f0/_workitems/edit/3362)

- 以下の画面について、日時の表示形式をブラウザのロケールに合わせて変換し、時差を考慮した内容になるよう修正しました。
  - タスク一覧画面
  - 音声メタ情報ポップアップ
  - 注文履歴画面(日付のみ表示)
    - サーバからUTCでのYYYY/MM/DDの文字列として返却していたので、ISOStringとして返却して画面で表示内容を変換するよう処理を修正しました
- タスク一覧画面のFile Lengthについて、hh:mm:ss形式となるよう修正しました

## レビューポイント
- formatMillisecondsToHHMMSSについて、他で使うシーンがなかったのでdictation内の関数としたが、全体の関数とした方がよいか
- convertUtcToLocalについて不正な日付の文字列が渡された場合、変換せずに元の値を返却しているが、エラー対応として問題ないか

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

## 動作確認状況
- ローカルで確認、サーバ側はnpm run test実施済

## 補足
- 相談、参考資料などがあれば
This commit is contained in:
masaaki 2023-12-27 02:24:39 +00:00
parent 9852004a36
commit 7652e5ef08
4 changed files with 83 additions and 16 deletions

View File

@ -0,0 +1,15 @@
// UTCの日付に対してローカルのロケールタイムゾーンを考慮して表示形式と時刻補正を行った文字列を返却する
export const convertUtcToLocal = (
utcDateString: string,
formatOptions?: Intl.DateTimeFormatOptions
): string => {
if (Number.isNaN(Date.parse(utcDateString))) {
// 日付文字列が未定義または無効な場合は 変換を行わない
return utcDateString;
}
const utcDate = new Date(utcDateString);
return formatOptions
? utcDate.toLocaleString(undefined, formatOptions)
: utcDate.toLocaleString();
};

View File

@ -1,9 +1,50 @@
import { RootState } from "app/store";
import { convertUtcToLocal } from "common/convertUtcToLocal";
import { ceil, floor } from "lodash";
import { BACKUP_POPUP_LIST_SIZE } from "./constants";
export const selectTasks = (state: RootState) => state.dictation.domain.tasks;
// ミリ秒の数値をhh:mm:ss形式に変換する
const formatMillisecondsToHHMMSS = (milliseconds: number): string => {
const seconds = Math.floor(milliseconds / 1000);
if (seconds < 0) {
return "00:00:00";
}
const hours = Math.floor(seconds / 3600);
const minutes = Math.floor((seconds % 3600) / 60);
const remainingSeconds = Math.floor(seconds % 60);
// "0x"となるように0埋めする
const formattedHours = String(hours).padStart(2, "0");
const formattedMinutes = String(minutes).padStart(2, "0");
const formattedSeconds = String(remainingSeconds).padStart(2, "0");
return `${formattedHours}:${formattedMinutes}:${formattedSeconds}`;
};
export const selectTasks = (state: RootState) => {
const { tasks } = state.dictation.domain;
const tasksWithLocalDate = tasks.map((task) => ({
...task,
// UTCからローカルタイムゾーンに変換して詰めなおす
audioCreatedDate: convertUtcToLocal(task.audioCreatedDate),
audioFinishedDate: convertUtcToLocal(task.audioFinishedDate),
audioUploadedDate: convertUtcToLocal(task.audioUploadedDate),
transcriptionStartedDate:
task.transcriptionStartedDate &&
convertUtcToLocal(task.transcriptionStartedDate),
transcriptionFinishedDate:
task.transcriptionFinishedDate &&
convertUtcToLocal(task.transcriptionFinishedDate),
// ミリ秒からhh:mm:ss形式に変換して詰めなおす
audioDuration: formatMillisecondsToHHMMSS(parseInt(task.audioDuration, 10)),
}));
return tasksWithLocalDate;
};
export const selectTotal = (state: RootState) => state.dictation.domain.total;
export const seletctLimit = (state: RootState) => state.dictation.domain.limit;

View File

@ -1,8 +1,27 @@
import { RootState } from "app/store";
import { ceil, floor } from "lodash";
import { convertUtcToLocal } from "common/convertUtcToLocal";
export const selectOrderHisory = (state: RootState) =>
state.licenseOrderHistory.domain.orderHistories;
export const selectOrderHisory = (state: RootState) => {
const { orderHistories } = state.licenseOrderHistory.domain;
const dateOptions: Intl.DateTimeFormatOptions = {
year: "numeric",
month: "numeric",
day: "numeric",
};
const orderHistoriesWithLocalDate = orderHistories.map((orderHistory) => ({
...orderHistory,
// UTCからローカルタイムゾーンに変換して詰めなおす
orderDate: convertUtcToLocal(orderHistory.orderDate, dateOptions),
issueDate:
orderHistory.issueDate &&
convertUtcToLocal(orderHistory.issueDate, dateOptions),
}));
return orderHistoriesWithLocalDate;
};
export const selectCompanyName = (state: RootState) =>
state.licenseOrderHistory.domain.companyName;

View File

@ -430,14 +430,12 @@ export class AccountsService {
} | params: { ` + `externalId: ${externalId}, };`,
);
try {
let userInfo: User;
userInfo = await this.usersRepository.findUserByExternalId(
const userInfo = await this.usersRepository.findUserByExternalId(
context,
externalId,
);
let accountInfo: Account;
accountInfo = await this.accountRepository.findAccountById(
const accountInfo = await this.accountRepository.findAccountById(
context,
userInfo.account_id,
);
@ -948,7 +946,7 @@ export class AccountsService {
for (const childPartnerLicenseFromRepository of getPartnerLicenseResult.childPartnerLicensesFromRepository) {
const { allocatableLicenseWithMargin, expiringSoonLicense } =
childPartnerLicenseFromRepository;
let childShortage: number = 0;
let childShortage = 0;
if (childPartnerLicenseFromRepository.tier === TIERS.TIER5) {
if (
allocatableLicenseWithMargin === undefined ||
@ -1031,16 +1029,10 @@ export class AccountsService {
const returnLicenseOrder: LicenseOrder = {
issueDate:
licenseOrder.issued_at !== null
? new Date(licenseOrder.issued_at)
.toISOString()
.substring(0, 10)
.replace(/-/g, '/')
? new Date(licenseOrder.issued_at).toISOString()
: undefined,
numberOfOrder: licenseOrder.quantity,
orderDate: new Date(licenseOrder.ordered_at)
.toISOString()
.substring(0, 10)
.replace(/-/g, '/'),
orderDate: new Date(licenseOrder.ordered_at).toISOString(),
poNumber: licenseOrder.po_number,
status: licenseOrder.status,
};