Merged PR 602: ライセンス確認画面(第五階層)に会社名を表示する(client側)
## 概要 [Task3225: ライセンス確認画面(第五階層)に会社名を表示する(client側)](https://paruru.nds-tyo.co.jp:8443/tfs/ReciproCollection/fa4924a4-d079-4fab-9fb5-a9a11eb205f0/_workitems/edit/3225) - 何をどう変更したか、追加したライブラリなど ライセンス確認画面(第5階層)の会社名取得APIを呼び出す実装を追加。 - このPull Requestでの対象/対象外 server側の実装は別ブランチで行うためここでは対象外 ## レビューポイント 特になし ## UIの変更 - Before/Afterのスクショなど - スクショ置き場 ## 動作確認状況 - ローカルで確認(完了)
This commit is contained in:
parent
4399a61f2b
commit
c246586498
@ -752,6 +752,32 @@ export interface GetAuthorsResponse {
|
|||||||
*/
|
*/
|
||||||
'authors': Array<Author>;
|
'authors': Array<Author>;
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @export
|
||||||
|
* @interface GetCompanyNameRequest
|
||||||
|
*/
|
||||||
|
export interface GetCompanyNameRequest {
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @type {number}
|
||||||
|
* @memberof GetCompanyNameRequest
|
||||||
|
*/
|
||||||
|
'accountId': number;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @export
|
||||||
|
* @interface GetCompanyNameResponse
|
||||||
|
*/
|
||||||
|
export interface GetCompanyNameResponse {
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @type {string}
|
||||||
|
* @memberof GetCompanyNameResponse
|
||||||
|
*/
|
||||||
|
'companyName': string;
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @export
|
* @export
|
||||||
@ -2739,6 +2765,46 @@ export const AccountsApiAxiosParamCreator = function (configuration?: Configurat
|
|||||||
options: localVarRequestOptions,
|
options: localVarRequestOptions,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
/**
|
||||||
|
* 指定したアカウントの会社名を取得します
|
||||||
|
* @summary
|
||||||
|
* @param {GetCompanyNameRequest} getCompanyNameRequest
|
||||||
|
* @param {*} [options] Override http request option.
|
||||||
|
* @throws {RequiredError}
|
||||||
|
*/
|
||||||
|
getCompanyName: async (getCompanyNameRequest: GetCompanyNameRequest, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
|
||||||
|
// verify required parameter 'getCompanyNameRequest' is not null or undefined
|
||||||
|
assertParamExists('getCompanyName', 'getCompanyNameRequest', getCompanyNameRequest)
|
||||||
|
const localVarPath = `/accounts/company-name`;
|
||||||
|
// 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(getCompanyNameRequest, localVarRequestOptions, configuration)
|
||||||
|
|
||||||
|
return {
|
||||||
|
url: toPathString(localVarUrlObj),
|
||||||
|
options: localVarRequestOptions,
|
||||||
|
};
|
||||||
|
},
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @summary
|
* @summary
|
||||||
@ -3500,6 +3566,19 @@ export const AccountsApiFp = function(configuration?: Configuration) {
|
|||||||
const operationBasePath = operationServerMap['AccountsApi.getAuthors']?.[index]?.url;
|
const operationBasePath = operationServerMap['AccountsApi.getAuthors']?.[index]?.url;
|
||||||
return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, operationBasePath || basePath);
|
return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, operationBasePath || basePath);
|
||||||
},
|
},
|
||||||
|
/**
|
||||||
|
* 指定したアカウントの会社名を取得します
|
||||||
|
* @summary
|
||||||
|
* @param {GetCompanyNameRequest} getCompanyNameRequest
|
||||||
|
* @param {*} [options] Override http request option.
|
||||||
|
* @throws {RequiredError}
|
||||||
|
*/
|
||||||
|
async getCompanyName(getCompanyNameRequest: GetCompanyNameRequest, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<GetCompanyNameResponse>> {
|
||||||
|
const localVarAxiosArgs = await localVarAxiosParamCreator.getCompanyName(getCompanyNameRequest, options);
|
||||||
|
const index = configuration?.serverIndex ?? 0;
|
||||||
|
const operationBasePath = operationServerMap['AccountsApi.getCompanyName']?.[index]?.url;
|
||||||
|
return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, operationBasePath || basePath);
|
||||||
|
},
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @summary
|
* @summary
|
||||||
@ -3816,6 +3895,16 @@ export const AccountsApiFactory = function (configuration?: Configuration, baseP
|
|||||||
getAuthors(options?: any): AxiosPromise<GetAuthorsResponse> {
|
getAuthors(options?: any): AxiosPromise<GetAuthorsResponse> {
|
||||||
return localVarFp.getAuthors(options).then((request) => request(axios, basePath));
|
return localVarFp.getAuthors(options).then((request) => request(axios, basePath));
|
||||||
},
|
},
|
||||||
|
/**
|
||||||
|
* 指定したアカウントの会社名を取得します
|
||||||
|
* @summary
|
||||||
|
* @param {GetCompanyNameRequest} getCompanyNameRequest
|
||||||
|
* @param {*} [options] Override http request option.
|
||||||
|
* @throws {RequiredError}
|
||||||
|
*/
|
||||||
|
getCompanyName(getCompanyNameRequest: GetCompanyNameRequest, options?: any): AxiosPromise<GetCompanyNameResponse> {
|
||||||
|
return localVarFp.getCompanyName(getCompanyNameRequest, options).then((request) => request(axios, basePath));
|
||||||
|
},
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @summary
|
* @summary
|
||||||
@ -4104,6 +4193,18 @@ export class AccountsApi extends BaseAPI {
|
|||||||
return AccountsApiFp(this.configuration).getAuthors(options).then((request) => request(this.axios, this.basePath));
|
return AccountsApiFp(this.configuration).getAuthors(options).then((request) => request(this.axios, this.basePath));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 指定したアカウントの会社名を取得します
|
||||||
|
* @summary
|
||||||
|
* @param {GetCompanyNameRequest} getCompanyNameRequest
|
||||||
|
* @param {*} [options] Override http request option.
|
||||||
|
* @throws {RequiredError}
|
||||||
|
* @memberof AccountsApi
|
||||||
|
*/
|
||||||
|
public getCompanyName(getCompanyNameRequest: GetCompanyNameRequest, options?: AxiosRequestConfig) {
|
||||||
|
return AccountsApiFp(this.configuration).getCompanyName(getCompanyNameRequest, options).then((request) => request(this.axios, this.basePath));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @summary
|
* @summary
|
||||||
|
|||||||
@ -1,20 +1,25 @@
|
|||||||
import { createSlice } from "@reduxjs/toolkit";
|
import { createSlice } from "@reduxjs/toolkit";
|
||||||
import { LicenseSummaryState } from "./state";
|
import { LicenseSummaryState } from "./state";
|
||||||
import { getLicenseSummaryAsync } from "./operations";
|
import { getCompanyNameAsync, getLicenseSummaryAsync } from "./operations";
|
||||||
|
|
||||||
const initialState: LicenseSummaryState = {
|
const initialState: LicenseSummaryState = {
|
||||||
domain: {
|
domain: {
|
||||||
totalLicense: 0,
|
licenseSummaryInfo: {
|
||||||
allocatedLicense: 0,
|
totalLicense: 0,
|
||||||
reusableLicense: 0,
|
allocatedLicense: 0,
|
||||||
freeLicense: 0,
|
reusableLicense: 0,
|
||||||
expiringWithin14daysLicense: 0,
|
freeLicense: 0,
|
||||||
issueRequesting: 0,
|
expiringWithin14daysLicense: 0,
|
||||||
numberOfRequesting: 0,
|
issueRequesting: 0,
|
||||||
shortage: 0,
|
numberOfRequesting: 0,
|
||||||
storageSize: 0,
|
shortage: 0,
|
||||||
usedSize: 0,
|
storageSize: 0,
|
||||||
isStorageAvailable: false,
|
usedSize: 0,
|
||||||
|
isStorageAvailable: false,
|
||||||
|
},
|
||||||
|
accountInfo: {
|
||||||
|
companyName: "",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
apps: {
|
apps: {
|
||||||
isLoading: false,
|
isLoading: false,
|
||||||
@ -31,7 +36,10 @@ export const licenseSummarySlice = createSlice({
|
|||||||
},
|
},
|
||||||
extraReducers: (builder) => {
|
extraReducers: (builder) => {
|
||||||
builder.addCase(getLicenseSummaryAsync.fulfilled, (state, action) => {
|
builder.addCase(getLicenseSummaryAsync.fulfilled, (state, action) => {
|
||||||
state.domain = action.payload;
|
state.domain.licenseSummaryInfo = action.payload;
|
||||||
|
});
|
||||||
|
builder.addCase(getCompanyNameAsync.fulfilled, (state, action) => {
|
||||||
|
state.domain.accountInfo.companyName = action.payload.companyName;
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@ -5,6 +5,7 @@ import { openSnackbar } from "features/ui/uiSlice";
|
|||||||
import { getAccessToken } from "features/auth";
|
import { getAccessToken } from "features/auth";
|
||||||
import {
|
import {
|
||||||
AccountsApi,
|
AccountsApi,
|
||||||
|
GetCompanyNameResponse,
|
||||||
GetLicenseSummaryResponse,
|
GetLicenseSummaryResponse,
|
||||||
PartnerLicenseInfo,
|
PartnerLicenseInfo,
|
||||||
} from "../../../api/api";
|
} from "../../../api/api";
|
||||||
@ -66,3 +67,59 @@ export const getLicenseSummaryAsync = createAsyncThunk<
|
|||||||
return thunkApi.rejectWithValue({ error });
|
return thunkApi.rejectWithValue({ error });
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
export const getCompanyNameAsync = createAsyncThunk<
|
||||||
|
// 正常時の戻り値の型
|
||||||
|
GetCompanyNameResponse,
|
||||||
|
// 引数
|
||||||
|
{ selectedRow?: PartnerLicenseInfo },
|
||||||
|
{
|
||||||
|
// rejectした時の返却値の型
|
||||||
|
rejectValue: {
|
||||||
|
error: ErrorObject;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
>("licenses/getCompanyNameAsync", async (args, thunkApi) => {
|
||||||
|
// 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 {
|
||||||
|
const getMyAccountResponse = await accountsApi.getMyAccount({
|
||||||
|
headers: { authorization: `Bearer ${accessToken}` },
|
||||||
|
});
|
||||||
|
|
||||||
|
const { selectedRow } = args;
|
||||||
|
// 引数がない場合は自分のアカウントID取得
|
||||||
|
const accountId =
|
||||||
|
selectedRow?.accountId ?? getMyAccountResponse?.data?.account?.accountId;
|
||||||
|
|
||||||
|
if (accountId !== undefined) {
|
||||||
|
const getCompanyNameResponse = await accountsApi.getCompanyName(
|
||||||
|
{ accountId },
|
||||||
|
{
|
||||||
|
headers: { authorization: `Bearer ${accessToken}` },
|
||||||
|
}
|
||||||
|
);
|
||||||
|
return getCompanyNameResponse.data;
|
||||||
|
}
|
||||||
|
throw new Error("accountId is undefined");
|
||||||
|
} catch (e) {
|
||||||
|
// e ⇒ errorObjectに変換"
|
||||||
|
const error = createErrorObject(e);
|
||||||
|
|
||||||
|
const errorMessage = getTranslationID("common.message.internalServerError");
|
||||||
|
|
||||||
|
thunkApi.dispatch(
|
||||||
|
openSnackbar({
|
||||||
|
level: "error",
|
||||||
|
message: errorMessage,
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
return thunkApi.rejectWithValue({ error });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|||||||
@ -2,6 +2,9 @@ import { RootState } from "app/store";
|
|||||||
|
|
||||||
// 各値はそのまま画面に表示するので、licenseSummaryInfoとして値を取得する
|
// 各値はそのまま画面に表示するので、licenseSummaryInfoとして値を取得する
|
||||||
export const selecLicenseSummaryInfo = (state: RootState) =>
|
export const selecLicenseSummaryInfo = (state: RootState) =>
|
||||||
state.licenseSummary.domain;
|
state.licenseSummary.domain.licenseSummaryInfo;
|
||||||
|
|
||||||
|
export const selectCompanyName = (state: RootState) =>
|
||||||
|
state.licenseSummary.domain.accountInfo.companyName;
|
||||||
|
|
||||||
export const selectIsLoading = (state: RootState) => state.license;
|
export const selectIsLoading = (state: RootState) => state.license;
|
||||||
|
|||||||
@ -4,17 +4,22 @@ export interface LicenseSummaryState {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export interface Domain {
|
export interface Domain {
|
||||||
totalLicense: number;
|
licenseSummaryInfo: {
|
||||||
allocatedLicense: number;
|
totalLicense: number;
|
||||||
reusableLicense: number;
|
allocatedLicense: number;
|
||||||
freeLicense: number;
|
reusableLicense: number;
|
||||||
expiringWithin14daysLicense: number;
|
freeLicense: number;
|
||||||
issueRequesting: number;
|
expiringWithin14daysLicense: number;
|
||||||
numberOfRequesting: number;
|
issueRequesting: number;
|
||||||
shortage: number;
|
numberOfRequesting: number;
|
||||||
storageSize: number;
|
shortage: number;
|
||||||
usedSize: number;
|
storageSize: number;
|
||||||
isStorageAvailable: boolean;
|
usedSize: number;
|
||||||
|
isStorageAvailable: boolean;
|
||||||
|
};
|
||||||
|
accountInfo: {
|
||||||
|
companyName: string;
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface Apps {
|
export interface Apps {
|
||||||
|
|||||||
@ -8,8 +8,10 @@ import { useTranslation } from "react-i18next";
|
|||||||
import { AppDispatch } from "app/store";
|
import { AppDispatch } from "app/store";
|
||||||
import { useDispatch, useSelector } from "react-redux";
|
import { useDispatch, useSelector } from "react-redux";
|
||||||
import {
|
import {
|
||||||
|
getCompanyNameAsync,
|
||||||
getLicenseSummaryAsync,
|
getLicenseSummaryAsync,
|
||||||
selecLicenseSummaryInfo,
|
selecLicenseSummaryInfo,
|
||||||
|
selectCompanyName,
|
||||||
} from "features/license/licenseSummary";
|
} from "features/license/licenseSummary";
|
||||||
import { selectSelectedRow } from "features/license/partnerLicense";
|
import { selectSelectedRow } from "features/license/partnerLicense";
|
||||||
import { selectDelegationAccessToken } from "features/auth/selectors";
|
import { selectDelegationAccessToken } from "features/auth/selectors";
|
||||||
@ -61,9 +63,11 @@ export const LicenseSummary: React.FC<LicenseSummaryProps> = (
|
|||||||
|
|
||||||
// apiからの値取得関係
|
// apiからの値取得関係
|
||||||
const licenseSummaryInfo = useSelector(selecLicenseSummaryInfo);
|
const licenseSummaryInfo = useSelector(selecLicenseSummaryInfo);
|
||||||
|
const companyName = useSelector(selectCompanyName);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
dispatch(getLicenseSummaryAsync({ selectedRow }));
|
dispatch(getLicenseSummaryAsync({ selectedRow }));
|
||||||
|
dispatch(getCompanyNameAsync({ selectedRow }));
|
||||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||||
}, [dispatch]);
|
}, [dispatch]);
|
||||||
|
|
||||||
@ -118,7 +122,7 @@ export const LicenseSummary: React.FC<LicenseSummaryProps> = (
|
|||||||
</div>
|
</div>
|
||||||
<section className={styles.license}>
|
<section className={styles.license}>
|
||||||
<div>
|
<div>
|
||||||
<h2 className="">{"会社名" /* TODO 会社名を表示する */}</h2>
|
<h2 className="">{companyName}</h2>
|
||||||
<ul className={styles.menuAction}>
|
<ul className={styles.menuAction}>
|
||||||
<li>
|
<li>
|
||||||
{/* 他アカウントのライセンス情報を見ている場合は、前画面に戻る用のreturnボタンを表示 */}
|
{/* 他アカウントのライセンス情報を見ている場合は、前画面に戻る用のreturnボタンを表示 */}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user