Skip to content

Commit

Permalink
feat: Variogram result status (#391)
Browse files Browse the repository at this point in the history
* feat: Added status switch for variogram result
  • Loading branch information
thomaslf97 authored Dec 11, 2024
1 parent 10bc4c2 commit ca4c3bf
Show file tree
Hide file tree
Showing 6 changed files with 140 additions and 64 deletions.
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

0 comments on commit ca4c3bf

Please sign in to comment.