From 44759b1aacaa6dc041ca8b5fbcc031f5fbeb66b4 Mon Sep 17 00:00:00 2001 From: Kentaro Fukunaga Date: Mon, 5 Feb 2024 00:31:47 +0000 Subject: [PATCH] =?UTF-8?q?Merged=20PR=20725:=20=E3=82=BF=E3=82=A4?= =?UTF-8?q?=E3=83=94=E3=82=B9=E3=83=88=E3=82=B0=E3=83=AB=E3=83=BC=E3=83=97?= =?UTF-8?q?=E5=89=8A=E9=99=A4=E3=80=80=E7=94=BB=E9=9D=A2=E5=AE=9F=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 概要 [Task3536: 画面実装](https://paruru.nds-tyo.co.jp:8443/tfs/ReciproCollection/fa4924a4-d079-4fab-9fb5-a9a11eb205f0/_workitems/edit/3536) - タイピストグループ画面に削除ボタン配置 - 削除ボタンクリック時に確認ダイアログ表示→OKで削除API実行&ぐるぐる表示 - API実行結果によってメッセージの出し分け&画面リスト更新 - 翻訳情報追加 ## レビューポイント - エラーコードに認識違いないか? - 画面実装のお作法にそぐわないところがないか? - なんか抜けてる実装などあれば ## UIの変更 大した変更ではないので、スクショ置き場に置く手間を省いてここに貼り付けます ![image (2).png](https://dev.azure.com/ODMSCloud/6023ff7b-d41c-4fa7-9c6f-f576ba48c07c/_apis/git/repositories/302da463-a2d7-40f9-b2bb-6e8edf324fa9/pullRequests/725/attachments/image%20%282%29.png) ## 動作確認状況 - 期待される動作を一通りローカルで確認しました。 - API実行中はぐるぐる表示されること - API成功または削除済みの場合は成功メッセージ表示され、画面更新されること - API失敗時、理由によってエラーメッセージが表示分けされること --- dictation_client/src/api/api.ts | 161 ++++++++++++++++++ dictation_client/src/common/errors/code.ts | 3 + .../workflow/typistGroup/operations.ts | 67 ++++++++ .../workflow/typistGroup/typistGroupSlice.ts | 10 ++ .../pages/TypistGroupSettingPage/index.tsx | 31 ++++ dictation_client/src/translation/de.json | 19 ++- dictation_client/src/translation/en.json | 19 ++- dictation_client/src/translation/es.json | 33 ++-- dictation_client/src/translation/fr.json | 33 ++-- 9 files changed, 350 insertions(+), 26 deletions(-) diff --git a/dictation_client/src/api/api.ts b/dictation_client/src/api/api.ts index c50df11..70d8d8f 100644 --- a/dictation_client/src/api/api.ts +++ b/dictation_client/src/api/api.ts @@ -1500,6 +1500,19 @@ export interface PostCheckoutPermissionRequest { */ 'assignees': Array; } +/** + * + * @export + * @interface PostDeleteUserRequest + */ +export interface PostDeleteUserRequest { + /** + * 削除対象のユーザーID + * @type {number} + * @memberof PostDeleteUserRequest + */ + 'userId': number; +} /** * * @export @@ -2639,6 +2652,44 @@ export const AccountsApiAxiosParamCreator = function (configuration?: Configurat options: localVarRequestOptions, }; }, + /** + * ログインしているユーザーのアカウント配下でIDで指定されたタイピストグループを削除します + * @summary + * @param {number} typistGroupId + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + deleteTypistGroup: async (typistGroupId: number, options: AxiosRequestConfig = {}): Promise => { + // verify required parameter 'typistGroupId' is not null or undefined + assertParamExists('deleteTypistGroup', 'typistGroupId', typistGroupId) + const localVarPath = `/accounts/typist-groups/{typistGroupId}/delete` + .replace(`{${"typistGroupId"}}`, encodeURIComponent(String(typistGroupId))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication bearer required + // http bearer authentication required + await setBearerAuthToObject(localVarHeaderParameter, configuration) + + + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, /** * * @summary @@ -3510,6 +3561,19 @@ export const AccountsApiFp = function(configuration?: Configuration) { const operationBasePath = operationServerMap['AccountsApi.deleteAccountAndData']?.[index]?.url; return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, operationBasePath || basePath); }, + /** + * ログインしているユーザーのアカウント配下でIDで指定されたタイピストグループを削除します + * @summary + * @param {number} typistGroupId + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async deleteTypistGroup(typistGroupId: number, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.deleteTypistGroup(typistGroupId, options); + const index = configuration?.serverIndex ?? 0; + const operationBasePath = operationServerMap['AccountsApi.deleteTypistGroup']?.[index]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, operationBasePath || basePath); + }, /** * * @summary @@ -3848,6 +3912,16 @@ export const AccountsApiFactory = function (configuration?: Configuration, baseP deleteAccountAndData(deleteAccountRequest: DeleteAccountRequest, options?: any): AxiosPromise { return localVarFp.deleteAccountAndData(deleteAccountRequest, options).then((request) => request(axios, basePath)); }, + /** + * ログインしているユーザーのアカウント配下でIDで指定されたタイピストグループを削除します + * @summary + * @param {number} typistGroupId + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + deleteTypistGroup(typistGroupId: number, options?: any): AxiosPromise { + return localVarFp.deleteTypistGroup(typistGroupId, options).then((request) => request(axios, basePath)); + }, /** * * @summary @@ -4140,6 +4214,18 @@ export class AccountsApi extends BaseAPI { return AccountsApiFp(this.configuration).deleteAccountAndData(deleteAccountRequest, options).then((request) => request(this.axios, this.basePath)); } + /** + * ログインしているユーザーのアカウント配下でIDで指定されたタイピストグループを削除します + * @summary + * @param {number} typistGroupId + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof AccountsApi + */ + public deleteTypistGroup(typistGroupId: number, options?: AxiosRequestConfig) { + return AccountsApiFp(this.configuration).deleteTypistGroup(typistGroupId, options).then((request) => request(this.axios, this.basePath)); + } + /** * * @summary @@ -7183,6 +7269,46 @@ export const UsersApiAxiosParamCreator = function (configuration?: Configuration localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; localVarRequestOptions.data = serializeDataIfNeeded(postUpdateUserRequest, localVarRequestOptions, configuration) + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * ユーザーを削除します + * @summary + * @param {PostDeleteUserRequest} postDeleteUserRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + updeateUser: async (postDeleteUserRequest: PostDeleteUserRequest, options: AxiosRequestConfig = {}): Promise => { + // verify required parameter 'postDeleteUserRequest' is not null or undefined + assertParamExists('updeateUser', 'postDeleteUserRequest', postDeleteUserRequest) + const localVarPath = `/users/delete`; + // 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(postDeleteUserRequest, localVarRequestOptions, configuration) + return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, @@ -7350,6 +7476,19 @@ export const UsersApiFp = function(configuration?: Configuration) { const operationBasePath = operationServerMap['UsersApi.updateUser']?.[index]?.url; return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, operationBasePath || basePath); }, + /** + * ユーザーを削除します + * @summary + * @param {PostDeleteUserRequest} postDeleteUserRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async updeateUser(postDeleteUserRequest: PostDeleteUserRequest, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.updeateUser(postDeleteUserRequest, options); + const index = configuration?.serverIndex ?? 0; + const operationBasePath = operationServerMap['UsersApi.updeateUser']?.[index]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, operationBasePath || basePath); + }, } }; @@ -7476,6 +7615,16 @@ export const UsersApiFactory = function (configuration?: Configuration, basePath updateUser(postUpdateUserRequest: PostUpdateUserRequest, options?: any): AxiosPromise { return localVarFp.updateUser(postUpdateUserRequest, options).then((request) => request(axios, basePath)); }, + /** + * ユーザーを削除します + * @summary + * @param {PostDeleteUserRequest} postDeleteUserRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + updeateUser(postDeleteUserRequest: PostDeleteUserRequest, options?: any): AxiosPromise { + return localVarFp.updeateUser(postDeleteUserRequest, options).then((request) => request(axios, basePath)); + }, }; }; @@ -7625,6 +7774,18 @@ export class UsersApi extends BaseAPI { public updateUser(postUpdateUserRequest: PostUpdateUserRequest, options?: AxiosRequestConfig) { return UsersApiFp(this.configuration).updateUser(postUpdateUserRequest, options).then((request) => request(this.axios, this.basePath)); } + + /** + * ユーザーを削除します + * @summary + * @param {PostDeleteUserRequest} postDeleteUserRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof UsersApi + */ + public updeateUser(postDeleteUserRequest: PostDeleteUserRequest, options?: AxiosRequestConfig) { + return UsersApiFp(this.configuration).updeateUser(postDeleteUserRequest, options).then((request) => request(this.axios, this.basePath)); + } } diff --git a/dictation_client/src/common/errors/code.ts b/dictation_client/src/common/errors/code.ts index da0d9b9..5d0ffd8 100644 --- a/dictation_client/src/common/errors/code.ts +++ b/dictation_client/src/common/errors/code.ts @@ -60,4 +60,7 @@ export const errorCodes = [ "E011004", // ワークタイプ使用中エラー "E013001", // ワークフローのAuthorIDとWorktypeIDのペア重複エラー "E013002", // ワークフロー不在エラー + "E015001", // タイピストグループ削除済みエラー + "E015002", // タイピストグループがワークフローに紐づいているエラー + "E015003", // タイピストグループがルーティングされているエラー ] as const; diff --git a/dictation_client/src/features/workflow/typistGroup/operations.ts b/dictation_client/src/features/workflow/typistGroup/operations.ts index a98ff1b..8ee85f1 100644 --- a/dictation_client/src/features/workflow/typistGroup/operations.ts +++ b/dictation_client/src/features/workflow/typistGroup/operations.ts @@ -256,3 +256,70 @@ export const updateTypistGroupAsync = createAsyncThunk< return thunkApi.rejectWithValue({ error }); } }); + +export const deleteTypistGroupAsync = createAsyncThunk< + { + /* Empty Object */ + }, + { + typistGroupId: number; + }, + { + // rejectした時の返却値の型 + rejectValue: { + error: ErrorObject; + }; + } +>("workflow/deleteTypistGroupAsync", async (args, thunkApi) => { + const { typistGroupId } = args; + + // apiのConfigurationを取得する + const { getState } = thunkApi; + const state = getState() as RootState; + const { configuration } = state.auth; + const accessToken = getAccessToken(state.auth); + const config = new Configuration(configuration); + const accountsApi = new AccountsApi(config); + + try { + await accountsApi.deleteTypistGroup(typistGroupId, { + headers: { authorization: `Bearer ${accessToken}` }, + }); + + thunkApi.dispatch( + openSnackbar({ + level: "info", + message: getTranslationID("common.message.success"), + }) + ); + return {}; + } catch (e) { + // e ⇒ errorObjectに変換" + const error = createErrorObject(e); + + // すでに削除されていた場合は成功扱いする + if (error.code === "E015001") { + thunkApi.dispatch( + openSnackbar({ + level: "info", + message: getTranslationID("common.message.success"), + }) + ); + return {}; + } + + // 以下は実際の削除失敗 + let message = getTranslationID("common.message.internalServerError"); + if (error.code === "E015002") + message = getTranslationID( + "typistGroupSetting.message.deleteFailedWorkflowAssigned" + ); + if (error.code === "E015003") + message = getTranslationID( + "typistGroupSetting.message.deleteFailedCheckoutPermissionExisted" + ); + + thunkApi.dispatch(openSnackbar({ level: "error", message })); + return thunkApi.rejectWithValue({ error }); + } +}); diff --git a/dictation_client/src/features/workflow/typistGroup/typistGroupSlice.ts b/dictation_client/src/features/workflow/typistGroup/typistGroupSlice.ts index 1574a3f..623cfcf 100644 --- a/dictation_client/src/features/workflow/typistGroup/typistGroupSlice.ts +++ b/dictation_client/src/features/workflow/typistGroup/typistGroupSlice.ts @@ -6,6 +6,7 @@ import { listTypistGroupsAsync, listTypistsAsync, updateTypistGroupAsync, + deleteTypistGroupAsync, } from "./operations"; const initialState: TypistGroupState = { @@ -106,6 +107,15 @@ export const typistGroupSlice = createSlice({ builder.addCase(updateTypistGroupAsync.rejected, (state) => { state.apps.isLoading = false; }); + builder.addCase(deleteTypistGroupAsync.pending, (state) => { + state.apps.isLoading = true; + }); + builder.addCase(deleteTypistGroupAsync.fulfilled, (state) => { + state.apps.isLoading = false; + }); + builder.addCase(deleteTypistGroupAsync.rejected, (state) => { + state.apps.isLoading = false; + }); }, }); diff --git a/dictation_client/src/pages/TypistGroupSettingPage/index.tsx b/dictation_client/src/pages/TypistGroupSettingPage/index.tsx index 05cf232..c4f9e1d 100644 --- a/dictation_client/src/pages/TypistGroupSettingPage/index.tsx +++ b/dictation_client/src/pages/TypistGroupSettingPage/index.tsx @@ -11,6 +11,7 @@ import { selectTypistGroups, selectIsLoading, listTypistGroupsAsync, + deleteTypistGroupAsync, } from "features/workflow/typistGroup"; import { AppDispatch } from "app/store"; import { useTranslation } from "react-i18next"; @@ -47,6 +48,25 @@ const TypistGroupSettingPage: React.FC = (): JSX.Element => { [setIsEditPopupOpen] ); + const onDeleteTypistGroup = useCallback( + async (typistGroupId: number) => { + if ( + /* eslint-disable-next-line no-alert */ + !window.confirm(t(getTranslationID("common.message.dialogConfirm"))) + ) { + return; + } + + const { meta } = await dispatch( + deleteTypistGroupAsync({ typistGroupId }) + ); + if (meta.requestStatus === "fulfilled") { + dispatch(listTypistGroupsAsync()); + } + }, + [dispatch, t] + ); + useEffect(() => { dispatch(listTypistGroupsAsync()); }, [dispatch]); @@ -142,6 +162,17 @@ const TypistGroupSettingPage: React.FC = (): JSX.Element => { {t(getTranslationID("common.label.edit"))} +
  • + {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions */} + { + onDeleteTypistGroup(group.id); + }} + > + {t(getTranslationID("common.label.delete"))} + +
  • diff --git a/dictation_client/src/translation/de.json b/dictation_client/src/translation/de.json index 4283e39..f756410 100644 --- a/dictation_client/src/translation/de.json +++ b/dictation_client/src/translation/de.json @@ -128,7 +128,14 @@ "authorIdIncorrectError": "Das Format der Autoren-ID ist ungültig. Als Autoren-ID können nur alphanumerische Zeichen und „_“ eingegeben werden.", "roleChangeError": "Die Benutzerrolle kann nicht geändert werden. Die angezeigten Informationen sind möglicherweise veraltet. Aktualisieren Sie daher bitte den Bildschirm, um den neuesten Status anzuzeigen.", "encryptionPasswordCorrectError": "Das Verschlüsselungskennwort entspricht nicht den Regeln.", - "alreadyLicenseDeallocatedError": "Die zugewiesene Lizenz wurde bereits storniert. Die angezeigten Informationen sind möglicherweise veraltet. Aktualisieren Sie daher bitte den Bildschirm, um den neuesten Status anzuzeigen." + "alreadyLicenseDeallocatedError": "Die zugewiesene Lizenz wurde bereits storniert. Die angezeigten Informationen sind möglicherweise veraltet. Aktualisieren Sie daher bitte den Bildschirm, um den neuesten Status anzuzeigen.", + "UserDeletionLicenseActiveError": "(de)ユーザーの削除に失敗しました。対象ユーザーのライセンス割り当てを解除してください。", + "TypistDeletionRoutingRuleError": "(de)ユーザーの削除に失敗しました。Workflow画面でルーティングルールから対象Transcriptionistを外してください。", + "AdminUserDeletionError": "(de)ユーザーの削除に失敗しました。アカウント画面で対象ユーザーをPrimary/Secondary Administratorから外してください。", + "TypistUserDeletionTranscriptionTaskError": "(de)ユーザーの削除に失敗しました。Dictation画面でタスクのルーティングから対象Transcriptionistを外してください。", + "AuthorUserDeletionTranscriptionTaskError": "(de)ユーザーの削除に失敗しました。Dictation画面で対象AuthorのAuthorIDが設定されているタスクの中で、文字起こしが未完了のタスクを削除またはFinishedにしてください。", + "TypistUserDeletionTranscriptionistGroupError": "(de)ユーザーの削除に失敗しました。Workflow画面でTranscriptionistGroupから対象Transcriptionistを外してください。", + "AuthorDeletionRoutingRuleError": "(de)ユーザーの削除に失敗しました。Workflow画面でルーティングルールから対象AuthorのAuthorIDを外してください。" }, "label": { "title": "Benutzer", @@ -417,7 +424,10 @@ }, "message": { "selectedTypistEmptyError": "Um eine Transkriptionsgruppe zu speichern, müssen ein oder mehrere Transkriptionisten ausgewählt werden.", - "groupSaveFailedError": "Die Schreibkraftgruppe konnte nicht gespeichert werden. Die angezeigten Informationen sind möglicherweise veraltet. Aktualisieren Sie daher bitte den Bildschirm, um den neuesten Status anzuzeigen." + "groupSaveFailedError": "Die Transkriptionistengruppe konnte nicht gespeichert werden. Die angezeigten Informationen sind möglicherweise veraltet. Aktualisieren Sie daher bitte den Bildschirm, um den neuesten Status anzuzeigen.", + "GroupNameAlreadyExistError": "(de)TypistGroupの保存に失敗しました。同名のTranscriptionistGroupは登録できません。", + "deleteFailedWorkflowAssigned": "(de)TranscriptionistGroupの削除に失敗しました。Workflow画面でルーティングルールから対象TranscriptionistGroupを外してください。", + "deleteFailedCheckoutPermissionExisted": "(de)TranscriptionistGroupの削除に失敗しました。Dictation画面でタスクのルーティングから対象TranscriptionistGroupを外してください。" } }, "worktypeIdSetting": { @@ -509,6 +519,9 @@ }, "message": { "updateAccountFailedError": "Kontoinformationen konnten nicht gespeichert werden. Bitte aktualisieren Sie den Bildschirm und versuchen Sie es erneut." + }, + "text": { + "dealerManagementAnnotation": "Durch die Aktivierung der Option „Erlauben Sie dem Händler, Änderungen vorzunehmen“ erklären Sie sich damit einverstanden, dass Ihr Händler die Rechte erhält, auf Ihr ODMS Cloud-Konto zuzugreifen, um in Ihrem Namen Lizenzen zu bestellen und Benutzer zu registrieren. Ihr Händler hat keinen Zugriff auf Sprachdateien oder Dokumente, die in Ihrem ODMS Cloud-Konto gespeichert sind." } }, "deleteAccountPopup": { @@ -558,4 +571,4 @@ "close": "Schließen" } } -} +} \ No newline at end of file diff --git a/dictation_client/src/translation/en.json b/dictation_client/src/translation/en.json index 2a4baf1..1ac4bf5 100644 --- a/dictation_client/src/translation/en.json +++ b/dictation_client/src/translation/en.json @@ -128,7 +128,14 @@ "authorIdIncorrectError": "Author ID format is invalid. Only alphanumeric characters and \"_\" can be entered for Author ID.", "roleChangeError": "Unable to change the User Role. The displayed information may be outdated, so please refresh the screen to see the latest status.", "encryptionPasswordCorrectError": "Encryption password does not meet the rules.", - "alreadyLicenseDeallocatedError": "Assigned license has already been canceled. The displayed information may be outdated, so please refresh the screen to see the latest status." + "alreadyLicenseDeallocatedError": "Assigned license has already been canceled. The displayed information may be outdated, so please refresh the screen to see the latest status.", + "UserDeletionLicenseActiveError": "ユーザーの削除に失敗しました。対象ユーザーのライセンス割り当てを解除してください。", + "TypistDeletionRoutingRuleError": "ユーザーの削除に失敗しました。Workflow画面でルーティングルールから対象Transcriptionistを外してください。", + "AdminUserDeletionError": "ユーザーの削除に失敗しました。アカウント画面で対象ユーザーをPrimary/Secondary Administratorから外してください。", + "TypistUserDeletionTranscriptionTaskError": "ユーザーの削除に失敗しました。Dictation画面でタスクのルーティングから対象Transcriptionistを外してください。", + "AuthorUserDeletionTranscriptionTaskError": "ユーザーの削除に失敗しました。Dictation画面で対象AuthorのAuthorIDが設定されているタスクの中で、文字起こしが未完了のタスクを削除またはFinishedにしてください。", + "TypistUserDeletionTranscriptionistGroupError": "ユーザーの削除に失敗しました。Workflow画面でTranscriptionistGroupから対象Transcriptionistを外してください。", + "AuthorDeletionRoutingRuleError": "ユーザーの削除に失敗しました。Workflow画面でルーティングルールから対象AuthorのAuthorIDを外してください。" }, "label": { "title": "User", @@ -417,7 +424,10 @@ }, "message": { "selectedTypistEmptyError": "One or more transcriptonist must be selected to save a transcrption group.", - "groupSaveFailedError": "Typist Group could not be saved. The displayed information may be outdated, so please refresh the screen to see the latest status." + "groupSaveFailedError": "Transcriptionist Group could not be saved. The displayed information may be outdated, so please refresh the screen to see the latest status.", + "GroupNameAlreadyExistError": "TypistGroupの保存に失敗しました。同名のTranscriptionistGroupは登録できません。", + "deleteFailedWorkflowAssigned": "TranscriptionistGroupの削除に失敗しました。Workflow画面でルーティングルールから対象TranscriptionistGroupを外してください。", + "deleteFailedCheckoutPermissionExisted": "TranscriptionistGroupの削除に失敗しました。Dictation画面でタスクのルーティングから対象TranscriptionistGroupを外してください。" } }, "worktypeIdSetting": { @@ -509,6 +519,9 @@ }, "message": { "updateAccountFailedError": "Failed to save account information. Please refresh the screen and try again." + }, + "text": { + "dealerManagementAnnotation": "By enabling the \"Dealer Management\" option, you are agreeing to allow your dealer to have the rights to access your ODMS Cloud account to order licenses and register users on your behalf. Your dealer will not have access to any voice file(s) or document(s) stored in your ODMS Cloud account." } }, "deleteAccountPopup": { @@ -558,4 +571,4 @@ "close": "Close" } } -} +} \ No newline at end of file diff --git a/dictation_client/src/translation/es.json b/dictation_client/src/translation/es.json index 43d4d44..70f8bf8 100644 --- a/dictation_client/src/translation/es.json +++ b/dictation_client/src/translation/es.json @@ -28,7 +28,7 @@ "tier1": "Admin", "tier2": "BC", "tier3": "Distribuidor", - "tier4": "Concesionario", + "tier4": "Distribuidor", "tier5": "Cliente", "notSelected": "Ninguno", "signOutButton": "cerrar sesión" @@ -62,14 +62,14 @@ "title": "Crea tu cuenta", "accountInfoTitle": "Información de Registro", "countryExplanation": "Seleccione el país donde se encuentra. Si su país no aparece en la lista, seleccione el país más cercano.", - "dealerExplanation": "Seleccione el concesionario al que le gustaría comprar la licencia.", + "dealerExplanation": "Seleccione el distribuidor al que le gustaría comprar la licencia.", "adminInfoTitle": "Registre la información del administrador principal", "passwordTerms": "Establezca una contraseña. La contraseña debe tener entre 8 y 25 caracteres y debe contener letras, números y símbolos. (Debe enumerar el símbolo compatible e indicar si se necesita una letra mayúscula)." }, "label": { "company": "Nombre de empresa", "country": "País", - "dealer": "Concesionario (Opcional)", + "dealer": "Distribuidor (Opcional)", "adminName": "Nombre del administrador", "email": "Dirección de correo electrónico", "password": "Contraseña", @@ -93,7 +93,7 @@ "label": { "company": "Nombre de empresa", "country": "País", - "dealer": "Concesionario (Opcional)", + "dealer": "Distribuidor (Opcional)", "adminName": "Nombre del administrador", "email": "Dirección de correo electrónico", "password": "Contraseña", @@ -128,7 +128,14 @@ "authorIdIncorrectError": "El formato de ID del autor no es válido. Sólo se pueden ingresar caracteres alfanuméricos y \"_\" para la ID del autor.", "roleChangeError": "No se puede cambiar la función de usuario. La información mostrada puede estar desactualizada, así que actualice la pantalla para ver el estado más reciente.", "encryptionPasswordCorrectError": "La contraseña de cifrado no cumple con las reglas.", - "alreadyLicenseDeallocatedError": "La licencia asignada ya ha sido cancelada. La información mostrada puede estar desactualizada, así que actualice la pantalla para ver el estado más reciente." + "alreadyLicenseDeallocatedError": "La licencia asignada ya ha sido cancelada. La información mostrada puede estar desactualizada, así que actualice la pantalla para ver el estado más reciente.", + "UserDeletionLicenseActiveError": "(es)ユーザーの削除に失敗しました。対象ユーザーのライセンス割り当てを解除してください。", + "TypistDeletionRoutingRuleError": "(es)ユーザーの削除に失敗しました。Workflow画面でルーティングルールから対象Transcriptionistを外してください。", + "AdminUserDeletionError": "(es)ユーザーの削除に失敗しました。アカウント画面で対象ユーザーをPrimary/Secondary Administratorから外してください。", + "TypistUserDeletionTranscriptionTaskError": "(es)ユーザーの削除に失敗しました。Dictation画面でタスクのルーティングから対象Transcriptionistを外してください。", + "AuthorUserDeletionTranscriptionTaskError": "(es)ユーザーの削除に失敗しました。Dictation画面で対象AuthorのAuthorIDが設定されているタスクの中で、文字起こしが未完了のタスクを削除またはFinishedにしてください。", + "TypistUserDeletionTranscriptionistGroupError": "(es)ユーザーの削除に失敗しました。Workflow画面でTranscriptionistGroupから対象Transcriptionistを外してください。", + "AuthorDeletionRoutingRuleError": "(es)ユーザーの削除に失敗しました。Workflow画面でルーティングルールから対象AuthorのAuthorIDを外してください。" }, "label": { "title": "Usuario", @@ -417,7 +424,10 @@ }, "message": { "selectedTypistEmptyError": "Se deben seleccionar uno o más transcriptores para guardar un grupo de transcripción.", - "groupSaveFailedError": "No se pudo guardar el grupo mecanógrafo. La información mostrada puede estar desactualizada, así que actualice la pantalla para ver el estado más reciente." + "groupSaveFailedError": "El grupo transcriptor no se pudo salvar. La información mostrada puede estar desactualizada. Así que actualice la pantalla para ver el estado más reciente.", + "GroupNameAlreadyExistError": "(es)TypistGroupの保存に失敗しました。同名のTranscriptionistGroupは登録できません。", + "deleteFailedWorkflowAssigned": "(es)TranscriptionistGroupの削除に失敗しました。Workflow画面でルーティングルールから対象TranscriptionistGroupを外してください。", + "deleteFailedCheckoutPermissionExisted": "(es)TranscriptionistGroupの削除に失敗しました。Dictation画面でタスクのルーティングから対象TranscriptionistGroupを外してください。" } }, "worktypeIdSetting": { @@ -496,9 +506,9 @@ "accountID": "ID de la cuenta", "yourCategory": "Tipo de cuenta", "yourCountry": "País", - "yourDealer": "Concesionario", - "selectDealer": "Seleccionar Concesionario", - "dealerManagement": "Permitir que el concesionario realice los cambios", + "yourDealer": "Distribuidor", + "selectDealer": "Seleccionar distribuidor", + "dealerManagement": "Permitir que el distribuidor realice los cambios", "administratorInformation": "Información del administrador", "primaryAdministrator": "Administrador primario", "secondaryAdministrator": "Administrador secundario", @@ -509,6 +519,9 @@ }, "message": { "updateAccountFailedError": "No se pudo guardar la información de la cuenta. Actualice la pantalla e inténtelo de nuevo." + }, + "text": { + "dealerManagementAnnotation": "Al habilitar la opción \"Permitir que el distribuidor realice los cambios\", usted acepta permitir que su distribuidor tenga derechos para acceder a su cuenta de ODMS Cloud para solicitar licencias y registrar usuarios en su nombre. Su distribuidor no tendrá acceso a ningún archivo de voz o documento almacenado en su cuenta de ODMS Cloud." } }, "deleteAccountPopup": { @@ -558,4 +571,4 @@ "close": "Cerrar" } } -} +} \ No newline at end of file diff --git a/dictation_client/src/translation/fr.json b/dictation_client/src/translation/fr.json index 57c5da9..3717a7e 100644 --- a/dictation_client/src/translation/fr.json +++ b/dictation_client/src/translation/fr.json @@ -28,7 +28,7 @@ "tier1": "Admin", "tier2": "BC", "tier3": "Distributeur", - "tier4": "Concessionnaire", + "tier4": "Revendeur", "tier5": "Client", "notSelected": "Aucune", "signOutButton": "se déconnecter" @@ -62,14 +62,14 @@ "title": "Créez votre compte", "accountInfoTitle": "Information d'inscription", "countryExplanation": "Sélectionnez le pays où vous vous trouvez. Si votre pays ne figure pas dans la liste, veuillez sélectionner le pays le plus proche.", - "dealerExplanation": "Veuillez sélectionner le concessionnaire auprès duquel vous souhaitez acheter la licence.", + "dealerExplanation": "Veuillez sélectionner le revendeur auprès duquel vous souhaitez acheter la licence.", "adminInfoTitle": "Enregistrer les informations de l'administrateur principal", "passwordTerms": "Veuillez définir un mot de passe. Le mot de passe doit être composé de 8 à 25 caractères et doit contenir des lettres, des chiffres et des symboles. (Devrait lister les symboles compatibles et indiquer si une majuscule est nécessaire)." }, "label": { "company": "Nom de l'entreprise", "country": "Pays", - "dealer": "Concessionnaire (Facultatif)", + "dealer": "Revendeur (Facultatif)", "adminName": "Nom de l'administrateur", "email": "Adresse e-mail", "password": "Mot de passe", @@ -93,7 +93,7 @@ "label": { "company": "Nom de l'entreprise", "country": "Pays", - "dealer": "Concessionnaire (Facultatif)", + "dealer": "Revendeur (Facultatif)", "adminName": "Nom de l'administrateur", "email": "Adresse e-mail", "password": "Mot de passe", @@ -128,7 +128,14 @@ "authorIdIncorrectError": "Le format de l'identifiant de l'auteur n'est pas valide. Seuls les caractères alphanumériques et \"_\" peuvent être saisis pour l'ID d'auteur.", "roleChangeError": "Impossible de modifier le rôle de l'utilisateur. Les informations affichées peuvent être obsolètes, veuillez donc actualiser l'écran pour voir le dernier statut.", "encryptionPasswordCorrectError": "Le mot de passe de cryptage n'est pas conforme aux règles.", - "alreadyLicenseDeallocatedError": "La licence attribuée a déjà été annulée. Les informations affichées peuvent être obsolètes, veuillez donc actualiser l'écran pour voir le dernier statut." + "alreadyLicenseDeallocatedError": "La licence attribuée a déjà été annulée. Les informations affichées peuvent être obsolètes, veuillez donc actualiser l'écran pour voir le dernier statut.", + "UserDeletionLicenseActiveError": "(fr)ユーザーの削除に失敗しました。対象ユーザーのライセンス割り当てを解除してください。", + "TypistDeletionRoutingRuleError": "(fr)ユーザーの削除に失敗しました。Workflow画面でルーティングルールから対象Transcriptionistを外してください。", + "AdminUserDeletionError": "(fr)ユーザーの削除に失敗しました。アカウント画面で対象ユーザーをPrimary/Secondary Administratorから外してください。", + "TypistUserDeletionTranscriptionTaskError": "(fr)ユーザーの削除に失敗しました。Dictation画面でタスクのルーティングから対象Transcriptionistを外してください。", + "AuthorUserDeletionTranscriptionTaskError": "(fr)ユーザーの削除に失敗しました。Dictation画面で対象AuthorのAuthorIDが設定されているタスクの中で、文字起こしが未完了のタスクを削除またはFinishedにしてください。", + "TypistUserDeletionTranscriptionistGroupError": "(fr)ユーザーの削除に失敗しました。Workflow画面でTranscriptionistGroupから対象Transcriptionistを外してください。", + "AuthorDeletionRoutingRuleError": "(fr)ユーザーの削除に失敗しました。Workflow画面でルーティングルールから対象AuthorのAuthorIDを外してください。" }, "label": { "title": "Utilisateur", @@ -417,7 +424,10 @@ }, "message": { "selectedTypistEmptyError": "Un ou plusieurs transcripteurs doivent être sélectionnés pour enregistrer un groupe de transcription.", - "groupSaveFailedError": "Le groupe de dactylographes n'a pas pu être enregistré. Les informations affichées peuvent être obsolètes, veuillez donc actualiser l'écran pour voir le dernier statut." + "groupSaveFailedError": "Le groupe de transcriptionniste n'a pas pu être enregistré. Les informations affichées peuvent être obsolètes, veuillez donc actualiser l'écran pour voir le dernier statut.", + "GroupNameAlreadyExistError": "(fr)TypistGroupの保存に失敗しました。同名のTranscriptionistGroupは登録できません。", + "deleteFailedWorkflowAssigned": "(fr)TranscriptionistGroupの削除に失敗しました。Workflow画面でルーティングルールから対象TranscriptionistGroupを外してください。", + "deleteFailedCheckoutPermissionExisted": "(fr)TranscriptionistGroupの削除に失敗しました。Dictation画面でタスクのルーティングから対象TranscriptionistGroupを外してください。" } }, "worktypeIdSetting": { @@ -496,9 +506,9 @@ "accountID": "identifiant de compte", "yourCategory": "Type de compte", "yourCountry": "Pays", - "yourDealer": "Concessionnaire", - "selectDealer": "Sélectionner le Concessionnaire", - "dealerManagement": "Autoriser le concessionnaire à modifier les paramètres", + "yourDealer": "Revendeur", + "selectDealer": "Sélectionner le revendeur", + "dealerManagement": "Autoriser le revendeur à modifier les paramètres", "administratorInformation": "Informations sur l'administrateur", "primaryAdministrator": "Administrateur principal", "secondaryAdministrator": "Administrateur secondaire", @@ -509,6 +519,9 @@ }, "message": { "updateAccountFailedError": "Échec de l'enregistrement des informations du compte. Veuillez actualiser l'écran et réessayer." + }, + "text": { + "dealerManagementAnnotation": "En activant l'option « Autoriser le revendeur à modifier les paramètres », vous acceptez que votre concessionnaire ait les droits d'accès à votre compte ODMS Cloud pour commander des licences et enregistrer des utilisateurs en votre nom. Votre revendeur n'aura accès à aucun fichier(s) vocal(s) ou document(s) stocké(s) dans votre compte ODMS Cloud." } }, "deleteAccountPopup": { @@ -558,4 +571,4 @@ "close": "Fermer" } } -} +} \ No newline at end of file