This is an automated email from the ASF dual-hosted git repository.
fimugdha pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ranger.git
The following commit(s) were added to refs/heads/master by this push:
new 1a4784bb7 RANGER-5697 : Fix redendering policy-condition in dataset
access grant (#1090)
1a4784bb7 is described below
commit 1a4784bb7267f8188ec3f084c219d7cc11ea3a56
Author: Mugdha Varadkar <[email protected]>
AuthorDate: Mon Jul 20 15:31:20 2026 +0530
RANGER-5697 : Fix redendering policy-condition in dataset access grant
(#1090)
---
.../views/GovernedData/Dataset/AccessGrantForm.jsx | 118 ++++++++++-----------
.../GovernedData/Dataset/DatasetDetailLayout.jsx | 21 ++--
.../GovernedData/Dataset/MyDatasetListing.jsx | 2 +-
.../Datashare/DatashareDetailLayout.jsx | 56 +++-------
4 files changed, 84 insertions(+), 113 deletions(-)
diff --git
a/security-admin/src/main/webapp/react-webapp/src/views/GovernedData/Dataset/AccessGrantForm.jsx
b/security-admin/src/main/webapp/react-webapp/src/views/GovernedData/Dataset/AccessGrantForm.jsx
index e53402f6c..423dc2813 100755
---
a/security-admin/src/main/webapp/react-webapp/src/views/GovernedData/Dataset/AccessGrantForm.jsx
+++
b/security-admin/src/main/webapp/react-webapp/src/views/GovernedData/Dataset/AccessGrantForm.jsx
@@ -29,11 +29,20 @@ import {
dragOver,
getAllTimeZoneList,
policyConditionUpdatedJSON,
- isSystemAdmin
+ isSystemAdmin,
+ getPolicyConditionDisplayLbl
} from "../../../utils/XAUtils";
import { fetchApi } from "Utils/fetchAPI";
-import { isPerRowCondition } from "Utils/policyConditionUtils";
-import { maxBy, find, isEmpty, isArray, isEqual, isObject } from "lodash";
+import {
+ map,
+ maxBy,
+ find,
+ isEmpty,
+ isArray,
+ isEqual,
+ isObject,
+ join
+} from "lodash";
import userGreyIcon from "../../../images/user-grey.svg";
import groupGreyIcon from "../../../images/group-grey.svg";
import roleGreyIcon from "../../../images/role-grey.svg";
@@ -194,7 +203,21 @@ function AccessGrantForm({
if (policyData?.conditions?.length > 0) {
data.conditions = {};
for (let val of policyData.conditions) {
- data.conditions[val?.type] = val?.values?.join(",");
+ let conditionObj = find(
+ policyConditionUpdatedJSON(serviceCompData?.policyConditions),
+ function (m) {
+ if (m.name == val.type) {
+ return m;
+ }
+ }
+ );
+
+ if (!isEmpty(conditionObj.uiHint)) {
+ data.conditions[val?.type] = JSON.parse(conditionObj.uiHint)
+ .isMultiValue
+ ? val?.values
+ : val?.values.toString().trim();
+ }
}
}
}
@@ -292,9 +315,7 @@ function AccessGrantForm({
});
};
- const handleSubmit = async (values) => {
- saveAccessGrant(values);
- };
+ const handleSubmit = async () => {};
const fetchPrincipleData = async (inputValue) => {
let params = { name: inputValue || "", isVisible: 1 };
@@ -335,11 +356,7 @@ function AccessGrantForm({
return null;
};
- const onConditionChange = () => {
- onDataChange(formValues, policyData);
- };
-
- const onRemovingPolicyItem = (index) => {
+ const onRemovingPolicyItem = () => {
onDataChange(undefined, undefined);
};
@@ -358,15 +375,6 @@ function AccessGrantForm({
modifiedVal = true;
break;
}
- if (
- dirtyFieldVal == "policyItems" &&
- values.policyItems.length == 1 &&
- values.policyItems[0] == undefined
- ) {
- } else if (!isEqual(values.policyItems, initialValues.policyItems)) {
- modifiedVal = true;
- break;
- }
}
}
if (
@@ -664,7 +672,7 @@ function AccessGrantForm({
<></>
)}
- {values?.conditions && !isEmpty(values.conditions) && (
+ {!isEmpty(values.conditions) && (
<div className="gds-action-card mb-5 pl-0 pr-0">
<div className="gds-section-title">
<p className="gds-card-heading">Conditions</p>
@@ -680,49 +688,39 @@ function AccessGrantForm({
Edit Conditions
</Button>
</div>
- {Object.keys(values.conditions).map((keyName) => {
- if (isPerRowCondition(keyName)) {
- return null;
- }
- if (
- values.conditions[keyName] != "" &&
- values.conditions[keyName] != null
- ) {
- let conditionObj = find(
- serviceCompDetails?.policyConditions,
- function (m) {
- if (m.name == keyName) {
- return m;
- }
- }
- );
+
+ {(() => {
+ const policyConditions =
+ serviceCompDetails?.policyConditions || [];
+
+ return map(values.conditions, (val, key) => {
+ const conditionConfig = find(policyConditions, {
+ name: key
+ });
+ const displayLabel =
+ getPolicyConditionDisplayLbl(
+ conditionConfig?.label
+ ) || conditionConfig?.label;
+
return (
- <div className="pt-3">
- {isObject(values.conditions[keyName]) ? (
- <div>
- <span className="fnt-14">
- {values.conditions[keyName].length > 1
- ? values.conditions[keyName].map(
- (m) => {
- return ` ${m.label} `;
- }
- )
- : values.conditions[keyName].label}
- </span>
- </div>
- ) : (
- <div>
- <span className="fnt-14">
- {values.conditions[keyName]}
- </span>
- </div>
- )}
+ <div className="pt-3" key={key}>
+ <div className="d-flex align-items-center">
+ <span className="fnt-14 font-weight-bold
me-2">
+ {displayLabel} :
+ </span>
+ <span className="fnt-14">
+ {isArray(val)
+ ? join(val, ", ")
+ : String(val)}
+ </span>
+ </div>
</div>
);
- }
- })}
+ });
+ })()}
</div>
)}
+
{isAdmin && showModal && (
<Field
className="form-control"
diff --git
a/security-admin/src/main/webapp/react-webapp/src/views/GovernedData/Dataset/DatasetDetailLayout.jsx
b/security-admin/src/main/webapp/react-webapp/src/views/GovernedData/Dataset/DatasetDetailLayout.jsx
index c8ad8b369..9b06d8616 100755
---
a/security-admin/src/main/webapp/react-webapp/src/views/GovernedData/Dataset/DatasetDetailLayout.jsx
+++
b/security-admin/src/main/webapp/react-webapp/src/views/GovernedData/Dataset/DatasetDetailLayout.jsx
@@ -58,7 +58,7 @@ import groupColourIcon from
"../../../images/group-colour.svg";
import roleColourIcon from "../../../images/role-colour.svg";
import historyDetailsIcon from "../../../images/history-details.svg";
import arrayMutators from "final-form-arrays";
-import { groupBy, isEmpty, isArray } from "lodash";
+import { groupBy, isEmpty, isArray, map } from "lodash";
import PrinciplePermissionComp from "./PrinciplePermissionComp";
import ReactPaginate from "react-paginate";
import CustomBreadcrumb from "Views/CustomBreadcrumb";
@@ -1027,10 +1027,10 @@ const DatasetDetailLayout = () => {
/*Policy Condition*/
if (values?.conditions) {
data.conditions = [];
- Object.entries(values.conditions).map(([key, value]) => {
+ map(values.conditions, (value, key) => {
return data.conditions.push({
type: key,
- values: value?.split(",")
+ values: isArray(value) ? [...value] : [value]
});
});
} else {
@@ -1589,7 +1589,7 @@ const DatasetDetailLayout = () => {
>
<span className="gds-label-color">ID</span>
</div>
- <div
line-height="30px">{datasetInfo.id}</div>
+ <div>{datasetInfo.id}</div>
</div>
<div className="wrapper">
<div
@@ -1600,7 +1600,7 @@ const DatasetDetailLayout = () => {
Date Updated
</span>
</div>
- <div line-height="30px">
+ <div>
{dateFormat(
datasetInfo.updateTime,
"mm/dd/yyyy hh:MM:ss TT"
@@ -1609,15 +1609,12 @@ const DatasetDetailLayout = () => {
</div>
<div className="wrapper">
- <div
- className="gds-left-inline-field"
- line-height="30px"
- >
+ <div className="gds-left-inline-field">
<span className="gds-label-color">
Date Created
</span>
</div>
- <div line-height="30px">
+ <div>
{dateFormat(
datasetInfo.createTime,
"mm/dd/yyyy hh:MM:ss TT"
@@ -2255,8 +2252,8 @@ const DatasetDetailLayout = () => {
<Modal show={showDeleteDatasetModal} onHide={toggleClose}>
<Modal.Header closeButton>
<span className="text-word-break">
- Are you sure you want to delete dataset "
- <b>{datasetInfo.name}</b>" ?
+ Are you sure you want to delete dataset
+ <b>{datasetInfo.name}</b> ?
</span>
</Modal.Header>
<Modal.Footer>
diff --git
a/security-admin/src/main/webapp/react-webapp/src/views/GovernedData/Dataset/MyDatasetListing.jsx
b/security-admin/src/main/webapp/react-webapp/src/views/GovernedData/Dataset/MyDatasetListing.jsx
index abc9dfa13..180f13604 100755
---
a/security-admin/src/main/webapp/react-webapp/src/views/GovernedData/Dataset/MyDatasetListing.jsx
+++
b/security-admin/src/main/webapp/react-webapp/src/views/GovernedData/Dataset/MyDatasetListing.jsx
@@ -139,7 +139,7 @@ const MyDatasetListing = () => {
url: "gds/dataset/summary",
params: params
});
- datasetList = resp.data.list;
+ datasetList = resp.data.list || [];
totalCount = resp.data.totalCount;
} catch (error) {
serverError(error);
diff --git
a/security-admin/src/main/webapp/react-webapp/src/views/GovernedData/Datashare/DatashareDetailLayout.jsx
b/security-admin/src/main/webapp/react-webapp/src/views/GovernedData/Datashare/DatashareDetailLayout.jsx
index 094ace3fa..85b437f14 100755
---
a/security-admin/src/main/webapp/react-webapp/src/views/GovernedData/Datashare/DatashareDetailLayout.jsx
+++
b/security-admin/src/main/webapp/react-webapp/src/views/GovernedData/Datashare/DatashareDetailLayout.jsx
@@ -49,7 +49,6 @@ import {
policyConditionUpdatedJSON,
capitalizeFirstLetter
} from "Utils/XAUtils";
-import { isPerRowCondition } from "Utils/policyConditionUtils";
import XATableLayout from "Components/XATableLayout";
import moment from "moment-timezone";
import { getServiceDef } from "Utils/appState";
@@ -1243,24 +1242,18 @@ const DatashareDetailLayout = () => {
<div className="gds-tab-content gds-content-border
px-3">
<div className="gds-inline-field-grp">
<div className="wrapper">
- <div
- className="gds-left-inline-field"
- height="30px"
- >
+ <div className="gds-left-inline-field">
<span className="gds-label-color">ID</span>
</div>
- <div
line-height="30px">{datashareInfo.id}</div>
+ <div>{datashareInfo.id}</div>
</div>
<div className="wrapper">
- <div
- className="gds-left-inline-field pl-1 fnt-14"
- height="30px"
- >
+ <div className="gds-left-inline-field pl-1
fnt-14">
<span className="gds-label-color">
Date Updated
</span>
</div>
- <div className="fnt-14" line-height="30px">
+ <div className="fnt-14">
{dateFormat(
datashareInfo?.updateTime,
"mm/dd/yyyy hh:MM:ss TT"
@@ -1269,15 +1262,12 @@ const DatashareDetailLayout = () => {
</div>
<div className="wrapper">
- <div
- className="gds-left-inline-field pl-1 fnt-14"
- line-height="30px"
- >
+ <div className="gds-left-inline-field pl-1
fnt-14">
<span className="gds-label-color">
Date Created
</span>
</div>
- <div className="fnt-14" line-height="30px">
+ <div className="fnt-14">
{dateFormat(
datashareInfo?.createTime,
"mm/dd/yyyy hh:MM:ss TT"
@@ -1341,21 +1331,10 @@ const DatashareDetailLayout = () => {
</div>
{values.conditions !== undefined &&
Object.keys(values.conditions).map((keyName) => {
- if (isPerRowCondition(keyName)) {
- return null;
- }
if (
values.conditions[keyName] != "" &&
values.conditions[keyName] != null
) {
- let conditionObj = find(
- DSpolicyConditions,
- function (m) {
- if (m.name == keyName) {
- return m;
- }
- }
- );
return (
<div className="pt-3">
{isObject(values.conditions[keyName]) ? (
@@ -1716,11 +1695,11 @@ const DatashareDetailLayout = () => {
<Modal show={confirmDeleteModal.showPopup}
onHide={toggleClose}>
<Modal.Header closeButton>
<span className="text-word-break">
- Are you sure you want to delete shared resource "
+ Are you sure you want to delete shared resource
<b>
{confirmDeleteModal?.sharedResourceDetails?.shareName}
</b>
- " ?
+ ?
</span>
</Modal.Header>
<Modal.Footer>
@@ -1752,20 +1731,20 @@ const DatashareDetailLayout = () => {
<div className="p-1">
<div className="gds-inline-field-grp">
<div className="wrapper">
- <div className="gds-left-inline-field" height="30px">
+ <div className="gds-left-inline-field">
Boolean Expression :
</div>
- <div line-height="30px">
+ <div>
{conditionModalData?.conditionExpr != undefined
? conditionModalData.conditionExpr
: ""}
</div>
</div>
<div className="wrapper">
- <div className="gds-left-inline-field" height="30px">
+ <div className="gds-left-inline-field">
Access Type :
</div>
- <div line-height="30px">
+ <div>
{conditionModalData?.accessTypes != undefined
? conditionModalData.accessTypes.toString()
: ""}
@@ -1773,13 +1752,10 @@ const DatashareDetailLayout = () => {
</div>
{false && (
<div className="wrapper">
- <div
- className="gds-left-inline-field"
- height="30px"
- >
+ <div className="gds-left-inline-field">
Row Filter :
</div>
- <div line-height="30px">
+ <div>
{conditionModalData?.rowFilter != undefined
? conditionModalData.rowFilter.filterExpr
: ""}
@@ -1854,8 +1830,8 @@ const DatashareDetailLayout = () => {
<Modal show={showDeleteDatashareModal} onHide={toggleClose}>
<Modal.Header closeButton>
<span className="text-word-break">
- Are you sure you want to delete datashare "
- <b>{datashareInfo?.name}</b>" ?
+ Are you sure you want to delete datashare
+ <b>{datashareInfo?.name}</b> ?
</span>
</Modal.Header>
<Modal.Footer>