diff --git a/dictation_client/src/AppRouter.tsx b/dictation_client/src/AppRouter.tsx index f95adfc..7a8d45f 100644 --- a/dictation_client/src/AppRouter.tsx +++ b/dictation_client/src/AppRouter.tsx @@ -12,6 +12,7 @@ import VerifySuccessPage from "pages/VerifySuccessPage"; import VerifyFailedPage from "pages/VerifyFailedPage"; import VerifyAlreadyExistPage from "pages/VerifyAlreadyExistPage"; import SignupCompletePage from "pages/SignupCompletePage"; +import UserListPage from "pages/UserListPage"; const AppRouter: React.FC = () => ( @@ -31,6 +32,7 @@ const AppRouter: React.FC = () => ( path="/mail-confirm/alreadyExist" element={} /> + } /> } />} diff --git a/dictation_client/src/api/api.ts b/dictation_client/src/api/api.ts index e8837e8..edfbf7d 100644 --- a/dictation_client/src/api/api.ts +++ b/dictation_client/src/api/api.ts @@ -360,17 +360,17 @@ export const AccountsApiAxiosParamCreator = function (configuration?: Configurat baseOptions = configuration.baseOptions; } - const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options }; + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - + localVarHeaderParameter['Content-Type'] = 'application/json'; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; - localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers }; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; localVarRequestOptions.data = serializeDataIfNeeded(createAccountRequest, localVarRequestOptions, configuration) return { @@ -385,7 +385,7 @@ export const AccountsApiAxiosParamCreator = function (configuration?: Configurat * AccountsApi - functional programming interface * @export */ -export const AccountsApiFp = function (configuration?: Configuration) { +export const AccountsApiFp = function(configuration?: Configuration) { const localVarAxiosParamCreator = AccountsApiAxiosParamCreator(configuration) return { /** @@ -464,7 +464,7 @@ export const AuthApiAxiosParamCreator = function (configuration?: Configuration) baseOptions = configuration.baseOptions; } - const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options }; + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; @@ -473,10 +473,10 @@ export const AuthApiAxiosParamCreator = function (configuration?: Configuration) await setBearerAuthToObject(localVarHeaderParameter, configuration) - + setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; - localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers }; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; return { url: toPathString(localVarUrlObj), @@ -501,17 +501,17 @@ export const AuthApiAxiosParamCreator = function (configuration?: Configuration) baseOptions = configuration.baseOptions; } - const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options }; + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - + localVarHeaderParameter['Content-Type'] = 'application/json'; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; - localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers }; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; localVarRequestOptions.data = serializeDataIfNeeded(tokenRequest, localVarRequestOptions, configuration) return { @@ -526,7 +526,7 @@ export const AuthApiAxiosParamCreator = function (configuration?: Configuration) * AuthApi - functional programming interface * @export */ -export const AuthApiFp = function (configuration?: Configuration) { +export const AuthApiFp = function(configuration?: Configuration) { const localVarAxiosParamCreator = AuthApiAxiosParamCreator(configuration) return { /** @@ -635,15 +635,15 @@ export const DefaultApiAxiosParamCreator = function (configuration?: Configurati baseOptions = configuration.baseOptions; } - const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options }; + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - + setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; - localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers }; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; return { url: toPathString(localVarUrlObj), @@ -657,7 +657,7 @@ export const DefaultApiAxiosParamCreator = function (configuration?: Configurati * DefaultApi - functional programming interface * @export */ -export const DefaultApiFp = function (configuration?: Configuration) { +export const DefaultApiFp = function(configuration?: Configuration) { const localVarAxiosParamCreator = DefaultApiAxiosParamCreator(configuration) return { /** @@ -736,7 +736,7 @@ export const FilesApiAxiosParamCreator = function (configuration?: Configuration baseOptions = configuration.baseOptions; } - const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options }; + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; @@ -749,10 +749,10 @@ export const FilesApiAxiosParamCreator = function (configuration?: Configuration } - + setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; - localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers }; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; return { url: toPathString(localVarUrlObj), @@ -774,7 +774,7 @@ export const FilesApiAxiosParamCreator = function (configuration?: Configuration baseOptions = configuration.baseOptions; } - const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options }; + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; @@ -783,10 +783,10 @@ export const FilesApiAxiosParamCreator = function (configuration?: Configuration await setBearerAuthToObject(localVarHeaderParameter, configuration) - + setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; - localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers }; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; return { url: toPathString(localVarUrlObj), @@ -800,7 +800,7 @@ export const FilesApiAxiosParamCreator = function (configuration?: Configuration * FilesApi - functional programming interface * @export */ -export const FilesApiFp = function (configuration?: Configuration) { +export const FilesApiFp = function(configuration?: Configuration) { const localVarAxiosParamCreator = FilesApiAxiosParamCreator(configuration) return { /** @@ -912,7 +912,7 @@ export const NotificationApiAxiosParamCreator = function (configuration?: Config baseOptions = configuration.baseOptions; } - const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options }; + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; @@ -921,12 +921,12 @@ export const NotificationApiAxiosParamCreator = function (configuration?: Config 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.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; localVarRequestOptions.data = serializeDataIfNeeded(registerRequest, localVarRequestOptions, configuration) return { @@ -941,7 +941,7 @@ export const NotificationApiAxiosParamCreator = function (configuration?: Config * NotificationApi - functional programming interface * @export */ -export const NotificationApiFp = function (configuration?: Configuration) { +export const NotificationApiFp = function(configuration?: Configuration) { const localVarAxiosParamCreator = NotificationApiAxiosParamCreator(configuration) return { /** @@ -1023,17 +1023,17 @@ export const UsersApiAxiosParamCreator = function (configuration?: Configuration baseOptions = configuration.baseOptions; } - const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options }; + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - + localVarHeaderParameter['Content-Type'] = 'application/json'; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; - localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers }; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; localVarRequestOptions.data = serializeDataIfNeeded(confirmRequest, localVarRequestOptions, configuration) return { @@ -1059,17 +1059,17 @@ export const UsersApiAxiosParamCreator = function (configuration?: Configuration baseOptions = configuration.baseOptions; } - const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options }; + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - + localVarHeaderParameter['Content-Type'] = 'application/json'; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; - localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers }; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; localVarRequestOptions.data = serializeDataIfNeeded(confirmRequest, localVarRequestOptions, configuration) return { @@ -1092,7 +1092,7 @@ export const UsersApiAxiosParamCreator = function (configuration?: Configuration baseOptions = configuration.baseOptions; } - const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options }; + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; @@ -1101,10 +1101,10 @@ export const UsersApiAxiosParamCreator = function (configuration?: Configuration await setBearerAuthToObject(localVarHeaderParameter, configuration) - + setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; - localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers }; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; return { url: toPathString(localVarUrlObj), @@ -1129,7 +1129,7 @@ export const UsersApiAxiosParamCreator = function (configuration?: Configuration baseOptions = configuration.baseOptions; } - const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options }; + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; @@ -1138,12 +1138,12 @@ export const UsersApiAxiosParamCreator = function (configuration?: Configuration 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.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; localVarRequestOptions.data = serializeDataIfNeeded(signupRequest, localVarRequestOptions, configuration) return { @@ -1158,7 +1158,7 @@ export const UsersApiAxiosParamCreator = function (configuration?: Configuration * UsersApi - functional programming interface * @export */ -export const UsersApiFp = function (configuration?: Configuration) { +export const UsersApiFp = function(configuration?: Configuration) { const localVarAxiosParamCreator = UsersApiAxiosParamCreator(configuration) return { /** diff --git a/dictation_client/src/app/store.ts b/dictation_client/src/app/store.ts index e500f65..9435645 100644 --- a/dictation_client/src/app/store.ts +++ b/dictation_client/src/app/store.ts @@ -4,6 +4,7 @@ import auth from "features/auth/authSlice"; import signup from "features/signup/signupSlice"; import verify from "features/verify/verifySlice"; import ui from "features/ui/uiSlice"; +import user from "features/user/userSlice"; export const store = configureStore({ reducer: { @@ -12,6 +13,7 @@ export const store = configureStore({ signup, verify, ui, + user, }, }); diff --git a/dictation_client/src/assets/images/check_fill.svg b/dictation_client/src/assets/images/check_fill.svg new file mode 100644 index 0000000..b706fb9 --- /dev/null +++ b/dictation_client/src/assets/images/check_fill.svg @@ -0,0 +1,10 @@ + + + + + + diff --git a/dictation_client/src/features/user/index.ts b/dictation_client/src/features/user/index.ts new file mode 100644 index 0000000..abfe789 --- /dev/null +++ b/dictation_client/src/features/user/index.ts @@ -0,0 +1,4 @@ +export * from "./state"; +export * from "./operations"; +export * from "./selectors"; +export * from "./userSlice"; diff --git a/dictation_client/src/features/user/operations.ts b/dictation_client/src/features/user/operations.ts new file mode 100644 index 0000000..3637c97 --- /dev/null +++ b/dictation_client/src/features/user/operations.ts @@ -0,0 +1,38 @@ +import { createAsyncThunk } from "@reduxjs/toolkit"; +import type { RootState } from "app/store"; +import { UsersApi, GetUsersResponse } from "../../api/api"; +import { Configuration } from "../../api/configuration"; +import { ErrorObject, createErrorObject } from "../../common/errors"; + +export const listUsersAsync = createAsyncThunk< + // 正常時の戻り値の型 + GetUsersResponse, + // 引数 + void, + { + // rejectした時の返却値の型 + rejectValue: { + error: ErrorObject; + }; + } +>("users/listUsersAsync", 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 res = await usersApi.getUsers({ + headers: { authorization: `Bearer ${accessToken}` }, + }); + + return { users: res.data.users }; + } catch (e) { + // e ⇒ errorObjectに変換 + const error = createErrorObject(e); + + return thunkApi.rejectWithValue({ error }); + } +}); diff --git a/dictation_client/src/features/user/selectors.ts b/dictation_client/src/features/user/selectors.ts new file mode 100644 index 0000000..efadaf5 --- /dev/null +++ b/dictation_client/src/features/user/selectors.ts @@ -0,0 +1,3 @@ +import { RootState } from "app/store"; + +export const selectDomain = (state: RootState) => state.user.domain; diff --git a/dictation_client/src/features/user/state.ts b/dictation_client/src/features/user/state.ts new file mode 100644 index 0000000..4e31f2f --- /dev/null +++ b/dictation_client/src/features/user/state.ts @@ -0,0 +1,9 @@ +import { User } from "../../api/api"; + +export interface UsersState { + domain: Domain; +} + +export interface Domain { + users: User[]; +} diff --git a/dictation_client/src/features/user/userSlice.ts b/dictation_client/src/features/user/userSlice.ts new file mode 100644 index 0000000..49124c6 --- /dev/null +++ b/dictation_client/src/features/user/userSlice.ts @@ -0,0 +1,20 @@ +import { createSlice } from "@reduxjs/toolkit"; +import { UsersState } from "./state"; +import { listUsersAsync } from "./operations"; + +const initialState: UsersState = { + domain: { users: [] }, +}; + +export const userSlice = createSlice({ + name: "user", + initialState, + reducers: {}, + extraReducers: (builder) => { + builder.addCase(listUsersAsync.fulfilled, (state, action) => { + state.domain.users = action.payload.users; + }); + }, +}); + +export default userSlice.reducer; diff --git a/dictation_client/src/pages/UserListPage/index.tsx b/dictation_client/src/pages/UserListPage/index.tsx new file mode 100644 index 0000000..a7d055c --- /dev/null +++ b/dictation_client/src/pages/UserListPage/index.tsx @@ -0,0 +1,221 @@ +import { AppDispatch } from "app/store"; +import React, { useEffect } from "react"; +import Header from "components/header"; +import Footer from "components/footer"; +import styles from "styles/app.module.scss"; +import { useDispatch, useSelector } from "react-redux"; +import { listUsersAsync, selectDomain } from "features/user"; +import { useTranslation } from "react-i18next"; +import { getTranslationID } from "translation"; +import personAdd from "../../assets/images/person_add.svg"; +import editImg from "../../assets/images/edit.svg"; +import deleteImg from "../../assets/images/delete.svg"; +import badgeImg from "../../assets/images/badge.svg"; +import checkFill from "../../assets/images/check_fill.svg"; +import circle from "../../assets/images/circle.svg"; + +// eslintの検査エラー無視設定 +/* eslint-disable jsx-a11y/anchor-is-valid */ + +const UserListPage: React.FC = (): JSX.Element => { + const dispatch: AppDispatch = useDispatch(); + const [t] = useTranslation(); + + useEffect(() => { + // ユーザ一覧取得処理を呼び出す + dispatch(listUsersAsync()); + }, [dispatch]); + + const domain = useSelector(selectDomain); + + return ( +
+ {/* XXX デザイン上はヘッダに「Account」「User」「License」等の項目が設定されているが、そのままでは使用できない。PBI1128ではユーザ一覧画面は作りこまないので、ユーザ一覧のPBIでヘッダをデザイン通りにする必要がある */} +
+
+
+
+

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

+

+

+
+
+ + + + + + + + + + + + + + + + + {/* XXX 「固定」の項目と、isSelected、isAlertの対応が必要 */} + {domain.users.map((user) => ( + + + + + + + + + + + + + + ))} + +
+ + {t(getTranslationID("userListPage.label.name"))} + + + + {t(getTranslationID("userListPage.label.role"))} + + + + {t(getTranslationID("userListPage.label.authorID"))} + + + + {t(getTranslationID("userListPage.label.typistGroup"))} + + + + {t(getTranslationID("userListPage.label.email"))} + + + + {t(getTranslationID("userListPage.label.status"))} + + + + {t(getTranslationID("userListPage.label.expiration"))} + + + + {t(getTranslationID("userListPage.label.remaining"))} + + + {t(getTranslationID("userListPage.label.autoRenew"))} + + {t(getTranslationID("userListPage.label.licenseAlert"))} + + {t(getTranslationID("userListPage.label.notification"))} +
{user.name}{user.role}{user.authorId}{user.typistGroupName}{user.email}固定:Uploaded固定:2023/8/3固定:114 + {user.autoRenew ? ( + + ) : ( + + )} + + {user.licenseAlert ? ( + + ) : ( + + )} + + {user.notification ? ( + + ) : ( + + )} +
+
+ +
+
+
+
+
+
+ ); +}; + +export default UserListPage; diff --git a/dictation_client/src/translation/de.json b/dictation_client/src/translation/de.json index ecf5943..bd246d5 100644 --- a/dictation_client/src/translation/de.json +++ b/dictation_client/src/translation/de.json @@ -43,7 +43,7 @@ "label": { "company": "(de)Company Name", "country": "(de)Country", - "dealer": "(de)Dealer (Optional)", + "dealer": "(de)Dealer", "adminName": "(de)Admin Name", "email": "(de)Email", "password": "(de)Password", @@ -66,7 +66,7 @@ "label": { "company": "(de)Company Name", "country": "(de)Country", - "dealer": "(de)Dealer", + "dealer": "(de)Dealer (Optional)", "adminName": "(de)Admin Name", "email": "(de)Email", "password": "(de)Password", @@ -93,5 +93,27 @@ "alreadySuccess": "(de)Already Verified!", "returnToSignIn": "(de)Return to Sign in" } + }, + "userListPage": { + "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" + } } -} +} \ No newline at end of file diff --git a/dictation_client/src/translation/en.json b/dictation_client/src/translation/en.json index c77d6e9..8564e76 100644 --- a/dictation_client/src/translation/en.json +++ b/dictation_client/src/translation/en.json @@ -43,7 +43,7 @@ "label": { "company": "Company Name", "country": "Country", - "dealer": "Dealer (Optional)", + "dealer": "Dealer", "adminName": "Admin Name", "email": "Email", "password": "Password", @@ -66,7 +66,7 @@ "label": { "company": "Company Name", "country": "Country", - "dealer": "Dealer", + "dealer": "Dealer (Optional)", "adminName": "Admin Name", "email": "Email", "password": "Password", @@ -93,5 +93,27 @@ "alreadySuccess": "Already Verified!", "returnToSignIn": "Return to Sign in" } + }, + "userListPage": { + "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" + } } -} +} \ No newline at end of file diff --git a/dictation_client/src/translation/es.json b/dictation_client/src/translation/es.json index 11b01d3..bab4cec 100644 --- a/dictation_client/src/translation/es.json +++ b/dictation_client/src/translation/es.json @@ -43,7 +43,7 @@ "label": { "company": "(es)Company Name", "country": "(es)Country", - "dealer": "(es)Dealer (Optional)", + "dealer": "(es)Dealer", "adminName": "(es)Admin Name", "email": "(es)Email", "password": "(es)Password", @@ -66,7 +66,7 @@ "label": { "company": "(es)Company Name", "country": "(es)Country", - "dealer": "(es)Dealer", + "dealer": "(es)Dealer (Optional)", "adminName": "(es)Admin Name", "email": "(es)Email", "password": "(es)Password", @@ -93,5 +93,27 @@ "alreadySuccess": "(es)Already Verified!", "returnToSignIn": "(es)Return to Sign in" } + }, + "userListPage": { + "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" + } } -} +} \ No newline at end of file diff --git a/dictation_client/src/translation/fr.json b/dictation_client/src/translation/fr.json index 50670a5..fdedb4b 100644 --- a/dictation_client/src/translation/fr.json +++ b/dictation_client/src/translation/fr.json @@ -43,7 +43,7 @@ "label": { "company": "(fr)Company Name", "country": "(fr)Country", - "dealer": "(fr)Dealer (Optional)", + "dealer": "(fr)Dealer", "adminName": "(fr)Admin Name", "email": "(fr)Email", "password": "(fr)Password", @@ -66,7 +66,7 @@ "label": { "company": "(fr)Company Name", "country": "(fr)Country", - "dealer": "(fr)Dealer", + "dealer": "(fr)Dealer (Optional)", "adminName": "(fr)Admin Name", "email": "(fr)Email", "password": "(fr)Password", @@ -93,5 +93,27 @@ "alreadySuccess": "(fr)Already Verified!", "returnToSignIn": "(fr)Return to Sign in" } + }, + "userListPage": { + "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" + } } -} +} \ No newline at end of file