Skip to content

Commit

Permalink
HPCC-31202 File permission dialog fails to open
Browse files Browse the repository at this point in the history
When checking file permissions for file scopes, dialog was not opening.
Dialog now opening for users to check permissions.

Signed-off-by: Kunal Aswani <[email protected]>
  • Loading branch information
kunalaswani committed Feb 14, 2024
1 parent 6cea89d commit cb0100c
Show file tree
Hide file tree
Showing 3 changed files with 150 additions and 2 deletions.
5 changes: 4 additions & 1 deletion esp/src/src-react/components/Permissions.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { useConfirm } from "../hooks/confirm";
import { useBuildInfo } from "../hooks/platform";
import { DojoGrid, selector, tree } from "./DojoGrid";
import { AddPermissionForm } from "./forms/AddPermission";
import { CheckPermissionsForm } from "./forms/CheckPermissions";
import { HolyGrail } from "../layouts/HolyGrail";
import { pushUrl } from "../util/history";

Expand All @@ -35,6 +36,7 @@ export const Permissions: React.FunctionComponent<PermissionsProps> = ({
const [selection, setSelection] = React.useState([]);

const [showAddPermission, setShowAddPermission] = React.useState(false);
const [showCheckFilePermissions, setShowCheckFilePermissions] = React.useState(false);
const [scopeScansEnabled, setScopeScansEnabled] = React.useState(false);
const [modulesDn, setModulesDn] = React.useState("");
const [uiState, setUIState] = React.useState({ ...defaultUIState });
Expand Down Expand Up @@ -203,7 +205,7 @@ export const Permissions: React.FunctionComponent<PermissionsProps> = ({
{ key: "fileScopeDefaults", text: nlsHPCC.FileScopeDefaultPermissions, onClick: (evt, item) => pushUrl(`/${opsCategory}/security/permissions/_/File%20Scopes`), disabled: !uiState.fileScope },
{ key: "workunitScopeDefaults", text: nlsHPCC.WorkUnitScopeDefaultPermissions, onClick: (evt, item) => pushUrl(`/${opsCategory}/security/permissions/_/Workunit%20Scopes`), disabled: !uiState.workunitScope },
{ key: "physicalFiles", text: nlsHPCC.PhysicalFiles, onClick: (evt, item) => pushUrl(`/${opsCategory}/security/permissions/file/File%20Scopes`), disabled: !uiState.fileScope },
{ key: "checkFilePermissions", text: nlsHPCC.CheckFilePermissions, disabled: !uiState.fileScope },
{ key: "checkFilePermissions", text: nlsHPCC.CheckFilePermissions, onClick: () => setShowCheckFilePermissions(true), disabled: !uiState.fileScope },
{ key: "codeGenerator", text: nlsHPCC.CodeGenerator, onClick: (evt, item) => pushUrl(`/${opsCategory}/security/permissions/_/${modulesDn}`), disabled: !uiState.repositoryModule },
],
},
Expand All @@ -223,6 +225,7 @@ export const Permissions: React.FunctionComponent<PermissionsProps> = ({
<ClearPermissionsConfirm />
<EnableScopesConfirm />
<DisableScopesConfirm />
<CheckPermissionsForm showForm={showCheckFilePermissions} setShowForm={setShowCheckFilePermissions} refreshGrid={() => refreshTable()} />
<AddPermissionForm showForm={showAddPermission} setShowForm={setShowAddPermission} refreshGrid={refreshTable} />
</>;

Expand Down
145 changes: 145 additions & 0 deletions esp/src/src-react/components/forms/CheckPermissions.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
import * as React from "react";
import { DefaultButton, Dropdown, IDropdownOption, MessageBar, MessageBarType, PrimaryButton, TextField } from "@fluentui/react";
import { scopedLogger } from "@hpcc-js/util";
import { useForm, Controller } from "react-hook-form";
import nlsHPCC from "src/nlsHPCC";
import { MessageBox } from "../../layouts/MessageBox";
import { FilePermission } from "src/ws_access";

const logger = scopedLogger("src-react/components/forms/CheckPermissions.tsx");

interface CheckPermissionsFormValues {
FileName: string;
SelectedValue: string;
}

const defaultValues: CheckPermissionsFormValues = {
FileName: "",
SelectedValue: "",
};

interface CheckPermissionsFormProps {
refreshGrid?: () => void;
showForm: boolean;
setShowForm: (_: boolean) => void;
}

export const CheckPermissionsForm: React.FunctionComponent<CheckPermissionsFormProps> = ({
refreshGrid,
showForm,
setShowForm
}) => {

const { handleSubmit, control, reset, setValue, watch } = useForm<CheckPermissionsFormValues>({ defaultValues });

const [showError, setShowError] = React.useState(false);
const [errorMessage, setErrorMessage] = React.useState("");
const [userOptions, setUserOptions] = React.useState<IDropdownOption[]>([]);
const [groupOptions, setGroupOptions] = React.useState<IDropdownOption[]>([]);
const [filePermissionResponse, setFilePermissionResponse] = React.useState<string>("");

React.useEffect(() => {
const fetchData = async () => {
try {
const { FilePermissionResponse } = await FilePermission({});
const { Users, Groups } = FilePermissionResponse;
const sortedUsers = Users?.User?.sort((a, b) => a.username.localeCompare(b.username));
const sortedGroups = Groups?.Group?.sort((a, b) => a.name.localeCompare(b.name));

setUserOptions(sortedUsers?.map((user: { username: any; }) => {
return { key: user.username, text: user.username };
}) ?? []);

setGroupOptions(sortedGroups?.map(group => {
return { key: group.name, text: group.name };
}) ?? []);
} catch (error) {
logger.error(error);
}
};

fetchData();
}, []);

const closeForm = React.useCallback(() => {
reset(defaultValues);
setShowForm(false);
setFilePermissionResponse("");
}, [reset, setShowForm]);

const onSubmit = async (data: CheckPermissionsFormValues) => {
try {
const { FileName, SelectedValue } = data;
logger.info(`Checking permissions for file ${FileName} for selected value: ${SelectedValue}`);
const response = await FilePermission({
request: {
FileName,
UserName: SelectedValue,
GroupName: SelectedValue
}
});
setFilePermissionResponse(response.FilePermissionResponse.UserPermission);
} catch (error) {
logger.error(error);
setErrorMessage("Error occurred while fetching file permissions.");
setShowError(true);
}
};

return (
<MessageBox show={showForm} setShow={closeForm} title={nlsHPCC.CheckFilePermissions} minWidth={400}
footer={<>
<PrimaryButton text={nlsHPCC.Submit} onClick={handleSubmit(onSubmit)} />
<DefaultButton text={nlsHPCC.Cancel} onClick={closeForm} />
</>}>
<Controller
control={control} name="FileName"
render={({
field: { onChange, name: fieldName, value },
fieldState: { error }
}) => <TextField
name={fieldName}
onChange={onChange}
label={nlsHPCC.Name}
value={value}
errorMessage={error && error?.message}
/>}
rules={{
required: nlsHPCC.ValidationErrorRequired
}}
/>
<Dropdown
label={nlsHPCC.Users}
options={userOptions}
selectedKey={watch("SelectedValue")}
onChange={(ev, option) => {
setValue("SelectedValue", option?.key.toString() || "");
}}
/>
<Dropdown
label={nlsHPCC.Groups}
options={groupOptions}
selectedKey={watch("SelectedValue")}
onChange={(ev, option) => {
setValue("SelectedValue", option?.key.toString() || "");
}}
/>
{filePermissionResponse && (
<TextField
label={nlsHPCC.Groups}
value={filePermissionResponse}
readOnly={true}
/>
)}
{showError &&
<div style={{ marginTop: 16 }}>
<MessageBar
messageBarType={MessageBarType.error} isMultiline={true}
onDismiss={() => setShowError(false)} dismissButtonAriaLabel="Close">
{errorMessage}
</MessageBar>
</div>
}
</MessageBox>
);
};
2 changes: 1 addition & 1 deletion esp/src/src/nls/hpcc.ts
Original file line number Diff line number Diff line change
Expand Up @@ -338,7 +338,7 @@ export = {
FileScopeDefaultPermissions: "File Scope Default Permissions",
FileSize: "File Size",
FilesNoPackage: "Files without matching package definitions",
FilePermission: "<b>File Permission</b>",
FilePermission: "File Permission",
FilesWarning: "The number of files returned is too large. Only the first 100,000 files sorted by date/time modified were returned. If you wish to limit results, set a filter.",
FilesWithUnknownSize: "Files With Unknown Size",
FileType: "File Type",
Expand Down

0 comments on commit cb0100c

Please sign in to comment.