Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Variogram result status #391

Merged
merged 2 commits into from
Dec 11, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
103 changes: 52 additions & 51 deletions src/api/generated/core/request.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,6 @@
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
import axios from 'axios';
import type { AxiosError, AxiosRequestConfig, AxiosResponse, AxiosInstance } from 'axios';
import FormData from 'form-data';

import { ApiError } from './ApiError';
import type { ApiRequestOptions } from './ApiRequestOptions';
import type { ApiResult } from './ApiResult';
Expand Down Expand Up @@ -42,10 +38,6 @@ export const isFormData = (value: any): value is FormData => {
return value instanceof FormData;
};

export const isSuccess = (status: number): boolean => {
return status >= 200 && status < 300;
};

export const base64 = (str: string): string => {
try {
return btoa(str);
Expand Down Expand Up @@ -144,24 +136,22 @@ export const resolve = async <T>(options: ApiRequestOptions, resolver?: T | Reso
return resolver;
};

export const getHeaders = async (config: OpenAPIConfig, options: ApiRequestOptions, formData?: FormData): Promise<Record<string, string>> => {
export const getHeaders = async (config: OpenAPIConfig, options: ApiRequestOptions): Promise<Headers> => {
const token = await resolve(options, config.TOKEN);
const username = await resolve(options, config.USERNAME);
const password = await resolve(options, config.PASSWORD);
const additionalHeaders = await resolve(options, config.HEADERS);
const formHeaders = typeof formData?.getHeaders === 'function' && formData?.getHeaders() || {}

const headers = Object.entries({
Accept: 'application/json',
...additionalHeaders,
...options.headers,
...formHeaders,
})
.filter(([_, value]) => isDefined(value))
.reduce((headers, [key, value]) => ({
...headers,
[key]: String(value),
}), {} as Record<string, string>);
.filter(([_, value]) => isDefined(value))
.reduce((headers, [key, value]) => ({
...headers,
[key]: String(value),
}), {} as Record<string, string>);

if (isStringWithValue(token)) {
headers['Authorization'] = `Bearer ${token}`;
Expand All @@ -184,63 +174,75 @@ export const getHeaders = async (config: OpenAPIConfig, options: ApiRequestOptio
}
}

return headers;
return new Headers(headers);
};

export const getRequestBody = (options: ApiRequestOptions): any => {
if (options.body) {
return options.body;
if (options.body !== undefined) {
if (options.mediaType?.includes('/json')) {
return JSON.stringify(options.body)
} else if (isString(options.body) || isBlob(options.body) || isFormData(options.body)) {
return options.body;
} else {
return JSON.stringify(options.body);
}
}
return undefined;
};

export const sendRequest = async <T>(
export const sendRequest = async (
config: OpenAPIConfig,
options: ApiRequestOptions,
url: string,
body: any,
formData: FormData | undefined,
headers: Record<string, string>,
onCancel: OnCancel,
axiosClient: AxiosInstance
): Promise<AxiosResponse<T>> => {
const source = axios.CancelToken.source();

const requestConfig: AxiosRequestConfig = {
url,
headers: Headers,
onCancel: OnCancel
): Promise<Response> => {
const controller = new AbortController();

const request: RequestInit = {
headers,
data: body ?? formData,
body: body ?? formData,
method: options.method,
withCredentials: config.WITH_CREDENTIALS,
cancelToken: source.token,
signal: controller.signal,
};

onCancel(() => source.cancel('The user aborted a request.'));

try {
return await axiosClient.request(requestConfig);
} catch (error) {
const axiosError = error as AxiosError<T>;
if (axiosError.response) {
return axiosError.response;
}
throw error;
if (config.WITH_CREDENTIALS) {
request.credentials = config.CREDENTIALS;
}

onCancel(() => controller.abort());

return await fetch(url, request);
};

export const getResponseHeader = (response: AxiosResponse<any>, responseHeader?: string): string | undefined => {
export const getResponseHeader = (response: Response, responseHeader?: string): string | undefined => {
if (responseHeader) {
const content = response.headers[responseHeader];
const content = response.headers.get(responseHeader);
if (isString(content)) {
return content;
}
}
return undefined;
};

export const getResponseBody = (response: AxiosResponse<any>): any => {
export const getResponseBody = async (response: Response): Promise<any> => {
if (response.status !== 204) {
return response.data;
try {
const contentType = response.headers.get('Content-Type');
if (contentType) {
const jsonTypes = ['application/json', 'application/problem+json']
const isJSON = jsonTypes.some(type => contentType.toLowerCase().startsWith(type));
if (isJSON) {
return await response.json();
} else {
return await response.text();
}
}
} catch (error) {
console.error(error);
}
}
return undefined;
};
Expand Down Expand Up @@ -283,26 +285,25 @@ export const catchErrorCodes = (options: ApiRequestOptions, result: ApiResult):
* Request method
* @param config The OpenAPI configuration object
* @param options The request options from the service
* @param axiosClient The axios client instance to use
* @returns CancelablePromise<T>
* @throws ApiError
*/
export const request = <T>(config: OpenAPIConfig, options: ApiRequestOptions, axiosClient: AxiosInstance = axios): CancelablePromise<T> => {
export const request = <T>(config: OpenAPIConfig, options: ApiRequestOptions): CancelablePromise<T> => {
return new CancelablePromise(async (resolve, reject, onCancel) => {
try {
const url = getUrl(config, options);
const formData = getFormData(options);
const body = getRequestBody(options);
const headers = await getHeaders(config, options, formData);
const headers = await getHeaders(config, options);

if (!onCancel.isCancelled) {
const response = await sendRequest<T>(config, options, url, body, formData, headers, onCancel, axiosClient);
const responseBody = getResponseBody(response);
const response = await sendRequest(config, options, url, body, formData, headers, onCancel);
const responseBody = await getResponseBody(response);
const responseHeader = getResponseHeader(response, options.responseHeader);

const result: ApiResult = {
url,
ok: isSuccess(response.status),
ok: response.ok,
status: response.status,
statusText: response.statusText,
body: responseHeader ?? responseBody,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,6 @@

export type UpdateVariogramResultCommandBody = {
status: string;
identifier: number;
};

3 changes: 2 additions & 1 deletion src/api/generated/models/UpdateVariogramResultDto.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ import type { ResultStatus } from './ResultStatus';

export type UpdateVariogramResultDto = {
analogueModelId: string;
variogramResultId: string;
computeCaseId: string;
status: ResultStatus;
identifier: number;
};

10 changes: 5 additions & 5 deletions src/api/generated/services/ResultsService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -90,22 +90,22 @@ export class ResultsService {

/**
* @param id
* @param variogramId
* @param computeCaseId
* @param requestBody
* @returns UpdateVariogramResultCommandResponse Success
* @throws ApiError
*/
public static putApiAnalogueModelsResultsVariogram(
public static putApiAnalogueModelsComputecasesResults(
id: string,
variogramId: string,
computeCaseId: string,
requestBody?: UpdateVariogramResultCommandBody,
): CancelablePromise<UpdateVariogramResultCommandResponse> {
return __request(OpenAPI, {
method: 'PUT',
url: '/api/analogue-models/{id}/results/variogram/{variogramId}',
url: '/api/analogue-models/{id}/computecases/{computeCaseId}/results',
path: {
'id': id,
'variogramId': variogramId,
'computeCaseId': computeCaseId,
},
body: requestBody,
mediaType: 'application/json-patch+json',
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
/* eslint-disable max-lines */
/* eslint-disable sort-imports */
/* eslint-disable max-lines-per-function */
import { Fragment } from 'react';
import { ChangeEvent, Fragment } from 'react';

import { Button, Icon } from '@equinor/eds-core-react';
import { Button, Icon, Switch } from '@equinor/eds-core-react';
import {
chevron_down as DOWN,
chevron_right as RIGHT,
Expand All @@ -19,11 +19,17 @@ import {
import {
GetVariogramResultsDto,
GetVariogramResultsVariogramResultFileDto,
ResultStatus,
UpdateVariogramResultCommandBody,
// UpdateVariogramResultCommandBody,
} from '../../../../../../../api/generated';
import { usePepmContextStore } from '../../../../../../../hooks/GlobalState';
import { roundResultString } from '../../../../../../../utils/RoundResultString';
import { SubRowResult } from '../SubRowResult/SubRowResult';
import * as Styled from './TanStackTable.styled';
import { useIsOwnerOrAdmin } from '../../../../../../../hooks/useIsOwnerOrAdmin';
import { useMutateVariogramResult } from '../../../../../../../hooks/useMutateResults';
// import { useMutateVariogramResult } from '../../../../../../../hooks/useMutateResults';

export interface ResultObjectType {
variogramResultId: string;
Expand All @@ -44,6 +50,7 @@ export interface ResultObjectType {
modelArea: string;
variogramModel: string;
identifier: number;
status: ResultStatus;
subRows?: ResultObjectType[];
}

Expand Down Expand Up @@ -131,7 +138,53 @@ export const TanStackTable = ({
}: {
resultList: GetVariogramResultsDto[];
}) => {
const { computeCases } = usePepmContextStore();
const {
computeCases,
analogueModel,
variogramResults,
updateVariogramResult,
} = usePepmContextStore();
const isOwner = useIsOwnerOrAdmin();
const mutateVariogramResult = useMutateVariogramResult();

const putUpdateVariogramResult = async (
status: ResultStatus,
variogram: ResultObjectType,
) => {
const requestBody: UpdateVariogramResultCommandBody = {
status: status,
identifier: variogram.identifier,
};

const variogramUpdate = await mutateVariogramResult.mutateAsync({
id: analogueModel.analogueModelId,
computeCaseId: variogram.computeCaseId,
requestBody: requestBody,
});

if (variogramUpdate.success) {
variogramResults.forEach((elem) => {
if (
elem.computeCaseId === variogram.computeCaseId &&
elem.identifier === variogram.identifier
)
updateVariogramResult({ ...elem, status: status });
});
}
};

const updateStatus = (checked: boolean, variogram: ResultObjectType) => {
if (checked) {
putUpdateVariogramResult(ResultStatus.PUBLISH, variogram);
} else {
putUpdateVariogramResult(ResultStatus.DRAFT, variogram);
}
};

const checkedStatus = (variogram: ResultObjectType) => {
if (variogram.status === ResultStatus.PUBLISH) return true;
return false;
};

const getSubRows = (computeCaseId: string, identifier: number) => {
const subRowArray: ResultObjectType[] = [];
Expand Down Expand Up @@ -178,6 +231,7 @@ export const TanStackTable = ({
variogramModel: e.family ? e.family : '',
quality: roundResultString(e.quality),
identifier: e.identifier,
status: e.status,
};

subRowArray.push(element);
Expand Down Expand Up @@ -230,6 +284,24 @@ export const TanStackTable = ({
header: () => <div>Model Area</div>,
id: 'modelArea',
},
{
accessorKey: 'status',
header: () => <div>Published</div>,
cell: ({ row }) => {
return (
row.getCanExpand() && (
<Switch
onChange={(e: ChangeEvent<HTMLInputElement>) => {
updateStatus(e.target.checked, row.original);
}}
checked={checkedStatus(row.original)}
disabled={!isOwner}
></Switch>
)
);
},
id: 'status',
},
];

const getRows = () => {
Expand Down Expand Up @@ -279,6 +351,7 @@ export const TanStackTable = ({
variogramModel: e.family ? e.family : '',
quality: roundResultString(e.quality),
identifier: e.identifier,
status: e.status,
};
rowArray.push(element);
});
Expand Down
8 changes: 4 additions & 4 deletions src/hooks/useMutateResults.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,16 +35,16 @@ export const useMutateVariogramResult = () => {
const putVariogramResult = useMutation({
mutationFn: ({
id,
variogramId,
computeCaseId,
requestBody,
}: {
id: string;
variogramId: string;
computeCaseId: string;
requestBody: UpdateVariogramResultCommandBody;
}) => {
return ResultsService.putApiAnalogueModelsResultsVariogram(
return ResultsService.putApiAnalogueModelsComputecasesResults(
id,
variogramId,
computeCaseId,
requestBody,
);
},
Expand Down
Loading