From 3dca5c604ba052035a1d185ccfe2d44d759cd91c Mon Sep 17 00:00:00 2001 From: "makabe.t" Date: Thu, 8 Jun 2023 08:04:34 +0000 Subject: [PATCH] =?UTF-8?q?Merged=20PR=20126:=20=E7=94=BB=E9=9D=A2?= =?UTF-8?q?=E5=AE=9F=E8=A3=85=EF=BC=88=E3=82=BF=E3=82=B9=E3=82=AF=E4=B8=80?= =?UTF-8?q?=E8=A6=A7=E7=94=BB=E9=9D=A2=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 概要 [Task1834: 画面実装(タスク一覧画面)](https://paruru.nds-tyo.co.jp:8443/tfs/ReciproCollection/fa4924a4-d079-4fab-9fb5-a9a11eb205f0/_workitems/edit/1834) - タスク一覧画面を実装しました。 - 表示項目、フィルターを制御できるようにしています - 表示項目はlocalStorageに保存するようにしています - ソート順の取得、変更、更新をする処理を追加 ## レビューポイント - デザインの反映は適切か - フィルター、表示の反映ロジックは適切か - ソートの反映を追加したので適切か確認をお願いします。 ## UIの変更 - [Task1834](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/Task1834?csf=1&web=1&e=zBcQ6i) ## 動作確認状況 - ローカルで確認 - API呼び出しは未検証 --- dictation_client/src/AppRouter.tsx | 3 +- dictation_client/src/api/api.ts | 351 ++++++- dictation_client/src/app/store.ts | 2 + .../src/assets/images/arrow_circle_left.svg | 13 + .../src/assets/images/arrow_circle_right.svg | 13 + dictation_client/src/assets/images/backup.svg | 14 + .../src/assets/images/check_circle_fill.svg | 12 +- .../src/assets/images/check_fill.svg | 20 +- dictation_client/src/assets/images/delete.svg | 9 +- dictation_client/src/assets/images/edit.svg | 7 +- .../src/assets/images/email_check.svg | 22 +- .../src/assets/images/finished.svg | 13 + .../src/assets/images/history.svg | 26 +- .../src/assets/images/inprogress.svg | 14 + dictation_client/src/assets/images/key.svg | 30 +- dictation_client/src/assets/images/lock.svg | 26 +- .../src/assets/images/lock_open.svg | 28 +- .../src/assets/images/mn_change.svg | 19 + .../src/assets/images/mn_file.svg | 15 + .../src/assets/images/mn_play.svg | 13 + .../src/assets/images/pending.svg | 17 + .../src/assets/images/person_add.svg | 15 +- .../src/assets/images/post_add.svg | 22 +- dictation_client/src/assets/images/report.svg | 24 +- dictation_client/src/assets/images/table.svg | 11 + dictation_client/src/assets/images/undo.svg | 22 +- .../src/assets/images/uploaded.svg | 13 + .../src/features/dictation/constants.ts | 97 ++ .../src/features/dictation/dictationSlice.ts | 71 ++ .../src/features/dictation/index.ts | 5 + .../src/features/dictation/operations.ts | 164 +++ .../src/features/dictation/selectors.ts | 31 + .../src/features/dictation/state.ts | 24 + .../src/pages/DictationPage/displayInfo.tsx | 575 +++++++++++ .../src/pages/DictationPage/index.tsx | 966 ++++++++++++++++++ dictation_client/src/styles/app.module.scss | 59 +- .../src/styles/app.module.scss.d.ts | 6 +- dictation_client/src/translation/de.json | 359 ++++--- dictation_client/src/translation/en.json | 359 ++++--- dictation_client/src/translation/es.json | 359 ++++--- dictation_client/src/translation/fr.json | 359 ++++--- dictation_server/src/api/odms/openapi.json | 904 ++++++++++++---- dictation_server/src/constants/index.ts | 1 + 43 files changed, 4070 insertions(+), 1043 deletions(-) create mode 100644 dictation_client/src/assets/images/arrow_circle_left.svg create mode 100644 dictation_client/src/assets/images/arrow_circle_right.svg create mode 100644 dictation_client/src/assets/images/backup.svg create mode 100644 dictation_client/src/assets/images/finished.svg create mode 100644 dictation_client/src/assets/images/inprogress.svg create mode 100644 dictation_client/src/assets/images/mn_change.svg create mode 100644 dictation_client/src/assets/images/mn_file.svg create mode 100644 dictation_client/src/assets/images/mn_play.svg create mode 100644 dictation_client/src/assets/images/pending.svg create mode 100644 dictation_client/src/assets/images/table.svg create mode 100644 dictation_client/src/assets/images/uploaded.svg create mode 100644 dictation_client/src/features/dictation/constants.ts create mode 100644 dictation_client/src/features/dictation/dictationSlice.ts create mode 100644 dictation_client/src/features/dictation/index.ts create mode 100644 dictation_client/src/features/dictation/operations.ts create mode 100644 dictation_client/src/features/dictation/selectors.ts create mode 100644 dictation_client/src/features/dictation/state.ts create mode 100644 dictation_client/src/pages/DictationPage/displayInfo.tsx create mode 100644 dictation_client/src/pages/DictationPage/index.tsx diff --git a/dictation_client/src/AppRouter.tsx b/dictation_client/src/AppRouter.tsx index 42d18f8..f9c7d63 100644 --- a/dictation_client/src/AppRouter.tsx +++ b/dictation_client/src/AppRouter.tsx @@ -14,6 +14,7 @@ import VerifyAlreadyExistPage from "pages/VerifyAlreadyExistPage"; import SignupCompletePage from "pages/SignupCompletePage"; import UserListPage from "pages/UserListPage"; import LicensePage from "pages/LicensePage"; +import DictationPage from "pages/DictationPage"; const AppRouter: React.FC = () => ( @@ -52,7 +53,7 @@ const AppRouter: React.FC = () => ( /> } />} + element={} />} /> ; } +/** + * + * @export + * @interface LicenseSummaryInfo + */ +export interface LicenseSummaryInfo { + /** + * + * @type {number} + * @memberof LicenseSummaryInfo + */ + 'totalLicense': number; + /** + * + * @type {number} + * @memberof LicenseSummaryInfo + */ + 'allocatedLicense': number; + /** + * + * @type {number} + * @memberof LicenseSummaryInfo + */ + 'reusableLicense': number; + /** + * + * @type {number} + * @memberof LicenseSummaryInfo + */ + 'freeLicense': number; + /** + * + * @type {number} + * @memberof LicenseSummaryInfo + */ + 'expiringWithin14daysLicense': number; + /** + * + * @type {number} + * @memberof LicenseSummaryInfo + */ + 'issueRequesting': number; + /** + * + * @type {number} + * @memberof LicenseSummaryInfo + */ + 'numberOfRequesting': number; + /** + * + * @type {number} + * @memberof LicenseSummaryInfo + */ + 'shortage': number; + /** + * + * @type {number} + * @memberof LicenseSummaryInfo + */ + 'storageSize': number; + /** + * + * @type {number} + * @memberof LicenseSummaryInfo + */ + 'usedSize': number; + /** + * + * @type {boolean} + * @memberof LicenseSummaryInfo + */ + 'isAccountLock': boolean; +} /** * * @export @@ -416,6 +534,25 @@ export interface OptionItemList { */ 'optionItemList': Array; } +/** + * + * @export + * @interface PostSortCriteriaRequest + */ +export interface PostSortCriteriaRequest { + /** + * ASC/DESC + * @type {string} + * @memberof PostSortCriteriaRequest + */ + 'direction': string; + /** + * JOB_NUMBER/STATUS/ENCRYPTION/AUTHOR_ID/FILE_NAME/FILE_LENGTH/FILE_SIZE/RECORDING_STARTED_DATE/RECORDING_FINISHED_DATE/UPLOAD_DATE/TRANSCRIPTION_STARTED_DATE/TRANSCRIPTION_FINISHED_DATE + * @type {string} + * @memberof PostSortCriteriaRequest + */ + 'paramName': string; +} /** * * @export @@ -490,25 +627,6 @@ export interface SignupRequest { */ 'notification': boolean; } -/** - * - * @export - * @interface SortCriteriaRequest - */ -export interface SortCriteriaRequest { - /** - * ASC/DESC - * @type {string} - * @memberof SortCriteriaRequest - */ - 'direction': string; - /** - * JOB_NUMBER/STATUS/ENCRYPTION/AUTHOR_ID/FILE_NAME/FILE_LENGTH/FILE_SIZE/RECORDING_STARTED_DATE/RECORDING_FINISHED_DATE/UPLOAD_DATE/TRANSCRIPTION_STARTED_DATE/TRANSCRIPTION_FINISHED_DATE - * @type {string} - * @memberof SortCriteriaRequest - */ - 'paramName': string; -} /** * * @export @@ -873,6 +991,46 @@ export const AccountsApiAxiosParamCreator = function (configuration?: Configurat localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; localVarRequestOptions.data = serializeDataIfNeeded(createAccountRequest, localVarRequestOptions, configuration) + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * 指定したアカウントのライセンス集計情報を取得します + * @summary + * @param {GetLicenseSummaryRequest} getLicenseSummaryRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getLicenseSummary: async (getLicenseSummaryRequest: GetLicenseSummaryRequest, options: AxiosRequestConfig = {}): Promise => { + // verify required parameter 'getLicenseSummaryRequest' is not null or undefined + assertParamExists('getLicenseSummary', 'getLicenseSummaryRequest', getLicenseSummaryRequest) + const localVarPath = `/accounts/licenses/summary`; + // 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(getLicenseSummaryRequest, localVarRequestOptions, configuration) + return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, @@ -899,6 +1057,17 @@ export const AccountsApiFp = function(configuration?: Configuration) { const localVarAxiosArgs = await localVarAxiosParamCreator.createAccount(createAccountRequest, options); return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, + /** + * 指定したアカウントのライセンス集計情報を取得します + * @summary + * @param {GetLicenseSummaryRequest} getLicenseSummaryRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async getLicenseSummary(getLicenseSummaryRequest: GetLicenseSummaryRequest, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.getLicenseSummary(getLicenseSummaryRequest, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, } }; @@ -919,6 +1088,16 @@ export const AccountsApiFactory = function (configuration?: Configuration, baseP createAccount(createAccountRequest: CreateAccountRequest, options?: any): AxiosPromise { return localVarFp.createAccount(createAccountRequest, options).then((request) => request(axios, basePath)); }, + /** + * 指定したアカウントのライセンス集計情報を取得します + * @summary + * @param {GetLicenseSummaryRequest} getLicenseSummaryRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getLicenseSummary(getLicenseSummaryRequest: GetLicenseSummaryRequest, options?: any): AxiosPromise { + return localVarFp.getLicenseSummary(getLicenseSummaryRequest, options).then((request) => request(axios, basePath)); + }, }; }; @@ -940,6 +1119,18 @@ export class AccountsApi extends BaseAPI { public createAccount(createAccountRequest: CreateAccountRequest, options?: AxiosRequestConfig) { return AccountsApiFp(this.configuration).createAccount(createAccountRequest, options).then((request) => request(this.axios, this.basePath)); } + + /** + * 指定したアカウントのライセンス集計情報を取得します + * @summary + * @param {GetLicenseSummaryRequest} getLicenseSummaryRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof AccountsApi + */ + public getLicenseSummary(getLicenseSummaryRequest: GetLicenseSummaryRequest, options?: AxiosRequestConfig) { + return AccountsApiFp(this.configuration).getLicenseSummary(getLicenseSummaryRequest, options).then((request) => request(this.axios, this.basePath)); + } } @@ -1982,10 +2173,12 @@ export const TasksApiAxiosParamCreator = function (configuration?: Configuration * @param {number} [limit] タスクの取得件数(指定しない場合はデフォルト値) * @param {number} [offset] オフセット(何件目から取得するか 設定しない場合はデフォルト値) * @param {string} [status] 取得対象とするタスクのステータス。カンマ(,)区切りで複数指定可能。設定されない場合はすべてのステータスを取得対象とする。許容するステータスの値は次の通り: Uploaded / Pending / InProgress / Finished / Backup + * @param {string} [direction] ASC/DESC + * @param {string} [paramName] JOB_NUMBER/STATUS/ENCRYPTION/AUTHOR_ID/FILE_NAME/FILE_LENGTH/FILE_SIZE/RECORDING_STARTED_DATE/RECORDING_FINISHED_DATE/UPLOAD_DATE/TRANSCRIPTION_STARTED_DATE/TRANSCRIPTION_FINISHED_DATE * @param {*} [options] Override http request option. * @throws {RequiredError} */ - getTasks: async (limit?: number, offset?: number, status?: string, options: AxiosRequestConfig = {}): Promise => { + getTasks: async (limit?: number, offset?: number, status?: string, direction?: string, paramName?: string, 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); @@ -2014,6 +2207,14 @@ export const TasksApiAxiosParamCreator = function (configuration?: Configuration localVarQueryParameter['status'] = status; } + if (direction !== undefined) { + localVarQueryParameter['direction'] = direction; + } + + if (paramName !== undefined) { + localVarQueryParameter['paramName'] = paramName; + } + setSearchParams(localVarUrlObj, localVarQueryParameter); @@ -2172,11 +2373,13 @@ export const TasksApiFp = function(configuration?: Configuration) { * @param {number} [limit] タスクの取得件数(指定しない場合はデフォルト値) * @param {number} [offset] オフセット(何件目から取得するか 設定しない場合はデフォルト値) * @param {string} [status] 取得対象とするタスクのステータス。カンマ(,)区切りで複数指定可能。設定されない場合はすべてのステータスを取得対象とする。許容するステータスの値は次の通り: Uploaded / Pending / InProgress / Finished / Backup + * @param {string} [direction] ASC/DESC + * @param {string} [paramName] JOB_NUMBER/STATUS/ENCRYPTION/AUTHOR_ID/FILE_NAME/FILE_LENGTH/FILE_SIZE/RECORDING_STARTED_DATE/RECORDING_FINISHED_DATE/UPLOAD_DATE/TRANSCRIPTION_STARTED_DATE/TRANSCRIPTION_FINISHED_DATE * @param {*} [options] Override http request option. * @throws {RequiredError} */ - async getTasks(limit?: number, offset?: number, status?: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { - const localVarAxiosArgs = await localVarAxiosParamCreator.getTasks(limit, offset, status, options); + async getTasks(limit?: number, offset?: number, status?: string, direction?: string, paramName?: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.getTasks(limit, offset, status, direction, paramName, options); return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, /** @@ -2267,11 +2470,13 @@ export const TasksApiFactory = function (configuration?: Configuration, basePath * @param {number} [limit] タスクの取得件数(指定しない場合はデフォルト値) * @param {number} [offset] オフセット(何件目から取得するか 設定しない場合はデフォルト値) * @param {string} [status] 取得対象とするタスクのステータス。カンマ(,)区切りで複数指定可能。設定されない場合はすべてのステータスを取得対象とする。許容するステータスの値は次の通り: Uploaded / Pending / InProgress / Finished / Backup + * @param {string} [direction] ASC/DESC + * @param {string} [paramName] JOB_NUMBER/STATUS/ENCRYPTION/AUTHOR_ID/FILE_NAME/FILE_LENGTH/FILE_SIZE/RECORDING_STARTED_DATE/RECORDING_FINISHED_DATE/UPLOAD_DATE/TRANSCRIPTION_STARTED_DATE/TRANSCRIPTION_FINISHED_DATE * @param {*} [options] Override http request option. * @throws {RequiredError} */ - getTasks(limit?: number, offset?: number, status?: string, options?: any): AxiosPromise { - return localVarFp.getTasks(limit, offset, status, options).then((request) => request(axios, basePath)); + getTasks(limit?: number, offset?: number, status?: string, direction?: string, paramName?: string, options?: any): AxiosPromise { + return localVarFp.getTasks(limit, offset, status, direction, paramName, options).then((request) => request(axios, basePath)); }, /** * 指定した文字起こしタスクを差し戻します(ステータスをPendingにします) @@ -2369,12 +2574,14 @@ export class TasksApi extends BaseAPI { * @param {number} [limit] タスクの取得件数(指定しない場合はデフォルト値) * @param {number} [offset] オフセット(何件目から取得するか 設定しない場合はデフォルト値) * @param {string} [status] 取得対象とするタスクのステータス。カンマ(,)区切りで複数指定可能。設定されない場合はすべてのステータスを取得対象とする。許容するステータスの値は次の通り: Uploaded / Pending / InProgress / Finished / Backup + * @param {string} [direction] ASC/DESC + * @param {string} [paramName] JOB_NUMBER/STATUS/ENCRYPTION/AUTHOR_ID/FILE_NAME/FILE_LENGTH/FILE_SIZE/RECORDING_STARTED_DATE/RECORDING_FINISHED_DATE/UPLOAD_DATE/TRANSCRIPTION_STARTED_DATE/TRANSCRIPTION_FINISHED_DATE * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof TasksApi */ - public getTasks(limit?: number, offset?: number, status?: string, options?: AxiosRequestConfig) { - return TasksApiFp(this.configuration).getTasks(limit, offset, status, options).then((request) => request(this.axios, this.basePath)); + public getTasks(limit?: number, offset?: number, status?: string, direction?: string, paramName?: string, options?: AxiosRequestConfig) { + return TasksApiFp(this.configuration).getTasks(limit, offset, status, direction, paramName, options).then((request) => request(this.axios, this.basePath)); } /** @@ -2506,6 +2713,40 @@ export const UsersApiAxiosParamCreator = function (configuration?: Configuration + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * ログインしているユーザーのタスクソート条件を取得します + * @summary + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getSortCcriteria: async (options: AxiosRequestConfig = {}): Promise => { + const localVarPath = `/users/sort-criteria`; + // 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}; @@ -2592,13 +2833,13 @@ export const UsersApiAxiosParamCreator = function (configuration?: Configuration /** * ログインしているユーザーのタスクソート条件を更新します * @summary - * @param {SortCriteriaRequest} sortCriteriaRequest + * @param {PostSortCriteriaRequest} postSortCriteriaRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ - updateSortCcriteria: async (sortCriteriaRequest: SortCriteriaRequest, options: AxiosRequestConfig = {}): Promise => { - // verify required parameter 'sortCriteriaRequest' is not null or undefined - assertParamExists('updateSortCcriteria', 'sortCriteriaRequest', sortCriteriaRequest) + updateSortCcriteria: async (postSortCriteriaRequest: PostSortCriteriaRequest, options: AxiosRequestConfig = {}): Promise => { + // verify required parameter 'postSortCriteriaRequest' is not null or undefined + assertParamExists('updateSortCcriteria', 'postSortCriteriaRequest', postSortCriteriaRequest) const localVarPath = `/users/sort-criteria`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); @@ -2622,7 +2863,7 @@ export const UsersApiAxiosParamCreator = function (configuration?: Configuration setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; - localVarRequestOptions.data = serializeDataIfNeeded(sortCriteriaRequest, localVarRequestOptions, configuration) + localVarRequestOptions.data = serializeDataIfNeeded(postSortCriteriaRequest, localVarRequestOptions, configuration) return { url: toPathString(localVarUrlObj), @@ -2671,6 +2912,16 @@ export const UsersApiFp = function(configuration?: Configuration) { const localVarAxiosArgs = await localVarAxiosParamCreator.getRelations(options); return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, + /** + * ログインしているユーザーのタスクソート条件を取得します + * @summary + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async getSortCcriteria(options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.getSortCcriteria(options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, /** * * @summary @@ -2695,12 +2946,12 @@ export const UsersApiFp = function(configuration?: Configuration) { /** * ログインしているユーザーのタスクソート条件を更新します * @summary - * @param {SortCriteriaRequest} sortCriteriaRequest + * @param {PostSortCriteriaRequest} postSortCriteriaRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ - async updateSortCcriteria(sortCriteriaRequest: SortCriteriaRequest, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { - const localVarAxiosArgs = await localVarAxiosParamCreator.updateSortCcriteria(sortCriteriaRequest, options); + async updateSortCcriteria(postSortCriteriaRequest: PostSortCriteriaRequest, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.updateSortCcriteria(postSortCriteriaRequest, options); return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, } @@ -2742,6 +2993,15 @@ export const UsersApiFactory = function (configuration?: Configuration, basePath getRelations(options?: any): AxiosPromise { return localVarFp.getRelations(options).then((request) => request(axios, basePath)); }, + /** + * ログインしているユーザーのタスクソート条件を取得します + * @summary + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getSortCcriteria(options?: any): AxiosPromise { + return localVarFp.getSortCcriteria(options).then((request) => request(axios, basePath)); + }, /** * * @summary @@ -2764,12 +3024,12 @@ export const UsersApiFactory = function (configuration?: Configuration, basePath /** * ログインしているユーザーのタスクソート条件を更新します * @summary - * @param {SortCriteriaRequest} sortCriteriaRequest + * @param {PostSortCriteriaRequest} postSortCriteriaRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ - updateSortCcriteria(sortCriteriaRequest: SortCriteriaRequest, options?: any): AxiosPromise { - return localVarFp.updateSortCcriteria(sortCriteriaRequest, options).then((request) => request(axios, basePath)); + updateSortCcriteria(postSortCriteriaRequest: PostSortCriteriaRequest, options?: any): AxiosPromise { + return localVarFp.updateSortCcriteria(postSortCriteriaRequest, options).then((request) => request(axios, basePath)); }, }; }; @@ -2816,6 +3076,17 @@ export class UsersApi extends BaseAPI { return UsersApiFp(this.configuration).getRelations(options).then((request) => request(this.axios, this.basePath)); } + /** + * ログインしているユーザーのタスクソート条件を取得します + * @summary + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof UsersApi + */ + public getSortCcriteria(options?: AxiosRequestConfig) { + return UsersApiFp(this.configuration).getSortCcriteria(options).then((request) => request(this.axios, this.basePath)); + } + /** * * @summary @@ -2842,13 +3113,13 @@ export class UsersApi extends BaseAPI { /** * ログインしているユーザーのタスクソート条件を更新します * @summary - * @param {SortCriteriaRequest} sortCriteriaRequest + * @param {PostSortCriteriaRequest} postSortCriteriaRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof UsersApi */ - public updateSortCcriteria(sortCriteriaRequest: SortCriteriaRequest, options?: AxiosRequestConfig) { - return UsersApiFp(this.configuration).updateSortCcriteria(sortCriteriaRequest, options).then((request) => request(this.axios, this.basePath)); + public updateSortCcriteria(postSortCriteriaRequest: PostSortCriteriaRequest, options?: AxiosRequestConfig) { + return UsersApiFp(this.configuration).updateSortCcriteria(postSortCriteriaRequest, options).then((request) => request(this.axios, this.basePath)); } } diff --git a/dictation_client/src/app/store.ts b/dictation_client/src/app/store.ts index 4ae0d5b..7abc151 100644 --- a/dictation_client/src/app/store.ts +++ b/dictation_client/src/app/store.ts @@ -6,6 +6,7 @@ import verify from "features/verify/verifySlice"; import ui from "features/ui/uiSlice"; import user from "features/user/userSlice"; import license from "features/license/licenseSlice"; +import dictation from "features/dictation/dictationSlice"; export const store = configureStore({ reducer: { @@ -16,6 +17,7 @@ export const store = configureStore({ ui, user, license, + dictation, }, }); diff --git a/dictation_client/src/assets/images/arrow_circle_left.svg b/dictation_client/src/assets/images/arrow_circle_left.svg new file mode 100644 index 0000000..df7a55b --- /dev/null +++ b/dictation_client/src/assets/images/arrow_circle_left.svg @@ -0,0 +1,13 @@ + + + + + + diff --git a/dictation_client/src/assets/images/arrow_circle_right.svg b/dictation_client/src/assets/images/arrow_circle_right.svg new file mode 100644 index 0000000..116da6d --- /dev/null +++ b/dictation_client/src/assets/images/arrow_circle_right.svg @@ -0,0 +1,13 @@ + + + + + + diff --git a/dictation_client/src/assets/images/backup.svg b/dictation_client/src/assets/images/backup.svg new file mode 100644 index 0000000..9e05ba8 --- /dev/null +++ b/dictation_client/src/assets/images/backup.svg @@ -0,0 +1,14 @@ + + + + + + diff --git a/dictation_client/src/assets/images/check_circle_fill.svg b/dictation_client/src/assets/images/check_circle_fill.svg index f9788d5..a13eb08 100644 --- a/dictation_client/src/assets/images/check_circle_fill.svg +++ b/dictation_client/src/assets/images/check_circle_fill.svg @@ -1,12 +1,12 @@ - + - + diff --git a/dictation_client/src/assets/images/check_fill.svg b/dictation_client/src/assets/images/check_fill.svg index b706fb9..6eb2eb9 100644 --- a/dictation_client/src/assets/images/check_fill.svg +++ b/dictation_client/src/assets/images/check_fill.svg @@ -1,10 +1,10 @@ - - - - - - + + + + + + diff --git a/dictation_client/src/assets/images/delete.svg b/dictation_client/src/assets/images/delete.svg index 89ec0bc..a625bac 100644 --- a/dictation_client/src/assets/images/delete.svg +++ b/dictation_client/src/assets/images/delete.svg @@ -1,10 +1,11 @@ - + + y="0px" viewBox="0 0 48 48" style="enable-background:new 0 0 48 48;" xml:space="preserve"> - + diff --git a/dictation_client/src/assets/images/edit.svg b/dictation_client/src/assets/images/edit.svg index 3575418..4fe6d98 100644 --- a/dictation_client/src/assets/images/edit.svg +++ b/dictation_client/src/assets/images/edit.svg @@ -1,10 +1,11 @@ - + - + diff --git a/dictation_client/src/assets/images/email_check.svg b/dictation_client/src/assets/images/email_check.svg index 6024032..f574fc2 100644 --- a/dictation_client/src/assets/images/email_check.svg +++ b/dictation_client/src/assets/images/email_check.svg @@ -1,11 +1,11 @@ - - - - - - + + + + + + diff --git a/dictation_client/src/assets/images/finished.svg b/dictation_client/src/assets/images/finished.svg new file mode 100644 index 0000000..5301e33 --- /dev/null +++ b/dictation_client/src/assets/images/finished.svg @@ -0,0 +1,13 @@ + + + + + + diff --git a/dictation_client/src/assets/images/history.svg b/dictation_client/src/assets/images/history.svg index d108bf4..cadcd97 100644 --- a/dictation_client/src/assets/images/history.svg +++ b/dictation_client/src/assets/images/history.svg @@ -1,13 +1,13 @@ - - - - - - + + + + + + diff --git a/dictation_client/src/assets/images/inprogress.svg b/dictation_client/src/assets/images/inprogress.svg new file mode 100644 index 0000000..080393d --- /dev/null +++ b/dictation_client/src/assets/images/inprogress.svg @@ -0,0 +1,14 @@ + + + + + + diff --git a/dictation_client/src/assets/images/key.svg b/dictation_client/src/assets/images/key.svg index e86e331..10f2c9f 100644 --- a/dictation_client/src/assets/images/key.svg +++ b/dictation_client/src/assets/images/key.svg @@ -1,15 +1,15 @@ - - - - - - + + + + + + diff --git a/dictation_client/src/assets/images/lock.svg b/dictation_client/src/assets/images/lock.svg index 993e747..4d1c758 100644 --- a/dictation_client/src/assets/images/lock.svg +++ b/dictation_client/src/assets/images/lock.svg @@ -1,13 +1,13 @@ - - - - - - + + + + + + diff --git a/dictation_client/src/assets/images/lock_open.svg b/dictation_client/src/assets/images/lock_open.svg index a822269..1f995ed 100644 --- a/dictation_client/src/assets/images/lock_open.svg +++ b/dictation_client/src/assets/images/lock_open.svg @@ -1,14 +1,14 @@ - - - - - - + + + + + + diff --git a/dictation_client/src/assets/images/mn_change.svg b/dictation_client/src/assets/images/mn_change.svg new file mode 100644 index 0000000..82020d5 --- /dev/null +++ b/dictation_client/src/assets/images/mn_change.svg @@ -0,0 +1,19 @@ + + + + + + diff --git a/dictation_client/src/assets/images/mn_file.svg b/dictation_client/src/assets/images/mn_file.svg new file mode 100644 index 0000000..971200f --- /dev/null +++ b/dictation_client/src/assets/images/mn_file.svg @@ -0,0 +1,15 @@ + + + + + + diff --git a/dictation_client/src/assets/images/mn_play.svg b/dictation_client/src/assets/images/mn_play.svg new file mode 100644 index 0000000..02faf0d --- /dev/null +++ b/dictation_client/src/assets/images/mn_play.svg @@ -0,0 +1,13 @@ + + + + + + diff --git a/dictation_client/src/assets/images/pending.svg b/dictation_client/src/assets/images/pending.svg new file mode 100644 index 0000000..e1270a0 --- /dev/null +++ b/dictation_client/src/assets/images/pending.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/dictation_client/src/assets/images/person_add.svg b/dictation_client/src/assets/images/person_add.svg index 5e3b2f8..6a61f54 100644 --- a/dictation_client/src/assets/images/person_add.svg +++ b/dictation_client/src/assets/images/person_add.svg @@ -1,12 +1,15 @@ - + + y="0px" viewBox="0 0 48 48" style="enable-background:new 0 0 48 48;" xml:space="preserve"> - + diff --git a/dictation_client/src/assets/images/post_add.svg b/dictation_client/src/assets/images/post_add.svg index 675731a..35793dd 100644 --- a/dictation_client/src/assets/images/post_add.svg +++ b/dictation_client/src/assets/images/post_add.svg @@ -1,11 +1,11 @@ - - - - - - + + + + + + diff --git a/dictation_client/src/assets/images/report.svg b/dictation_client/src/assets/images/report.svg index e7890c4..7de71bb 100644 --- a/dictation_client/src/assets/images/report.svg +++ b/dictation_client/src/assets/images/report.svg @@ -1,12 +1,12 @@ - - - - - - + + + + + + diff --git a/dictation_client/src/assets/images/table.svg b/dictation_client/src/assets/images/table.svg new file mode 100644 index 0000000..3c84b43 --- /dev/null +++ b/dictation_client/src/assets/images/table.svg @@ -0,0 +1,11 @@ + + + + + + diff --git a/dictation_client/src/assets/images/undo.svg b/dictation_client/src/assets/images/undo.svg index 963bf70..b41870a 100644 --- a/dictation_client/src/assets/images/undo.svg +++ b/dictation_client/src/assets/images/undo.svg @@ -1,11 +1,11 @@ - - - - - - + + + + + + diff --git a/dictation_client/src/assets/images/uploaded.svg b/dictation_client/src/assets/images/uploaded.svg new file mode 100644 index 0000000..4b8f50c --- /dev/null +++ b/dictation_client/src/assets/images/uploaded.svg @@ -0,0 +1,13 @@ + + + + + + diff --git a/dictation_client/src/features/dictation/constants.ts b/dictation_client/src/features/dictation/constants.ts new file mode 100644 index 0000000..0fc83e7 --- /dev/null +++ b/dictation_client/src/features/dictation/constants.ts @@ -0,0 +1,97 @@ +export const STATUS = { + UPLOADED: "Uploaded", + PENDING: "Pending", + INPROGRESS: "InProgress", + FINISHED: "Finished", + BACKUP: "Backup", +} as const; + +export type StatusType = typeof STATUS[keyof typeof STATUS]; + +export const LIMIT_TASK_NUM = 20; + +export const SORTABLE_COLUMN = { + JobNumber: "JOB_NUMBER", + Status: "STATUS", + Encryption: "ENCRYPTION", + AuthorId: "AUTHOR_ID", + WorkType: "WORK_TYPE", + FileName: "FILE_NAME", + FileLength: "FILE_LENGTH", + FileSize: "FILE_SIZE", + RecordingStartedDate: "RECORDING_STARTED_DATE", + RecordingFinishedDate: "RECORDING_FINISHED_DATE", + UploadDate: "UPLOAD_DATE", + TranscriptionStartedDate: "TRANSCRIPTION_STARTED_DATE", + TranscriptionFinishedDate: "TRANSCRIPTION_FINISHED_DATE", +} as const; +export type SortableColumnType = + typeof SORTABLE_COLUMN[keyof typeof SORTABLE_COLUMN]; + +export type SortableColumnList = + typeof SORTABLE_COLUMN[keyof typeof SORTABLE_COLUMN]; + +export const DIRECTION = { + ASC: "ASC", + DESC: "DESC", +} as const; + +export type DirectionType = typeof DIRECTION[keyof typeof DIRECTION]; + +export interface DisplayInfoType { + JobNumber: boolean; + Status: boolean; + Priority: boolean; + Encryption: boolean; + AuthorId: boolean; + WorkType: boolean; + FileName: boolean; + FileLength: boolean; + FileSize: boolean; + RecordingStartedDate: boolean; + RecordingFinishedDate: boolean; + UploadDate: boolean; + TranscriptionStartedDate: boolean; + TranscriptionFinishedDate: boolean; + Transcriptionist: boolean; + Comment: boolean; + OptionItem1: boolean; + OptionItem2: boolean; + OptionItem3: boolean; + OptionItem4: boolean; + OptionItem5: boolean; + OptionItem6: boolean; + OptionItem7: boolean; + OptionItem8: boolean; + OptionItem9: boolean; + OptionItem10: boolean; +} + +export const INIT_DISPLAY_INFO: DisplayInfoType = { + JobNumber: true, + Status: true, + Priority: false, + Encryption: true, + AuthorId: true, + WorkType: true, + FileName: true, + FileLength: true, + FileSize: false, + RecordingStartedDate: true, + RecordingFinishedDate: true, + UploadDate: false, + TranscriptionStartedDate: true, + TranscriptionFinishedDate: true, + Transcriptionist: true, + Comment: true, + OptionItem1: false, + OptionItem2: false, + OptionItem3: false, + OptionItem4: false, + OptionItem5: false, + OptionItem6: false, + OptionItem7: false, + OptionItem8: false, + OptionItem9: false, + OptionItem10: false, +} as const; diff --git a/dictation_client/src/features/dictation/dictationSlice.ts b/dictation_client/src/features/dictation/dictationSlice.ts new file mode 100644 index 0000000..31a4f55 --- /dev/null +++ b/dictation_client/src/features/dictation/dictationSlice.ts @@ -0,0 +1,71 @@ +import { PayloadAction, createSlice } from "@reduxjs/toolkit"; +import { DictationState } from "./state"; +import { getSortColumnAsync, listTasksAsync } from "./operations"; +import { + SORTABLE_COLUMN, + DIRECTION, + DisplayInfoType, + INIT_DISPLAY_INFO, + LIMIT_TASK_NUM, + DirectionType, + SortableColumnType, +} from "./constants"; + +const initialState: DictationState = { + domain: { + limit: LIMIT_TASK_NUM, + offset: 0, + total: 0, + tasks: [], + }, + apps: { + displayInfo: INIT_DISPLAY_INFO, + direction: DIRECTION.ASC, + paramName: SORTABLE_COLUMN.JobNumber, + }, +}; + +export const dictationSlice = createSlice({ + name: "dictation", + initialState, + reducers: { + changeDisplayInfo: ( + state, + action: PayloadAction<{ column: DisplayInfoType }> + ) => { + const { column } = action.payload; + state.apps.displayInfo = column; + }, + changeDirection: ( + state, + action: PayloadAction<{ direction: DirectionType }> + ) => { + const { direction } = action.payload; + state.apps.direction = direction; + }, + changeParamName: ( + state, + action: PayloadAction<{ paramName: SortableColumnType }> + ) => { + const { paramName } = action.payload; + state.apps.paramName = paramName; + }, + }, + extraReducers: (builder) => { + builder.addCase(listTasksAsync.fulfilled, (state, action) => { + state.domain.limit = action.payload.limit; + state.domain.offset = action.payload.offset; + state.domain.total = action.payload.total; + state.domain.tasks = action.payload.tasks; + }); + builder.addCase(getSortColumnAsync.fulfilled, (state, action) => { + state.apps.direction = action.payload.direction; + state.apps.paramName = action.payload.paramName; + }); + }, +}); + +export const { changeDisplayInfo, changeDirection, changeParamName } = + dictationSlice.actions; + +export default dictationSlice.reducer; diff --git a/dictation_client/src/features/dictation/index.ts b/dictation_client/src/features/dictation/index.ts new file mode 100644 index 0000000..eb04fc5 --- /dev/null +++ b/dictation_client/src/features/dictation/index.ts @@ -0,0 +1,5 @@ +export * from "./state"; +export * from "./constants"; +export * from "./selectors"; +export * from "./dictationSlice"; +export * from "./operations"; diff --git a/dictation_client/src/features/dictation/operations.ts b/dictation_client/src/features/dictation/operations.ts new file mode 100644 index 0000000..a1ec6aa --- /dev/null +++ b/dictation_client/src/features/dictation/operations.ts @@ -0,0 +1,164 @@ +import { createAsyncThunk } from "@reduxjs/toolkit"; +import type { RootState } from "app/store"; +import { getTranslationID } from "translation"; +import { openSnackbar } from "features/ui/uiSlice"; +import { TasksResponse, TasksApi, UsersApi } from "../../api/api"; +import { Configuration } from "../../api/configuration"; +import { ErrorObject, createErrorObject } from "../../common/errors"; +import { + DIRECTION, + DirectionType, + SORTABLE_COLUMN, + SortableColumnType, +} from "./constants"; + +export const listTasksAsync = createAsyncThunk< + TasksResponse, + { + // パラメータ + limit: number; + offset: number; + filter: string; + direction: DirectionType; + paramName: SortableColumnType; + }, + { + // rejectした時の返却値の型 + rejectValue: { + error: ErrorObject; + }; + } +>("dictations/listTasksAsync", async (args, thunkApi) => { + const { limit, offset, filter, direction, paramName } = args; + + // apiのConfigurationを取得する + const { getState } = thunkApi; + const state = getState() as RootState; + const { configuration, accessToken } = state.auth; + const config = new Configuration(configuration); + const tasksApi = new TasksApi(config); + + try { + const res = await tasksApi.getTasks( + limit, + offset, + filter, + direction, + paramName, + { + headers: { authorization: `Bearer ${accessToken}` }, + } + ); + + return res.data; + } catch (e) { + // e ⇒ errorObjectに変換" + const error = createErrorObject(e); + thunkApi.dispatch( + openSnackbar({ + level: "error", + message: getTranslationID("common.message.internalServerError"), + }) + ); + + return thunkApi.rejectWithValue({ error }); + } +}); + +export const getSortColumnAsync = createAsyncThunk< + { + direction: DirectionType; + paramName: SortableColumnType; + }, + void, + { + // rejectした時の返却値の型 + rejectValue: { + error: ErrorObject; + }; + } +>("dictations/getSortColumnAsync", async (args, thunkApi) => { + // apiのConfigurationを取得する + const { getState } = thunkApi; + const state = getState() as RootState; + const { configuration, accessToken } = state.auth; + const config = new Configuration(configuration); + const usersApi = new UsersApi(config); + + try { + const sort = await usersApi.getSortCcriteria({ + headers: { authorization: `Bearer ${accessToken}` }, + }); + + const { direction, paramName } = sort.data; + + if ( + Object.values(DIRECTION).includes(direction) && + Object.values(SORTABLE_COLUMN).includes(paramName) + ) { + return { + direction: direction as DirectionType, + paramName: paramName as SortableColumnType, + }; + } + throw new Error( + `invalid param. direction=${direction}, paramName=${paramName}` + ); + } catch (e) { + // e ⇒ errorObjectに変換" + const error = createErrorObject(e); + thunkApi.dispatch( + openSnackbar({ + level: "error", + message: getTranslationID("common.message.internalServerError"), + }) + ); + return thunkApi.rejectWithValue({ error }); + } +}); + +export const updateSortColumnAsync = createAsyncThunk< + { + /** empty */ + }, + { + // パラメータ + direction: DirectionType; + paramName: SortableColumnType; + }, + { + // rejectした時の返却値の型 + rejectValue: { + error: ErrorObject; + }; + } +>("dictations/updateSortColumnAsync", async (args, thunkApi) => { + const { direction, paramName } = args; + + // apiのConfigurationを取得する + const { getState } = thunkApi; + const state = getState() as RootState; + const { configuration, accessToken } = state.auth; + const config = new Configuration(configuration); + const usersApi = new UsersApi(config); + + try { + await usersApi.updateSortCcriteria( + { direction, paramName }, + { + headers: { authorization: `Bearer ${accessToken}` }, + } + ); + return {}; + } catch (e) { + // e ⇒ errorObjectに変換" + const error = createErrorObject(e); + thunkApi.dispatch( + openSnackbar({ + level: "error", + message: getTranslationID("common.message.internalServerError"), + }) + ); + return thunkApi.rejectWithValue({ error }); + } +}); diff --git a/dictation_client/src/features/dictation/selectors.ts b/dictation_client/src/features/dictation/selectors.ts new file mode 100644 index 0000000..7524a2f --- /dev/null +++ b/dictation_client/src/features/dictation/selectors.ts @@ -0,0 +1,31 @@ +import { RootState } from "app/store"; +import { ceil, floor } from "lodash"; + +export const selectTasks = (state: RootState) => state.dictation.domain.tasks; + +export const selectTotal = (state: RootState) => state.dictation.domain.total; + +export const seletctLimit = (state: RootState) => state.dictation.domain.limit; + +export const selectOffset = (state: RootState) => state.dictation.domain.offset; + +export const selectTotalPage = (state: RootState) => { + const { limit, total } = state.dictation.domain; + const page = ceil(total / limit); + return page; +}; + +export const selectCurrentPage = (state: RootState) => { + const { limit, offset } = state.dictation.domain; + const page = floor(offset / limit) + 1; + return page; +}; + +export const selectDisplayInfo = (state: RootState) => + state.dictation.apps.displayInfo; + +export const selectDirection = (state: RootState) => + state.dictation.apps.direction; + +export const selectParamName = (state: RootState) => + state.dictation.apps.paramName; diff --git a/dictation_client/src/features/dictation/state.ts b/dictation_client/src/features/dictation/state.ts new file mode 100644 index 0000000..e12f8da --- /dev/null +++ b/dictation_client/src/features/dictation/state.ts @@ -0,0 +1,24 @@ +import { Task } from "../../api/api"; +import { + DirectionType, + DisplayInfoType, + SortableColumnType, +} from "./constants"; + +export interface DictationState { + domain: Domain; + apps: Apps; +} + +export interface Domain { + limit: number; + offset: number; + total: number; + tasks: Task[]; +} + +export interface Apps { + displayInfo: DisplayInfoType; + direction: DirectionType; + paramName: SortableColumnType; +} diff --git a/dictation_client/src/pages/DictationPage/displayInfo.tsx b/dictation_client/src/pages/DictationPage/displayInfo.tsx new file mode 100644 index 0000000..74224b9 --- /dev/null +++ b/dictation_client/src/pages/DictationPage/displayInfo.tsx @@ -0,0 +1,575 @@ +import React, { useState } from "react"; +import { AppDispatch } from "app/store"; +import { useTranslation } from "react-i18next"; +import { useDispatch, useSelector } from "react-redux"; +import styles from "styles/app.module.scss"; +import { + DisplayInfoType, + selectDisplayInfo, + changeDisplayInfo, +} from "features/dictation"; +import { getTranslationID } from "translation"; +import table from "../../assets/images/table.svg"; + +export const DisPlayInfo: React.FC = (): JSX.Element => { + const dispatch: AppDispatch = useDispatch(); + const [t] = useTranslation(); + + const [openDisplayInfo, setOpenDisplayInfo] = useState(false); + + // 各カラムの表示/非表示 + const displayColumn = useSelector(selectDisplayInfo); + + const updateDisplayInfo = (column: DisplayInfoType) => { + localStorage.setItem("displayInfo", JSON.stringify(column)); + }; + + return ( + <> + +
    +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
+ + ); +}; diff --git a/dictation_client/src/pages/DictationPage/index.tsx b/dictation_client/src/pages/DictationPage/index.tsx new file mode 100644 index 0000000..f87ffa7 --- /dev/null +++ b/dictation_client/src/pages/DictationPage/index.tsx @@ -0,0 +1,966 @@ +import React, { useCallback, useEffect, useState } from "react"; +import { AppDispatch } from "app/store"; +import { useTranslation } from "react-i18next"; +import { useDispatch, useSelector } from "react-redux"; +import styles from "styles/app.module.scss"; +import Footer from "components/footer"; +import Header from "components/header"; +import { + listTasksAsync, + selectCurrentPage, + selectTasks, + selectTotal, + selectTotalPage, + DIRECTION, + DisplayInfoType, + INIT_DISPLAY_INFO, + SORTABLE_COLUMN, + selectDisplayInfo, + changeDisplayInfo, + getSortColumnAsync, + selectParamName, + selectDirection, + changeParamName, + changeDirection, + updateSortColumnAsync, + SortableColumnType, +} from "features/dictation"; +import { getTranslationID } from "translation"; +import { STATUS, LIMIT_TASK_NUM } from "../../features/dictation"; +import uploaded from "../../assets/images/uploaded.svg"; +import pending from "../../assets/images/pending.svg"; +import inprogress from "../../assets/images/inprogress.svg"; +import finished from "../../assets/images/finished.svg"; +import backup from "../../assets/images/backup.svg"; +import lock from "../../assets/images/lock.svg"; +import { DisPlayInfo } from "./displayInfo"; + +const DictationPage: React.FC = (): JSX.Element => { + const dispatch: AppDispatch = useDispatch(); + const [t] = useTranslation(); + + // 各カラムの表示/非表示 + const displayColumn = useSelector(selectDisplayInfo); + + // フィルターするステータス + const [filterUploaded, setFilterUploaded] = useState(true); + const [filterPending, setFilterPending] = useState(true); + const [filterInProgress, setFilterInProgress] = useState(true); + const [filterFinished, setFilterFinished] = useState(true); + const [filterBackup, setFilterBackup] = useState(false); + + // ソート対象カラム + const sortableParamName = useSelector(selectParamName); + const sortDirection = useSelector(selectDirection); + + const tasks = useSelector(selectTasks); + const total = useSelector(selectTotal); + const totalPage = useSelector(selectTotalPage); + const currentPage = useSelector(selectCurrentPage); + + // ページネーションのボタンクリック時のアクション + const getFirstPage = useCallback(() => { + const filter = getFilter( + filterUploaded, + filterInProgress, + filterPending, + filterFinished, + filterBackup + ); + dispatch( + listTasksAsync({ + limit: LIMIT_TASK_NUM, + offset: 0, + filter, + direction: sortDirection, + paramName: sortableParamName, + }) + ); + }, [ + dispatch, + filterUploaded, + filterInProgress, + filterPending, + filterFinished, + filterBackup, + sortDirection, + sortableParamName, + ]); + + const getLastPage = useCallback(() => { + const filter = getFilter( + filterUploaded, + filterInProgress, + filterPending, + filterFinished, + filterBackup + ); + const lastPageOffset = (totalPage - 1) * LIMIT_TASK_NUM; + dispatch( + listTasksAsync({ + limit: LIMIT_TASK_NUM, + offset: lastPageOffset, + filter, + direction: sortDirection, + paramName: sortableParamName, + }) + ); + }, [ + dispatch, + totalPage, + filterUploaded, + filterInProgress, + filterPending, + filterFinished, + filterBackup, + sortDirection, + sortableParamName, + ]); + + const getPrevPage = useCallback(() => { + const filter = getFilter( + filterUploaded, + filterInProgress, + filterPending, + filterFinished, + filterBackup + ); + const prevPageOffset = (currentPage - 2) * LIMIT_TASK_NUM; + dispatch( + listTasksAsync({ + limit: LIMIT_TASK_NUM, + offset: prevPageOffset, + filter, + direction: sortDirection, + paramName: sortableParamName, + }) + ); + }, [ + dispatch, + currentPage, + filterUploaded, + filterInProgress, + filterPending, + filterFinished, + filterBackup, + sortDirection, + sortableParamName, + ]); + + const getNextPage = useCallback(() => { + const filter = getFilter( + filterUploaded, + filterInProgress, + filterPending, + filterFinished, + filterBackup + ); + const nextPageOffset = currentPage * LIMIT_TASK_NUM; + dispatch( + listTasksAsync({ + limit: LIMIT_TASK_NUM, + offset: nextPageOffset, + filter, + direction: sortDirection, + paramName: sortableParamName, + }) + ); + }, [ + dispatch, + currentPage, + filterUploaded, + filterInProgress, + filterPending, + filterFinished, + filterBackup, + sortDirection, + sortableParamName, + ]); + + const updateSortColumn = useCallback( + (paramName: SortableColumnType) => { + const currentDirection = + sortableParamName === paramName && sortDirection === DIRECTION.ASC + ? DIRECTION.DESC + : DIRECTION.ASC; + dispatch(changeDirection({ direction: currentDirection })); + dispatch(changeParamName({ paramName })); + + const filter = getFilter( + filterUploaded, + filterInProgress, + filterPending, + filterFinished, + filterBackup + ); + + dispatch( + listTasksAsync({ + limit: LIMIT_TASK_NUM, + offset: 0, + filter, + direction: currentDirection, + paramName, + }) + ); + }, + [ + dispatch, + sortableParamName, + sortDirection, + filterUploaded, + filterInProgress, + filterPending, + filterFinished, + filterBackup, + ] + ); + + const getFilter = ( + hasUploaded: boolean, + hasInProgress: boolean, + hasPending: boolean, + hasFinished: boolean, + hasBackup: boolean + ) => { + const filterStatus = []; + if (hasUploaded) { + filterStatus.push(STATUS.UPLOADED); + } + if (hasInProgress) { + filterStatus.push(STATUS.INPROGRESS); + } + if (hasPending) { + filterStatus.push(STATUS.PENDING); + } + if (hasFinished) { + filterStatus.push(STATUS.FINISHED); + } + if (hasBackup) { + filterStatus.push(STATUS.BACKUP); + } + + return filterStatus.join(","); + }; + + // ステータスフィルターの変更時アクション + const updateFilter = useCallback( + ( + hasUploaded: boolean, + hasInProgress: boolean, + hasPending: boolean, + hasFinished: boolean, + hasBackup: boolean + ) => { + const filter = getFilter( + hasUploaded, + hasInProgress, + hasPending, + hasFinished, + hasBackup + ); + dispatch( + listTasksAsync({ + limit: LIMIT_TASK_NUM, + offset: 0, + filter, + direction: sortDirection, + paramName: sortableParamName, + }) + ); + }, + [dispatch, sortDirection, sortableParamName] + ); + + const onPlayBack = useCallback(() => { + dispatch( + updateSortColumnAsync({ + direction: sortDirection, + paramName: sortableParamName, + }) + ); + }, [dispatch, sortDirection, sortableParamName]); + + // 初回読み込み処理 + useEffect(() => { + (async () => { + const displayInfoValue = localStorage.getItem("displayInfo"); + + let displayInfo: DisplayInfoType; + if (displayInfoValue) { + displayInfo = JSON.parse(displayInfoValue); + } else { + displayInfo = INIT_DISPLAY_INFO; + localStorage.setItem("displayInfo", JSON.stringify(displayInfo)); + } + + dispatch(changeDisplayInfo({ column: displayInfo })); + + const filter = getFilter(true, true, true, true, false); + const { meta, payload } = await dispatch(getSortColumnAsync()); + if ( + meta.requestStatus === "fulfilled" && + payload && + !("error" in payload) + ) { + const { direction, paramName } = payload; + dispatch( + listTasksAsync({ + limit: LIMIT_TASK_NUM, + offset: 0, + filter, + direction, + paramName, + }) + ); + } + })(); + }, [dispatch]); + + return ( +
+
+
+
+
+

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

+
+ +
+
+ +
    +
  • {t(getTranslationID("dictationPage.label.filter"))}:
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
+ +
+ + + + {displayColumn.JobNumber && ( + + )} + {displayColumn.Status && ( + + )} + {displayColumn.Priority && ( + + )} + {displayColumn.Encryption && ( + + )} + {displayColumn.AuthorId && ( + + )} + {displayColumn.WorkType && ( + + )} + {displayColumn.FileName && ( + + )} + {displayColumn.FileLength && ( + + )} + {displayColumn.FileSize && ( + + )} + {displayColumn.RecordingStartedDate && ( + + )} + {displayColumn.RecordingFinishedDate && ( + + )} + {displayColumn.UploadDate && ( + + )} + {displayColumn.TranscriptionStartedDate && ( + + )} + {displayColumn.TranscriptionFinishedDate && ( + + )} + {displayColumn.Transcriptionist && ( + + )} + {displayColumn.Comment && ( + + )} + {displayColumn.OptionItem1 && ( + + )} + {displayColumn.OptionItem2 && ( + + )} + {displayColumn.OptionItem3 && ( + + )} + {displayColumn.OptionItem4 && ( + + )} + {displayColumn.OptionItem5 && ( + + )} + {displayColumn.OptionItem6 && ( + + )} + {displayColumn.OptionItem7 && ( + + )} + {displayColumn.OptionItem8 && ( + + )} + {displayColumn.OptionItem9 && ( + + )} + {displayColumn.OptionItem10 && ( + + )} + + {tasks.length !== 0 && + tasks.map((x) => ( + + + {displayColumn.JobNumber && ( + + )} + {displayColumn.Status && ( + + )} + {displayColumn.Priority && ( + + )} + {displayColumn.Encryption && ( + + )} + {displayColumn.AuthorId && ( + + )} + {displayColumn.WorkType && ( + + )} + {displayColumn.FileName && ( + + )} + {displayColumn.FileLength && ( + + )} + {displayColumn.FileSize && ( + + )} + {displayColumn.RecordingStartedDate && ( + + )} + {displayColumn.RecordingFinishedDate && ( + + )} + {displayColumn.UploadDate && ( + + )} + {displayColumn.TranscriptionStartedDate && ( + + )} + {displayColumn.TranscriptionFinishedDate && ( + + )} + {displayColumn.Transcriptionist && ( + + )} + {displayColumn.Comment && ( + + )} + {displayColumn.OptionItem1 && ( + + )} + + {displayColumn.OptionItem2 && ( + + )} + {displayColumn.OptionItem3 && ( + + )} + {displayColumn.OptionItem4 && ( + + )} + {displayColumn.OptionItem5 && ( + + )} + {displayColumn.OptionItem6 && ( + + )} + {displayColumn.OptionItem7 && ( + + )} + {displayColumn.OptionItem8 && ( + + )} + {displayColumn.OptionItem9 && ( + + )} + {displayColumn.OptionItem10 && ( + + )} + + ))} +
{/** th is empty */} + {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions */} + + updateSortColumn(SORTABLE_COLUMN.JobNumber) + } + > + {t(getTranslationID("dictationPage.label.jobNumber"))} + + + {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions */} + + updateSortColumn(SORTABLE_COLUMN.Status) + } + > + {t(getTranslationID("dictationPage.label.status"))} + + Priority + {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions */} + + updateSortColumn(SORTABLE_COLUMN.Encryption) + } + > + {t( + getTranslationID("dictationPage.label.encryption") + )} + + + {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions */} + + updateSortColumn(SORTABLE_COLUMN.AuthorId) + } + > + {t(getTranslationID("dictationPage.label.authorId"))} + + + {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions */} + + updateSortColumn(SORTABLE_COLUMN.WorkType) + } + > + {t(getTranslationID("dictationPage.label.workType"))} + + + {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions */} + + updateSortColumn(SORTABLE_COLUMN.FileName) + } + > + {t(getTranslationID("dictationPage.label.fileName"))} + + + {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions */} + + updateSortColumn(SORTABLE_COLUMN.FileLength) + } + > + {t( + getTranslationID("dictationPage.label.fileLength") + )} + + + {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions */} + + updateSortColumn(SORTABLE_COLUMN.FileSize) + } + > + {t(getTranslationID("dictationPage.label.fileSize"))} + + + {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions */} + + updateSortColumn( + SORTABLE_COLUMN.RecordingStartedDate + ) + } + > + {t( + getTranslationID( + "dictationPage.label.recordingStartedDate" + ) + )} + + + {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions */} + + updateSortColumn( + SORTABLE_COLUMN.RecordingFinishedDate + ) + } + > + {t( + getTranslationID( + "dictationPage.label.recordingFinishedDate" + ) + )} + + + {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions */} + + updateSortColumn(SORTABLE_COLUMN.UploadDate) + } + > + {t( + getTranslationID("dictationPage.label.uploadDate") + )} + + + {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions */} + + updateSortColumn( + SORTABLE_COLUMN.TranscriptionStartedDate + ) + } + > + {t( + getTranslationID( + "dictationPage.label.transcriptionStartedDate" + ) + )} + + + {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions */} + + updateSortColumn( + SORTABLE_COLUMN.TranscriptionFinishedDate + ) + } + > + {t( + getTranslationID( + "dictationPage.label.transcriptionFinishedDate" + ) + )} + + + {t( + getTranslationID( + "dictationPage.label.transcriptionist" + ) + )} + + {t(getTranslationID("dictationPage.label.comment"))} + + {t(getTranslationID("dictationPage.label.optionItem1"))} + + {t(getTranslationID("dictationPage.label.optionItem2"))} + + {t(getTranslationID("dictationPage.label.optionItem3"))} + + {t(getTranslationID("dictationPage.label.optionItem4"))} + + {t(getTranslationID("dictationPage.label.optionItem5"))} + + {t(getTranslationID("dictationPage.label.optionItem6"))} + + {t(getTranslationID("dictationPage.label.optionItem7"))} + + {t(getTranslationID("dictationPage.label.optionItem8"))} + + {t(getTranslationID("dictationPage.label.optionItem9"))} + + {t( + getTranslationID("dictationPage.label.optionItem10") + )} +
+ + {x.jobNumber} + {(() => { + switch (x.status) { + case STATUS.UPLOADED: + return Uploaded; + case STATUS.PENDING: + return Pending; + case STATUS.FINISHED: + return Finished; + case STATUS.INPROGRESS: + return ( + InProgress + ); + default: + return Backup; + } + })()} + {x.status} + + {x.priority === "01" ? "High" : "Normal"} + + {x.isEncrypted ? ( + encrypted + ) : ( + <>- + )} + {x.authorId}{x.workType}{x.fileName}{x.audioDuration}{x.fileSize}{x.audioCreatedDate} + {x.audioFinishedDate} + + {x.audioUploadedDate} + + {x.transcriptionStartedDate} + + {x.transcriptionFinishedDate} + + {x.assignees.map((a, i) => ( + <> + {a.typistName} + {i !== x.assignees.length - 1 &&
} + + ))} +
{x.comment} + {x.optionItemList[0].optionItemValue} + + {x.optionItemList[1].optionItemValue} + + {x.optionItemList[2].optionItemValue} + + {x.optionItemList[3].optionItemValue} + + {x.optionItemList[4].optionItemValue} + + {x.optionItemList[5].optionItemValue} + + {x.optionItemList[6].optionItemValue} + + {x.optionItemList[7].optionItemValue} + + {x.optionItemList[8].optionItemValue} + + {x.optionItemList[9].optionItemValue} +
+ {tasks.length === 0 && ( +

+ {t(getTranslationID("common.message.listEmpty"))} +

+ )} +
+ + {/** pagenation */} +
+ +
+
+
+
+
+
+ ); +}; + +export default DictationPage; diff --git a/dictation_client/src/styles/app.module.scss b/dictation_client/src/styles/app.module.scss index 8eee3fa..6b1b2d9 100644 --- a/dictation_client/src/styles/app.module.scss +++ b/dictation_client/src/styles/app.module.scss @@ -17,18 +17,18 @@ z-index: 4; } .headerLogo { - margin: 1.2rem 2rem 1rem; + margin: 1.2rem 2rem 1.5rem; font-size: 1.71rem; line-height: 2rem; letter-spacing: 0.07rem; font-weight: normal; } .headerLogo img { - width: 198px; + width: 280px; } .headerSub { margin: 1.4rem 2rem 1rem; - font-size: 1.2rem; + font-size: 1.8rem; line-height: 2rem; letter-spacing: 0.07rem; font-weight: normal; @@ -44,7 +44,7 @@ padding: 0 2rem; } .headerMenu ul li { - font-size: 1rem; + font-size: 1.3rem; line-height: 2rem; letter-spacing: 0.07rem; font-weight: normal; @@ -52,7 +52,7 @@ } .headerMenu ul li a { display: block; - padding: 0 2rem; + padding: 0.2rem 2.5rem 0.2rem; color: #333333; text-decoration: none; -moz-transition: all 0.3s ease-out; @@ -61,7 +61,7 @@ transition: all 0.3s ease-out; } .headerMenu ul li a:hover { - background: #fafafa; + background: #f5f5f5; text-decoration: underline; } .headerMenu ul li a.isActive { @@ -71,9 +71,9 @@ } .headerMenu ul li a.isActive::after { content: ""; - border-right: 0.6rem transparent solid; - border-bottom: 0.6rem #282828 solid; - border-left: 0.6rem transparent solid; + border-right: 0.7rem transparent solid; + border-bottom: 0.7rem #282828 solid; + border-left: 0.7rem transparent solid; position: absolute; bottom: -4px; left: 50%; @@ -600,7 +600,7 @@ h3 .brCrumb .tlIcon { } .pageHeader { - padding: 0.5rem 2.5rem 0.4rem; + padding: 0.3rem 2.5rem 0.2rem; background: #282828; color: #ffffff; margin-bottom: 2rem; @@ -608,8 +608,8 @@ h3 .brCrumb .tlIcon { .pageTitle { display: inline-block; padding-right: 1rem; - font-size: 1.8rem; - line-height: 2.5rem; + font-size: 1.4rem; + line-height: 1.4rem; letter-spacing: 0.07rem; font-weight: 500; } @@ -978,6 +978,9 @@ _:-ms-lang(x)::-ms-backdrop, .menuAction.inTable .colorLink.isActive:hover { background: rgba(0, 94, 184, 0.7); } +.menuAction.alignRight { + margin-top: -1rem; +} .menuMore { text-align: center; } @@ -1205,7 +1208,7 @@ _:-ms-lang(x)::-ms-backdrop, border-left: 0.6rem transparent solid; position: absolute; top: -0.5rem; - left: 1rem; + right: 3rem; } .dictation .table { margin-bottom: 0; @@ -1307,6 +1310,13 @@ _:-ms-lang(x)::-ms-backdrop, .dictation .table.dictation tr.isSelected:hover { color: #ffffff; } +.dictation .table.dictation tr.isSelected img[alt="Uploaded"], +.dictation .table.dictation tr.isSelected img[alt="Finished"], +.dictation .table.dictation tr.isSelected img[alt="InProgress"], +.dictation .table.dictation tr.isSelected img[alt="encrypted"] { + filter: brightness(0) saturate(100%) invert(100%) sepia(100%) saturate(2%) + hue-rotate(110deg) brightness(110%) contrast(101%); +} .dictation .table.dictation td { padding-bottom: 2rem; vertical-align: top; @@ -1467,9 +1477,11 @@ _:-ms-lang(x)::-ms-backdrop, margin-right: 0.5rem; padding-right: 0.5rem; } +.menuInTable li:not(:last-child) { + border-right: 1px #999999 solid; +} .menuInTable li a { display: block; - padding-left: 1.2rem; font-size: 12px; line-height: 1.4; letter-spacing: 0.02rem; @@ -1484,26 +1496,7 @@ _:-ms-lang(x)::-ms-backdrop, 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; } diff --git a/dictation_client/src/styles/app.module.scss.d.ts b/dictation_client/src/styles/app.module.scss.d.ts index ad831d5..7ff37db 100644 --- a/dictation_client/src/styles/app.module.scss.d.ts +++ b/dictation_client/src/styles/app.module.scss.d.ts @@ -78,6 +78,7 @@ declare const classNames: { readonly inTable: "inTable"; readonly menuLink: "menuLink"; readonly colorLink: "colorLink"; + readonly alignRight: "alignRight"; readonly menuMore: "menuMore"; readonly menuIcon: "menuIcon"; readonly icCheckCircle: "icCheckCircle"; @@ -155,17 +156,12 @@ declare const classNames: { 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"; readonly linkTx: "linkTx"; readonly borderTop: "borderTop"; readonly borderBottom: "borderBottom"; diff --git a/dictation_client/src/translation/de.json b/dictation_client/src/translation/de.json index 1c1e9e4..6531b1f 100644 --- a/dictation_client/src/translation/de.json +++ b/dictation_client/src/translation/de.json @@ -1,158 +1,201 @@ -{ - "common": { - "message": { - "inputEmptyError": "(de)Error Message", - "passwordIncorrectError": "(de)Error Message", - "emailIncorrectError": "(de)Error Message", - "internalServerError": "(de)処理に失敗しました。時間をおいて再実行しても解決しない場合はシステム管理者にお問い合わせください。" - }, - "label": { - "cancel": "(de)Cancel", - "headerTitle": "(de)ODMS Cloud", - "copyRight": "(de)OM Digital Solutions 2023" - } - }, - "topPage": { - "label": { - "displayLanguage": "(de)Display language", - "languageEnglish": "(de)English", - "languageGerman": "(de)German", - "languageSpanish": "(de)Spanish", - "languageFrench": "(de)French", - "alreadyHaveAccount": "(de)Already have an account?", - "signInButton": "(de)Sign in", - "newUser": "(de)New user?", - "signUpButton": "(de)Create a new account" - } - }, - "signupPage": { - "message": { - "inputEmptyError": "(de)この項目の入力は必須です。入力してください。", - "passwordIncorrectError": "(de)入力されたパスワードがルールを満たしていません。下記のルールを満たすパスワードを入力してください。", - "emailIncorrectError": "(de)メールアドレスの形式が不正です。正しいメールアドレスの形式で入力してください。" - }, - "text": { - "title": "(de)Create your account", - "pageExplanation": "(de)Explanation...", - "accountInfoTitle": "(de)Register your account information", - "countryExplanation": "(de) Please select your country or the nearest country.", - "dealerExplanation": "(de)Please select the dealer to purchase a license.", - "adminInfoTitle": "(de)Register primary administrator's information", - "passwordTerms": "(de)Please set a password or issue an initial password.\nThe password must be more than 8 or less than 64 letters,numbers and symbols." - }, - "label": { - "company": "(de)Company Name", - "country": "(de)Country", - "dealer": "(de)Dealer", - "adminName": "(de)Admin Name", - "email": "(de)Email", - "password": "(de)Password", - "termsLink": "(de)Click here to read the terms of use", - "termsLinkFor": "(de)for ODDS.", - "termsCheckBox": "(de)Yes, I agree to the terms of use.", - "createAccountButton": "(de)Create account" - } - }, - "signupConfirmPage": { - "message": { - "emailConflictError": "(de)このメールアドレスは既に登録されています。他のメールアドレスで登録してください。" - }, - "text": { - "title": "(de)Confirmation", - "pageExplanation": "(de)Explanation ......", - "accountInfoTitle": "(de)Your account information", - "adminInfoTitle": "(de)Primary administrator's information" - }, - "label": { - "company": "(de)Company Name", - "country": "(de)Country", - "dealer": "(de)Dealer (Optional)", - "adminName": "(de)Admin Name", - "email": "(de)Email", - "password": "(de)Password", - "signupButton": "(de)Sign up" - } - }, - "signupCompletePage": { - "text": { - "createdInfo": "(de)Your account has been created and a verification email has been set to your registered email address. Please click on the verification link included in the email to activate your account." - }, - "label": { - "title": "(de)Account created" - } - }, - "signupVerifyPage": { - "text": { - "verifySuccess": "(de)You have successfully verified the account.", - "faild": "(de)The verification url does not match. Please try again,\nor click on the link below to receive a new verification mail.", - "alreadySuccess": "(de)Your account has already been verified." - }, - "label": { - "verifySuccess": "(de)Verified!", - "faild": "(de)Verification failed", - "alreadySuccess": "(de)Already Verified!", - "returnToSignIn": "(de)Return to Sign in" - } - }, - "userListPage": { - "message": { - "addUserSuccess": "(de)メールアドレス宛に認証用メールを送信しました。", - "authorIdConflictError": "(de)このAuthor IDは既に登録されています。他のAuthor IDで登録してください。", - "authorIdIncorrectError": "(de)Author IDの形式が不正です。Author IDは半角英数字(大文字)と\"_\"のみ入力可能です。" - }, - "label": { - "title": "(de)User", - "addUser": "(de)Add User", - "edit": "(de)Edit", - "delete": "(de)Delete", - "licenseAllocation": "(de)License Allocation", - "name": "(de)Name", - "role": "(de)Role", - "authorID": "(de)Author ID", - "typistGroup": "(de)Typist Group", - "email": "(de)Email", - "status": "(de)Status", - "expiration": "(de)Expiration", - "remaining": "(de)Remaining", - "autoRenew": "(de)Auto renew", - "licenseAlert": "(de)License alert", - "notification": "(de)Notification", - "users": "(de)users", - "of": "(de)of", - "personal": "(de)Personal information", - "setting": "(de)Setting", - "selectGroup": "(de)Select group", - "addToGroup": "(de)Add to group (Optional)", - "author": "(de)Author", - "transcriptionist": "(de)Transcriptionist", - "none": "(de)None" - } - }, - "LicensePage": { - "label": { - "title": "(de)License", - "subTitle": "(de)EFGI Legal", - "orderLicense": "(de)Order License", - "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" - } - } -} +{ + "common": { + "message": { + "inputEmptyError": "(de)Error Message", + "passwordIncorrectError": "(de)Error Message", + "emailIncorrectError": "(de)Error Message", + "internalServerError": "(de)処理に失敗しました。時間をおいて再実行しても解決しない場合はシステム管理者にお問い合わせください。", + "listEmpty": "(de)検索結果が0件です。" + }, + "label": { + "cancel": "(de)Cancel", + "headerTitle": "(de)ODMS Cloud", + "copyRight": "(de)OM Digital Solutions 2023" + } + }, + "topPage": { + "label": { + "displayLanguage": "(de)Display language", + "languageEnglish": "(de)English", + "languageGerman": "(de)German", + "languageSpanish": "(de)Spanish", + "languageFrench": "(de)French", + "alreadyHaveAccount": "(de)Already have an account?", + "signInButton": "(de)Sign in", + "newUser": "(de)New user?", + "signUpButton": "(de)Create a new account" + } + }, + "signupPage": { + "message": { + "inputEmptyError": "(de)この項目の入力は必須です。入力してください。", + "passwordIncorrectError": "(de)入力されたパスワードがルールを満たしていません。下記のルールを満たすパスワードを入力してください。", + "emailIncorrectError": "(de)メールアドレスの形式が不正です。正しいメールアドレスの形式で入力してください。" + }, + "text": { + "title": "(de)Create your account", + "pageExplanation": "(de)Explanation...", + "accountInfoTitle": "(de)Register your account information", + "countryExplanation": "(de) Please select your country or the nearest country.", + "dealerExplanation": "(de)Please select the dealer to purchase a license.", + "adminInfoTitle": "(de)Register primary administrator's information", + "passwordTerms": "(de)Please set a password or issue an initial password.\nThe password must be more than 8 or less than 64 letters,numbers and symbols." + }, + "label": { + "company": "(de)Company Name", + "country": "(de)Country", + "dealer": "(de)Dealer", + "adminName": "(de)Admin Name", + "email": "(de)Email", + "password": "(de)Password", + "termsLink": "(de)Click here to read the terms of use", + "termsLinkFor": "(de)for ODDS.", + "termsCheckBox": "(de)Yes, I agree to the terms of use.", + "createAccountButton": "(de)Create account" + } + }, + "signupConfirmPage": { + "message": { + "emailConflictError": "(de)このメールアドレスは既に登録されています。他のメールアドレスで登録してください。" + }, + "text": { + "title": "(de)Confirmation", + "pageExplanation": "(de)Explanation ......", + "accountInfoTitle": "(de)Your account information", + "adminInfoTitle": "(de)Primary administrator's information" + }, + "label": { + "company": "(de)Company Name", + "country": "(de)Country", + "dealer": "(de)Dealer (Optional)", + "adminName": "(de)Admin Name", + "email": "(de)Email", + "password": "(de)Password", + "signupButton": "(de)Sign up" + } + }, + "signupCompletePage": { + "text": { + "createdInfo": "(de)Your account has been created and a verification email has been set to your registered email address. Please click on the verification link included in the email to activate your account." + }, + "label": { + "title": "(de)Account created" + } + }, + "signupVerifyPage": { + "text": { + "verifySuccess": "(de)You have successfully verified the account.", + "faild": "(de)The verification url does not match. Please try again,\nor click on the link below to receive a new verification mail.", + "alreadySuccess": "(de)Your account has already been verified." + }, + "label": { + "verifySuccess": "(de)Verified!", + "faild": "(de)Verification failed", + "alreadySuccess": "(de)Already Verified!", + "returnToSignIn": "(de)Return to Sign in" + } + }, + "userListPage": { + "message": { + "addUserSuccess": "(de)メールアドレス宛に認証用メールを送信しました。", + "authorIdConflictError": "(de)このAuthor IDは既に登録されています。他のAuthor IDで登録してください。", + "authorIdIncorrectError": "(de)Author IDの形式が不正です。Author IDは半角英数字(大文字)と\"_\"のみ入力可能です。" + }, + "label": { + "title": "(de)User", + "addUser": "(de)Add User", + "edit": "(de)Edit", + "delete": "(de)Delete", + "licenseAllocation": "(de)License Allocation", + "name": "(de)Name", + "role": "(de)Role", + "authorID": "(de)Author ID", + "typistGroup": "(de)Typist Group", + "email": "(de)Email", + "status": "(de)Status", + "expiration": "(de)Expiration", + "remaining": "(de)Remaining", + "autoRenew": "(de)Auto renew", + "licenseAlert": "(de)License alert", + "notification": "(de)Notification", + "users": "(de)users", + "of": "(de)of", + "personal": "(de)Personal information", + "setting": "(de)Setting", + "selectGroup": "(de)Select group", + "addToGroup": "(de)Add to group (Optional)", + "author": "(de)Author", + "transcriptionist": "(de)Transcriptionist", + "none": "(de)None" + } + }, + "LicensePage": { + "label": { + "title": "(de)License", + "subTitle": "(de)EFGI Legal", + "orderLicense": "(de)Order License", + "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" + } + }, + "dictationPage": { + "label": { + "title": "(de)Dictations", + "displayInfomation": "(de)Display Information", + "jobNumber": "(de)Job Number", + "status": "(de)Status", + "priority": "(de)Priority", + "encryption": "(de)Encryption", + "authorId": "(de)Author ID", + "workType": "(de)WorkType", + "fileName": "(de)File Name", + "fileLength": "(de)File Length", + "fileSize": "(de)File size", + "recordingStartedDate": "(de)Recording started date", + "recordingFinishedDate": "(de)Recording finished date", + "uploadDate": "(de)Upload date", + "transcriptionStartedDate": "(de)Transcription start date", + "transcriptionFinishedDate": "(de)Transcription finished date", + "transcriptionist": "(de)Transcriptionist", + "comment": "(de)Comment", + "optionItem1": "(de)OptionItem1", + "optionItem2": "(de)OptionItem2", + "optionItem3": "(de)OptionItem3", + "optionItem4": "(de)OptionItem4", + "optionItem5": "(de)OptionItem5", + "optionItem6": "(de)OptionItem6", + "optionItem7": "(de)OptionItem7", + "optionItem8": "(de)OptionItem8", + "optionItem9": "(de)OptionItem9", + "optionItem10": "(de)OptionItem10", + "filter": "(de)Filter", + "uploaded": "(de)Uploaded", + "inProgress": "(de)InProgress", + "finished": "(de)Finished", + "pending": "(de)Pending", + "backup": "(de)Backup", + "playback": "(de)Playback", + "fileProperty": "(de)File Property", + "changeTranscriptionist": "(de)Change Transcriptionist", + "deleteDictation": "(de)Delete Dictation" + } + } +} \ No newline at end of file diff --git a/dictation_client/src/translation/en.json b/dictation_client/src/translation/en.json index 71669c6..246f76a 100644 --- a/dictation_client/src/translation/en.json +++ b/dictation_client/src/translation/en.json @@ -1,158 +1,201 @@ -{ - "common": { - "message": { - "inputEmptyError": "Error Message", - "passwordIncorrectError": "Error Message", - "emailIncorrectError": "Error Message", - "internalServerError": "処理に失敗しました。時間をおいて再実行しても解決しない場合はシステム管理者にお問い合わせください。" - }, - "label": { - "cancel": "Cancel", - "headerTitle": "ODMS Cloud", - "copyRight": "OM Digital Solutions 2023" - } - }, - "topPage": { - "label": { - "displayLanguage": "Display language", - "languageEnglish": "English", - "languageGerman": "German", - "languageSpanish": "Spanish", - "languageFrench": "French", - "alreadyHaveAccount": "Already have an account?", - "signInButton": "Sign in", - "newUser": "New user?", - "signUpButton": "Create a new account" - } - }, - "signupPage": { - "message": { - "inputEmptyError": "この項目の入力は必須です。入力してください。", - "passwordIncorrectError": "入力されたパスワードがルールを満たしていません。下記のルールを満たすパスワードを入力してください。", - "emailIncorrectError": "メールアドレスの形式が不正です。正しいメールアドレスの形式で入力してください。" - }, - "text": { - "title": "Create your account", - "pageExplanation": "Explanation...", - "accountInfoTitle": "Register your account information", - "countryExplanation": " Please select your country or the nearest country.", - "dealerExplanation": "Please select the dealer to purchase a license.", - "adminInfoTitle": "Register primary administrator's information", - "passwordTerms": "Please set a password or issue an initial password.\nThe password must be more than 8 or less than 64 letters,numbers and symbols." - }, - "label": { - "company": "Company Name", - "country": "Country", - "dealer": "Dealer", - "adminName": "Admin Name", - "email": "Email", - "password": "Password", - "termsLink": "Click here to read the terms of use", - "termsLinkFor": "for ODDS.", - "termsCheckBox": "Yes, I agree to the terms of use.", - "createAccountButton": "Create account" - } - }, - "signupConfirmPage": { - "message": { - "emailConflictError": "このメールアドレスは既に登録されています。他のメールアドレスで登録してください。" - }, - "text": { - "title": "Confirmation", - "pageExplanation": "Explanation ......", - "accountInfoTitle": "Your account information", - "adminInfoTitle": "Primary administrator's information" - }, - "label": { - "company": "Company Name", - "country": "Country", - "dealer": "Dealer (Optional)", - "adminName": "Admin Name", - "email": "Email", - "password": "Password", - "signupButton": "Sign up" - } - }, - "signupCompletePage": { - "text": { - "createdInfo": "Your account has been created and a verification email has been set to your registered email address. Please click on the verification link included in the email to activate your account." - }, - "label": { - "title": "Account created" - } - }, - "signupVerifyPage": { - "text": { - "verifySuccess": "You have successfully verified the account.", - "faild": "The verification url does not match. Please try again,\nor click on the link below to receive a new verification mail.", - "alreadySuccess": "Your account has already been verified." - }, - "label": { - "verifySuccess": "Verified!", - "faild": "Verification failed", - "alreadySuccess": "Already Verified!", - "returnToSignIn": "Return to Sign in" - } - }, - "userListPage": { - "message": { - "addUserSuccess": "メールアドレス宛に認証用メールを送信しました。", - "authorIdConflictError": "このAuthor IDは既に登録されています。他のAuthor IDで登録してください。", - "authorIdIncorrectError": "Author IDの形式が不正です。Author IDは半角英数字(大文字)と\"_\"のみ入力可能です。" - }, - "label": { - "title": "User", - "addUser": "Add User", - "edit": "Edit", - "delete": "Delete", - "licenseAllocation": "License Allocation", - "name": "Name", - "role": "Role", - "authorID": "Author ID", - "typistGroup": "Typist Group", - "email": "Email", - "status": "Status", - "expiration": "Expiration", - "remaining": "Remaining", - "autoRenew": "Auto renew", - "licenseAlert": "License alert", - "notification": "Notification", - "users": "users", - "of": "of", - "personal": "Personal information", - "setting": "Setting", - "selectGroup": "Select group", - "addToGroup": "Add to group (Optional)", - "author": "Author", - "transcriptionist": "Transcriptionist", - "none": "None" - } - }, - "LicensePage": { - "label": { - "title": "License", - "subTitle": "EFGI Legal", - "orderLicense": "Order License", - "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" - } - } -} +{ + "common": { + "message": { + "inputEmptyError": "Error Message", + "passwordIncorrectError": "Error Message", + "emailIncorrectError": "Error Message", + "internalServerError": "処理に失敗しました。時間をおいて再実行しても解決しない場合はシステム管理者にお問い合わせください。", + "listEmpty": "検索結果が0件です。" + }, + "label": { + "cancel": "Cancel", + "headerTitle": "ODMS Cloud", + "copyRight": "OM Digital Solutions 2023" + } + }, + "topPage": { + "label": { + "displayLanguage": "Display language", + "languageEnglish": "English", + "languageGerman": "German", + "languageSpanish": "Spanish", + "languageFrench": "French", + "alreadyHaveAccount": "Already have an account?", + "signInButton": "Sign in", + "newUser": "New user?", + "signUpButton": "Create a new account" + } + }, + "signupPage": { + "message": { + "inputEmptyError": "この項目の入力は必須です。入力してください。", + "passwordIncorrectError": "入力されたパスワードがルールを満たしていません。下記のルールを満たすパスワードを入力してください。", + "emailIncorrectError": "メールアドレスの形式が不正です。正しいメールアドレスの形式で入力してください。" + }, + "text": { + "title": "Create your account", + "pageExplanation": "Explanation...", + "accountInfoTitle": "Register your account information", + "countryExplanation": " Please select your country or the nearest country.", + "dealerExplanation": "Please select the dealer to purchase a license.", + "adminInfoTitle": "Register primary administrator's information", + "passwordTerms": "Please set a password or issue an initial password.\nThe password must be more than 8 or less than 64 letters,numbers and symbols." + }, + "label": { + "company": "Company Name", + "country": "Country", + "dealer": "Dealer", + "adminName": "Admin Name", + "email": "Email", + "password": "Password", + "termsLink": "Click here to read the terms of use", + "termsLinkFor": "for ODDS.", + "termsCheckBox": "Yes, I agree to the terms of use.", + "createAccountButton": "Create account" + } + }, + "signupConfirmPage": { + "message": { + "emailConflictError": "このメールアドレスは既に登録されています。他のメールアドレスで登録してください。" + }, + "text": { + "title": "Confirmation", + "pageExplanation": "Explanation ......", + "accountInfoTitle": "Your account information", + "adminInfoTitle": "Primary administrator's information" + }, + "label": { + "company": "Company Name", + "country": "Country", + "dealer": "Dealer (Optional)", + "adminName": "Admin Name", + "email": "Email", + "password": "Password", + "signupButton": "Sign up" + } + }, + "signupCompletePage": { + "text": { + "createdInfo": "Your account has been created and a verification email has been set to your registered email address. Please click on the verification link included in the email to activate your account." + }, + "label": { + "title": "Account created" + } + }, + "signupVerifyPage": { + "text": { + "verifySuccess": "You have successfully verified the account.", + "faild": "The verification url does not match. Please try again,\nor click on the link below to receive a new verification mail.", + "alreadySuccess": "Your account has already been verified." + }, + "label": { + "verifySuccess": "Verified!", + "faild": "Verification failed", + "alreadySuccess": "Already Verified!", + "returnToSignIn": "Return to Sign in" + } + }, + "userListPage": { + "message": { + "addUserSuccess": "メールアドレス宛に認証用メールを送信しました。", + "authorIdConflictError": "このAuthor IDは既に登録されています。他のAuthor IDで登録してください。", + "authorIdIncorrectError": "Author IDの形式が不正です。Author IDは半角英数字(大文字)と\"_\"のみ入力可能です。" + }, + "label": { + "title": "User", + "addUser": "Add User", + "edit": "Edit", + "delete": "Delete", + "licenseAllocation": "License Allocation", + "name": "Name", + "role": "Role", + "authorID": "Author ID", + "typistGroup": "Typist Group", + "email": "Email", + "status": "Status", + "expiration": "Expiration", + "remaining": "Remaining", + "autoRenew": "Auto renew", + "licenseAlert": "License alert", + "notification": "Notification", + "users": "users", + "of": "of", + "personal": "Personal information", + "setting": "Setting", + "selectGroup": "Select group", + "addToGroup": "Add to group (Optional)", + "author": "Author", + "transcriptionist": "Transcriptionist", + "none": "None" + } + }, + "LicensePage": { + "label": { + "title": "License", + "subTitle": "EFGI Legal", + "orderLicense": "Order License", + "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" + } + }, + "dictationPage": { + "label": { + "title": "Dictations", + "displayInfomation": "Display Information", + "jobNumber": "Job Number", + "status": "Status", + "priority": "Priority", + "encryption": "Encryption", + "authorId": "Author ID", + "workType": "WorkType", + "fileName": "File Name", + "fileLength": "File Length", + "fileSize": "File size", + "recordingStartedDate": "Recording started date", + "recordingFinishedDate": "Recording finished date", + "uploadDate": "Upload date", + "transcriptionStartedDate": "Transcription start date", + "transcriptionFinishedDate": "Transcription finished date", + "transcriptionist": "Transcriptionist", + "comment": "Comment", + "optionItem1": "OptionItem1", + "optionItem2": "OptionItem2", + "optionItem3": "OptionItem3", + "optionItem4": "OptionItem4", + "optionItem5": "OptionItem5", + "optionItem6": "OptionItem6", + "optionItem7": "OptionItem7", + "optionItem8": "OptionItem8", + "optionItem9": "OptionItem9", + "optionItem10": "OptionItem10", + "filter": "Filter", + "uploaded": "Uploaded", + "inProgress": "InProgress", + "finished": "Finished", + "pending": "Pending", + "backup": "Backup", + "playback": "Playback", + "fileProperty": "File Property", + "changeTranscriptionist": "Change Transcriptionist", + "deleteDictation": "Delete Dictation" + } + } +} \ No newline at end of file diff --git a/dictation_client/src/translation/es.json b/dictation_client/src/translation/es.json index c05bdc7..deea7f2 100644 --- a/dictation_client/src/translation/es.json +++ b/dictation_client/src/translation/es.json @@ -1,158 +1,201 @@ -{ - "common": { - "message": { - "inputEmptyError": "(es)Error Message", - "passwordIncorrectError": "(es)Error Message", - "emailIncorrectError": "(es)Error Message", - "internalServerError": "(es)処理に失敗しました。時間をおいて再実行しても解決しない場合はシステム管理者にお問い合わせください。" - }, - "label": { - "cancel": "(es)Cancel", - "headerTitle": "(es)ODMS Cloud", - "copyRight": "(es)OM Digital Solutions 2023" - } - }, - "topPage": { - "label": { - "displayLanguage": "(es)Display language", - "languageEnglish": "(es)English", - "languageGerman": "(es)German", - "languageSpanish": "(es)Spanish", - "languageFrench": "(es)French", - "alreadyHaveAccount": "(es)Already have an account?", - "signInButton": "(es)Sign in", - "newUser": "(es)New user?", - "signUpButton": "(es)Create a new account" - } - }, - "signupPage": { - "message": { - "inputEmptyError": "(es)この項目の入力は必須です。入力してください。", - "passwordIncorrectError": "(es)入力されたパスワードがルールを満たしていません。下記のルールを満たすパスワードを入力してください。", - "emailIncorrectError": "(es)メールアドレスの形式が不正です。正しいメールアドレスの形式で入力してください。" - }, - "text": { - "title": "(es)Create your account", - "pageExplanation": "(es)Explanation...", - "accountInfoTitle": "(es)Register your account information", - "countryExplanation": "(es) Please select your country or the nearest country.", - "dealerExplanation": "(es)Please select the dealer to purchase a license.", - "adminInfoTitle": "(es)Register primary administrator's information", - "passwordTerms": "(es)Please set a password or issue an initial password.\nThe password must be more than 8 or less than 64 letters,numbers and symbols." - }, - "label": { - "company": "(es)Company Name", - "country": "(es)Country", - "dealer": "(es)Dealer", - "adminName": "(es)Admin Name", - "email": "(es)Email", - "password": "(es)Password", - "termsLink": "(es)Click here to read the terms of use", - "termsLinkFor": "(es)for ODDS.", - "termsCheckBox": "(es)Yes, I agree to the terms of use.", - "createAccountButton": "(es)Create account" - } - }, - "signupConfirmPage": { - "message": { - "emailConflictError": "(es)このメールアドレスは既に登録されています。他のメールアドレスで登録してください。" - }, - "text": { - "title": "(es)Confirmation", - "pageExplanation": "(es)Explanation ......", - "accountInfoTitle": "(es)Your account information", - "adminInfoTitle": "(es)Primary administrator's information" - }, - "label": { - "company": "(es)Company Name", - "country": "(es)Country", - "dealer": "(es)Dealer (Optional)", - "adminName": "(es)Admin Name", - "email": "(es)Email", - "password": "(es)Password", - "signupButton": "(es)Sign up" - } - }, - "signupCompletePage": { - "text": { - "createdInfo": "(es)Your account has been created and a verification email has been set to your registered email address. Please click on the verification link included in the email to activate your account." - }, - "label": { - "title": "(es)Account created" - } - }, - "signupVerifyPage": { - "text": { - "verifySuccess": "(es)You have successfully verified the account.", - "faild": "(es)The verification url does not match. Please try again,\nor click on the link below to receive a new verification mail.", - "alreadySuccess": "(es)Your account has already been verified." - }, - "label": { - "verifySuccess": "(es)Verified!", - "faild": "(es)Verification failed", - "alreadySuccess": "(es)Already Verified!", - "returnToSignIn": "(es)Return to Sign in" - } - }, - "userListPage": { - "message": { - "addUserSuccess": "(es)メールアドレス宛に認証用メールを送信しました。", - "authorIdConflictError": "(es)このAuthor IDは既に登録されています。他のAuthor IDで登録してください。", - "authorIdIncorrectError": "(es)Author IDの形式が不正です。Author IDは半角英数字(大文字)と\"_\"のみ入力可能です。" - }, - "label": { - "title": "(es)User", - "addUser": "(es)Add User", - "edit": "(es)Edit", - "delete": "(es)Delete", - "licenseAllocation": "(es)License Allocation", - "name": "(es)Name", - "role": "(es)Role", - "authorID": "(es)Author ID", - "typistGroup": "(es)Typist Group", - "email": "(es)Email", - "status": "(es)Status", - "expiration": "(es)Expiration", - "remaining": "(es)Remaining", - "autoRenew": "(es)Auto renew", - "licenseAlert": "(es)License alert", - "notification": "(es)Notification", - "users": "(es)users", - "of": "(es)of", - "personal": "(es)Personal information", - "setting": "(es)Setting", - "selectGroup": "(es)Select group", - "addToGroup": "(es)Add to group (Optional)", - "author": "(es)Author", - "transcriptionist": "(es)Transcriptionist", - "none": "(es)None" - } - }, - "LicensePage": { - "label": { - "title": "(es)License", - "subTitle": "(es)EFGI Legal", - "orderLicense": "(es)Order License", - "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" - } - } -} +{ + "common": { + "message": { + "inputEmptyError": "(es)Error Message", + "passwordIncorrectError": "(es)Error Message", + "emailIncorrectError": "(es)Error Message", + "internalServerError": "(es)処理に失敗しました。時間をおいて再実行しても解決しない場合はシステム管理者にお問い合わせください。", + "listEmpty": "(es)検索結果が0件です。" + }, + "label": { + "cancel": "(es)Cancel", + "headerTitle": "(es)ODMS Cloud", + "copyRight": "(es)OM Digital Solutions 2023" + } + }, + "topPage": { + "label": { + "displayLanguage": "(es)Display language", + "languageEnglish": "(es)English", + "languageGerman": "(es)German", + "languageSpanish": "(es)Spanish", + "languageFrench": "(es)French", + "alreadyHaveAccount": "(es)Already have an account?", + "signInButton": "(es)Sign in", + "newUser": "(es)New user?", + "signUpButton": "(es)Create a new account" + } + }, + "signupPage": { + "message": { + "inputEmptyError": "(es)この項目の入力は必須です。入力してください。", + "passwordIncorrectError": "(es)入力されたパスワードがルールを満たしていません。下記のルールを満たすパスワードを入力してください。", + "emailIncorrectError": "(es)メールアドレスの形式が不正です。正しいメールアドレスの形式で入力してください。" + }, + "text": { + "title": "(es)Create your account", + "pageExplanation": "(es)Explanation...", + "accountInfoTitle": "(es)Register your account information", + "countryExplanation": "(es) Please select your country or the nearest country.", + "dealerExplanation": "(es)Please select the dealer to purchase a license.", + "adminInfoTitle": "(es)Register primary administrator's information", + "passwordTerms": "(es)Please set a password or issue an initial password.\nThe password must be more than 8 or less than 64 letters,numbers and symbols." + }, + "label": { + "company": "(es)Company Name", + "country": "(es)Country", + "dealer": "(es)Dealer", + "adminName": "(es)Admin Name", + "email": "(es)Email", + "password": "(es)Password", + "termsLink": "(es)Click here to read the terms of use", + "termsLinkFor": "(es)for ODDS.", + "termsCheckBox": "(es)Yes, I agree to the terms of use.", + "createAccountButton": "(es)Create account" + } + }, + "signupConfirmPage": { + "message": { + "emailConflictError": "(es)このメールアドレスは既に登録されています。他のメールアドレスで登録してください。" + }, + "text": { + "title": "(es)Confirmation", + "pageExplanation": "(es)Explanation ......", + "accountInfoTitle": "(es)Your account information", + "adminInfoTitle": "(es)Primary administrator's information" + }, + "label": { + "company": "(es)Company Name", + "country": "(es)Country", + "dealer": "(es)Dealer (Optional)", + "adminName": "(es)Admin Name", + "email": "(es)Email", + "password": "(es)Password", + "signupButton": "(es)Sign up" + } + }, + "signupCompletePage": { + "text": { + "createdInfo": "(es)Your account has been created and a verification email has been set to your registered email address. Please click on the verification link included in the email to activate your account." + }, + "label": { + "title": "(es)Account created" + } + }, + "signupVerifyPage": { + "text": { + "verifySuccess": "(es)You have successfully verified the account.", + "faild": "(es)The verification url does not match. Please try again,\nor click on the link below to receive a new verification mail.", + "alreadySuccess": "(es)Your account has already been verified." + }, + "label": { + "verifySuccess": "(es)Verified!", + "faild": "(es)Verification failed", + "alreadySuccess": "(es)Already Verified!", + "returnToSignIn": "(es)Return to Sign in" + } + }, + "userListPage": { + "message": { + "addUserSuccess": "(es)メールアドレス宛に認証用メールを送信しました。", + "authorIdConflictError": "(es)このAuthor IDは既に登録されています。他のAuthor IDで登録してください。", + "authorIdIncorrectError": "(es)Author IDの形式が不正です。Author IDは半角英数字(大文字)と\"_\"のみ入力可能です。" + }, + "label": { + "title": "(es)User", + "addUser": "(es)Add User", + "edit": "(es)Edit", + "delete": "(es)Delete", + "licenseAllocation": "(es)License Allocation", + "name": "(es)Name", + "role": "(es)Role", + "authorID": "(es)Author ID", + "typistGroup": "(es)Typist Group", + "email": "(es)Email", + "status": "(es)Status", + "expiration": "(es)Expiration", + "remaining": "(es)Remaining", + "autoRenew": "(es)Auto renew", + "licenseAlert": "(es)License alert", + "notification": "(es)Notification", + "users": "(es)users", + "of": "(es)of", + "personal": "(es)Personal information", + "setting": "(es)Setting", + "selectGroup": "(es)Select group", + "addToGroup": "(es)Add to group (Optional)", + "author": "(es)Author", + "transcriptionist": "(es)Transcriptionist", + "none": "(es)None" + } + }, + "LicensePage": { + "label": { + "title": "(es)License", + "subTitle": "(es)EFGI Legal", + "orderLicense": "(es)Order License", + "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" + } + }, + "dictationPage": { + "label": { + "title": "(es)Dictations", + "displayInfomation": "(es)Display Information", + "jobNumber": "(es)Job Number", + "status": "(es)Status", + "priority": "(es)Priority", + "encryption": "(es)Encryption", + "authorId": "(es)Author ID", + "workType": "(es)WorkType", + "fileName": "(es)File Name", + "fileLength": "(es)File Length", + "fileSize": "(es)File size", + "recordingStartedDate": "(es)Recording started date", + "recordingFinishedDate": "(es)Recording finished date", + "uploadDate": "(es)Upload date", + "transcriptionStartedDate": "(es)Transcription start date", + "transcriptionFinishedDate": "(es)Transcription finished date", + "transcriptionist": "(es)Transcriptionist", + "comment": "(es)Comment", + "optionItem1": "(es)OptionItem1", + "optionItem2": "(es)OptionItem2", + "optionItem3": "(es)OptionItem3", + "optionItem4": "(es)OptionItem4", + "optionItem5": "(es)OptionItem5", + "optionItem6": "(es)OptionItem6", + "optionItem7": "(es)OptionItem7", + "optionItem8": "(es)OptionItem8", + "optionItem9": "(es)OptionItem9", + "optionItem10": "(es)OptionItem10", + "filter": "(es)Filter", + "uploaded": "(es)Uploaded", + "inProgress": "(es)InProgress", + "finished": "(es)Finished", + "pending": "(es)Pending", + "backup": "(es)Backup", + "playback": "(es)Playback", + "fileProperty": "(es)File Property", + "changeTranscriptionist": "(es)Change Transcriptionist", + "deleteDictation": "(es)Delete Dictation" + } + } +} \ No newline at end of file diff --git a/dictation_client/src/translation/fr.json b/dictation_client/src/translation/fr.json index d88f8f0..e915ab6 100644 --- a/dictation_client/src/translation/fr.json +++ b/dictation_client/src/translation/fr.json @@ -1,158 +1,201 @@ -{ - "common": { - "message": { - "inputEmptyError": "(fr)Error Message", - "passwordIncorrectError": "(fr)Error Message", - "emailIncorrectError": "(fr)Error Message", - "internalServerError": "(fr)処理に失敗しました。時間をおいて再実行しても解決しない場合はシステム管理者にお問い合わせください。" - }, - "label": { - "cancel": "(fr)Cancel", - "headerTitle": "(fr)ODMS Cloud", - "copyRight": "(fr)OM Digital Solutions 2023" - } - }, - "topPage": { - "label": { - "displayLanguage": "(fr)Display language", - "languageEnglish": "(fr)English", - "languageGerman": "(fr)German", - "languageSpanish": "(fr)Spanish", - "languageFrench": "(fr)French", - "alreadyHaveAccount": "(fr)Already have an account?", - "signInButton": "(fr)Sign in", - "newUser": "(fr)New user?", - "signUpButton": "(fr)Create a new account" - } - }, - "signupPage": { - "message": { - "inputEmptyError": "(fr)この項目の入力は必須です。入力してください。", - "passwordIncorrectError": "(fr)入力されたパスワードがルールを満たしていません。下記のルールを満たすパスワードを入力してください。", - "emailIncorrectError": "(fr)メールアドレスの形式が不正です。正しいメールアドレスの形式で入力してください。" - }, - "text": { - "title": "(fr)Create your account", - "pageExplanation": "(fr)Explanation...", - "accountInfoTitle": "(fr)Register your account information", - "countryExplanation": "(fr) Please select your country or the nearest country.", - "dealerExplanation": "(fr)Please select the dealer to purchase a license.", - "adminInfoTitle": "(fr)Register primary administrator's information", - "passwordTerms": "(fr)Please set a password or issue an initial password.\nThe password must be more than 8 or less than 64 letters,numbers and symbols." - }, - "label": { - "company": "(fr)Company Name", - "country": "(fr)Country", - "dealer": "(fr)Dealer", - "adminName": "(fr)Admin Name", - "email": "(fr)Email", - "password": "(fr)Password", - "termsLink": "(fr)Click here to read the terms of use", - "termsLinkFor": "(fr)for ODDS.", - "termsCheckBox": "(fr)Yes, I agree to the terms of use.", - "createAccountButton": "(fr)Create account" - } - }, - "signupConfirmPage": { - "message": { - "emailConflictError": "(fr)このメールアドレスは既に登録されています。他のメールアドレスで登録してください。" - }, - "text": { - "title": "(fr)Confirmation", - "pageExplanation": "(fr)Explanation ......", - "accountInfoTitle": "(fr)Your account information", - "adminInfoTitle": "(fr)Primary administrator's information" - }, - "label": { - "company": "(fr)Company Name", - "country": "(fr)Country", - "dealer": "(fr)Dealer (Optional)", - "adminName": "(fr)Admin Name", - "email": "(fr)Email", - "password": "(fr)Password", - "signupButton": "(fr)Sign up" - } - }, - "signupCompletePage": { - "text": { - "createdInfo": "(fr)Your account has been created and a verification email has been set to your registered email address. Please click on the verification link included in the email to activate your account." - }, - "label": { - "title": "(fr)Account created" - } - }, - "signupVerifyPage": { - "text": { - "verifySuccess": "(fr)You have successfully verified the account.", - "faild": "(fr)The verification url does not match. Please try again,\nor click on the link below to receive a new verification mail.", - "alreadySuccess": "(fr)Your account has already been verified." - }, - "label": { - "verifySuccess": "(fr)Verified!", - "faild": "(fr)Verification failed", - "alreadySuccess": "(fr)Already Verified!", - "returnToSignIn": "(fr)Return to Sign in" - } - }, - "userListPage": { - "message": { - "addUserSuccess": "(fr)メールアドレス宛に認証用メールを送信しました。", - "authorIdConflictError": "(fr)このAuthor IDは既に登録されています。他のAuthor IDで登録してください。", - "authorIdIncorrectError": "(fr)Author IDの形式が不正です。Author IDは半角英数字(大文字)と\"_\"のみ入力可能です。" - }, - "label": { - "title": "(fr)User", - "addUser": "(fr)Add User", - "edit": "(fr)Edit", - "delete": "(fr)Delete", - "licenseAllocation": "(fr)License Allocation", - "name": "(fr)Name", - "role": "(fr)Role", - "authorID": "(fr)Author ID", - "typistGroup": "(fr)Typist Group", - "email": "(fr)Email", - "status": "(fr)Status", - "expiration": "(fr)Expiration", - "remaining": "(fr)Remaining", - "autoRenew": "(fr)Auto renew", - "licenseAlert": "(fr)License alert", - "notification": "(fr)Notification", - "users": "(fr)users", - "of": "(fr)of", - "personal": "(fr)Personal information", - "setting": "(fr)Setting", - "selectGroup": "(fr)Select group", - "addToGroup": "(fr)Add to group (Optional)", - "author": "(fr)Author", - "transcriptionist": "(fr)Transcriptionist", - "none": "(fr)None" - } - }, - "LicensePage": { - "label": { - "title": "(fr)License", - "subTitle": "(fr)EFGI Legal", - "orderLicense": "(fr)Order License", - "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" - } - } -} +{ + "common": { + "message": { + "inputEmptyError": "(fr)Error Message", + "passwordIncorrectError": "(fr)Error Message", + "emailIncorrectError": "(fr)Error Message", + "internalServerError": "(fr)処理に失敗しました。時間をおいて再実行しても解決しない場合はシステム管理者にお問い合わせください。", + "listEmpty": "(fr)検索結果が0件です。" + }, + "label": { + "cancel": "(fr)Cancel", + "headerTitle": "(fr)ODMS Cloud", + "copyRight": "(fr)OM Digital Solutions 2023" + } + }, + "topPage": { + "label": { + "displayLanguage": "(fr)Display language", + "languageEnglish": "(fr)English", + "languageGerman": "(fr)German", + "languageSpanish": "(fr)Spanish", + "languageFrench": "(fr)French", + "alreadyHaveAccount": "(fr)Already have an account?", + "signInButton": "(fr)Sign in", + "newUser": "(fr)New user?", + "signUpButton": "(fr)Create a new account" + } + }, + "signupPage": { + "message": { + "inputEmptyError": "(fr)この項目の入力は必須です。入力してください。", + "passwordIncorrectError": "(fr)入力されたパスワードがルールを満たしていません。下記のルールを満たすパスワードを入力してください。", + "emailIncorrectError": "(fr)メールアドレスの形式が不正です。正しいメールアドレスの形式で入力してください。" + }, + "text": { + "title": "(fr)Create your account", + "pageExplanation": "(fr)Explanation...", + "accountInfoTitle": "(fr)Register your account information", + "countryExplanation": "(fr) Please select your country or the nearest country.", + "dealerExplanation": "(fr)Please select the dealer to purchase a license.", + "adminInfoTitle": "(fr)Register primary administrator's information", + "passwordTerms": "(fr)Please set a password or issue an initial password.\nThe password must be more than 8 or less than 64 letters,numbers and symbols." + }, + "label": { + "company": "(fr)Company Name", + "country": "(fr)Country", + "dealer": "(fr)Dealer", + "adminName": "(fr)Admin Name", + "email": "(fr)Email", + "password": "(fr)Password", + "termsLink": "(fr)Click here to read the terms of use", + "termsLinkFor": "(fr)for ODDS.", + "termsCheckBox": "(fr)Yes, I agree to the terms of use.", + "createAccountButton": "(fr)Create account" + } + }, + "signupConfirmPage": { + "message": { + "emailConflictError": "(fr)このメールアドレスは既に登録されています。他のメールアドレスで登録してください。" + }, + "text": { + "title": "(fr)Confirmation", + "pageExplanation": "(fr)Explanation ......", + "accountInfoTitle": "(fr)Your account information", + "adminInfoTitle": "(fr)Primary administrator's information" + }, + "label": { + "company": "(fr)Company Name", + "country": "(fr)Country", + "dealer": "(fr)Dealer (Optional)", + "adminName": "(fr)Admin Name", + "email": "(fr)Email", + "password": "(fr)Password", + "signupButton": "(fr)Sign up" + } + }, + "signupCompletePage": { + "text": { + "createdInfo": "(fr)Your account has been created and a verification email has been set to your registered email address. Please click on the verification link included in the email to activate your account." + }, + "label": { + "title": "(fr)Account created" + } + }, + "signupVerifyPage": { + "text": { + "verifySuccess": "(fr)You have successfully verified the account.", + "faild": "(fr)The verification url does not match. Please try again,\nor click on the link below to receive a new verification mail.", + "alreadySuccess": "(fr)Your account has already been verified." + }, + "label": { + "verifySuccess": "(fr)Verified!", + "faild": "(fr)Verification failed", + "alreadySuccess": "(fr)Already Verified!", + "returnToSignIn": "(fr)Return to Sign in" + } + }, + "userListPage": { + "message": { + "addUserSuccess": "(fr)メールアドレス宛に認証用メールを送信しました。", + "authorIdConflictError": "(fr)このAuthor IDは既に登録されています。他のAuthor IDで登録してください。", + "authorIdIncorrectError": "(fr)Author IDの形式が不正です。Author IDは半角英数字(大文字)と\"_\"のみ入力可能です。" + }, + "label": { + "title": "(fr)User", + "addUser": "(fr)Add User", + "edit": "(fr)Edit", + "delete": "(fr)Delete", + "licenseAllocation": "(fr)License Allocation", + "name": "(fr)Name", + "role": "(fr)Role", + "authorID": "(fr)Author ID", + "typistGroup": "(fr)Typist Group", + "email": "(fr)Email", + "status": "(fr)Status", + "expiration": "(fr)Expiration", + "remaining": "(fr)Remaining", + "autoRenew": "(fr)Auto renew", + "licenseAlert": "(fr)License alert", + "notification": "(fr)Notification", + "users": "(fr)users", + "of": "(fr)of", + "personal": "(fr)Personal information", + "setting": "(fr)Setting", + "selectGroup": "(fr)Select group", + "addToGroup": "(fr)Add to group (Optional)", + "author": "(fr)Author", + "transcriptionist": "(fr)Transcriptionist", + "none": "(fr)None" + } + }, + "LicensePage": { + "label": { + "title": "(fr)License", + "subTitle": "(fr)EFGI Legal", + "orderLicense": "(fr)Order License", + "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" + } + }, + "dictationPage": { + "label": { + "title": "(fr)Dictations", + "displayInfomation": "(fr)Display Information", + "jobNumber": "(fr)Job Number", + "status": "(fr)Status", + "priority": "(fr)Priority", + "encryption": "(fr)Encryption", + "authorId": "(fr)Author ID", + "workType": "(fr)WorkType", + "fileName": "(fr)File Name", + "fileLength": "(fr)File Length", + "fileSize": "(fr)File size", + "recordingStartedDate": "(fr)Recording started date", + "recordingFinishedDate": "(fr)Recording finished date", + "uploadDate": "(fr)Upload date", + "transcriptionStartedDate": "(fr)Transcription start date", + "transcriptionFinishedDate": "(fr)Transcription finished date", + "transcriptionist": "(fr)Transcriptionist", + "comment": "(fr)Comment", + "optionItem1": "(fr)OptionItem1", + "optionItem2": "(fr)OptionItem2", + "optionItem3": "(fr)OptionItem3", + "optionItem4": "(fr)OptionItem4", + "optionItem5": "(fr)OptionItem5", + "optionItem6": "(fr)OptionItem6", + "optionItem7": "(fr)OptionItem7", + "optionItem8": "(fr)OptionItem8", + "optionItem9": "(fr)OptionItem9", + "optionItem10": "(fr)OptionItem10", + "filter": "(fr)Filter", + "uploaded": "(fr)Uploaded", + "inProgress": "(fr)InProgress", + "finished": "(fr)Finished", + "pending": "(fr)Pending", + "backup": "(fr)Backup", + "playback": "(fr)Playback", + "fileProperty": "(fr)File Property", + "changeTranscriptionist": "(fr)Change Transcriptionist", + "deleteDictation": "(fr)Delete Dictation" + } + } +} \ No newline at end of file diff --git a/dictation_server/src/api/odms/openapi.json b/dictation_server/src/api/odms/openapi.json index 33e5620..96d5315 100644 --- a/dictation_server/src/api/odms/openapi.json +++ b/dictation_server/src/api/odms/openapi.json @@ -6,7 +6,11 @@ "operationId": "checkHealth", "summary": "", "parameters": [], - "responses": { "200": { "description": "" } } + "responses": { + "200": { + "description": "" + } + } } }, "/auth/token": { @@ -19,7 +23,9 @@ "required": true, "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/TokenRequest" } + "schema": { + "$ref": "#/components/schemas/TokenRequest" + } } } }, @@ -28,7 +34,9 @@ "description": "成功時のレスポンス", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/TokenResponse" } + "schema": { + "$ref": "#/components/schemas/TokenResponse" + } } } }, @@ -36,7 +44,9 @@ "description": "認証エラー", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, @@ -44,7 +54,9 @@ "description": "想定外のサーバーエラー", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } } @@ -63,7 +75,9 @@ "description": "成功時のレスポンス", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/AccessTokenResponse" } + "schema": { + "$ref": "#/components/schemas/AccessTokenResponse" + } } } }, @@ -71,7 +85,9 @@ "description": "認証エラー", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, @@ -79,13 +95,19 @@ "description": "想定外のサーバーエラー", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } } }, "tags": ["auth"], - "security": [{ "bearer": [] }] + "security": [ + { + "bearer": [] + } + ] } }, "/accounts": { @@ -97,7 +119,9 @@ "required": true, "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/CreateAccountRequest" } + "schema": { + "$ref": "#/components/schemas/CreateAccountRequest" + } } } }, @@ -116,7 +140,9 @@ "description": "登録済みユーザーからの登録など", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, @@ -124,7 +150,9 @@ "description": "想定外のサーバーエラー", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } } @@ -163,7 +191,9 @@ "description": "認証エラー", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, @@ -171,13 +201,19 @@ "description": "想定外のサーバーエラー", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } } }, "tags": ["accounts"], - "security": [{ "bearer": [] }] + "security": [ + { + "bearer": [] + } + ] } }, "/users/confirm": { @@ -189,7 +225,9 @@ "required": true, "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ConfirmRequest" } + "schema": { + "$ref": "#/components/schemas/ConfirmRequest" + } } } }, @@ -198,7 +236,9 @@ "description": "成功時のレスポンス", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ConfirmResponse" } + "schema": { + "$ref": "#/components/schemas/ConfirmResponse" + } } } }, @@ -206,7 +246,9 @@ "description": "不正なトークン", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, @@ -214,7 +256,9 @@ "description": "想定外のサーバーエラー", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } } @@ -231,7 +275,9 @@ "required": true, "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ConfirmRequest" } + "schema": { + "$ref": "#/components/schemas/ConfirmRequest" + } } } }, @@ -240,7 +286,9 @@ "description": "成功時のレスポンス", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ConfirmResponse" } + "schema": { + "$ref": "#/components/schemas/ConfirmResponse" + } } } }, @@ -248,7 +296,9 @@ "description": "不正なトークン", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, @@ -256,7 +306,9 @@ "description": "想定外のサーバーエラー", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } } @@ -274,7 +326,9 @@ "description": "成功時のレスポンス", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/GetUsersResponse" } + "schema": { + "$ref": "#/components/schemas/GetUsersResponse" + } } } }, @@ -282,7 +336,9 @@ "description": "認証エラー", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, @@ -290,13 +346,19 @@ "description": "想定外のサーバーエラー", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } } }, "tags": ["users"], - "security": [{ "bearer": [] }] + "security": [ + { + "bearer": [] + } + ] } }, "/users/signup": { @@ -308,7 +370,9 @@ "required": true, "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/SignupRequest" } + "schema": { + "$ref": "#/components/schemas/SignupRequest" + } } } }, @@ -317,7 +381,9 @@ "description": "成功時のレスポンス", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/SignupResponse" } + "schema": { + "$ref": "#/components/schemas/SignupResponse" + } } } }, @@ -325,7 +391,9 @@ "description": "登録済みメールによる再登録、AuthorIDの重複など", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, @@ -333,7 +401,9 @@ "description": "認証エラー", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, @@ -341,13 +411,19 @@ "description": "想定外のサーバーエラー", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } } }, "tags": ["users"], - "security": [{ "bearer": [] }] + "security": [ + { + "bearer": [] + } + ] } }, "/users/relations": { @@ -371,7 +447,9 @@ "description": "認証エラー", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, @@ -379,13 +457,19 @@ "description": "想定外のサーバーエラー", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } } }, "tags": ["users"], - "security": [{ "bearer": [] }] + "security": [ + { + "bearer": [] + } + ] } }, "/users/sort-criteria": { @@ -419,7 +503,9 @@ "description": "不正なパラメータ", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, @@ -427,7 +513,9 @@ "description": "認証エラー", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, @@ -435,13 +523,19 @@ "description": "想定外のサーバーエラー", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } } }, "tags": ["users"], - "security": [{ "bearer": [] }] + "security": [ + { + "bearer": [] + } + ] }, "get": { "operationId": "getSortCcriteria", @@ -454,7 +548,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/PostSortCriteriaResponse" + "$ref": "#/components/schemas/GetSortCriteriaResponse" } } } @@ -463,7 +557,9 @@ "description": "認証エラー", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, @@ -471,13 +567,19 @@ "description": "想定外のサーバーエラー", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } } }, "tags": ["users"], - "security": [{ "bearer": [] }] + "security": [ + { + "bearer": [] + } + ] } }, "/files/audio/upload-finished": { @@ -490,7 +592,9 @@ "name": "authorization", "required": true, "in": "header", - "schema": { "type": "string" } + "schema": { + "type": "string" + } } ], "requestBody": { @@ -518,7 +622,9 @@ "description": "不正なパラメータ", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, @@ -526,7 +632,9 @@ "description": "認証エラー", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, @@ -534,13 +642,19 @@ "description": "想定外のサーバーエラー", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } } }, "tags": ["files"], - "security": [{ "bearer": [] }] + "security": [ + { + "bearer": [] + } + ] } }, "/files/audio/upload-location": { @@ -553,7 +667,9 @@ "name": "authorization", "required": true, "in": "header", - "schema": { "type": "string" } + "schema": { + "type": "string" + } } ], "responses": { @@ -571,7 +687,9 @@ "description": "認証エラー", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, @@ -579,13 +697,19 @@ "description": "想定外のサーバーエラー", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } } }, "tags": ["files"], - "security": [{ "bearer": [] }] + "security": [ + { + "bearer": [] + } + ] } }, "/files/audio/download-location": { @@ -599,7 +723,9 @@ "required": true, "in": "query", "description": "ODMSCloud上で管理する音声ファイルのID", - "schema": { "type": "number" } + "schema": { + "type": "number" + } } ], "responses": { @@ -617,7 +743,9 @@ "description": "不正なパラメータ", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, @@ -625,7 +753,9 @@ "description": "認証エラー", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, @@ -633,13 +763,19 @@ "description": "想定外のサーバーエラー", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } } }, "tags": ["files"], - "security": [{ "bearer": [] }] + "security": [ + { + "bearer": [] + } + ] } }, "/files/template/download-location": { @@ -653,7 +789,9 @@ "required": true, "in": "query", "description": "文字起こし対象の音声ファイルID", - "schema": { "type": "number" } + "schema": { + "type": "number" + } } ], "responses": { @@ -671,7 +809,9 @@ "description": "不正なパラメータ", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, @@ -679,7 +819,9 @@ "description": "認証エラー", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, @@ -687,13 +829,19 @@ "description": "想定外のサーバーエラー", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } } }, "tags": ["files"], - "security": [{ "bearer": [] }] + "security": [ + { + "bearer": [] + } + ] } }, "/tasks": { @@ -707,14 +855,20 @@ "required": false, "in": "query", "description": "タスクの取得件数(指定しない場合はデフォルト値)", - "schema": { "default": 200, "type": "number" } + "schema": { + "default": 200, + "type": "number" + } }, { "name": "offset", "required": false, "in": "query", "description": "オフセット(何件目から取得するか 設定しない場合はデフォルト値)", - "schema": { "default": 0, "type": "number" } + "schema": { + "default": 0, + "type": "number" + } }, { "name": "status", @@ -722,21 +876,27 @@ "in": "query", "description": "取得対象とするタスクのステータス。カンマ(,)区切りで複数指定可能。設定されない場合はすべてのステータスを取得対象とする。許容するステータスの値は次の通り: Uploaded / Pending / InProgress / Finished / Backup", "example": "Uploaded,Pending,InProgress", - "schema": { "type": "string" } + "schema": { + "type": "string" + } }, { "name": "direction", "required": false, "in": "query", "description": "ASC/DESC", - "schema": { "type": "string" } + "schema": { + "type": "string" + } }, { "name": "paramName", "required": false, "in": "query", "description": "JOB_NUMBER/STATUS/ENCRYPTION/AUTHOR_ID/FILE_NAME/FILE_LENGTH/FILE_SIZE/RECORDING_STARTED_DATE/RECORDING_FINISHED_DATE/UPLOAD_DATE/TRANSCRIPTION_STARTED_DATE/TRANSCRIPTION_FINISHED_DATE", - "schema": { "type": "string" } + "schema": { + "type": "string" + } } ], "responses": { @@ -744,7 +904,9 @@ "description": "成功時のレスポンス", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/TasksResponse" } + "schema": { + "$ref": "#/components/schemas/TasksResponse" + } } } }, @@ -752,7 +914,9 @@ "description": "不正なパラメータ", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, @@ -760,7 +924,9 @@ "description": "認証エラー", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, @@ -768,13 +934,19 @@ "description": "想定外のサーバーエラー", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } } }, "tags": ["tasks"], - "security": [{ "bearer": [] }] + "security": [ + { + "bearer": [] + } + ] } }, "/tasks/next": { @@ -788,7 +960,9 @@ "required": true, "in": "query", "description": "文字起こし完了したタスクの音声ファイルID", - "schema": { "type": "number" } + "schema": { + "type": "number" + } } ], "responses": { @@ -796,7 +970,9 @@ "description": "成功時のレスポンス", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/AudioNextResponse" } + "schema": { + "$ref": "#/components/schemas/AudioNextResponse" + } } } }, @@ -804,7 +980,9 @@ "description": "不正なパラメータ", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, @@ -812,7 +990,9 @@ "description": "認証エラー", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, @@ -820,13 +1000,19 @@ "description": "想定外のサーバーエラー", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } } }, "tags": ["tasks"], - "security": [{ "bearer": [] }] + "security": [ + { + "bearer": [] + } + ] } }, "/tasks/{audioFileId}/checkout": { @@ -840,7 +1026,9 @@ "required": true, "in": "path", "description": "ODMS Cloud上の音声ファイルID", - "schema": { "type": "number" } + "schema": { + "type": "number" + } } ], "responses": { @@ -858,7 +1046,9 @@ "description": "不正なパラメータ", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, @@ -866,7 +1056,9 @@ "description": "認証エラー", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, @@ -874,7 +1066,9 @@ "description": "指定したIDの音声ファイルが存在しない場合", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, @@ -882,13 +1076,19 @@ "description": "想定外のサーバーエラー", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } } }, "tags": ["tasks"], - "security": [{ "bearer": [] }] + "security": [ + { + "bearer": [] + } + ] } }, "/tasks/{audioFileId}/checkin": { @@ -902,7 +1102,9 @@ "required": true, "in": "path", "description": "ODMS Cloud上の音声ファイルID", - "schema": { "type": "number" } + "schema": { + "type": "number" + } } ], "responses": { @@ -920,7 +1122,9 @@ "description": "不正なパラメータ", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, @@ -928,7 +1132,9 @@ "description": "認証エラー", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, @@ -936,7 +1142,9 @@ "description": "指定したIDの音声ファイルが存在しない場合", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, @@ -944,13 +1152,19 @@ "description": "想定外のサーバーエラー", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } } }, "tags": ["tasks"], - "security": [{ "bearer": [] }] + "security": [ + { + "bearer": [] + } + ] } }, "/tasks/{audioFileId}/cancel": { @@ -964,7 +1178,9 @@ "required": true, "in": "path", "description": "ODMS Cloud上の音声ファイルID", - "schema": { "type": "number" } + "schema": { + "type": "number" + } } ], "responses": { @@ -982,7 +1198,9 @@ "description": "不正なパラメータ", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, @@ -990,7 +1208,9 @@ "description": "認証エラー", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, @@ -998,7 +1218,9 @@ "description": "指定したIDの音声ファイルが存在しない場合", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, @@ -1006,13 +1228,19 @@ "description": "想定外のサーバーエラー", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } } }, "tags": ["tasks"], - "security": [{ "bearer": [] }] + "security": [ + { + "bearer": [] + } + ] } }, "/tasks/{audioFileId}/suspend": { @@ -1026,7 +1254,9 @@ "required": true, "in": "path", "description": "ODMS Cloud上の音声ファイルID", - "schema": { "type": "number" } + "schema": { + "type": "number" + } } ], "responses": { @@ -1044,7 +1274,9 @@ "description": "不正なパラメータ", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, @@ -1052,7 +1284,9 @@ "description": "認証エラー", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, @@ -1060,7 +1294,9 @@ "description": "指定したIDの音声ファイルが存在しない場合", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, @@ -1068,13 +1304,19 @@ "description": "想定外のサーバーエラー", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } } }, "tags": ["tasks"], - "security": [{ "bearer": [] }] + "security": [ + { + "bearer": [] + } + ] } }, "/tasks/{audioFileId}/send-back": { @@ -1088,7 +1330,9 @@ "required": true, "in": "path", "description": "ODMS Cloud上の音声ファイルID", - "schema": { "type": "number" } + "schema": { + "type": "number" + } } ], "responses": { @@ -1106,7 +1350,9 @@ "description": "不正なパラメータ", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, @@ -1114,7 +1360,9 @@ "description": "認証エラー", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, @@ -1122,7 +1370,9 @@ "description": "指定したIDの音声ファイルが存在しない場合", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, @@ -1130,13 +1380,19 @@ "description": "想定外のサーバーエラー", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } } }, "tags": ["tasks"], - "security": [{ "bearer": [] }] + "security": [ + { + "bearer": [] + } + ] } }, "/tasks/{audioFileId}/backup": { @@ -1150,7 +1406,9 @@ "required": true, "in": "path", "description": "ODMS Cloud上の音声ファイルID", - "schema": { "type": "number" } + "schema": { + "type": "number" + } } ], "responses": { @@ -1168,7 +1426,9 @@ "description": "不正なパラメータ", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, @@ -1176,7 +1436,9 @@ "description": "認証エラー", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, @@ -1184,7 +1446,9 @@ "description": "指定したIDの音声ファイルが存在しない場合", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, @@ -1192,13 +1456,19 @@ "description": "想定外のサーバーエラー", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } } }, "tags": ["tasks"], - "security": [{ "bearer": [] }] + "security": [ + { + "bearer": [] + } + ] } }, "/licenses/orders": { @@ -1210,7 +1480,9 @@ "required": true, "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/CreateOrdersRequest" } + "schema": { + "$ref": "#/components/schemas/CreateOrdersRequest" + } } } }, @@ -1229,7 +1501,9 @@ "description": "同一PONumberの注文がすでに存在する場合など", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, @@ -1237,7 +1511,9 @@ "description": "認証エラー", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, @@ -1245,13 +1521,19 @@ "description": "想定外のサーバーエラー", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } } }, "tags": ["licenses"], - "security": [{ "bearer": [] }] + "security": [ + { + "bearer": [] + } + ] } }, "/notification/register": { @@ -1263,7 +1545,9 @@ "required": true, "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/RegisterRequest" } + "schema": { + "$ref": "#/components/schemas/RegisterRequest" + } } } }, @@ -1272,7 +1556,9 @@ "description": "成功時のレスポンス", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/RegisterResponse" } + "schema": { + "$ref": "#/components/schemas/RegisterResponse" + } } } }, @@ -1280,7 +1566,9 @@ "description": "不正なパラメータ", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, @@ -1288,7 +1576,9 @@ "description": "認証エラー", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, @@ -1296,13 +1586,19 @@ "description": "想定外のサーバーエラー", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/ErrorResponse" } + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } } }, "tags": ["notification"], - "security": [{ "bearer": [] }] + "security": [ + { + "bearer": [] + } + ] } } }, @@ -1316,13 +1612,19 @@ "servers": [], "components": { "securitySchemes": { - "bearer": { "scheme": "bearer", "bearerFormat": "JWT", "type": "http" } + "bearer": { + "scheme": "bearer", + "bearerFormat": "JWT", + "type": "http" + } }, "schemas": { "TokenRequest": { "type": "object", "properties": { - "idToken": { "type": "string" }, + "idToken": { + "type": "string" + }, "type": { "type": "string", "description": "web or mobile or desktop" @@ -1333,43 +1635,69 @@ "TokenResponse": { "type": "object", "properties": { - "refreshToken": { "type": "string" }, - "accessToken": { "type": "string" } + "refreshToken": { + "type": "string" + }, + "accessToken": { + "type": "string" + } }, "required": ["refreshToken", "accessToken"] }, "ErrorResponse": { "type": "object", "properties": { - "message": { "type": "string" }, - "code": { "type": "string" } + "message": { + "type": "string" + }, + "code": { + "type": "string" + } }, "required": ["message", "code"] }, "AccessTokenResponse": { "type": "object", - "properties": { "accessToken": { "type": "string" } }, + "properties": { + "accessToken": { + "type": "string" + } + }, "required": ["accessToken"] }, "CreateAccountRequest": { "type": "object", "properties": { - "companyName": { "type": "string" }, + "companyName": { + "type": "string" + }, "country": { "type": "string", "description": "国名(ISO 3166-1 alpha-2)", "minLength": 2, "maxLength": 2 }, - "dealerAccountId": { "type": "number", "nullable": true }, - "adminName": { "type": "string" }, - "adminMail": { "type": "string" }, - "adminPassword": { "type": "string" }, + "dealerAccountId": { + "type": "number", + "nullable": true + }, + "adminName": { + "type": "string" + }, + "adminMail": { + "type": "string" + }, + "adminPassword": { + "type": "string" + }, "acceptedTermsVersion": { "type": "string", "description": "同意済み利用規約のバージョン" }, - "token": { "type": "string", "description": "reCAPTCHA Token" } + "token": { + "type": "string", + "description": "reCAPTCHA Token" + } }, "required": [ "companyName", @@ -1382,26 +1710,55 @@ "token" ] }, - "CreateAccountResponse": { "type": "object", "properties": {} }, + "CreateAccountResponse": { + "type": "object", + "properties": {} + }, "GetLicenseSummaryRequest": { "type": "object", - "properties": { "accountId": { "type": "number" } }, + "properties": { + "accountId": { + "type": "number" + } + }, "required": ["accountId"] }, "LicenseSummaryInfo": { "type": "object", "properties": { - "totalLicense": { "type": "number" }, - "allocatedLicense": { "type": "number" }, - "reusableLicense": { "type": "number" }, - "freeLicense": { "type": "number" }, - "expiringWithin14daysLicense": { "type": "number" }, - "issueRequesting": { "type": "number" }, - "numberOfRequesting": { "type": "number" }, - "shortage": { "type": "number" }, - "storageSize": { "type": "number" }, - "usedSize": { "type": "number" }, - "isAccountLock": { "type": "boolean" } + "totalLicense": { + "type": "number" + }, + "allocatedLicense": { + "type": "number" + }, + "reusableLicense": { + "type": "number" + }, + "freeLicense": { + "type": "number" + }, + "expiringWithin14daysLicense": { + "type": "number" + }, + "issueRequesting": { + "type": "number" + }, + "numberOfRequesting": { + "type": "number" + }, + "shortage": { + "type": "number" + }, + "storageSize": { + "type": "number" + }, + "usedSize": { + "type": "number" + }, + "isAccountLock": { + "type": "boolean" + } }, "required": [ "totalLicense", @@ -1428,22 +1785,50 @@ }, "ConfirmRequest": { "type": "object", - "properties": { "token": { "type": "string" } }, + "properties": { + "token": { + "type": "string" + } + }, "required": ["token"] }, - "ConfirmResponse": { "type": "object", "properties": {} }, + "ConfirmResponse": { + "type": "object", + "properties": {} + }, "User": { "type": "object", "properties": { - "name": { "type": "string" }, - "role": { "type": "string", "description": "none/author/typist" }, - "authorId": { "type": "string", "nullable": true }, - "typistGroupName": { "type": "string", "nullable": true }, - "email": { "type": "string" }, - "emailVerified": { "type": "boolean" }, - "autoRenew": { "type": "boolean" }, - "licenseAlert": { "type": "boolean" }, - "notification": { "type": "boolean" } + "name": { + "type": "string" + }, + "role": { + "type": "string", + "description": "none/author/typist" + }, + "authorId": { + "type": "string", + "nullable": true + }, + "typistGroupName": { + "type": "string", + "nullable": true + }, + "email": { + "type": "string" + }, + "emailVerified": { + "type": "boolean" + }, + "autoRenew": { + "type": "boolean" + }, + "licenseAlert": { + "type": "boolean" + }, + "notification": { + "type": "boolean" + } }, "required": [ "name", @@ -1462,7 +1847,9 @@ "properties": { "users": { "type": "array", - "items": { "$ref": "#/components/schemas/User" } + "items": { + "$ref": "#/components/schemas/User" + } } }, "required": ["users"] @@ -1470,14 +1857,31 @@ "SignupRequest": { "type": "object", "properties": { - "name": { "type": "string" }, - "role": { "type": "string", "description": "none/author/typist" }, - "authorId": { "type": "string" }, - "typistGroupId": { "type": "number" }, - "email": { "type": "string" }, - "autoRenew": { "type": "boolean" }, - "licenseAlert": { "type": "boolean" }, - "notification": { "type": "boolean" } + "name": { + "type": "string" + }, + "role": { + "type": "string", + "description": "none/author/typist" + }, + "authorId": { + "type": "string" + }, + "typistGroupId": { + "type": "number" + }, + "email": { + "type": "string" + }, + "autoRenew": { + "type": "boolean" + }, + "licenseAlert": { + "type": "boolean" + }, + "notification": { + "type": "boolean" + } }, "required": [ "name", @@ -1488,7 +1892,10 @@ "notification" ] }, - "SignupResponse": { "type": "object", "properties": {} }, + "SignupResponse": { + "type": "object", + "properties": {} + }, "OptionItem": { "type": "object", "properties": { @@ -1514,12 +1921,16 @@ "OptionItemList": { "type": "object", "properties": { - "workTypeId": { "type": "string" }, + "workTypeId": { + "type": "string" + }, "optionItemList": { "maxItems": 10, "description": "1WorkTypeIDにつき、10個まで登録可能", "type": "array", - "items": { "$ref": "#/components/schemas/OptionItem" } + "items": { + "$ref": "#/components/schemas/OptionItem" + } } }, "required": ["workTypeId", "optionItemList"] @@ -1534,13 +1945,17 @@ "authorIdList": { "description": "属しているアカウントのAuthorID List(全て)", "type": "array", - "items": { "type": "string" } + "items": { + "type": "string" + } }, "workTypeList": { "maxItems": 20, "description": "アカウントに設定されているWorktypeIDのリスト(最大20個)", "type": "array", - "items": { "$ref": "#/components/schemas/OptionItemList" } + "items": { + "$ref": "#/components/schemas/OptionItemList" + } }, "isEncrypted": { "type": "boolean", @@ -1578,7 +1993,28 @@ "PostSortCriteriaRequest": { "type": "object", "properties": { - "direction": { "type": "string", "description": "ASC/DESC" }, + "direction": { + "type": "string", + "description": "ASC/DESC" + }, + "paramName": { + "type": "string", + "description": "JOB_NUMBER/STATUS/ENCRYPTION/AUTHOR_ID/FILE_NAME/FILE_LENGTH/FILE_SIZE/RECORDING_STARTED_DATE/RECORDING_FINISHED_DATE/UPLOAD_DATE/TRANSCRIPTION_STARTED_DATE/TRANSCRIPTION_FINISHED_DATE" + } + }, + "required": ["direction", "paramName"] + }, + "PostSortCriteriaResponse": { + "type": "object", + "properties": {} + }, + "GetSortCriteriaResponse": { + "type": "object", + "properties": { + "direction": { + "type": "string", + "description": "ASC/DESC" + }, "paramName": { "type": "string", "description": "JOB_NUMBER/STATUS/ENCRYPTION/AUTHOR_ID/FILE_NAME/FILE_LENGTH/FILE_SIZE/RECORDING_STARTED_DATE/RECORDING_FINISHED_DATE/UPLOAD_DATE/TRANSCRIPTION_STARTED_DATE/TRANSCRIPTION_FINISHED_DATE" @@ -1586,7 +2022,6 @@ }, "required": ["direction", "paramName"] }, - "PostSortCriteriaResponse": { "type": "object", "properties": {} }, "AudioOptionItem": { "type": "object", "properties": { @@ -1614,7 +2049,10 @@ "type": "string", "description": "自分自身(ログイン認証)したAuthorID" }, - "fileName": { "type": "string", "description": "音声ファイル名" }, + "fileName": { + "type": "string", + "description": "音声ファイル名" + }, "duration": { "type": "string", "description": "音声ファイルの録音時間(yyyy-mm-ddThh:mm:ss.sss)" @@ -1643,16 +2081,24 @@ "type": "string", "description": "録音形式: DSS/DS2(SP)/DS2(QP)" }, - "comment": { "type": "string" }, - "workType": { "type": "string" }, + "comment": { + "type": "string" + }, + "workType": { + "type": "string" + }, "optionItemList": { "maxItems": 10, "minItems": 10, "description": "音声ファイルに紐づくOption Itemの一覧(10個固定)", "type": "array", - "items": { "$ref": "#/components/schemas/AudioOptionItem" } + "items": { + "$ref": "#/components/schemas/AudioOptionItem" + } }, - "isEncrypted": { "type": "boolean" } + "isEncrypted": { + "type": "boolean" + } }, "required": [ "url", @@ -1674,7 +2120,10 @@ "AudioUploadFinishedResponse": { "type": "object", "properties": { - "jobNumber": { "type": "string", "description": "8桁固定の数字" } + "jobNumber": { + "type": "string", + "description": "8桁固定の数字" + } }, "required": ["jobNumber"] }, @@ -1700,7 +2149,11 @@ }, "TemplateDownloadLocationResponse": { "type": "object", - "properties": { "url": { "type": "string" } }, + "properties": { + "url": { + "type": "string" + } + }, "required": ["url"] }, "Typist": { @@ -1728,20 +2181,30 @@ "type": "number", "description": "ODMS Cloud上の音声ファイルID" }, - "authorId": { "type": "string", "description": "AuthorID" }, - "workType": { "type": "string" }, + "authorId": { + "type": "string", + "description": "AuthorID" + }, + "workType": { + "type": "string" + }, "optionItemList": { "maxItems": 10, "minItems": 10, "description": "音声ファイルに紐づくOption Itemの一覧(10個固定)", "type": "array", - "items": { "$ref": "#/components/schemas/AudioOptionItem" } + "items": { + "$ref": "#/components/schemas/AudioOptionItem" + } }, "url": { "type": "string", "description": "音声ファイルのBlob Storage上での保存場所(ファイル名含む)のURL" }, - "fileName": { "type": "string", "description": "音声ファイル名" }, + "fileName": { + "type": "string", + "description": "音声ファイル名" + }, "audioDuration": { "type": "string", "description": "音声ファイルの録音時間(yyyy-mm-ddThh:mm:ss.sss)" @@ -1770,17 +2233,31 @@ "type": "string", "description": "録音形式: DSS/DS2(SP)/DS2(QP)" }, - "comment": { "type": "string", "description": "コメント" }, - "isEncrypted": { "type": "boolean" }, - "jobNumber": { "type": "string", "description": "JOBナンバー" }, + "comment": { + "type": "string", + "description": "コメント" + }, + "isEncrypted": { + "type": "boolean" + }, + "jobNumber": { + "type": "string", + "description": "JOBナンバー" + }, "typist": { "description": "割り当てられたユーザー", - "allOf": [{ "$ref": "#/components/schemas/Typist" }] + "allOf": [ + { + "$ref": "#/components/schemas/Typist" + } + ] }, "assignees": { "description": "文字起こしに着手できる(チェックアウト可能な)、タスクにアサインされているグループ/個人の一覧", "type": "array", - "items": { "$ref": "#/components/schemas/Typist" } + "items": { + "$ref": "#/components/schemas/Typist" + } }, "status": { "type": "string", @@ -1829,11 +2306,16 @@ "type": "number", "description": "オフセット(何件目から取得するか 設定しない場合はデフォルト値)" }, - "total": { "type": "number", "description": "タスクの総件数" }, + "total": { + "type": "number", + "description": "タスクの総件数" + }, "tasks": { "description": "音声ファイル/タスク一覧", "type": "array", - "items": { "$ref": "#/components/schemas/Task" } + "items": { + "$ref": "#/components/schemas/Task" + } } }, "required": ["limit", "offset", "total", "tasks"] @@ -1847,20 +2329,33 @@ } } }, - "ChangeStatusResponse": { "type": "object", "properties": {} }, + "ChangeStatusResponse": { + "type": "object", + "properties": {} + }, "CreateOrdersRequest": { "type": "object", "properties": { - "poNumber": { "type": "string" }, - "orderCount": { "type": "number" } + "poNumber": { + "type": "string" + }, + "orderCount": { + "type": "number" + } }, "required": ["poNumber", "orderCount"] }, - "CreateOrdersResponse": { "type": "object", "properties": {} }, + "CreateOrdersResponse": { + "type": "object", + "properties": {} + }, "RegisterRequest": { "type": "object", "properties": { - "pns": { "type": "string", "description": "wns or apns" }, + "pns": { + "type": "string", + "description": "wns or apns" + }, "handler": { "type": "string", "description": "wnsのチャネルURI or apnsのデバイストークン" @@ -1868,7 +2363,10 @@ }, "required": ["pns", "handler"] }, - "RegisterResponse": { "type": "object", "properties": {} } + "RegisterResponse": { + "type": "object", + "properties": {} + } } } } diff --git a/dictation_server/src/constants/index.ts b/dictation_server/src/constants/index.ts index 626e5c7..928b56e 100644 --- a/dictation_server/src/constants/index.ts +++ b/dictation_server/src/constants/index.ts @@ -139,6 +139,7 @@ export const TASK_LIST_SORTABLE_ATTRIBUTES = [ 'STATUS', 'ENCRYPTION', 'AUTHOR_ID', + 'WORK_TYPE', 'FILE_NAME', 'FILE_LENGTH', 'FILE_SIZE',