blob: 7851e7c26a54bb2bb2b127ba54f9b1f0b561c484 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import React, { useState, useReducer } from "react";
import { Button } from "react-bootstrap";
import { useNavigate } from "react-router-dom";
import { serverError } from "../../../utils/XAUtils";
import { fetchApi } from "Utils/fetchAPI";
import { toast } from "react-toastify";
import { Form } from "react-final-form";
import arrayMutators from "final-form-arrays";
import PrinciplePermissionComp from "./PrinciplePermissionComp";
const initialState = {
dataset: {},
loader: false,
preventUnBlock: false,
blockUI: false,
selectedPrinciple: []
};
const datasetFormReducer = (state, action) => {
switch (action.type) {
case "SET_SELECTED_PRINCIPLE":
return {
...state,
selectedPrinciple: action.selectedPrinciple
};
case "SET_PREVENT_ALERT":
return {
...state,
preventUnBlock: action.preventUnBlock
};
case "SET_BLOCK_UI":
return {
...state,
blockUI: action.blockUI
};
default:
throw new Error();
}
};
const AddDatasetView = () => {
const navigate = useNavigate();
const [dataSetDetails, dispatch] = useReducer(
datasetFormReducer,
initialState
);
const [step, setStep] = useState(1);
const [dataset] = useState({
name: "",
acl: {
users: {},
groups: {},
roles: {}
},
description: "",
termsOfUse: ""
});
const [datasetName, setName] = useState();
const [datasetDescription, setDatasetDescription] = useState();
const [datasetTermsAndConditions, setDatasetTermsAndConditions] =
useState("");
const [saveButtonText, setSaveButtonText] = useState("Continue");
const [userList, setUserList] = useState([]);
const [groupList, setGroupList] = useState([]);
const [roleList, setRoleList] = useState([]);
const datasetNameChange = (event) => {
setName(event.target.value);
dataset.name = event.target.value;
};
const datasetDescriptionChange = (event) => {
setDatasetDescription(event.target.value);
dataset.description = event.target.value;
};
const datasetTermsAndConditionsChange = (event) => {
setDatasetTermsAndConditions(event.target.value);
dataset.termsOfUse = event.target.value;
};
const handleDataChange = (userList, groupList, roleList) => {
setUserList(userList);
setGroupList(groupList);
setRoleList(roleList);
};
const handleSubmit = async (values) => {
if (step == 3) {
userList.forEach((user) => {
dataset.acl.users[user.name] = user.perm;
});
groupList.forEach((group) => {
dataset.acl.groups[group.name] = group.perm;
});
roleList.forEach((role) => {
dataset.acl.roles[role.name] = role.perm;
});
dispatch({
type: "SET_PREVENT_ALERT",
preventUnBlock: true
});
try {
dispatch({
type: "SET_BLOCK_UI",
blockUI: true
});
const createDatasetResp = await fetchApi({
url: `gds/dataset`,
method: "post",
data: dataset
});
toast.success("Dataset created successfully!!");
self.location.hash = "#/gds/mydatasetlisting";
} catch (error) {
dispatch({
type: "SET_BLOCK_UI",
blockUI: false
});
serverError(error);
console.error(`Error occurred while creating dataset ${error}`);
}
} else if (step == 2) {
setSaveButtonText("Create Dataset");
setStep(step + 1);
} else if (step == 1) {
if (datasetName == undefined) {
toast.error("Dataset name cannot be empty!!");
return;
}
else if (datasetName.length>512)
{
toast.error("Dataset name must not exceed 512 characters!!");
return;
}
setSaveButtonText("Continue");
setStep(step + 1);
}
};
const cancelDatasetDetails = () => {
if (step == 1) {
navigate("/gds/mydatasetlisting");
} else {
let txt = "";
for (let x in dataset.acl.users) {
txt += dataset.acl.users[x] + " ";
}
setStep(step - 1);
}
setSaveButtonText("Continue");
};
return (
<>
<Form
onSubmit={handleSubmit}
mutators={{
...arrayMutators
}}
render={({ handleSubmit }) => (
<>
<div className="gds-form-header-wrapper">
<h3 className="gds-header bold">Create Dataset</h3>
<div className="gds-header-btn-grp">
<Button
variant="secondary"
type="button"
size="sm"
onClick={cancelDatasetDetails}
data-id="cancel"
data-cy="cancel"
>
Back
</Button>
<Button
variant="primary"
onClick={handleSubmit}
size="sm"
data-id="save"
data-cy="save"
>
{saveButtonText}
</Button>
</div>
</div>
{step == 1 && (
<div className="gds-form-wrap">
<div className="gds-form-header">
<h6 className="gds-form-step-num">Step 1</h6>
<h2 className="gds-form-step-name">
Enter dataset name and description
</h2>
</div>
<div className="gds-form-content">
<div className="gds-form-input">
<input
type="text"
name="datasetName"
placeholder="Dataset Name"
className="form-control"
data-cy="datasetName"
onChange={datasetNameChange}
value={datasetName}
/>
</div>
<div className="gds-form-input">
<textarea
placeholder="Dataset Description"
className="form-control"
id="description"
data-cy="description"
onChange={datasetDescriptionChange}
value={datasetDescription}
rows={4}
/>
</div>
</div>
</div>
)}
{step == 2 && (
<div className="gds-form-wrap">
<div className="gds-form-header">
<h6 className="gds-form-step-num">Step 2</h6>
<h2 className="gds-form-step-name">Dataset Visibility</h2>
</div>
<PrinciplePermissionComp
userList={userList}
groupList={groupList}
roleList={roleList}
type="dataset"
onDataChange={handleDataChange}
/>
</div>
)}
{step == 3 && (
<div className="gds-form-wrap">
<div className="gds-form-header">
<h6 className="gds-form-step-num">Step 3</h6>
<h2 className="gds-form-step-name">
Specify terms and conditions
</h2>
</div>
<table className="gds-table">
<tr>
<td>
<textarea
placeholder="Terms & Conditions"
className="form-control"
id="termsAndConditions"
data-cy="termsAndConditions"
onChange={datasetTermsAndConditionsChange}
value={datasetTermsAndConditions}
rows={16}
/>
</td>
</tr>
</table>
</div>
)}
</>
)}
/>
</>
);
};
export default AddDatasetView;