Skip to content

Commit

Permalink
Merge pull request #105 from ssi-dk/feat/clone-workspaces
Browse files Browse the repository at this point in the history
feat: add ability to clone workspaces
  • Loading branch information
DG-KFuglsang committed Sep 19, 2024
2 parents 420f9ee + 33b0f6f commit 393fc5c
Show file tree
Hide file tree
Showing 15 changed files with 431 additions and 1 deletion.
57 changes: 57 additions & 0 deletions app/src/app/workspaces/clone-workspace.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
import React, { useCallback, useEffect, useState } from "react";
import { useToast } from "@chakra-ui/react";
import { useMutation } from "redux-query-react";
import { useTranslation } from "react-i18next";
import { cloneWorkspace } from "./workspaces-query-configs";
import { IconButton } from "@chakra-ui/react";
import { CopyIcon } from "@chakra-ui/icons";

type Props = {
id: string;
samples: string[];
};

export function CloneWorkspace(props: Props) {
const { t } = useTranslation();
const toast = useToast();

const [
cloneWorkspaceQueryState,
cloneWorkspaceMutation,
] = useMutation((name: string, id: string) => cloneWorkspace({ name, id, samples: props.samples }));

const [needsNotify, setNeedsNotify] = useState(true);

const cloneWorkspaceCallback = useCallback(() => {
const name = prompt("Workspace name");
if (name) {
setNeedsNotify(true);
cloneWorkspaceMutation(name, props.id);
}
}, [cloneWorkspaceMutation, setNeedsNotify, props.id]);

useEffect(() => {
if (
needsNotify &&
cloneWorkspaceQueryState.status >= 200 &&
cloneWorkspaceQueryState.status < 300 &&
!cloneWorkspaceQueryState.isPending
) {
toast({
title: t("Workspace cloned"),
status: "info",
duration: 3000,
isClosable: true,
});
setNeedsNotify(false);
}
}, [t, cloneWorkspaceQueryState, toast, needsNotify, setNeedsNotify]);

return (
<IconButton
icon={<CopyIcon />}
aria-label={`${t("Clone workspace")}`}
onClick={cloneWorkspaceCallback}
/>
);
}
27 changes: 26 additions & 1 deletion app/src/app/workspaces/workspaces-query-configs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,9 @@ import {
DeleteWorkspaceRequest,
PostWorkspaceRequest,
DeleteWorkspaceSampleRequest,
cloneWorkspace as cloneWorkspaceApi,
} from "sap-client";
import { CreateWorkspace, WorkspaceInfo } from "sap-client/models";
import { CreateWorkspace, WorkspaceInfo, CloneWorkspace } from "sap-client/models";
import { getUrl } from "service";

export type WorkspacesSlice = {
Expand Down Expand Up @@ -106,6 +107,30 @@ export const createWorkspace = (params: CreateWorkspace) => {
return base;
};

export const cloneWorkspace = (params: CloneWorkspace & { samples: string[] }) => {
const base = cloneWorkspaceApi({ cloneWorkspace: params });
base.url = getUrl(base.url);

base.transform = (response) => {
if (!response.id) {
return undefined;
}
return { workspaces: [{ id: response.id, name: params.name, samples: params.samples }] };
};


base.update = {
workspaces: (oldValue, newValue) => {
if (!newValue) {
return oldValue;
}
return [].concat(...oldValue, ...newValue);
},
};
base.force = true;
return base;
};

export const updateWorkspace = (params: PostWorkspaceRequest) => {
const base = postWorkspaceApi(params);
base.url = getUrl(base.url);
Expand Down
2 changes: 2 additions & 0 deletions app/src/app/workspaces/workspaces.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import type { Workspace } from "sap-client";
import { DeleteWorkspace } from "./delete-workspace";
import { CreateWorkspace } from "./create-workspace";
import { ViewWorkspace } from "./view-workspace";
import { CloneWorkspace } from "./clone-workspace";

export function Workspaces() {
const [workspacesQueryState] = useRequest(fetchWorkspaces());
Expand Down Expand Up @@ -63,6 +64,7 @@ export function Workspaces() {
<Td>
<div style={{ display: "flex", columnGap: "4px" }}>
<ViewWorkspace id={h.id} />
<CloneWorkspace id={h.id} samples={h.samples}/>
<DeleteWorkspace id={h.id} />
</div>
</Td>
Expand Down
49 changes: 49 additions & 0 deletions app/src/sap-client/apis/WorkspacesApi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@
import { HttpMethods, QueryConfig, ResponseBody, ResponseText } from 'redux-query';
import * as runtime from '../runtime';
import {
CloneWorkspace,
CloneWorkspaceFromJSON,
CloneWorkspaceToJSON,
CreateWorkspace,
CreateWorkspaceFromJSON,
CreateWorkspaceToJSON,
Expand All @@ -29,6 +32,10 @@ import {
WorkspaceInfoToJSON,
} from '../models';

export interface CloneWorkspaceRequest {
cloneWorkspace?: CloneWorkspace;
}

export interface CreateWorkspaceRequest {
createWorkspace?: CreateWorkspace;
}
Expand All @@ -52,6 +59,48 @@ export interface PostWorkspaceRequest {
}


/**
*/
function cloneWorkspaceRaw<T>(requestParameters: CloneWorkspaceRequest, requestConfig: runtime.TypedQueryConfig<T, void> = {}): QueryConfig<T> {
let queryParameters = null;


const headerParameters : runtime.HttpHeaders = {};

headerParameters['Content-Type'] = 'application/json';


const { meta = {} } = requestConfig;

meta.authType = ['bearer'];
const config: QueryConfig<T> = {
url: `${runtime.Configuration.basePath}/workspace/clone`,
meta,
update: requestConfig.update,
queryKey: requestConfig.queryKey,
optimisticUpdate: requestConfig.optimisticUpdate,
force: requestConfig.force,
rollback: requestConfig.rollback,
options: {
method: 'POST',
headers: headerParameters,
},
body: queryParameters || CloneWorkspaceToJSON(requestParameters.cloneWorkspace),
};

const { transform: requestTransform } = requestConfig;
if (requestTransform) {
}

return config;
}

/**
*/
export function cloneWorkspace<T>(requestParameters: CloneWorkspaceRequest, requestConfig?: runtime.TypedQueryConfig<T, void>): QueryConfig<T> {
return cloneWorkspaceRaw(requestParameters, requestConfig);
}

/**
*/
function createWorkspaceRaw<T>(requestParameters: CreateWorkspaceRequest, requestConfig: runtime.TypedQueryConfig<T, void> = {}): QueryConfig<T> {
Expand Down
52 changes: 52 additions & 0 deletions app/src/sap-client/models/CloneWorkspace.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
// tslint:disable
/**
* SOFI
* SOFI Sekvensanalyseplatform
*
* The version of the OpenAPI document: 0.1.0
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/

import { exists, mapValues } from '../runtime';
/**
*
* @export
* @interface CloneWorkspace
*/
export interface CloneWorkspace {
/**
*
* @type {string}
* @memberof CloneWorkspace
*/
name: string;
/**
*
* @type {string}
* @memberof CloneWorkspace
*/
id: string;
}

export function CloneWorkspaceFromJSON(json: any): CloneWorkspace {
return {
'name': json['name'],
'id': json['id'],
};
}

export function CloneWorkspaceToJSON(value?: CloneWorkspace): any {
if (value === undefined) {
return undefined;
}
return {
'name': value.name,
'id': value.id,
};
}


1 change: 1 addition & 0 deletions app/src/sap-client/models/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ export * from './ApprovalRequest';
export * from './ApprovalStatus';
export * from './BaseMetadata';
export * from './BioApiStatus';
export * from './CloneWorkspace';
export * from './Column';
export * from './CreateWorkspace';
export * from './DataClearance';
Expand Down
27 changes: 27 additions & 0 deletions openapi_specs/SOFI/SOFI.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,20 @@ paths:
tags:
- workspaces
x-openapi-router-controller: web.src.SAP.generated.controllers.workspaces_controller
/workspace/clone:
post:
operationId: clone_workspace
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/CloneWorkspace"
responses:
'204':
description: "Workspace cloned."
tags:
- workspaces
x-openapi-router-controller: web.src.SAP.generated.controllers.workspaces_controller
/workspace/{workspace_id}/{sample_id}:
delete:
description: Delete sample from workspace
Expand Down Expand Up @@ -1550,6 +1564,19 @@ components:
required:
- name

CloneWorkspace:
properties:
name:
type: string
title: Name
id:
type: string
title: Id
type: object
required:
- name
- id

UpdateWorkspace:
properties:
samples:
Expand Down
27 changes: 27 additions & 0 deletions web/openapi_specs/SOFI/SOFI.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,20 @@ paths:
tags:
- workspaces
x-openapi-router-controller: web.src.SAP.generated.controllers.workspaces_controller
/workspace/clone:
post:
operationId: clone_workspace
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/CloneWorkspace"
responses:
'204':
description: "Workspace cloned."
tags:
- workspaces
x-openapi-router-controller: web.src.SAP.generated.controllers.workspaces_controller
/workspace/{workspace_id}/{sample_id}:
delete:
description: Delete sample from workspace
Expand Down Expand Up @@ -1550,6 +1564,19 @@ components:
required:
- name

CloneWorkspace:
properties:
name:
type: string
title: Name
id:
type: string
title: Id
type: object
required:
- name
- id

UpdateWorkspace:
properties:
samples:
Expand Down
15 changes: 15 additions & 0 deletions web/src/SAP/generated/controllers/workspaces_controller.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,21 @@
from .. import util
from ...src.controllers import WorkspacesController

def clone_workspace(user, token_info, clone_workspace=None): # noqa: E501
"""clone_workspace
# noqa: E501
:param clone_workspace:
:type clone_workspace: dict | bytes
:rtype: None
"""
if connexion.request.is_json:
from ..models import CloneWorkspace
clone_workspace = CloneWorkspace.from_dict(connexion.request.get_json()) # noqa: E501
return WorkspacesController.clone_workspace(user, token_info, clone_workspace)

def create_workspace(user, token_info, create_workspace=None): # noqa: E501
"""create_workspace
Expand Down
1 change: 1 addition & 0 deletions web/src/SAP/generated/models/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
from .base_metadata import BaseMetadata
from .bio_api_status import BioApiStatus
from .bulk_upload_request import BulkUploadRequest
from .clone_workspace import CloneWorkspace
from .column import Column
from .create_workspace import CreateWorkspace
from .data_clearance import DataClearance
Expand Down
Loading

0 comments on commit 393fc5c

Please sign in to comment.