From 81dca16d5f1fdf257219ba3e24cc91e4baf588d5 Mon Sep 17 00:00:00 2001 From: "oura.a" Date: Tue, 30 May 2023 01:07:52 +0000 Subject: [PATCH] =?UTF-8?q?Merged=20PR=20113:=20=E7=94=BB=E9=9D=A2?= =?UTF-8?q?=E5=AE=9F=E8=A3=85=EF=BC=88=E3=83=A9=E3=82=A4=E3=82=BB=E3=83=B3?= =?UTF-8?q?=E3=82=B9=E6=B3=A8=E6=96=87=E3=83=9D=E3=83=83=E3=83=97=E3=82=A2?= =?UTF-8?q?=E3=83=83=E3=83=97=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 概要 [Task1684: 画面実装(ライセンス注文ポップアップ)](https://paruru.nds-tyo.co.jp:8443/tfs/ReciproCollection/fa4924a4-d079-4fab-9fb5-a9a11eb205f0/_workitems/edit/1684) - ライセンス注文ポップアップ画面について実装を行いました - ライセンス情報画面について、ボタン押下時にポップアップを表示する実装も併せて実施しております - ポップアップの表示について、表示/非表示を制御するのではなくそもそも表示しない場合はhtmlとして生成しないよう制御を入れています。 - ポップアップ表示の対応により、ポップアップクローズ時の対応が簡易化しています。(これまでは、ポップアップを閉じる際に値を初期化しなおす必要があったのですが、生成しなおす形になるので初期生成の考慮のみでよくなる) - cssについて、5/26時点で最新のファイルを取り込みました ## レビューポイント - ポップアップ生成周りの考え方、初期化の実装内容 - images、cssについては、最新のデザイナさんのものを取り込んだ形なので、レビュー対象外でお願いします ## 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/Task1684?csf=1&web=1&e=xLRn4D ## 動作確認状況 - ローカルで確認 ## 補足 - 無し --- dictation_client/openapitools.json | 2 +- .../src/api/.openapi-generator/VERSION | 2 +- dictation_client/src/api/api.ts | 1487 ++++++++++++++++- dictation_client/src/app/store.ts | 2 + .../src/assets/images/ODMScloud.png | Bin 0 -> 7670 bytes dictation_client/src/assets/images/lock.svg | 13 + .../src/assets/images/lock_open.svg | 14 + dictation_client/src/assets/images/top-bg.png | Bin 0 -> 79672 bytes dictation_client/src/assets/images/undo.svg | 11 + dictation_client/src/common/errors/code.ts | 1 + .../src/features/license/index.ts | 4 + .../src/features/license/licenseSlice.ts | 31 + .../src/features/license/operations.ts | 74 + .../src/features/license/selectors.ts | 36 + .../src/features/license/state.ts | 8 + .../src/pages/LicensePage/index.tsx | 140 +- .../pages/LicensePage/licenseOrderPopup.tsx | 210 +++ dictation_client/src/styles/app.module.scss | 917 ++++++++-- .../src/styles/app.module.scss.d.ts | 103 +- dictation_client/src/translation/de.json | 18 + dictation_client/src/translation/en.json | 18 + dictation_client/src/translation/es.json | 18 + dictation_client/src/translation/fr.json | 18 + 23 files changed, 2937 insertions(+), 190 deletions(-) create mode 100644 dictation_client/src/assets/images/ODMScloud.png create mode 100644 dictation_client/src/assets/images/lock.svg create mode 100644 dictation_client/src/assets/images/lock_open.svg create mode 100644 dictation_client/src/assets/images/top-bg.png create mode 100644 dictation_client/src/assets/images/undo.svg create mode 100644 dictation_client/src/features/license/index.ts create mode 100644 dictation_client/src/features/license/licenseSlice.ts create mode 100644 dictation_client/src/features/license/operations.ts create mode 100644 dictation_client/src/features/license/selectors.ts create mode 100644 dictation_client/src/features/license/state.ts create mode 100644 dictation_client/src/pages/LicensePage/licenseOrderPopup.tsx diff --git a/dictation_client/openapitools.json b/dictation_client/openapitools.json index a3883a3..cd53ff4 100644 --- a/dictation_client/openapitools.json +++ b/dictation_client/openapitools.json @@ -2,6 +2,6 @@ "$schema": "./node_modules/@openapitools/openapi-generator-cli/config.schema.json", "spaces": 2, "generator-cli": { - "version": "6.5.0" + "version": "6.6.0" } } diff --git a/dictation_client/src/api/.openapi-generator/VERSION b/dictation_client/src/api/.openapi-generator/VERSION index 4be2c72..cd802a1 100644 --- a/dictation_client/src/api/.openapi-generator/VERSION +++ b/dictation_client/src/api/.openapi-generator/VERSION @@ -1 +1 @@ -6.5.0 \ No newline at end of file +6.6.0 \ No newline at end of file diff --git a/dictation_client/src/api/api.ts b/dictation_client/src/api/api.ts index edfbf7d..dfbe824 100644 --- a/dictation_client/src/api/api.ts +++ b/dictation_client/src/api/api.ts @@ -43,12 +43,148 @@ export interface AccessTokenResponse { */ export interface AudioDownloadLocationResponse { /** - * + * Blob StorageにアクセスするためのSASトークン入りのアクセスURL * @type {string} * @memberof AudioDownloadLocationResponse */ 'url': string; } +/** + * + * @export + * @interface AudioNextResponse + */ +export interface AudioNextResponse { + /** + * ODMS Cloud上の次の音声ファイルID(存在しなければundefind) + * @type {number} + * @memberof AudioNextResponse + */ + 'nextFileId'?: number; +} +/** + * + * @export + * @interface AudioOptionItem + */ +export interface AudioOptionItem { + /** + * + * @type {string} + * @memberof AudioOptionItem + */ + 'optionItemLabel': string; + /** + * + * @type {string} + * @memberof AudioOptionItem + */ + 'optionItemValue': string; +} +/** + * + * @export + * @interface AudioUploadFinishedRequest + */ +export interface AudioUploadFinishedRequest { + /** + * アップロード先Blob Storage(ファイル名含む) + * @type {string} + * @memberof AudioUploadFinishedRequest + */ + 'url': string; + /** + * 自分自身(ログイン認証)したAuthorID + * @type {string} + * @memberof AudioUploadFinishedRequest + */ + 'authorId': string; + /** + * 音声ファイル名 + * @type {string} + * @memberof AudioUploadFinishedRequest + */ + 'fileName': string; + /** + * 音声ファイルの録音時間(yyyy-mm-ddThh:mm:ss.sss) + * @type {string} + * @memberof AudioUploadFinishedRequest + */ + 'duration': string; + /** + * 音声ファイルの録音作成日時(開始日時)(yyyy-mm-ddThh:mm:ss.sss) + * @type {string} + * @memberof AudioUploadFinishedRequest + */ + 'createdDate': string; + /** + * 音声ファイルの録音作成終了日時(yyyy-mm-ddThh:mm:ss.sss) + * @type {string} + * @memberof AudioUploadFinishedRequest + */ + 'finishedDate': string; + /** + * 音声ファイルのアップロード日時(yyyy-mm-ddThh:mm:ss.sss) + * @type {string} + * @memberof AudioUploadFinishedRequest + */ + 'uploadedDate': string; + /** + * 音声ファイルのファイルサイズ(Byte) + * @type {number} + * @memberof AudioUploadFinishedRequest + */ + 'fileSize': number; + /** + * 優先度 \"00\":Normal / \"01\":High + * @type {string} + * @memberof AudioUploadFinishedRequest + */ + 'priority': string; + /** + * 録音形式: DSS/DS2(SP)/DS2(QP) + * @type {string} + * @memberof AudioUploadFinishedRequest + */ + 'audioFormat': string; + /** + * + * @type {string} + * @memberof AudioUploadFinishedRequest + */ + 'comment': string; + /** + * + * @type {string} + * @memberof AudioUploadFinishedRequest + */ + 'workType': string; + /** + * 音声ファイルに紐づくOption Itemの一覧(10個固定) + * @type {Array} + * @memberof AudioUploadFinishedRequest + */ + 'optionItemList': Array; + /** + * + * @type {boolean} + * @memberof AudioUploadFinishedRequest + */ + 'isEncrypted': boolean; +} +/** + * + * @export + * @interface AudioUploadFinishedResponse + */ +export interface AudioUploadFinishedResponse { + /** + * 8桁固定の数字 + * @type {string} + * @memberof AudioUploadFinishedResponse + */ + 'jobNumber': string; +} /** * * @export @@ -56,7 +192,7 @@ export interface AudioDownloadLocationResponse { */ export interface AudioUploadLocationResponse { /** - * + * Blob StorageにアクセスするためのSASトークン入りのアクセスURL * @type {string} * @memberof AudioUploadLocationResponse */ @@ -130,6 +266,25 @@ export interface CreateAccountRequest { */ 'token': string; } +/** + * + * @export + * @interface CreateOrdersRequest + */ +export interface CreateOrdersRequest { + /** + * + * @type {string} + * @memberof CreateOrdersRequest + */ + 'poNumber': string; + /** + * + * @type {number} + * @memberof CreateOrdersRequest + */ + 'orderCount': number; +} /** * * @export @@ -149,6 +304,61 @@ export interface ErrorResponse { */ 'code': string; } +/** + * + * @export + * @interface GetRelationsResponse + */ +export interface GetRelationsResponse { + /** + * ログインしたユーザーのAuthorID(Authorでない場合は空文字) + * @type {string} + * @memberof GetRelationsResponse + */ + 'authorId': string; + /** + * 属しているアカウントのAuthorID List(全て) + * @type {Array} + * @memberof GetRelationsResponse + */ + 'authorIdList': Array; + /** + * アカウントに設定されているWorktypeIDのリスト(最大20個) + * @type {Array} + * @memberof GetRelationsResponse + */ + 'workTypeList': Array; + /** + * ユーザーが音声ファイルを暗号化するかどうか + * @type {boolean} + * @memberof GetRelationsResponse + */ + 'isEncrypted': boolean; + /** + * ユーザーが暗号化を掛ける場合のパスワード + * @type {string} + * @memberof GetRelationsResponse + */ + 'encryptionPassword': string | null; + /** + * アカウントがデフォルトで利用するWorkTypeID(アカウントに紐づくWorkTypeIDから一つ指定) + * @type {string} + * @memberof GetRelationsResponse + */ + 'activeWorktype': string; + /** + * 録音形式: DSS/DS2(SP)/DS2(QP): DS2固定 + * @type {string} + * @memberof GetRelationsResponse + */ + 'audioFormat': string; + /** + * デバイス上で自動的にWorkTypeの選択画面を表示するかどうかのユーザーごとの設定(Authorでない場合はfalse) + * @type {boolean} + * @memberof GetRelationsResponse + */ + 'prompt': boolean; +} /** * * @export @@ -162,6 +372,50 @@ export interface GetUsersResponse { */ 'users': Array; } +/** + * + * @export + * @interface OptionItem + */ +export interface OptionItem { + /** + * Option Itemのラベル + * @type {string} + * @memberof OptionItem + */ + 'label': string; + /** + * 項目タイプ 1:Blank/2:Default/3:前の値 + * @type {number} + * @memberof OptionItem + */ + 'initialValueType': number; + /** + * typeでDefaultを選択した場合のデフォルト値 + * @type {string} + * @memberof OptionItem + */ + 'defaultValue': string; +} +/** + * + * @export + * @interface OptionItemList + */ +export interface OptionItemList { + /** + * + * @type {string} + * @memberof OptionItemList + */ + 'workTypeId': string; + /** + * 1WorkTypeIDにつき、10個まで登録可能 + * @type {Array} + * @memberof OptionItemList + */ + 'optionItemList': Array; +} /** * * @export @@ -236,6 +490,208 @@ export interface SignupRequest { */ 'notification': boolean; } +/** + * + * @export + * @interface Task + */ +export interface Task { + /** + * ODMS Cloud上の音声ファイルID + * @type {number} + * @memberof Task + */ + 'audioFileId': number; + /** + * AuthorID + * @type {string} + * @memberof Task + */ + 'authorId': string; + /** + * + * @type {string} + * @memberof Task + */ + 'workType': string; + /** + * 音声ファイルに紐づくOption Itemの一覧(10個固定) + * @type {Array} + * @memberof Task + */ + 'optionItemList': Array; + /** + * 音声ファイルのBlob Storage上での保存場所(ファイル名含む)のURL + * @type {string} + * @memberof Task + */ + 'url': string; + /** + * 音声ファイル名 + * @type {string} + * @memberof Task + */ + 'fileName': string; + /** + * 音声ファイルの録音時間(yyyy-mm-ddThh:mm:ss.sss) + * @type {string} + * @memberof Task + */ + 'audioDuration': string; + /** + * 音声ファイルの録音開始日時(yyyy-mm-ddThh:mm:ss.sss) + * @type {string} + * @memberof Task + */ + 'audioCreatedDate': string; + /** + * 音声ファイルの録音終了日時(yyyy-mm-ddThh:mm:ss.sss) + * @type {string} + * @memberof Task + */ + 'audioFinishedDate': string; + /** + * 音声ファイルのアップロード日時(yyyy-mm-ddThh:mm:ss.sss) + * @type {string} + * @memberof Task + */ + 'audioUploadedDate': string; + /** + * 音声ファイルのファイルサイズ(Byte) + * @type {number} + * @memberof Task + */ + 'fileSize': number; + /** + * 音声ファイルの優先度 \"00\":Normal / \"01\":High + * @type {string} + * @memberof Task + */ + 'priority': string; + /** + * 録音形式: DSS/DS2(SP)/DS2(QP) + * @type {string} + * @memberof Task + */ + 'audioFormat': string; + /** + * コメント + * @type {string} + * @memberof Task + */ + 'comment': string; + /** + * + * @type {boolean} + * @memberof Task + */ + 'isEncrypted': boolean; + /** + * JOBナンバー + * @type {string} + * @memberof Task + */ + 'jobNumber': string; + /** + * + * @type {TaskTypist} + * @memberof Task + */ + 'typist'?: TaskTypist; + /** + * 文字起こしに着手できる(チェックアウト可能な)、タスクにアサインされているグループ/個人の一覧 + * @type {Array} + * @memberof Task + */ + 'assignees': Array; + /** + * 音声ファイルのファイルステータス Uploaded / Pending / InProgress / Finished / Backup + * @type {string} + * @memberof Task + */ + 'status': string; + /** + * 文字起こし開始日時(yyyy-mm-ddThh:mm:ss.sss) + * @type {string} + * @memberof Task + */ + 'transcriptionStartedDate': string; + /** + * 文字起こし終了日時(yyyy-mm-ddThh:mm:ss.sss) + * @type {string} + * @memberof Task + */ + 'transcriptionFinishedDate': string; +} +/** + * 割り当てられたユーザー + * @export + * @interface TaskTypist + */ +export interface TaskTypist { + /** + * TypistID(TypistIDかTypistGroupIDのどちらかに値が入る) + * @type {number} + * @memberof TaskTypist + */ + 'typistUserId'?: number; + /** + * TypistGroupID(TypistGroupIDかTypistIDのどちらかに値が入る) + * @type {number} + * @memberof TaskTypist + */ + 'typistGroupId'?: number; + /** + * Typist名 / TypistGroup名 + * @type {string} + * @memberof TaskTypist + */ + 'typistName': string; +} +/** + * + * @export + * @interface TasksResponse + */ +export interface TasksResponse { + /** + * タスクの取得件数(指定しない場合はデフォルト値) + * @type {number} + * @memberof TasksResponse + */ + 'limit': number; + /** + * オフセット(何件目から取得するか 設定しない場合はデフォルト値) + * @type {number} + * @memberof TasksResponse + */ + 'offset': number; + /** + * タスクの総件数 + * @type {number} + * @memberof TasksResponse + */ + 'total': number; + /** + * 音声ファイル/タスク一覧 + * @type {Array} + * @memberof TasksResponse + */ + 'tasks': Array; +} +/** + * + * @export + * @interface TemplateDownloadLocationResponse + */ +export interface TemplateDownloadLocationResponse { + /** + * + * @type {string} + * @memberof TemplateDownloadLocationResponse + */ + 'url': string; +} /** * * @export @@ -274,6 +730,31 @@ export interface TokenResponse { */ 'accessToken': string; } +/** + * + * @export + * @interface Typist + */ +export interface Typist { + /** + * TypistID(TypistIDかTypistGroupIDのどちらかに値が入る) + * @type {number} + * @memberof Typist + */ + 'typistUserId'?: number; + /** + * TypistGroupID(TypistGroupIDかTypistIDのどちらかに値が入る) + * @type {number} + * @memberof Typist + */ + 'typistGroupId'?: number; + /** + * Typist名 / TypistGroup名 + * @type {string} + * @memberof Typist + */ + 'typistName': string; +} /** * * @export @@ -450,7 +931,7 @@ export class AccountsApi extends BaseAPI { export const AuthApiAxiosParamCreator = function (configuration?: Configuration) { return { /** - * + * リフレッシュトークンを元にアクセストークンを再生成します * @summary * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -484,7 +965,7 @@ export const AuthApiAxiosParamCreator = function (configuration?: Configuration) }; }, /** - * + * AzureADB2Cでのサインイン後に払いだされるIDトークンを元に認証用のアクセストークンとリフレッシュトークンを生成します * @summary * @param {TokenRequest} tokenRequest * @param {*} [options] Override http request option. @@ -530,7 +1011,7 @@ export const AuthApiFp = function(configuration?: Configuration) { const localVarAxiosParamCreator = AuthApiAxiosParamCreator(configuration) return { /** - * + * リフレッシュトークンを元にアクセストークンを再生成します * @summary * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -540,7 +1021,7 @@ export const AuthApiFp = function(configuration?: Configuration) { return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, /** - * + * AzureADB2Cでのサインイン後に払いだされるIDトークンを元に認証用のアクセストークンとリフレッシュトークンを生成します * @summary * @param {TokenRequest} tokenRequest * @param {*} [options] Override http request option. @@ -561,7 +1042,7 @@ export const AuthApiFactory = function (configuration?: Configuration, basePath? const localVarFp = AuthApiFp(configuration) return { /** - * + * リフレッシュトークンを元にアクセストークンを再生成します * @summary * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -570,7 +1051,7 @@ export const AuthApiFactory = function (configuration?: Configuration, basePath? return localVarFp.accessToken(options).then((request) => request(axios, basePath)); }, /** - * + * AzureADB2Cでのサインイン後に払いだされるIDトークンを元に認証用のアクセストークンとリフレッシュトークンを生成します * @summary * @param {TokenRequest} tokenRequest * @param {*} [options] Override http request option. @@ -590,7 +1071,7 @@ export const AuthApiFactory = function (configuration?: Configuration, basePath? */ export class AuthApi extends BaseAPI { /** - * + * リフレッシュトークンを元にアクセストークンを再生成します * @summary * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -601,7 +1082,7 @@ export class AuthApi extends BaseAPI { } /** - * + * AzureADB2Cでのサインイン後に払いだされるIDトークンを元に認証用のアクセストークンとリフレッシュトークンを生成します * @summary * @param {TokenRequest} tokenRequest * @param {*} [options] Override http request option. @@ -719,15 +1200,15 @@ export class DefaultApi extends BaseAPI { export const FilesApiAxiosParamCreator = function (configuration?: Configuration) { return { /** - * + * 指定した音声ファイルのBlob Storage上のダウンロード先アクセスURLを取得します * @summary - * @param {string} id 音声ファイル情報をDBから取得するためのID + * @param {number} audioFileId ODMSCloud上で管理する音声ファイルのID * @param {*} [options] Override http request option. * @throws {RequiredError} */ - downloadLocation: async (id: string, options: AxiosRequestConfig = {}): Promise => { - // verify required parameter 'id' is not null or undefined - assertParamExists('downloadLocation', 'id', id) + downloadLocation: async (audioFileId: number, options: AxiosRequestConfig = {}): Promise => { + // verify required parameter 'audioFileId' is not null or undefined + assertParamExists('downloadLocation', 'audioFileId', audioFileId) const localVarPath = `/files/audio/download-location`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); @@ -744,8 +1225,8 @@ export const FilesApiAxiosParamCreator = function (configuration?: Configuration // http bearer authentication required await setBearerAuthToObject(localVarHeaderParameter, configuration) - if (id !== undefined) { - localVarQueryParameter['id'] = id; + if (audioFileId !== undefined) { + localVarQueryParameter['audioFileId'] = audioFileId; } @@ -760,7 +1241,88 @@ export const FilesApiAxiosParamCreator = function (configuration?: Configuration }; }, /** - * + * 指定した音声ファイルに対応したテンプレートファイルのBlob Storage上のダウンロード先アクセスURLを取得します + * @summary + * @param {number} audioFileId 文字起こし対象の音声ファイルID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + downloadTemplateLocation: async (audioFileId: number, options: AxiosRequestConfig = {}): Promise => { + // verify required parameter 'audioFileId' is not null or undefined + assertParamExists('downloadTemplateLocation', 'audioFileId', audioFileId) + const localVarPath = `/files/template/download-location`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication bearer required + // http bearer authentication required + await setBearerAuthToObject(localVarHeaderParameter, configuration) + + if (audioFileId !== undefined) { + localVarQueryParameter['audioFileId'] = audioFileId; + } + + + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * アップロードが完了した音声ファイルの情報を登録し、文字起こしタスクを生成します + * @summary + * @param {AudioUploadFinishedRequest} audioUploadFinishedRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + uploadFinished: async (audioUploadFinishedRequest: AudioUploadFinishedRequest, options: AxiosRequestConfig = {}): Promise => { + // verify required parameter 'audioUploadFinishedRequest' is not null or undefined + assertParamExists('uploadFinished', 'audioUploadFinishedRequest', audioUploadFinishedRequest) + const localVarPath = `/files/audio/upload-finished`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication bearer required + // http bearer authentication required + await setBearerAuthToObject(localVarHeaderParameter, configuration) + + + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(audioUploadFinishedRequest, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * ログイン中ユーザー用のBlob Storage上の音声ファイルのアップロード先アクセスURLを取得します * @summary * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -804,18 +1366,40 @@ export const FilesApiFp = function(configuration?: Configuration) { const localVarAxiosParamCreator = FilesApiAxiosParamCreator(configuration) return { /** - * + * 指定した音声ファイルのBlob Storage上のダウンロード先アクセスURLを取得します * @summary - * @param {string} id 音声ファイル情報をDBから取得するためのID + * @param {number} audioFileId ODMSCloud上で管理する音声ファイルのID * @param {*} [options] Override http request option. * @throws {RequiredError} */ - async downloadLocation(id: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { - const localVarAxiosArgs = await localVarAxiosParamCreator.downloadLocation(id, options); + async downloadLocation(audioFileId: number, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.downloadLocation(audioFileId, options); return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, /** - * + * 指定した音声ファイルに対応したテンプレートファイルのBlob Storage上のダウンロード先アクセスURLを取得します + * @summary + * @param {number} audioFileId 文字起こし対象の音声ファイルID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async downloadTemplateLocation(audioFileId: number, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.downloadTemplateLocation(audioFileId, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * アップロードが完了した音声ファイルの情報を登録し、文字起こしタスクを生成します + * @summary + * @param {AudioUploadFinishedRequest} audioUploadFinishedRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async uploadFinished(audioUploadFinishedRequest: AudioUploadFinishedRequest, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.uploadFinished(audioUploadFinishedRequest, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * ログイン中ユーザー用のBlob Storage上の音声ファイルのアップロード先アクセスURLを取得します * @summary * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -835,17 +1419,37 @@ export const FilesApiFactory = function (configuration?: Configuration, basePath const localVarFp = FilesApiFp(configuration) return { /** - * + * 指定した音声ファイルのBlob Storage上のダウンロード先アクセスURLを取得します * @summary - * @param {string} id 音声ファイル情報をDBから取得するためのID + * @param {number} audioFileId ODMSCloud上で管理する音声ファイルのID * @param {*} [options] Override http request option. * @throws {RequiredError} */ - downloadLocation(id: string, options?: any): AxiosPromise { - return localVarFp.downloadLocation(id, options).then((request) => request(axios, basePath)); + downloadLocation(audioFileId: number, options?: any): AxiosPromise { + return localVarFp.downloadLocation(audioFileId, options).then((request) => request(axios, basePath)); }, /** - * + * 指定した音声ファイルに対応したテンプレートファイルのBlob Storage上のダウンロード先アクセスURLを取得します + * @summary + * @param {number} audioFileId 文字起こし対象の音声ファイルID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + downloadTemplateLocation(audioFileId: number, options?: any): AxiosPromise { + return localVarFp.downloadTemplateLocation(audioFileId, options).then((request) => request(axios, basePath)); + }, + /** + * アップロードが完了した音声ファイルの情報を登録し、文字起こしタスクを生成します + * @summary + * @param {AudioUploadFinishedRequest} audioUploadFinishedRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + uploadFinished(audioUploadFinishedRequest: AudioUploadFinishedRequest, options?: any): AxiosPromise { + return localVarFp.uploadFinished(audioUploadFinishedRequest, options).then((request) => request(axios, basePath)); + }, + /** + * ログイン中ユーザー用のBlob Storage上の音声ファイルのアップロード先アクセスURLを取得します * @summary * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -864,19 +1468,43 @@ export const FilesApiFactory = function (configuration?: Configuration, basePath */ export class FilesApi extends BaseAPI { /** - * + * 指定した音声ファイルのBlob Storage上のダウンロード先アクセスURLを取得します * @summary - * @param {string} id 音声ファイル情報をDBから取得するためのID + * @param {number} audioFileId ODMSCloud上で管理する音声ファイルのID * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof FilesApi */ - public downloadLocation(id: string, options?: AxiosRequestConfig) { - return FilesApiFp(this.configuration).downloadLocation(id, options).then((request) => request(this.axios, this.basePath)); + public downloadLocation(audioFileId: number, options?: AxiosRequestConfig) { + return FilesApiFp(this.configuration).downloadLocation(audioFileId, options).then((request) => request(this.axios, this.basePath)); } /** - * + * 指定した音声ファイルに対応したテンプレートファイルのBlob Storage上のダウンロード先アクセスURLを取得します + * @summary + * @param {number} audioFileId 文字起こし対象の音声ファイルID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof FilesApi + */ + public downloadTemplateLocation(audioFileId: number, options?: AxiosRequestConfig) { + return FilesApiFp(this.configuration).downloadTemplateLocation(audioFileId, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * アップロードが完了した音声ファイルの情報を登録し、文字起こしタスクを生成します + * @summary + * @param {AudioUploadFinishedRequest} audioUploadFinishedRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof FilesApi + */ + public uploadFinished(audioUploadFinishedRequest: AudioUploadFinishedRequest, options?: AxiosRequestConfig) { + return FilesApiFp(this.configuration).uploadFinished(audioUploadFinishedRequest, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * ログイン中ユーザー用のBlob Storage上の音声ファイルのアップロード先アクセスURLを取得します * @summary * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -888,6 +1516,117 @@ export class FilesApi extends BaseAPI { } +/** + * LicensesApi - axios parameter creator + * @export + */ +export const LicensesApiAxiosParamCreator = function (configuration?: Configuration) { + return { + /** + * + * @summary + * @param {CreateOrdersRequest} createOrdersRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + createOrders: async (createOrdersRequest: CreateOrdersRequest, options: AxiosRequestConfig = {}): Promise => { + // verify required parameter 'createOrdersRequest' is not null or undefined + assertParamExists('createOrders', 'createOrdersRequest', createOrdersRequest) + const localVarPath = `/licenses/orders`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication bearer required + // http bearer authentication required + await setBearerAuthToObject(localVarHeaderParameter, configuration) + + + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(createOrdersRequest, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + } +}; + +/** + * LicensesApi - functional programming interface + * @export + */ +export const LicensesApiFp = function(configuration?: Configuration) { + const localVarAxiosParamCreator = LicensesApiAxiosParamCreator(configuration) + return { + /** + * + * @summary + * @param {CreateOrdersRequest} createOrdersRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async createOrders(createOrdersRequest: CreateOrdersRequest, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.createOrders(createOrdersRequest, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + } +}; + +/** + * LicensesApi - factory interface + * @export + */ +export const LicensesApiFactory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) { + const localVarFp = LicensesApiFp(configuration) + return { + /** + * + * @summary + * @param {CreateOrdersRequest} createOrdersRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + createOrders(createOrdersRequest: CreateOrdersRequest, options?: any): AxiosPromise { + return localVarFp.createOrders(createOrdersRequest, options).then((request) => request(axios, basePath)); + }, + }; +}; + +/** + * LicensesApi - object-oriented interface + * @export + * @class LicensesApi + * @extends {BaseAPI} + */ +export class LicensesApi extends BaseAPI { + /** + * + * @summary + * @param {CreateOrdersRequest} createOrdersRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof LicensesApi + */ + public createOrders(createOrdersRequest: CreateOrdersRequest, options?: AxiosRequestConfig) { + return LicensesApiFp(this.configuration).createOrders(createOrdersRequest, options).then((request) => request(this.axios, this.basePath)); + } +} + + /** * NotificationApi - axios parameter creator * @export @@ -999,6 +1738,624 @@ export class NotificationApi extends BaseAPI { } +/** + * TasksApi - axios parameter creator + * @export + */ +export const TasksApiAxiosParamCreator = function (configuration?: Configuration) { + return { + /** + * 指定した文字起こしタスクをバックアップします(ステータスをBackupにします) + * @summary + * @param {number} audioFileId ODMS Cloud上の音声ファイルID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + backup: async (audioFileId: number, options: AxiosRequestConfig = {}): Promise => { + // verify required parameter 'audioFileId' is not null or undefined + assertParamExists('backup', 'audioFileId', audioFileId) + const localVarPath = `/tasks/{audioFileId}/backup` + .replace(`{${"audioFileId"}}`, encodeURIComponent(String(audioFileId))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication bearer required + // http bearer authentication required + await setBearerAuthToObject(localVarHeaderParameter, configuration) + + + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * 指定した文字起こしタスクをキャンセルします(ステータスをUploadedにします) + * @summary + * @param {number} audioFileId ODMS Cloud上の音声ファイルID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + cancel: async (audioFileId: number, options: AxiosRequestConfig = {}): Promise => { + // verify required parameter 'audioFileId' is not null or undefined + assertParamExists('cancel', 'audioFileId', audioFileId) + const localVarPath = `/tasks/{audioFileId}/cancel` + .replace(`{${"audioFileId"}}`, encodeURIComponent(String(audioFileId))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication bearer required + // http bearer authentication required + await setBearerAuthToObject(localVarHeaderParameter, configuration) + + + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * 指定した文字起こしタスクをチェックインします(ステータスをFinishedにします) + * @summary + * @param {number} audioFileId ODMS Cloud上の音声ファイルID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + checkin: async (audioFileId: number, options: AxiosRequestConfig = {}): Promise => { + // verify required parameter 'audioFileId' is not null or undefined + assertParamExists('checkin', 'audioFileId', audioFileId) + const localVarPath = `/tasks/{audioFileId}/checkin` + .replace(`{${"audioFileId"}}`, encodeURIComponent(String(audioFileId))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication bearer required + // http bearer authentication required + await setBearerAuthToObject(localVarHeaderParameter, configuration) + + + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * 指定した文字起こしタスクをチェックアウトします(ステータスをInprogressにします) + * @summary + * @param {number} audioFileId ODMS Cloud上の音声ファイルID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + checkout: async (audioFileId: number, options: AxiosRequestConfig = {}): Promise => { + // verify required parameter 'audioFileId' is not null or undefined + assertParamExists('checkout', 'audioFileId', audioFileId) + const localVarPath = `/tasks/{audioFileId}/checkout` + .replace(`{${"audioFileId"}}`, encodeURIComponent(String(audioFileId))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication bearer required + // http bearer authentication required + await setBearerAuthToObject(localVarHeaderParameter, configuration) + + + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * 指定した文字起こしタスクの次のタスクに紐づく音声ファイルIDを取得します + * @summary + * @param {number} endedFileId 文字起こし完了したタスクの音声ファイルID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getNextAudioFile: async (endedFileId: number, options: AxiosRequestConfig = {}): Promise => { + // verify required parameter 'endedFileId' is not null or undefined + assertParamExists('getNextAudioFile', 'endedFileId', endedFileId) + const localVarPath = `/tasks/next`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication bearer required + // http bearer authentication required + await setBearerAuthToObject(localVarHeaderParameter, configuration) + + if (endedFileId !== undefined) { + localVarQueryParameter['endedFileId'] = endedFileId; + } + + + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * 音声ファイル・文字起こしタスク情報をページ指定して取得します + * @summary + * @param {number} [limit] タスクの取得件数(指定しない場合はデフォルト値) + * @param {number} [offset] オフセット(何件目から取得するか 設定しない場合はデフォルト値) + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getTasks: async (limit?: number, offset?: number, options: AxiosRequestConfig = {}): Promise => { + const localVarPath = `/tasks`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication bearer required + // http bearer authentication required + await setBearerAuthToObject(localVarHeaderParameter, configuration) + + if (limit !== undefined) { + localVarQueryParameter['limit'] = limit; + } + + if (offset !== undefined) { + localVarQueryParameter['offset'] = offset; + } + + + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * 指定した文字起こしタスクを差し戻します(ステータスをPendingにします) + * @summary + * @param {number} audioFileId ODMS Cloud上の音声ファイルID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + sendBack: async (audioFileId: number, options: AxiosRequestConfig = {}): Promise => { + // verify required parameter 'audioFileId' is not null or undefined + assertParamExists('sendBack', 'audioFileId', audioFileId) + const localVarPath = `/tasks/{audioFileId}/send-back` + .replace(`{${"audioFileId"}}`, encodeURIComponent(String(audioFileId))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication bearer required + // http bearer authentication required + await setBearerAuthToObject(localVarHeaderParameter, configuration) + + + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * 指定した文字起こしタスクを一時中断します(ステータスをPendingにします) + * @summary + * @param {number} audioFileId ODMS Cloud上の音声ファイルID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + suspend: async (audioFileId: number, options: AxiosRequestConfig = {}): Promise => { + // verify required parameter 'audioFileId' is not null or undefined + assertParamExists('suspend', 'audioFileId', audioFileId) + const localVarPath = `/tasks/{audioFileId}/suspend` + .replace(`{${"audioFileId"}}`, encodeURIComponent(String(audioFileId))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication bearer required + // http bearer authentication required + await setBearerAuthToObject(localVarHeaderParameter, configuration) + + + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + } +}; + +/** + * TasksApi - functional programming interface + * @export + */ +export const TasksApiFp = function(configuration?: Configuration) { + const localVarAxiosParamCreator = TasksApiAxiosParamCreator(configuration) + return { + /** + * 指定した文字起こしタスクをバックアップします(ステータスをBackupにします) + * @summary + * @param {number} audioFileId ODMS Cloud上の音声ファイルID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async backup(audioFileId: number, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.backup(audioFileId, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * 指定した文字起こしタスクをキャンセルします(ステータスをUploadedにします) + * @summary + * @param {number} audioFileId ODMS Cloud上の音声ファイルID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async cancel(audioFileId: number, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.cancel(audioFileId, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * 指定した文字起こしタスクをチェックインします(ステータスをFinishedにします) + * @summary + * @param {number} audioFileId ODMS Cloud上の音声ファイルID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async checkin(audioFileId: number, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.checkin(audioFileId, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * 指定した文字起こしタスクをチェックアウトします(ステータスをInprogressにします) + * @summary + * @param {number} audioFileId ODMS Cloud上の音声ファイルID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async checkout(audioFileId: number, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.checkout(audioFileId, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * 指定した文字起こしタスクの次のタスクに紐づく音声ファイルIDを取得します + * @summary + * @param {number} endedFileId 文字起こし完了したタスクの音声ファイルID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async getNextAudioFile(endedFileId: number, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.getNextAudioFile(endedFileId, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * 音声ファイル・文字起こしタスク情報をページ指定して取得します + * @summary + * @param {number} [limit] タスクの取得件数(指定しない場合はデフォルト値) + * @param {number} [offset] オフセット(何件目から取得するか 設定しない場合はデフォルト値) + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async getTasks(limit?: number, offset?: number, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.getTasks(limit, offset, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * 指定した文字起こしタスクを差し戻します(ステータスをPendingにします) + * @summary + * @param {number} audioFileId ODMS Cloud上の音声ファイルID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async sendBack(audioFileId: number, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.sendBack(audioFileId, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * 指定した文字起こしタスクを一時中断します(ステータスをPendingにします) + * @summary + * @param {number} audioFileId ODMS Cloud上の音声ファイルID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async suspend(audioFileId: number, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.suspend(audioFileId, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + } +}; + +/** + * TasksApi - factory interface + * @export + */ +export const TasksApiFactory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) { + const localVarFp = TasksApiFp(configuration) + return { + /** + * 指定した文字起こしタスクをバックアップします(ステータスをBackupにします) + * @summary + * @param {number} audioFileId ODMS Cloud上の音声ファイルID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + backup(audioFileId: number, options?: any): AxiosPromise { + return localVarFp.backup(audioFileId, options).then((request) => request(axios, basePath)); + }, + /** + * 指定した文字起こしタスクをキャンセルします(ステータスをUploadedにします) + * @summary + * @param {number} audioFileId ODMS Cloud上の音声ファイルID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + cancel(audioFileId: number, options?: any): AxiosPromise { + return localVarFp.cancel(audioFileId, options).then((request) => request(axios, basePath)); + }, + /** + * 指定した文字起こしタスクをチェックインします(ステータスをFinishedにします) + * @summary + * @param {number} audioFileId ODMS Cloud上の音声ファイルID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + checkin(audioFileId: number, options?: any): AxiosPromise { + return localVarFp.checkin(audioFileId, options).then((request) => request(axios, basePath)); + }, + /** + * 指定した文字起こしタスクをチェックアウトします(ステータスをInprogressにします) + * @summary + * @param {number} audioFileId ODMS Cloud上の音声ファイルID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + checkout(audioFileId: number, options?: any): AxiosPromise { + return localVarFp.checkout(audioFileId, options).then((request) => request(axios, basePath)); + }, + /** + * 指定した文字起こしタスクの次のタスクに紐づく音声ファイルIDを取得します + * @summary + * @param {number} endedFileId 文字起こし完了したタスクの音声ファイルID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getNextAudioFile(endedFileId: number, options?: any): AxiosPromise { + return localVarFp.getNextAudioFile(endedFileId, options).then((request) => request(axios, basePath)); + }, + /** + * 音声ファイル・文字起こしタスク情報をページ指定して取得します + * @summary + * @param {number} [limit] タスクの取得件数(指定しない場合はデフォルト値) + * @param {number} [offset] オフセット(何件目から取得するか 設定しない場合はデフォルト値) + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getTasks(limit?: number, offset?: number, options?: any): AxiosPromise { + return localVarFp.getTasks(limit, offset, options).then((request) => request(axios, basePath)); + }, + /** + * 指定した文字起こしタスクを差し戻します(ステータスをPendingにします) + * @summary + * @param {number} audioFileId ODMS Cloud上の音声ファイルID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + sendBack(audioFileId: number, options?: any): AxiosPromise { + return localVarFp.sendBack(audioFileId, options).then((request) => request(axios, basePath)); + }, + /** + * 指定した文字起こしタスクを一時中断します(ステータスをPendingにします) + * @summary + * @param {number} audioFileId ODMS Cloud上の音声ファイルID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + suspend(audioFileId: number, options?: any): AxiosPromise { + return localVarFp.suspend(audioFileId, options).then((request) => request(axios, basePath)); + }, + }; +}; + +/** + * TasksApi - object-oriented interface + * @export + * @class TasksApi + * @extends {BaseAPI} + */ +export class TasksApi extends BaseAPI { + /** + * 指定した文字起こしタスクをバックアップします(ステータスをBackupにします) + * @summary + * @param {number} audioFileId ODMS Cloud上の音声ファイルID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof TasksApi + */ + public backup(audioFileId: number, options?: AxiosRequestConfig) { + return TasksApiFp(this.configuration).backup(audioFileId, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * 指定した文字起こしタスクをキャンセルします(ステータスをUploadedにします) + * @summary + * @param {number} audioFileId ODMS Cloud上の音声ファイルID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof TasksApi + */ + public cancel(audioFileId: number, options?: AxiosRequestConfig) { + return TasksApiFp(this.configuration).cancel(audioFileId, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * 指定した文字起こしタスクをチェックインします(ステータスをFinishedにします) + * @summary + * @param {number} audioFileId ODMS Cloud上の音声ファイルID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof TasksApi + */ + public checkin(audioFileId: number, options?: AxiosRequestConfig) { + return TasksApiFp(this.configuration).checkin(audioFileId, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * 指定した文字起こしタスクをチェックアウトします(ステータスをInprogressにします) + * @summary + * @param {number} audioFileId ODMS Cloud上の音声ファイルID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof TasksApi + */ + public checkout(audioFileId: number, options?: AxiosRequestConfig) { + return TasksApiFp(this.configuration).checkout(audioFileId, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * 指定した文字起こしタスクの次のタスクに紐づく音声ファイルIDを取得します + * @summary + * @param {number} endedFileId 文字起こし完了したタスクの音声ファイルID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof TasksApi + */ + public getNextAudioFile(endedFileId: number, options?: AxiosRequestConfig) { + return TasksApiFp(this.configuration).getNextAudioFile(endedFileId, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * 音声ファイル・文字起こしタスク情報をページ指定して取得します + * @summary + * @param {number} [limit] タスクの取得件数(指定しない場合はデフォルト値) + * @param {number} [offset] オフセット(何件目から取得するか 設定しない場合はデフォルト値) + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof TasksApi + */ + public getTasks(limit?: number, offset?: number, options?: AxiosRequestConfig) { + return TasksApiFp(this.configuration).getTasks(limit, offset, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * 指定した文字起こしタスクを差し戻します(ステータスをPendingにします) + * @summary + * @param {number} audioFileId ODMS Cloud上の音声ファイルID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof TasksApi + */ + public sendBack(audioFileId: number, options?: AxiosRequestConfig) { + return TasksApiFp(this.configuration).sendBack(audioFileId, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * 指定した文字起こしタスクを一時中断します(ステータスをPendingにします) + * @summary + * @param {number} audioFileId ODMS Cloud上の音声ファイルID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof TasksApi + */ + public suspend(audioFileId: number, options?: AxiosRequestConfig) { + return TasksApiFp(this.configuration).suspend(audioFileId, options).then((request) => request(this.axios, this.basePath)); + } +} + + /** * UsersApi - axios parameter creator * @export @@ -1077,6 +2434,40 @@ export const UsersApiAxiosParamCreator = function (configuration?: Configuration options: localVarRequestOptions, }; }, + /** + * ログインしているユーザーに関連する各種情報を取得します + * @summary + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getRelations: async (options: AxiosRequestConfig = {}): Promise => { + const localVarPath = `/users/relations`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication bearer required + // http bearer authentication required + await setBearerAuthToObject(localVarHeaderParameter, configuration) + + + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, /** * * @summary @@ -1183,6 +2574,16 @@ export const UsersApiFp = function(configuration?: Configuration) { const localVarAxiosArgs = await localVarAxiosParamCreator.confirmUserAndInitPassword(confirmRequest, options); return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, + /** + * ログインしているユーザーに関連する各種情報を取得します + * @summary + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async getRelations(options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.getRelations(options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, /** * * @summary @@ -1234,6 +2635,15 @@ export const UsersApiFactory = function (configuration?: Configuration, basePath confirmUserAndInitPassword(confirmRequest: ConfirmRequest, options?: any): AxiosPromise { return localVarFp.confirmUserAndInitPassword(confirmRequest, options).then((request) => request(axios, basePath)); }, + /** + * ログインしているユーザーに関連する各種情報を取得します + * @summary + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getRelations(options?: any): AxiosPromise { + return localVarFp.getRelations(options).then((request) => request(axios, basePath)); + }, /** * * @summary @@ -1287,6 +2697,17 @@ export class UsersApi extends BaseAPI { return UsersApiFp(this.configuration).confirmUserAndInitPassword(confirmRequest, options).then((request) => request(this.axios, this.basePath)); } + /** + * ログインしているユーザーに関連する各種情報を取得します + * @summary + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof UsersApi + */ + public getRelations(options?: AxiosRequestConfig) { + return UsersApiFp(this.configuration).getRelations(options).then((request) => request(this.axios, this.basePath)); + } + /** * * @summary diff --git a/dictation_client/src/app/store.ts b/dictation_client/src/app/store.ts index 9435645..4ae0d5b 100644 --- a/dictation_client/src/app/store.ts +++ b/dictation_client/src/app/store.ts @@ -5,6 +5,7 @@ import signup from "features/signup/signupSlice"; import verify from "features/verify/verifySlice"; import ui from "features/ui/uiSlice"; import user from "features/user/userSlice"; +import license from "features/license/licenseSlice"; export const store = configureStore({ reducer: { @@ -14,6 +15,7 @@ export const store = configureStore({ verify, ui, user, + license, }, }); diff --git a/dictation_client/src/assets/images/ODMScloud.png b/dictation_client/src/assets/images/ODMScloud.png new file mode 100644 index 0000000000000000000000000000000000000000..1be7a16362705172f4ab9176292101882d11382e GIT binary patch literal 7670 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 bbgUksd0kG`-w{wEfpV+1SJz8Ca=7;iu@ literal 0 HcmV?d00001 diff --git a/dictation_client/src/assets/images/lock.svg b/dictation_client/src/assets/images/lock.svg new file mode 100644 index 0000000..993e747 --- /dev/null +++ b/dictation_client/src/assets/images/lock.svg @@ -0,0 +1,13 @@ + + + + + + diff --git a/dictation_client/src/assets/images/lock_open.svg b/dictation_client/src/assets/images/lock_open.svg new file mode 100644 index 0000000..a822269 --- /dev/null +++ b/dictation_client/src/assets/images/lock_open.svg @@ -0,0 +1,14 @@ + + + + + + diff --git a/dictation_client/src/assets/images/top-bg.png b/dictation_client/src/assets/images/top-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..622ed48c34f3c8f7a1af15b4fdd66e30e040ef5f GIT binary patch literal 79672 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 Kq^cxLL;nwH%hiVf literal 0 HcmV?d00001 diff --git a/dictation_client/src/assets/images/undo.svg b/dictation_client/src/assets/images/undo.svg new file mode 100644 index 0000000..963bf70 --- /dev/null +++ b/dictation_client/src/assets/images/undo.svg @@ -0,0 +1,11 @@ + + + + + + diff --git a/dictation_client/src/common/errors/code.ts b/dictation_client/src/common/errors/code.ts index 305eb60..c296113 100644 --- a/dictation_client/src/common/errors/code.ts +++ b/dictation_client/src/common/errors/code.ts @@ -24,4 +24,5 @@ export const errorCodes = [ "E010202", // 認証済ユーザエラー "E010301", // メールアドレス登録済みエラー "E010302", // authorId重複エラー + "E010401", // PONumber重複エラー ] as const; diff --git a/dictation_client/src/features/license/index.ts b/dictation_client/src/features/license/index.ts new file mode 100644 index 0000000..85ba17f --- /dev/null +++ b/dictation_client/src/features/license/index.ts @@ -0,0 +1,4 @@ +export * from "./state"; +export * from "./operations"; +export * from "./selectors"; +export * from "./licenseSlice"; diff --git a/dictation_client/src/features/license/licenseSlice.ts b/dictation_client/src/features/license/licenseSlice.ts new file mode 100644 index 0000000..583f992 --- /dev/null +++ b/dictation_client/src/features/license/licenseSlice.ts @@ -0,0 +1,31 @@ +import { PayloadAction, createSlice } from "@reduxjs/toolkit"; +import { LicenseOrdersState } from "./state"; + +const initialState: LicenseOrdersState = { + apps: { + poNumber: "", + newOrder: 0, + }, +}; +export const licenseSlice = createSlice({ + name: "license", + initialState, + reducers: { + changePoNumber: (state, action: PayloadAction<{ poNumber: string }>) => { + const { poNumber } = action.payload; + state.apps.poNumber = poNumber.toUpperCase(); + }, + changeNewOrder: (state, action: PayloadAction<{ newOrder: number }>) => { + const { newOrder } = action.payload; + state.apps.newOrder = newOrder; + }, + cleanupApps: (state) => { + state.apps = initialState.apps; + }, + }, +}); + +export const { changePoNumber, changeNewOrder, cleanupApps } = + licenseSlice.actions; + +export default licenseSlice.reducer; diff --git a/dictation_client/src/features/license/operations.ts b/dictation_client/src/features/license/operations.ts new file mode 100644 index 0000000..75bb187 --- /dev/null +++ b/dictation_client/src/features/license/operations.ts @@ -0,0 +1,74 @@ +import { createAsyncThunk } from "@reduxjs/toolkit"; +import type { RootState } from "app/store"; +import { getTranslationID } from "translation"; +import { openSnackbar } from "features/ui/uiSlice"; +import { LicensesApi } from "../../api/api"; +import { Configuration } from "../../api/configuration"; +import { ErrorObject, createErrorObject } from "../../common/errors"; + +export const orderLicenseAsync = createAsyncThunk< + { + /* Empty Object */ + }, + { + // パラメータ + poNumber: string; + orderCount: number; + }, + { + // rejectした時の返却値の型 + rejectValue: { + error: ErrorObject; + }; + } +>("licenses/orderLicenseAsync", async (args, thunkApi) => { + const { poNumber, orderCount } = args; + + // apiのConfigurationを取得する + const { getState } = thunkApi; + const state = getState() as RootState; + const { configuration, accessToken } = state.auth; + const config = new Configuration(configuration); + const licensesApi = new LicensesApi(config); + + try { + await licensesApi.createOrders( + { + poNumber, + orderCount, + }, + { + headers: { authorization: `Bearer ${accessToken}` }, + } + ); + thunkApi.dispatch( + openSnackbar({ + level: "info", + message: getTranslationID( + "licenseOrderPage.message.createOrderSuccess" + ), + }) + ); + return {}; + } catch (e) { + // e ⇒ errorObjectに変換" + const error = createErrorObject(e); + + let errorMessage = getTranslationID("common.message.internalServerError"); + + if (error.code === "E010401") { + errorMessage = getTranslationID( + "licenseOrderPage.message.poNumberConflictError" + ); + } + + thunkApi.dispatch( + openSnackbar({ + level: "error", + message: errorMessage, + }) + ); + + return thunkApi.rejectWithValue({ error }); + } +}); diff --git a/dictation_client/src/features/license/selectors.ts b/dictation_client/src/features/license/selectors.ts new file mode 100644 index 0000000..78d3cbb --- /dev/null +++ b/dictation_client/src/features/license/selectors.ts @@ -0,0 +1,36 @@ +import { RootState } from "app/store"; + +export const selectInputValidationErrors = (state: RootState) => { + const { poNumber, newOrder } = state.license.apps; + + // 必須項目のチェック + const hasErrorEmptyPoNumber = poNumber === ""; + // newOrderは初期値が入っている+minvalueが1なので必須チェックは行わない + + const hasErrorIncorrectPoNumber = checkErrorIncorrectPoNumber(poNumber); + const hasErrorIncorrectNewOrder = checkErrorIncorrectNewOrder(newOrder); + + return { + hasErrorEmptyPoNumber, + hasErrorIncorrectPoNumber, + hasErrorIncorrectNewOrder, + }; +}; +export const checkErrorIncorrectPoNumber = (poNumber: string): boolean => { + // 大文字半角英数字で50文字まで + const charaTypePattern = /^[A-Z0-9]{1,50}$/; + const charaType = new RegExp(charaTypePattern).test(poNumber); + + return !charaType; +}; +export const checkErrorIncorrectNewOrder = (newOrder: number): boolean => { + // 0以下の場合はエラー + if (newOrder <= 0) { + return true; + } + + return false; +}; + +export const selectPoNumber = (state: RootState) => state.license.apps.poNumber; +export const selectNewOrder = (state: RootState) => state.license.apps.newOrder; diff --git a/dictation_client/src/features/license/state.ts b/dictation_client/src/features/license/state.ts new file mode 100644 index 0000000..2a1f7c3 --- /dev/null +++ b/dictation_client/src/features/license/state.ts @@ -0,0 +1,8 @@ +export interface LicenseOrdersState { + apps: Apps; +} + +export interface Apps { + poNumber: string; + newOrder: number; +} diff --git a/dictation_client/src/pages/LicensePage/index.tsx b/dictation_client/src/pages/LicensePage/index.tsx index 7bfc585..d6a957c 100644 --- a/dictation_client/src/pages/LicensePage/index.tsx +++ b/dictation_client/src/pages/LicensePage/index.tsx @@ -1,10 +1,10 @@ import { useMsal } from "@azure/msal-react"; +import React, { useCallback, useState } from "react"; import { AppDispatch } from "app/store"; import { UpdateTokenTimer } from "components/auth/updateTokenTimer"; import Footer from "components/footer"; import Header from "components/header"; import { clearToken } from "features/auth"; -import React from "react"; import { useDispatch } from "react-redux"; import styles from "styles/app.module.scss"; import { getTranslationID } from "translation"; @@ -12,74 +12,94 @@ import { useTranslation } from "react-i18next"; import postAdd from "../../assets/images/post_add.svg"; import history from "../../assets/images/history.svg"; import key from "../../assets/images/key.svg"; +import { LicenseOrderPopup } from "./licenseOrderPopup"; const LicensePage: React.FC = (): JSX.Element => { const { instance } = useMsal(); const dispatch: AppDispatch = useDispatch(); const [t] = useTranslation(); + const [islicenseOrderPopupOpen, setIslicenseOrderPopupOpen] = useState(false); + + const onlicenseOrderOpen = useCallback(() => { + setIslicenseOrderPopupOpen(true); + }, [setIslicenseOrderPopupOpen]); + return ( - /* TODO 現状(PBI1221)はライセンス注文PUを起動するためのボタンのみ。別途ライセンス注文を実装するPBIで全般的に見直し。 */ -
-
- - -
- -
- - {/* TODO 画面デザインにはないが、試験時に便利なので配置しておく。ライセンス注文を実装するPBIで正式なサインアウトのレイアウトに直す */} -
- + /> + )} + {/* TODO 現状(PBI1221)はライセンス注文PUを起動するためのボタンのみ。別途ライセンス注文を実装するPBIで全般的に見直し。 */} +
+
+ + +
+
+
+

+ {t(getTranslationID("LicensePage.label.title"))} +

+
+
+
+

+ {t(getTranslationID("LicensePage.label.subTitle"))} +

+ +
+
+
+
+ + {/* TODO 画面デザインにはないが、試験時に便利なので配置しておく。ライセンス注文を実装するPBIで正式なサインアウトのレイアウトに直す */} +
+ +
+
-
-
+ ); }; diff --git a/dictation_client/src/pages/LicensePage/licenseOrderPopup.tsx b/dictation_client/src/pages/LicensePage/licenseOrderPopup.tsx new file mode 100644 index 0000000..be846c4 --- /dev/null +++ b/dictation_client/src/pages/LicensePage/licenseOrderPopup.tsx @@ -0,0 +1,210 @@ +import { AppDispatch } from "app/store"; +import React, { useState, useCallback, useEffect } from "react"; +import styles from "styles/app.module.scss"; +import { useDispatch, useSelector } from "react-redux"; +import { getTranslationID } from "translation"; +import { useTranslation } from "react-i18next"; +import { + changePoNumber, + changeNewOrder, + selectPoNumber, + selectNewOrder, + selectInputValidationErrors, + orderLicenseAsync, + cleanupApps, +} from "features/license"; +import close from "../../assets/images/close.svg"; + +interface LicenseOrderPopupProps { + onClose: () => void; +} + +export const LicenseOrderPopup: React.FC = (props) => { + const { onClose } = props; + const dispatch: AppDispatch = useDispatch(); + const { t } = useTranslation(); + const initCount = useSelector(selectNewOrder); + const [count, setCount] = useState(initCount); + const [poNumberInputValue, setpoNumberInputValue] = useState(); + + useEffect( + () => () => { + // useEffectのreturnとしてcleanupAppsを実行することで、ポップアップのアンマウント時に初期化を行う + dispatch(cleanupApps()); + }, + [dispatch] + ); + + // ポップアップを閉じる処理 + const closePopup = useCallback(() => { + setIsPushOrderButton(false); + onClose(); + }, [onClose]); + + // 画面からのパラメータ + const poNumber = useSelector(selectPoNumber); + const orderCount = useSelector(selectNewOrder); + + const [isPushOrderButton, setIsPushOrderButton] = useState(false); + + // エラー宣言 + const { + hasErrorEmptyPoNumber, + hasErrorIncorrectPoNumber, + hasErrorIncorrectNewOrder, + } = useSelector(selectInputValidationErrors); + + // 注文ボタン押下時 + const onOrderLicense = useCallback(async () => { + setIsPushOrderButton(true); + // エラーチェックを実施 + if ( + hasErrorEmptyPoNumber || + hasErrorIncorrectPoNumber || + hasErrorIncorrectNewOrder + ) { + return; + } + + // ダイアログ確認 + if ( + /* eslint-disable-next-line no-alert */ + !window.confirm( + t(getTranslationID("licenseOrderPage.message.confirmOrder")) + ) + ) { + return; + } + + // 注文APIの呼び出し + const { meta } = await dispatch( + orderLicenseAsync({ + poNumber, + orderCount, + }) + ); + setIsPushOrderButton(false); + + if (meta.requestStatus === "fulfilled") { + closePopup(); + } + }, [ + dispatch, + closePopup, + t, + hasErrorEmptyPoNumber, + hasErrorIncorrectPoNumber, + hasErrorIncorrectNewOrder, + poNumber, + orderCount, + ]); + + // HTML + return ( +
+
+

+ {t(getTranslationID("licenseOrderPage.label.title"))} + +

+
+
+
{t(getTranslationID("licenseOrderPage.label.licenses"))}
+
+ +
+
{t(getTranslationID("licenseOrderPage.label.poNumber"))}
+
+ { + const input = e.target.value.toUpperCase(); + setpoNumberInputValue(input); + }} + onBlur={(e) => { + dispatch(changePoNumber({ poNumber: e.target.value })); + }} + /> + {isPushOrderButton && hasErrorEmptyPoNumber && ( + + {t( + getTranslationID("licenseOrderPage.message.inputEmptyError") + )} + + )} + {isPushOrderButton && hasErrorIncorrectPoNumber && ( + + {t( + getTranslationID( + "licenseOrderPage.message.poNumberIncorrectError" + ) + )} + + )} +
+
{t(getTranslationID("licenseOrderPage.label.newOrder"))}
+
+ { + const input = Number(e.target.value.substring(0, 4)); + setCount(input); + }} + onBlur={(e) => { + dispatch( + changeNewOrder({ newOrder: Number(e.target.value) }) + ); + }} + /> + {isPushOrderButton && hasErrorIncorrectNewOrder && ( + + {t( + getTranslationID( + "licenseOrderPage.message.newOrderIncorrectError" + ) + )} + + )} +
+
+ +
+
+
+
+
+ ); +}; diff --git a/dictation_client/src/styles/app.module.scss b/dictation_client/src/styles/app.module.scss index 4e0abe3..8eee3fa 100644 --- a/dictation_client/src/styles/app.module.scss +++ b/dictation_client/src/styles/app.module.scss @@ -1,8 +1,3 @@ -.wrap.home { - background: url("../assets/images/top-bg04.png") no-repeat bottom center; - background-size: cover; -} - .wrap { display: grid; grid-template-rows: auto 1fr auto; @@ -22,7 +17,7 @@ z-index: 4; } .headerLogo { - margin: 1.8rem 2rem 1rem; + margin: 1.2rem 2rem 1rem; font-size: 1.71rem; line-height: 2rem; letter-spacing: 0.07rem; @@ -32,7 +27,7 @@ width: 198px; } .headerSub { - margin: 1.8rem 2rem 1rem; + margin: 1.4rem 2rem 1rem; font-size: 1.2rem; line-height: 2rem; letter-spacing: 0.07rem; @@ -70,25 +65,26 @@ text-decoration: underline; } .headerMenu ul li a.isActive { - font-weight: 500; + font-weight: 600; pointer-events: none; position: relative; } .headerMenu ul li a.isActive::after { content: ""; - width: 100%; - height: 5px; - background: #f0f0f0; + border-right: 0.6rem transparent solid; + border-bottom: 0.6rem #282828 solid; + border-left: 0.6rem transparent solid; position: absolute; bottom: -4px; - left: 0; + left: 50%; + transform: translateX(-50%); } .accountInfo { position: absolute; right: 2rem; bottom: 0.3rem; - font-size: 0.8rem; + font-size: 0.9rem; line-height: 1.6rem; letter-spacing: 0.04rem; font-weight: normal; @@ -133,7 +129,54 @@ _:-ms-lang(x)::-ms-backdrop, letter-spacing: 0.4px; font-weight: normal; color: #999999; - background: #282828; +} + +h2 .brCrumb, +h3 .brCrumb { + display: inline; + margin-left: 1rem; + font-size: 1.5rem; + line-height: 1.4; + letter-spacing: 0.04rem; + font-weight: normal; +} +h2 .brCrumb::before, +h3 .brCrumb::before { + content: "-"; +} +h2 .brCrumb .tlIcon, +h3 .brCrumb .tlIcon { + width: 1.6rem; + margin: 0 0.2rem 0 0.5rem; + vertical-align: text-top; +} + +.brCrumbAcc { + margin-bottom: 1rem; +} +.brCrumbAcc li { + padding-left: 1.1rem; + font-size: 1.2rem; + line-height: 1.4; + letter-spacing: 0.04rem; + font-weight: normal; + position: relative; +} +.brCrumbAcc li::before { + content: ""; + border-top: 8px #333333 solid; + border-right: 6px transparent solid; + border-left: 6px transparent solid; + position: absolute; + top: 50%; + left: 0; + transform: translateY(-50%); +} +.brCrumbAcc li:nth-of-type(2) { + margin-left: 1.1rem; +} +.brCrumbAcc li:nth-of-type(3) { + margin-left: 2.2rem; } .buttonNormal { @@ -281,14 +324,18 @@ _:-ms-lang(x)::-ms-backdrop, .formInput:focus { outline: 0; } +.formInput[readonly] { + border: 1px #e6e6e6 solid; + background: #e6e6e6; +} .formInput.isError { background: rgba(229, 0, 0, 0.08); } .formInput.password[type="password"] + span { - background: url(../images/visibility_off.svg) no-repeat top right; + background: url(../assets/images/visibility_off.svg) no-repeat top right; } .formInput.password[type="text"] + span { - background: url(../images/visibility.svg) no-repeat top right; + background: url(../assets/images/visibility.svg) no-repeat top right; } .formIconEye { display: inline-block; @@ -345,6 +392,7 @@ _:-ms-lang(x)::-ms-backdrop, width: 350px; padding: 0.6rem 0.6rem; background: #f0f0f0; + box-sizing: border-box; } .formSubmit { min-width: 15rem; @@ -433,6 +481,34 @@ _:-ms-lang(x)::-ms-backdrop, width: 100px; } +.listVertical { + width: 600px; + display: flex; + flex-wrap: wrap; + border-bottom: 0.1rem solid rgba(0, 0, 0, 0.1); +} +.listVertical dt, +.listVertical dd { + padding: 0.8rem 4%; + font-size: 14px; + line-height: 1.4; + letter-spacing: 0.04rem; + font-weight: normal; +} +.listVertical dt:nth-of-type(odd), +.listVertical dd:nth-of-type(odd) { + background: #f5f5f5; +} +.listVertical dt { + width: 42%; + text-align: left; + position: relative; +} +.listVertical dd { + width: 42%; + text-align: right; +} + .loadingBoxSpinner { width: 50px; height: 50px; @@ -524,16 +600,22 @@ _:-ms-lang(x)::-ms-backdrop, } .pageHeader { - background: #f0f0f0; - padding: 1.5rem 2.5rem; - background: linear-gradient(#f0f0f0, #ffffff 70%, #ffffff 100%); + padding: 0.5rem 2.5rem 0.4rem; + background: #282828; + color: #ffffff; + margin-bottom: 2rem; } .pageTitle { + display: inline-block; + padding-right: 1rem; font-size: 1.8rem; line-height: 2.5rem; letter-spacing: 0.07rem; font-weight: 500; } +.pageTx { + display: inline-block; +} .pagenation { margin-bottom: 3rem; @@ -640,6 +722,16 @@ _:-ms-lang(x)::-ms-backdrop, .table tr:last-child { border-bottom: 0.1rem solid rgba(0, 0, 0, 0.1); } +.table td { + padding: 0.8rem 0.7rem; + font-size: 13px; + line-height: 1.4; + letter-spacing: 0; + font-weight: normal; +} +.table td .isAlert { + color: #ff5a33; +} .tableHeader { background: #282828; } @@ -657,6 +749,7 @@ _:-ms-lang(x)::-ms-backdrop, .tableHeader th .hasSort { display: block; width: calc(100% - 0.5rem); + padding-right: 0.5rem; } .tableHeader th .hasSort::before { content: ""; @@ -667,7 +760,7 @@ _:-ms-lang(x)::-ms-backdrop, top: 50%; right: 0.5rem; transform: translateY(-50%); - opacity: 0; + opacity: 0.4; -moz-transition: all 0.3s ease-out; -ms-transition: all 0.3s ease-out; -webkit-transition: all 0.3s ease-out; @@ -692,55 +785,48 @@ _:-ms-lang(x)::-ms-backdrop, right: -0.3rem; z-index: 3; } -.table td { - padding: 0.8rem 0.5rem; - font-size: 13px; - line-height: 1.4; - letter-spacing: 0; - font-weight: normal; +.tableHeader th.noLine { + border-right: none; } -.table td:has(img) { +.tableHeader th.noLine::after { + display: none; +} + +.wrap.home { + background: url("../assets/images/top-bg.png") no-repeat bottom center; + background-size: cover; +} + +.header.home { + background: none; + box-shadow: none; +} +.header.home .headerSub { + display: none; +} + +@media only screen and (min-width: 1280px) { + .pgHome { + display: flex; + flex-wrap: wrap; + justify-content: center; + } +} +.pgHome .ODMSlogo { text-align: center; + padding: 2rem 0 0; } -.table td .isAlert { - color: #ff5a33; -} - -.icCheckCircle { - width: 20px; - vertical-align: bottom; -} - @media only screen and (min-width: 1280px) { - .wrap.home { - display: grid; - grid-template-rows: 1fr auto; - grid-template-columns: 45% 1fr; - grid-template-areas: "header main" "footer footer"; - min-height: 100vh; - } -} - -@media only screen and (min-width: 1280px) { - .header.home { - display: block; - padding-top: 30vh; - padding-left: 40%; - background: none; - box-shadow: none; - } - .header.home .headerSub { - font-size: 1.4rem; - line-height: 2rem; - letter-spacing: 0.07rem; - font-weight: 600; + .pgHome .ODMSlogo { + width: 400px; + margin: 15vh 0 0 0; + padding: 0 0 0; text-align: left; } } - .pgHome > div { width: 400px; - margin: 15vh auto 0; + margin: 3rem auto 0; padding: 2rem; background: #ffffff; box-shadow: 0 0 5px #aaa; @@ -748,7 +834,7 @@ _:-ms-lang(x)::-ms-backdrop, } @media only screen and (min-width: 1280px) { .pgHome > div { - margin: 25vh auto 0 50px; + margin: 15vh 0 0 0; } } .pgHomeLinks { @@ -797,48 +883,53 @@ _:-ms-lang(x)::-ms-backdrop, } .user > div, -.license > div { +.license > div, +.dictation > div { padding: 0 2rem; } .user .table tr:not(.tableHeader), -.license .table tr:not(.tableHeader) { - cursor: pointer; +.license .table tr:not(.tableHeader), +.dictation .table tr:not(.tableHeader) { position: relative; } -.user .table tr:not(.tableHeader):hover .tdEx, -.license .table tr:not(.tableHeader):hover .tdEx { - opacity: 1; -} -.user .table tr:not(.tableHeader).isSelected, -.license .table tr:not(.tableHeader).isSelected { - background: #0084b2; - color: #ffffff; -} -.user .table tr:not(.tableHeader).isSelected:hover, -.license .table tr:not(.tableHeader).isSelected:hover { - color: #ffffff; -} -.user .table td:not(.tdEx), -.license .table td:not(.tdEx) { +.user .table td, +.license .table td, +.dictation .table td { max-width: 300px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; - padding-bottom: 2rem; + position: relative; } -.user .table td.tdEx, -.license .table td.tdEx { +.user .table.user tr:not(.tableHeader), +.license .table.user tr:not(.tableHeader), +.dictation .table.user tr:not(.tableHeader) { + cursor: pointer; +} +.user .table.user tr:not(.tableHeader):hover, +.license .table.user tr:not(.tableHeader):hover, +.dictation .table.user tr:not(.tableHeader):hover { + color: #0084b2; +} +.user .table.user tr:not(.tableHeader).isSelected, +.license .table.user tr:not(.tableHeader).isSelected, +.dictation .table.user tr:not(.tableHeader).isSelected { + color: #ffffff; +} +.user .table.user tr:not(.tableHeader).isSelected:hover, +.license .table.user tr:not(.tableHeader).isSelected:hover, +.dictation .table.user tr:not(.tableHeader).isSelected:hover { + color: #ffffff; +} +.user .table.user tr:not(.tableHeader).isSelected td, +.license .table.user tr:not(.tableHeader).isSelected td, +.dictation .table.user tr:not(.tableHeader).isSelected td { + background: #0084b2; +} +.user .table.user tr:not(.tableHeader).isSelected .menuInTable, +.license .table.user tr:not(.tableHeader).isSelected .menuInTable, +.dictation .table.user tr:not(.tableHeader).isSelected .menuInTable { display: block; - width: 100%; - padding: 0 0.5rem; - position: absolute; - left: 0; - bottom: 0.5rem; - -moz-transition: all 0.3s ease-out; - -ms-transition: all 0.3s ease-out; - -webkit-transition: all 0.3s ease-out; - transition: all 0.3s ease-out; - opacity: 0; } .menuAction { @@ -848,6 +939,51 @@ _:-ms-lang(x)::-ms-backdrop, display: inline-block; margin-right: 0.5rem; } +.menuAction.inTable { + margin-bottom: 0; +} +.menuAction.inTable .menuLink { + padding: 0.3rem 0.5rem 0.3rem 0.5rem; + opacity: 0; +} +.menuAction.inTable .menuLink.isActive { + opacity: 1; +} +.menuAction.inTable .colorLink { + display: block; + padding: 0.3rem 0.5rem 0.3rem 0.5rem; + font-size: 13px; + line-height: 1.4; + letter-spacing: 0.04rem; + font-weight: normal; + text-decoration: none; + border: 1px #999999 solid; + border-radius: 0.2rem; + opacity: 0; + pointer-events: none; + background: #ffffff; + -moz-transition: all 0.3s ease-out; + -ms-transition: all 0.3s ease-out; + -webkit-transition: all 0.3s ease-out; + transition: all 0.3s ease-out; +} +.menuAction.inTable .colorLink.isActive { + cursor: pointer; + opacity: 1; + color: #ffffff; + background: #004086; + border: 1px #004086 solid; + pointer-events: inherit; +} +.menuAction.inTable .colorLink.isActive:hover { + background: rgba(0, 94, 184, 0.7); +} +.menuMore { + text-align: center; +} +.menuMore .menuIcon { + height: 1.2rem; +} .menuLink { display: block; padding: 0.3rem 0.5rem 0.3rem 0.3rem; @@ -859,8 +995,13 @@ _:-ms-lang(x)::-ms-backdrop, color: #333333; border: 1px #a5a5a5 solid; border-radius: 0.2rem; - opacity: 0.4; + opacity: 0.3; pointer-events: none; + background: #ffffff; + -moz-transition: all 0.3s ease-out; + -ms-transition: all 0.3s ease-out; + -webkit-transition: all 0.3s ease-out; + transition: all 0.3s ease-out; } .menuLink.isActive { opacity: 1; @@ -875,6 +1016,577 @@ _:-ms-lang(x)::-ms-backdrop, vertical-align: bottom; } +.icCheckCircle { + width: 20px; + vertical-align: bottom; +} + +.license .table.history { + width: 1000px; +} +.license .table.history td:last-child { + width: 200px; + text-align: right; +} +.license .table.cardHistory { + width: 750px; +} +.license .table.cardHistory td:last-child { + width: 50%; +} +.license .table.partner tr { + position: relative; +} +.license .table.partner tr td[title="View child accounts"] { + position: relative; + cursor: pointer; + background-size: 0.2rem; +} +.license .table.partner tr td[title="View child accounts"]:hover { + color: #0084b2; +} +.license .table.partner tr td[title="View child accounts"] a { + color: inherit; + text-decoration: none; +} +.license .table.partner tr td[title="Return"] { + position: relative; + cursor: pointer; +} +.license .table.partner tr td[title="Return"]:hover { + color: #0084b2; +} +.license .table.partner tr.isOpen::after { + content: ""; + width: 100%; + border-bottom: 3px #0084b2 solid; + position: absolute; + bottom: 0; + left: 0; +} +.license .table.partner tr.isOpen td { + padding: 0.3rem 0.7rem; +} +.license .table.partner tr.isOpen td:nth-child(n + 2) { + color: #999999; +} +.license .table.partner tr.isOpen td:first-child { + padding-left: 1.5rem; +} +.license .table.partner tr.isOpen td:first-child::before { + content: ""; + position: absolute; + top: 50%; + left: 0.4rem; + border-top: 8px #0084b2 solid; + border-right: 6px transparent solid; + border-left: 6px transparent solid; + transform: translateY(-50%); +} +.license .table.partner tr.isOpen ~ tr td:first-child { + padding-left: 2.5rem; +} +.license .table.partner tr.isOpen ~ tr td:first-child::before { + top: 50%; + left: 1.4rem; +} +.license .table.partner tr.isOpen + .isOpen::after { + width: calc(100% - 1.4rem); + left: 1.4rem; +} +.license .table.partner tr.isOpen + .isOpen ~ tr td:first-child { + padding-left: 3.5rem; +} +.license .table.partner tr.isOpen + .isOpen ~ tr td:first-child::before { + top: 50%; + left: 2.4rem; +} +.license .table.partner tr.isOpen + .isOpen + .isOpen::after { + width: calc(100% - 2.4rem); + left: 2.4rem; +} +.license .table.partner tr.isOpen.role2, +.license .table.partner tr.isOpen.role3, +.license .table.partner tr.isOpen.role4 { + background: #fafafa; +} +.license .table.partner tr.isOpen.role3::after { + border-bottom: 3px #00b4aa solid; +} +.license .table.partner tr.isOpen.role3 td:first-child::before { + border-top: 8px #00b4aa solid; + border-right: 6px transparent solid; + border-left: 6px transparent solid; +} +.license .table.partner tr.isOpen.role4::after { + border-bottom: 3px #faa306 solid; +} +.license .table.partner tr.isOpen.role4 td:first-child::before { + border-top: 8px #faa306 solid; + border-right: 6px transparent solid; + border-left: 6px transparent solid; +} +.license .table.partner td:last-child { + width: 120px; + text-align: right; +} +.license .table.partner.iconver tr td[title="View child accounts"] { + padding-left: 1.5rem; + position: relative; + cursor: pointer; + background-size: none; +} +.license .table.partner.iconver tr td[title="View child accounts"]:hover { + color: #0084b2; +} +.license .table.partner.iconver tr td[title="View child accounts"] a { + color: inherit; + text-decoration: none; +} +.license .table.partner.iconver tr td[title="View child accounts"]::before { + content: ""; + position: absolute; + top: 50%; + left: 0.4rem; + border-top: 6px transparent solid; + border-bottom: 6px transparent solid; + border-left: 8px #0084b2 solid; + transform: translateY(-50%); +} +.license + .table.partner.iconver + tr.role3 + td[title="View child accounts"]::before { + border-top: 6px transparent solid; + border-bottom: 6px transparent solid; + border-left: 8px #00b4aa solid; +} +.license + .table.partner.iconver + tr.role4 + td[title="View child accounts"]::before { + border-top: 6px transparent solid; + border-bottom: 6px transparent solid; + border-left: 8px #faa306 solid; +} +.license .table.partner.iconver tr.role5 td:first-child::before { + display: none; +} + +.dictation .displayOptions { + display: none; + margin-bottom: 0.6rem; + padding: 0.3rem 1rem; + background: #f0f0f0; + position: relative; +} +.dictation .displayOptions li { + display: inline-block; +} +.dictation .displayOptions li label { + padding: 0.3rem 0; + font-size: 13px; + line-height: 1.4; + letter-spacing: 0.02rem; + font-weight: normal; +} +.dictation .displayOptions li label .formCheck { + width: 0.9rem; + height: 0.9rem; + margin-right: 0.3rem; +} +.dictation .displayOptions.isShow { + display: block; +} +.dictation .displayOptions::before { + content: ""; + border-right: 0.6rem transparent solid; + border-bottom: 0.6rem #f0f0f0 solid; + border-left: 0.6rem transparent solid; + position: absolute; + top: -0.5rem; + left: 1rem; +} +.dictation .table { + margin-bottom: 0; +} +.dictation .tableFilter { + padding-top: 0.8rem; + margin-bottom: 0.8rem; +} +.dictation .tableFilter li { + display: inline-block; + margin-right: 0.3rem; + font-size: 14px; + line-height: 1.4; + letter-spacing: 0.02rem; + font-weight: normal; +} +.dictation .tableFilter li label { + cursor: pointer; +} +.dictation .tableFilter li label .formCheck { + width: 0.9rem; + height: 0.9rem; + margin-right: 0.3rem; +} +.dictation .tableFilter2 { + padding-top: 0.8rem; + margin-bottom: 0.8rem; +} +.dictation .tableFilter2 li { + display: inline-block; + margin-right: 0.5rem; + font-size: 14px; + line-height: 1.1; + letter-spacing: 0.02rem; + font-weight: normal; +} +.dictation .tableFilter2 li a { + display: block; + color: #0084b2; + text-decoration: none; + padding-right: 0.5rem; +} +.dictation .tableFilter2 li a:hover { + opacity: 0.7; +} +.dictation .tableFilter2 li a.isDisable { + color: #999999; + pointer-events: none; +} +.dictation .tableFilter2 li a span { + display: inline-block; + padding: 0 0.2rem; + color: #333333; +} +.dictation .tableFilter2 li:not(:last-child) a { + border-right: 1px #999999 solid; +} +.dictation .tableWrap { + max-width: calc(100vw - 5.1rem); + max-height: 90vh; + overflow-x: scroll; + margin-bottom: 1rem; +} +.dictation .table.dictation { + position: relative; + min-width: 100%; +} +.dictation .table.dictation tr { + position: relative; +} +.dictation .table.dictation tr.tableHeader th { + position: -webkit-sticky; + position: sticky; + top: 0; + background: #282828; + z-index: 1; +} +.dictation .table.dictation tr.tableHeader th.clm0 { + width: 0px; + padding: 0 0; +} +.dictation .table.dictation tr.tableHeader th:not(:last-child)::before { + content: ""; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + border-right: 0.1rem #e6e6e6 solid; + z-index: -1; +} +.dictation .table.dictation tr:hover .menuInTable { + opacity: 1; +} +.dictation .table.dictation tr.isSelected { + background: #0084b2; + color: #ffffff; +} +.dictation .table.dictation tr.isSelected:hover { + color: #ffffff; +} +.dictation .table.dictation td { + padding-bottom: 2rem; + vertical-align: top; +} +.dictation .table.dictation td:has(img[alt="encrypted"]) { + text-align: center; +} +.dictation .table.dictation td:has(img[alt="encrypted"]) img { + height: 1.1rem; +} +.dictation .table.dictation td.clm0 { + width: 0px; + padding: 0 0; + overflow: visible; + position: sticky; + left: 0; + z-index: 2; +} +.dictation .table.dictation td img { + height: 1.3rem; + margin-right: 0.2rem; + margin-left: -0.4rem; + vertical-align: middle; +} +.dictation .table.dictation td.txWsline { + white-space: pre; +} +.dictation .table.dictation.hidePri th.opPri, +.dictation .table.dictation.hidePri td.opPri { + display: none; +} +.dictation .table.dictation.hideSize th.opSize, +.dictation .table.dictation.hideSize td.opSize { + display: none; +} +.dictation .table.dictation.hideUpd th.opUpd, +.dictation .table.dictation.hideUpd td.opUpd { + display: none; +} +.dictation .table.dictation.hideC1 th.clm1, +.dictation .table.dictation.hideC1 td.clm1 { + display: none; +} +.dictation .table.dictation.hideC2 th.clm2, +.dictation .table.dictation.hideC2 td.clm2 { + display: none; +} +.dictation .table.dictation.hideC3 th.clm3, +.dictation .table.dictation.hideC3 td.clm3 { + display: none; +} +.dictation .table.dictation.hideC4 th.clm4, +.dictation .table.dictation.hideC4 td.clm4 { + display: none; +} +.dictation .table.dictation.hideC5 th.clm5, +.dictation .table.dictation.hideC5 td.clm5 { + display: none; +} +.dictation .table.dictation.hideC6 th.clm6, +.dictation .table.dictation.hideC6 td.clm6 { + display: none; +} +.dictation .table.dictation.hideC7 th.clm7, +.dictation .table.dictation.hideC7 td.clm7 { + display: none; +} +.dictation .table.dictation.hideC8 th.clm8, +.dictation .table.dictation.hideC8 td.clm8 { + display: none; +} +.dictation .table.dictation.hideC9 th.clm9, +.dictation .table.dictation.hideC9 td.clm9 { + display: none; +} +.dictation .table.dictation.hideC10 th.clm10, +.dictation .table.dictation.hideC10 td.clm10 { + display: none; +} +.dictation .table.dictation.hideC11 th.clm11, +.dictation .table.dictation.hideC11 td.clm11 { + display: none; +} +.dictation .table.dictation.hideC12 th.clm12, +.dictation .table.dictation.hideC12 td.clm12 { + display: none; +} +.dictation .table.dictation.hideC13 th.clm13, +.dictation .table.dictation.hideC13 td.clm13 { + display: none; +} +.dictation .table.dictation.hideC14 th.clm14, +.dictation .table.dictation.hideC14 td.clm14 { + display: none; +} +.dictation .table.dictation.hideC15 th.clm15, +.dictation .table.dictation.hideC15 td.clm15 { + display: none; +} +.dictation .table.dictation.hideC16 th.clm16, +.dictation .table.dictation.hideC16 td.clm16 { + display: none; +} +.dictation .table.dictation.hideO1 th.op1, +.dictation .table.dictation.hideO1 td.op1 { + display: none; +} +.dictation .table.dictation.hideO2 th.op2, +.dictation .table.dictation.hideO2 td.op2 { + display: none; +} +.dictation .table.dictation.hideO3 th.op3, +.dictation .table.dictation.hideO3 td.op3 { + display: none; +} +.dictation .table.dictation.hideO4 th.op4, +.dictation .table.dictation.hideO4 td.op4 { + display: none; +} +.dictation .table.dictation.hideO5 th.op5, +.dictation .table.dictation.hideO5 td.op5 { + display: none; +} +.dictation .table.dictation.hideO6 th.op6, +.dictation .table.dictation.hideO6 td.op6 { + display: none; +} +.dictation .table.dictation.hideO7 th.op7, +.dictation .table.dictation.hideO7 td.op7 { + display: none; +} +.dictation .table.dictation.hideO8 th.op8, +.dictation .table.dictation.hideO8 td.op8 { + display: none; +} +.dictation .table.dictation.hideO9 th.op9, +.dictation .table.dictation.hideO9 td.op9 { + display: none; +} +.dictation .table.dictation.hideO10 th.op10, +.dictation .table.dictation.hideO10 td.op10 { + display: none; +} + +.menuInTable { + width: auto; + position: absolute; + left: 0.7rem; + bottom: 0.5rem; + opacity: 0; + -moz-transition: all 0.3s ease-out; + -ms-transition: all 0.3s ease-out; + -webkit-transition: all 0.3s ease-out; + transition: all 0.3s ease-out; +} +.menuInTable li { + display: inline-block; + margin-right: 0.5rem; + padding-right: 0.5rem; +} +.menuInTable li a { + display: block; + padding-left: 1.2rem; + font-size: 12px; + line-height: 1.4; + letter-spacing: 0.02rem; + font-weight: normal; + text-decoration: none; + color: #0084b2; +} +.menuInTable li a:hover { + opacity: 0.7; +} +.menuInTable li a.isDisable { + color: #999999; + pointer-events: none; +} +.menuInTable li a.mnPlay { + background: url(../assets/images/mn_play.svg) no-repeat left center; + background-size: 1.2rem; +} +.menuInTable li a.mnFile { + background: url(../assets/images/mn_file.svg) no-repeat left center; + background-size: 1.2rem; +} +.menuInTable li a.mnChange { + background: url(../assets/images/mn_change.svg) no-repeat left center; + background-size: 1.2rem; +} +.menuInTable li a.mnDelete { + background: url(../assets/images/delete.svg) no-repeat left center; + background-size: 1.2rem; +} +tr.isSelected .menuInTable li a { + color: #333333; +} +tr.isSelected .menuInTable li a:hover { + color: #ffffff; +} + +.formList dd.formChange { + display: flex; + flex-wrap: wrap; + justify-content: space-between; + align-items: center; + width: 92%; + padding: 0 4%; +} +.formList dd.formChange ul.chooseMember, +.formList dd.formChange ul.holdMember { + width: calc(40% - 2px); + border: 1px #999999 solid; +} +.formChange ul.chooseMember, +.formChange ul.holdMember { + height: 250px; + overflow-y: scroll; + padding: 0.5rem; +} +.formChange ul.chooseMember li.changeTitle, +.formChange ul.holdMember li.changeTitle { + font-weight: 600; +} +.formChange ul.chooseMember li .formCheck, +.formChange ul.holdMember li .formCheck { + display: none; +} +.formChange ul.chooseMember li input + label, +.formChange ul.holdMember li input + label { + display: block; + padding: 0.2rem 0 0.2rem 1.5rem; + margin-right: 0; + background: url(../assets/images/circle.svg) no-repeat left center; + background-size: 1.3rem; +} +.formChange ul.chooseMember li input + label:hover, +.formChange ul.holdMember li input + label:hover { + background: #e6e6e6 url(../assets/images/arrow_circle_left.svg) no-repeat left + center; + background-size: 1.3rem; +} +.formChange ul.chooseMember li input:checked + label, +.formChange ul.holdMember li input:checked + label { + padding: 0.2rem 1rem 0.2rem 0; + background: url(../assets/images/check_circle_fill.svg) no-repeat right center; + background-size: 1.3rem; +} +.formChange ul.chooseMember li input:checked + label:hover, +.formChange ul.holdMember li input:checked + label:hover { + background: #e6e6e6 url(../assets/images/arrow_circle_right.svg) no-repeat + right center; + background-size: 1.3rem; +} +.formChange > p { + width: 6%; + height: 20px; + background: #e6e6e6; + position: relative; +} +.formChange > p::before { + content: ""; + border-top: 20px transparent solid; + border-right: 20px #e6e6e6 solid; + border-bottom: 20px transparent solid; + position: absolute; + top: 50%; + left: -15px; + transform: translateY(-50%); +} +.formChange > p::after { + content: ""; + border-top: 20px transparent solid; + border-bottom: 20px transparent solid; + border-left: 20px #e6e6e6 solid; + position: absolute; + top: 50%; + right: -15px; + transform: translateY(-50%); +} + .alignCenter { text-align: center; } @@ -931,6 +1643,19 @@ _:-ms-lang(x)::-ms-backdrop, margin-right: 3rem; } +.paddSide0 { + padding: 0 0.5rem; +} +.paddSide1 { + padding: 0 1rem; +} +.paddSide2 { + padding: 0 2rem; +} +.paddSide3 { + padding: 0 3rem; +} + .txNormal { font-size: 14px; line-height: 1.7; @@ -940,5 +1665,11 @@ _:-ms-lang(x)::-ms-backdrop, .txIcon { width: 1.1rem; } +.txWsline { + white-space: pre-line; +} +.txWswrap { + white-space: pre-wrap; +} /*# sourceMappingURL=style.css.map */ diff --git a/dictation_client/src/styles/app.module.scss.d.ts b/dictation_client/src/styles/app.module.scss.d.ts index 11b807b..ad831d5 100644 --- a/dictation_client/src/styles/app.module.scss.d.ts +++ b/dictation_client/src/styles/app.module.scss.d.ts @@ -1,6 +1,5 @@ declare const classNames: { readonly wrap: "wrap"; - readonly home: "home"; readonly header: "header"; readonly headerLogo: "headerLogo"; readonly headerSub: "headerSub"; @@ -12,6 +11,9 @@ declare const classNames: { readonly mainSmall: "mainSmall"; readonly mainLogin: "mainLogin"; readonly footer: "footer"; + readonly brCrumb: "brCrumb"; + readonly tlIcon: "tlIcon"; + readonly brCrumbAcc: "brCrumbAcc"; readonly buttonNormal: "buttonNormal"; readonly small: "small"; readonly red: "red"; @@ -37,6 +39,7 @@ declare const classNames: { readonly formBack: "formBack"; readonly formButtonTx: "formButtonTx"; readonly formDone: "formDone"; + readonly listVertical: "listVertical"; readonly loadingBoxSpinner: "loadingBoxSpinner"; readonly modal: "modal"; readonly isShow: "isShow"; @@ -48,6 +51,7 @@ declare const classNames: { readonly slideSet: "slideSet"; readonly pageHeader: "pageHeader"; readonly pageTitle: "pageTitle"; + readonly pageTx: "pageTx"; readonly pagenation: "pagenation"; readonly pagenationNav: "pagenationNav"; readonly pagenationTotal: "pagenationTotal"; @@ -59,16 +63,106 @@ declare const classNames: { readonly table: "table"; readonly tableHeader: "tableHeader"; readonly hasSort: "hasSort"; - readonly icCheckCircle: "icCheckCircle"; + readonly noLine: "noLine"; + readonly home: "home"; readonly pgHome: "pgHome"; + readonly ODMSlogo: "ODMSlogo"; readonly pgHomeLinks: "pgHomeLinks"; readonly buttonIcon: "buttonIcon"; readonly user: "user"; readonly license: "license"; + readonly dictation: "dictation"; readonly isSelected: "isSelected"; + readonly menuInTable: "menuInTable"; readonly menuAction: "menuAction"; + readonly inTable: "inTable"; readonly menuLink: "menuLink"; + readonly colorLink: "colorLink"; + readonly menuMore: "menuMore"; readonly menuIcon: "menuIcon"; + readonly icCheckCircle: "icCheckCircle"; + readonly history: "history"; + readonly cardHistory: "cardHistory"; + readonly partner: "partner"; + readonly isOpen: "isOpen"; + readonly role2: "role2"; + readonly role3: "role3"; + readonly role4: "role4"; + readonly iconver: "iconver"; + readonly role5: "role5"; + readonly displayOptions: "displayOptions"; + readonly tableFilter: "tableFilter"; + readonly tableFilter2: "tableFilter2"; + readonly isDisable: "isDisable"; + readonly tableWrap: "tableWrap"; + readonly clm0: "clm0"; + readonly txWsline: "txWsline"; + readonly hidePri: "hidePri"; + readonly opPri: "opPri"; + readonly hideSize: "hideSize"; + readonly opSize: "opSize"; + readonly hideUpd: "hideUpd"; + readonly opUpd: "opUpd"; + readonly hideC1: "hideC1"; + readonly clm1: "clm1"; + readonly hideC2: "hideC2"; + readonly clm2: "clm2"; + readonly hideC3: "hideC3"; + readonly clm3: "clm3"; + readonly hideC4: "hideC4"; + readonly clm4: "clm4"; + readonly hideC5: "hideC5"; + readonly clm5: "clm5"; + readonly hideC6: "hideC6"; + readonly clm6: "clm6"; + readonly hideC7: "hideC7"; + readonly clm7: "clm7"; + readonly hideC8: "hideC8"; + readonly clm8: "clm8"; + readonly hideC9: "hideC9"; + readonly clm9: "clm9"; + readonly hideC10: "hideC10"; + readonly clm10: "clm10"; + readonly hideC11: "hideC11"; + readonly clm11: "clm11"; + readonly hideC12: "hideC12"; + readonly clm12: "clm12"; + readonly hideC13: "hideC13"; + readonly clm13: "clm13"; + readonly hideC14: "hideC14"; + readonly clm14: "clm14"; + readonly hideC15: "hideC15"; + readonly clm15: "clm15"; + readonly hideC16: "hideC16"; + readonly clm16: "clm16"; + readonly hideO1: "hideO1"; + readonly op1: "op1"; + readonly hideO2: "hideO2"; + readonly op2: "op2"; + readonly hideO3: "hideO3"; + readonly op3: "op3"; + readonly hideO4: "hideO4"; + readonly op4: "op4"; + readonly hideO5: "hideO5"; + readonly op5: "op5"; + readonly hideO6: "hideO6"; + readonly op6: "op6"; + readonly hideO7: "hideO7"; + readonly op7: "op7"; + readonly hideO8: "hideO8"; + readonly op8: "op8"; + readonly hideO9: "hideO9"; + readonly op9: "op9"; + readonly hideO10: "hideO10"; + readonly op10: "op10"; + readonly mnPlay: "mnPlay"; + readonly mnFile: "mnFile"; + readonly mnChange: "mnChange"; + readonly mnDelete: "mnDelete"; + readonly formChange: "formChange"; + readonly chooseMember: "chooseMember"; + readonly holdMember: "holdMember"; + readonly changeTitle: "changeTitle"; readonly alignCenter: "alignCenter"; readonly alignLeft: "alignLeft"; readonly alignRight: "alignRight"; @@ -83,7 +177,12 @@ declare const classNames: { readonly marginRgt1: "marginRgt1"; readonly marginRgt2: "marginRgt2"; readonly marginRgt3: "marginRgt3"; + readonly paddSide0: "paddSide0"; + readonly paddSide1: "paddSide1"; + readonly paddSide2: "paddSide2"; + readonly paddSide3: "paddSide3"; readonly txNormal: "txNormal"; readonly txIcon: "txIcon"; + readonly txWswrap: "txWswrap"; }; export = classNames; diff --git a/dictation_client/src/translation/de.json b/dictation_client/src/translation/de.json index 39b4999..c4629fb 100644 --- a/dictation_client/src/translation/de.json +++ b/dictation_client/src/translation/de.json @@ -136,5 +136,23 @@ "orderHistory": "(de)Order History", "importLicenseKey": "(de)Import License Key" } + }, + "licenseOrderPage": { + "message": { + "inputEmptyError": "(de)この項目の入力は必須です。入力してください。", + "poNumberIncorrectError": "(de)PO Numberの形式が不正です。PO Numberは半角英数字(大文字)のみ入力可能です。", + "newOrderIncorrectError": "(de)New Orderには1以上の数字を入力してください。", + "confirmOrder": "(de)注文を行いますか?", + "createOrderSuccess": "(de)処理に成功しました。", + "poNumberConflictError": "(de)既に同じPO Numberで注文済みもしくは発行済みの注文が存在しています。他のPO Numberで注文してください。" + }, + "label": { + "title": "(de)Order License", + "licenses": "(de)Licenses", + "poNumber": "(de)PO Number", + "newOrder": "(de)New Order", + "orderButton": "(de)Order", + "licenseTypeText": "(de)One Year" + } } } \ No newline at end of file diff --git a/dictation_client/src/translation/en.json b/dictation_client/src/translation/en.json index f4d70c4..3edb49b 100644 --- a/dictation_client/src/translation/en.json +++ b/dictation_client/src/translation/en.json @@ -136,5 +136,23 @@ "orderHistory": "Order History", "importLicenseKey": "Import License Key" } + }, + "licenseOrderPage": { + "message": { + "inputEmptyError": "この項目の入力は必須です。入力してください。", + "poNumberIncorrectError": "PO Numberの形式が不正です。PO Numberは半角英数字(大文字)のみ入力可能です。", + "newOrderIncorrectError": "New Orderには1以上の数字を入力してください。", + "confirmOrder": "注文を行いますか?", + "createOrderSuccess": "処理に成功しました。", + "poNumberConflictError": "既に同じPO Numberで注文済みもしくは発行済みの注文が存在しています。他のPO Numberで注文してください。" + }, + "label": { + "title": "Order License", + "licenses": "Licenses", + "poNumber": "PO Number", + "newOrder": "New Order", + "orderButton": "Order", + "licenseTypeText": "One Year" + } } } \ No newline at end of file diff --git a/dictation_client/src/translation/es.json b/dictation_client/src/translation/es.json index 4ac6865..a4738d5 100644 --- a/dictation_client/src/translation/es.json +++ b/dictation_client/src/translation/es.json @@ -136,5 +136,23 @@ "orderHistory": "(es)Order History", "importLicenseKey": "(es)Import License Key" } + }, + "licenseOrderPage": { + "message": { + "inputEmptyError": "(es)この項目の入力は必須です。入力してください。", + "poNumberIncorrectError": "(es)PO Numberの形式が不正です。PO Numberは半角英数字(大文字)のみ入力可能です。", + "newOrderIncorrectError": "(es)New Orderには1以上の数字を入力してください。", + "confirmOrder": "(es)注文を行いますか?", + "createOrderSuccess": "(es)処理に成功しました。", + "poNumberConflictError": "(es)既に同じPO Numberで注文済みもしくは発行済みの注文が存在しています。他のPO Numberで注文してください。" + }, + "label": { + "title": "(es)Order License", + "licenses": "(es)Licenses", + "poNumber": "(es)PO Number", + "newOrder": "(es)New Order", + "orderButton": "(es)Order", + "licenseTypeText": "(es)One Year" + } } } \ No newline at end of file diff --git a/dictation_client/src/translation/fr.json b/dictation_client/src/translation/fr.json index 16a0fda..e8d136a 100644 --- a/dictation_client/src/translation/fr.json +++ b/dictation_client/src/translation/fr.json @@ -136,5 +136,23 @@ "orderHistory": "(fr)Order History", "importLicenseKey": "(fr)Import License Key" } + }, + "licenseOrderPage": { + "message": { + "inputEmptyError": "(fr)この項目の入力は必須です。入力してください。", + "poNumberIncorrectError": "(fr)PO Numberの形式が不正です。PO Numberは半角英数字(大文字)のみ入力可能です。", + "newOrderIncorrectError": "(fr)New Orderには1以上の数字を入力してください。", + "confirmOrder": "(fr)注文を行いますか?", + "createOrderSuccess": "(fr)処理に成功しました。", + "poNumberConflictError": "(fr)既に同じPO Numberで注文済みもしくは発行済みの注文が存在しています。他のPO Numberで注文してください。" + }, + "label": { + "title": "(fr)Order License", + "licenses": "(fr)Licenses", + "poNumber": "(fr)PO Number", + "newOrder": "(fr)New Order", + "orderButton": "(fr)Order", + "licenseTypeText": "(fr)One Year" + } } } \ No newline at end of file