This is an automated email from the ASF dual-hosted git repository.
dhavalrajpara 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 3cca69231 RANGER-5330 : Disable tab selection in Ranger UI form fields
(#773)
3cca69231 is described below
commit 3cca69231bfe9920c0d432a25d10aa79574ef3b0
Author: Dhaval Rajpara <[email protected]>
AuthorDate: Thu Jan 29 21:29:46 2026 +0530
RANGER-5330 : Disable tab selection in Ranger UI form fields (#773)
Co-authored-by: Dhaval Rajpara <[email protected]>
---
.../src/main/webapp/react-webapp/src/utils/XAUtils.js | 2 +-
.../src/views/PermissionsModule/EditPermission.jsx | 8 +++++---
.../src/views/PolicyListing/AddUpdatePolicyForm.jsx | 19 +++++++++++++++++++
.../src/views/PolicyListing/PolicyPermissionItem.jsx | 6 ++++++
.../src/views/PolicyListing/TagBasePermissionItem.jsx | 1 +
.../src/views/Reports/UserAccessLayout.jsx | 6 ++++++
.../react-webapp/src/views/Resources/ResourceComp.jsx | 1 +
.../src/views/Resources/ResourceSelectComp.jsx | 14 ++++++++++++++
.../src/views/SecurityZone/SecurityZoneForm.jsx | 8 ++++++++
.../src/views/ServiceManager/ServiceAuditFilter.jsx | 3 +++
.../src/views/ServiceManager/ServiceDefinitions.jsx | 1 +
.../src/views/ServiceManager/ServiceForm.jsx | 8 ++------
.../react-webapp/src/views/SideBar/TopNavBar.jsx | 2 ++
.../UserGroupRoleListing/role_details/RoleForm.jsx | 6 ++++++
.../UserGroupRoleListing/users_details/UserForm.jsx | 3 +++
15 files changed, 78 insertions(+), 10 deletions(-)
diff --git a/security-admin/src/main/webapp/react-webapp/src/utils/XAUtils.js
b/security-admin/src/main/webapp/react-webapp/src/utils/XAUtils.js
index 21a163531..0f9f66b58 100644
--- a/security-admin/src/main/webapp/react-webapp/src/utils/XAUtils.js
+++ b/security-admin/src/main/webapp/react-webapp/src/utils/XAUtils.js
@@ -1082,7 +1082,7 @@ export const InfoIcon = (props) => {
};
/* Edit Permission Module Infinite Scroll */
-export const CustomInfinteScroll = (props) => {
+export const CustomInfiniteScroll = (props) => {
const { data, removeUsrGrp, scrollableDiv } = props;
const [count, setCount] = useState({
startIndex: 0,
diff --git
a/security-admin/src/main/webapp/react-webapp/src/views/PermissionsModule/EditPermission.jsx
b/security-admin/src/main/webapp/react-webapp/src/views/PermissionsModule/EditPermission.jsx
index c482363a1..e2d422130 100755
---
a/security-admin/src/main/webapp/react-webapp/src/views/PermissionsModule/EditPermission.jsx
+++
b/security-admin/src/main/webapp/react-webapp/src/views/PermissionsModule/EditPermission.jsx
@@ -39,7 +39,7 @@ import { toast } from "react-toastify";
import { cloneDeep, find, findIndex, isEmpty, map, reverse } from "lodash";
import { AccessResult } from "Utils/XAEnums";
import {
- CustomInfinteScroll,
+ CustomInfiniteScroll,
commonBreadcrumb,
serverError
} from "Utils/XAUtils";
@@ -414,6 +414,7 @@ const EditPermission = () => {
placeholder="Select Groups"
isMulti
styles={selectInputCustomStyles}
+ tabSelectsValue={false}
/>
<Button
size="sm"
@@ -461,6 +462,7 @@ const EditPermission = () => {
placeholder="Select Users"
isMulti
styles={selectInputCustomStyles}
+ tabSelectsValue={false}
/>
<Button
@@ -502,7 +504,7 @@ const EditPermission = () => {
></Spinner>
</div>
) : (
- <CustomInfinteScroll
+ <CustomInfiniteScroll
data={selectedGrp}
removeUsrGrp={handleRemoveGrp}
scrollableDiv="scrollableGrpDiv"
@@ -528,7 +530,7 @@ const EditPermission = () => {
></Spinner>
</div>
) : (
- <CustomInfinteScroll
+ <CustomInfiniteScroll
data={selectedUsr}
removeUsrGrp={handleRemoveUsr}
scrollableDiv="scrollableUsrDiv"
diff --git
a/security-admin/src/main/webapp/react-webapp/src/views/PolicyListing/AddUpdatePolicyForm.jsx
b/security-admin/src/main/webapp/react-webapp/src/views/PolicyListing/AddUpdatePolicyForm.jsx
index 515c2b0d0..2981b74f9 100644
---
a/security-admin/src/main/webapp/react-webapp/src/views/PolicyListing/AddUpdatePolicyForm.jsx
+++
b/security-admin/src/main/webapp/react-webapp/src/views/PolicyListing/AddUpdatePolicyForm.jsx
@@ -1393,6 +1393,25 @@ export default function AddUpdatePolicyForm() {
}}
defaultOptions={defaultPolicyLabelOptions}
styles={selectInputCustomStyles}
+ // Add this prop to trim the visual "Create"
label
+ formatCreateLabel={(inputValue) =>
+ `Create "${inputValue.trim()}"`
+ }
+ // Add this prop to trim the value when a
tag is created
+ onCreateOption={(inputValue) => {
+ const policyLabelVal = inputValue.trim();
+ if (policyLabelVal) {
+ input.onChange([
+ ...input.value,
+ {
+ label: policyLabelVal,
+ value: policyLabelVal
+ }
+ ]);
+ }
+ }}
+ tabSelectsValue={false}
+ placeholder="Add Policy Labels"
/>
</Col>
</FormB.Group>
diff --git
a/security-admin/src/main/webapp/react-webapp/src/views/PolicyListing/PolicyPermissionItem.jsx
b/security-admin/src/main/webapp/react-webapp/src/views/PolicyListing/PolicyPermissionItem.jsx
index 4496f7541..69325c2dd 100644
---
a/security-admin/src/main/webapp/react-webapp/src/views/PolicyListing/PolicyPermissionItem.jsx
+++
b/security-admin/src/main/webapp/react-webapp/src/views/PolicyListing/PolicyPermissionItem.jsx
@@ -371,6 +371,8 @@ export default function PolicyPermissionItem(props) {
styles={customStyles}
cacheOptions
isMulti
+ tabSelectsValue={false}
+ placeholder="Select Roles"
/>
</div>
)}
@@ -402,6 +404,8 @@ export default function PolicyPermissionItem(props) {
styles={customStyles}
cacheOptions
isMulti
+ tabSelectsValue={false}
+ placeholder="Select Groups"
/>
</div>
)}
@@ -433,6 +437,8 @@ export default function PolicyPermissionItem(props) {
styles={customStyles}
cacheOptions
isMulti
+ tabSelectsValue={false}
+ placeholder="Select Users"
/>
</div>
)}
diff --git
a/security-admin/src/main/webapp/react-webapp/src/views/PolicyListing/TagBasePermissionItem.jsx
b/security-admin/src/main/webapp/react-webapp/src/views/PolicyListing/TagBasePermissionItem.jsx
index 083bba71c..7d164dedc 100644
---
a/security-admin/src/main/webapp/react-webapp/src/views/PolicyListing/TagBasePermissionItem.jsx
+++
b/security-admin/src/main/webapp/react-webapp/src/views/PolicyListing/TagBasePermissionItem.jsx
@@ -373,6 +373,7 @@ export default function TagBasePermissionItem(props) {
isClearable={false}
isSearchable={true}
placeholder="Select Service Name"
+ tabSelectsValue={false}
/>
</FormB.Group>
)}
diff --git
a/security-admin/src/main/webapp/react-webapp/src/views/Reports/UserAccessLayout.jsx
b/security-admin/src/main/webapp/react-webapp/src/views/Reports/UserAccessLayout.jsx
index 2d30c3c22..5dc1c6914 100644
---
a/security-admin/src/main/webapp/react-webapp/src/views/Reports/UserAccessLayout.jsx
+++
b/security-admin/src/main/webapp/react-webapp/src/views/Reports/UserAccessLayout.jsx
@@ -538,6 +538,7 @@ function UserAccessLayout() {
]}
menuPlacement="auto"
placeholder="Select Policy Type"
+ tabSelectsValue={false}
/>
)}
</Field>
@@ -558,6 +559,7 @@ function UserAccessLayout() {
menuPlacement="auto"
placeholder="Select Component Type"
styles={selectInputCustomStyles}
+ tabSelectsValue={false}
/>
)}
</Field>
@@ -596,6 +598,7 @@ function UserAccessLayout() {
loadOptions={fetchPolicyLabels}
placeholder="Select Policy Label"
styles={selectInputCustomStyles}
+ tabSelectsValue={false}
/>
)}
</Field>
@@ -617,6 +620,7 @@ function UserAccessLayout() {
menuPlacement="auto"
placeholder="Select Zone Name"
styles={selectInputCustomStyles}
+ tabSelectsValue={false}
/>
)}
</Field>
@@ -654,6 +658,7 @@ function UserAccessLayout() {
onChange={(e) =>
onChangeSearchBy(e, input, values)
}
+ tabSelectsValue={false}
/>
)}
</Field>
@@ -814,6 +819,7 @@ function SearchByAsyncSelect(props) {
DropdownIndicator: () => null,
IndicatorSeparator: () => null
}}
+ tabSelectsValue={false}
/>
)}
</Field>
diff --git
a/security-admin/src/main/webapp/react-webapp/src/views/Resources/ResourceComp.jsx
b/security-admin/src/main/webapp/react-webapp/src/views/Resources/ResourceComp.jsx
index 661e8237d..b71448dbc 100644
---
a/security-admin/src/main/webapp/react-webapp/src/views/Resources/ResourceComp.jsx
+++
b/security-admin/src/main/webapp/react-webapp/src/views/Resources/ResourceComp.jsx
@@ -209,6 +209,7 @@ export default function ResourceComp(props) {
}
isSearchable={false}
styles={selectInputCustomStyles}
+ tabSelectsValue={false}
/>
</span>
<RenderValidateField name={`resourceName-${levelKey}`} />
diff --git
a/security-admin/src/main/webapp/react-webapp/src/views/Resources/ResourceSelectComp.jsx
b/security-admin/src/main/webapp/react-webapp/src/views/Resources/ResourceSelectComp.jsx
index 128796f55..d1b676b5c 100644
---
a/security-admin/src/main/webapp/react-webapp/src/views/Resources/ResourceSelectComp.jsx
+++
b/security-admin/src/main/webapp/react-webapp/src/views/Resources/ResourceSelectComp.jsx
@@ -216,6 +216,20 @@ export default function ResourceSelectComp(props) {
filterOption={customFilterOptions}
isLoading={isLoading}
styles={selectInputCustomStyles}
+ formatCreateLabel={(inputValue) => `Create "${inputValue.trim()}"`}
+ onCreateOption={(inputValue) => {
+ const trimmedValue = inputValue.trim();
+ if (trimmedValue) {
+ const newOption = { label: trimmedValue, value: trimmedValue };
+ const currentValue = input.value || [];
+ const newValue = isArray(currentValue)
+ ? [...currentValue, newOption]
+ : [newOption];
+ input.onChange(newValue);
+ }
+ }}
+ tabSelectsValue={false}
+ placeholder="Add policy Resources"
/>
{formValues &&
formValues[`resourceName-${levelKey}`]?.mandatory &&
diff --git
a/security-admin/src/main/webapp/react-webapp/src/views/SecurityZone/SecurityZoneForm.jsx
b/security-admin/src/main/webapp/react-webapp/src/views/SecurityZone/SecurityZoneForm.jsx
index 12a376458..d3a26b1cd 100644
---
a/security-admin/src/main/webapp/react-webapp/src/views/SecurityZone/SecurityZoneForm.jsx
+++
b/security-admin/src/main/webapp/react-webapp/src/views/SecurityZone/SecurityZoneForm.jsx
@@ -874,6 +874,7 @@ const SecurityZoneForm = () => {
}}
isClearable={true}
placeholder="Select Users"
+ tabSelectsValue={false}
/>
</Col>
</Row>
@@ -918,6 +919,7 @@ const SecurityZoneForm = () => {
}}
isClearable={true}
placeholder="Select Groups"
+ tabSelectsValue={false}
/>
</Col>
</Row>
@@ -962,6 +964,7 @@ const SecurityZoneForm = () => {
}}
isClearable={true}
placeholder="Select Roles"
+ tabSelectsValue={false}
/>
{meta.touched && meta.error && (
<span className="invalid-field">
@@ -1011,6 +1014,7 @@ const SecurityZoneForm = () => {
}}
isClearable={true}
placeholder="Select Users"
+ tabSelectsValue={false}
/>
</Col>
</Row>
@@ -1055,6 +1059,7 @@ const SecurityZoneForm = () => {
}}
isClearable={true}
placeholder="Select Groups"
+ tabSelectsValue={false}
/>
</Col>
</Row>
@@ -1099,6 +1104,7 @@ const SecurityZoneForm = () => {
}}
isClearable={true}
placeholder="Select Roles"
+ tabSelectsValue={false}
/>
{meta.error && meta.touched && (
<span className="invalid-field">
@@ -1140,6 +1146,7 @@ const SecurityZoneForm = () => {
isClearable={true}
placeholder="Select Tag Services"
styles={selectInputCustomStyles}
+ tabSelectsValue={false}
/>
</Col>
</Row>
@@ -1177,6 +1184,7 @@ const SecurityZoneForm = () => {
isSearchable={true}
placeholder="Select Resource Services"
styles={selectInputCustomStyles}
+ tabSelectsValue={false}
/>
</Col>
</Row>
diff --git
a/security-admin/src/main/webapp/react-webapp/src/views/ServiceManager/ServiceAuditFilter.jsx
b/security-admin/src/main/webapp/react-webapp/src/views/ServiceManager/ServiceAuditFilter.jsx
index 36d0d6aa1..9468bef96 100644
---
a/security-admin/src/main/webapp/react-webapp/src/views/ServiceManager/ServiceAuditFilter.jsx
+++
b/security-admin/src/main/webapp/react-webapp/src/views/ServiceManager/ServiceAuditFilter.jsx
@@ -429,6 +429,7 @@ export default function ServiceAuditFilter(props) {
isMulti
styles={selectInputCustomStyles}
placeholder="Select Roles"
+ tabSelectsValue={false}
/>
</div>
)}
@@ -469,6 +470,7 @@ export default function ServiceAuditFilter(props) {
isMulti
styles={selectInputCustomStyles}
placeholder="Select Groups"
+ tabSelectsValue={false}
/>
</div>
)}
@@ -509,6 +511,7 @@ export default function ServiceAuditFilter(props) {
isMulti
styles={selectInputCustomStyles}
placeholder="Select Users"
+ tabSelectsValue={false}
/>
</div>
)}
diff --git
a/security-admin/src/main/webapp/react-webapp/src/views/ServiceManager/ServiceDefinitions.jsx
b/security-admin/src/main/webapp/react-webapp/src/views/ServiceManager/ServiceDefinitions.jsx
index c3d0a2b67..d1fb1de58 100644
---
a/security-admin/src/main/webapp/react-webapp/src/views/ServiceManager/ServiceDefinitions.jsx
+++
b/security-admin/src/main/webapp/react-webapp/src/views/ServiceManager/ServiceDefinitions.jsx
@@ -409,6 +409,7 @@ class ServiceDefinitions extends Component {
})}
menuPlacement="auto"
placeholder="Select Zone Name"
+ tabSelectsValue={false}
/>
</div>
)}
diff --git
a/security-admin/src/main/webapp/react-webapp/src/views/ServiceManager/ServiceForm.jsx
b/security-admin/src/main/webapp/react-webapp/src/views/ServiceManager/ServiceForm.jsx
index 40d871904..c710ae44b 100644
---
a/security-admin/src/main/webapp/react-webapp/src/views/ServiceManager/ServiceForm.jsx
+++
b/security-admin/src/main/webapp/react-webapp/src/views/ServiceManager/ServiceForm.jsx
@@ -984,16 +984,12 @@ class ServiceForm extends Component {
undefined
);
- SelectField = ({ input, ...rest }) => (
- <Select {...input} {...rest} searchable />
- );
-
AsyncSelectField = ({ input, ...rest }) => (
- <AsyncSelect {...input} {...rest} cacheOptions />
+ <AsyncSelect {...input} {...rest} cacheOptions tabSelectsValue={false} />
);
AsyncCreatableSelectField = ({ input, ...rest }) => (
- <AsyncCreatableSelect {...input} {...rest} />
+ <AsyncCreatableSelect {...input} {...rest} tabSelectsValue={false} />
);
fetchUsers = async (inputValue) => {
diff --git
a/security-admin/src/main/webapp/react-webapp/src/views/SideBar/TopNavBar.jsx
b/security-admin/src/main/webapp/react-webapp/src/views/SideBar/TopNavBar.jsx
index 8e7aa43e7..764591b8e 100644
---
a/security-admin/src/main/webapp/react-webapp/src/views/SideBar/TopNavBar.jsx
+++
b/security-admin/src/main/webapp/react-webapp/src/views/SideBar/TopNavBar.jsx
@@ -206,6 +206,7 @@ export const TopNavBar = (props) => {
menuPlacement="auto"
placeholder="Select Service Name"
hideSelectedOptions
+ tabSelectsValue={false}
/>
{!isKMSRole && (
<React.Fragment>
@@ -223,6 +224,7 @@ export const TopNavBar = (props) => {
placeholder="Select Zone Name"
isClearable
hideSelectedOptions
+ tabSelectsValue={false}
/>
</React.Fragment>
)}
diff --git
a/security-admin/src/main/webapp/react-webapp/src/views/UserGroupRoleListing/role_details/RoleForm.jsx
b/security-admin/src/main/webapp/react-webapp/src/views/UserGroupRoleListing/role_details/RoleForm.jsx
index 222d901f5..2f82f1a05 100644
---
a/security-admin/src/main/webapp/react-webapp/src/views/UserGroupRoleListing/role_details/RoleForm.jsx
+++
b/security-admin/src/main/webapp/react-webapp/src/views/UserGroupRoleListing/role_details/RoleForm.jsx
@@ -634,6 +634,8 @@ function RoleForm() {
data-name="usersSelect"
data-cy="usersSelect"
styles={selectInputCustomStyles}
+ tabSelectsValue={false}
+ placeholder="Select Users"
/>
</div>
<div className="col-sm-3">
@@ -741,6 +743,8 @@ function RoleForm() {
data-name="groupsSelect"
data-cy="groupsSelect"
styles={selectInputCustomStyles}
+ tabSelectsValue={false}
+ placeholder="Select Groups"
/>
</div>
<div className="col-sm-3">
@@ -848,6 +852,8 @@ function RoleForm() {
data-name="rolesSelect"
data-cy="rolesSelect"
styles={selectInputCustomStyles}
+ tabSelectsValue={false}
+ placeholder="Select Roles"
/>
</div>
<div className="col-sm-3">
diff --git
a/security-admin/src/main/webapp/react-webapp/src/views/UserGroupRoleListing/users_details/UserForm.jsx
b/security-admin/src/main/webapp/react-webapp/src/views/UserGroupRoleListing/users_details/UserForm.jsx
index 2eb9e5a85..aa47e137e 100644
---
a/security-admin/src/main/webapp/react-webapp/src/views/UserGroupRoleListing/users_details/UserForm.jsx
+++
b/security-admin/src/main/webapp/react-webapp/src/views/UserGroupRoleListing/users_details/UserForm.jsx
@@ -241,6 +241,8 @@ function UserForm(props) {
isEditView && userInfo && isExternalOrFederatedUser ? true : false
}
styles={selectInputCustomStyles}
+ tabSelectsValue={false}
+ placeholder="Select Groups"
/>
);
};
@@ -710,6 +712,7 @@ function UserForm(props) {
options={userRoleListData()}
onChange={(e) => getUserRole(e, input)}
isDisabled={disabledUserRoleField()}
+ tabSelectsValue={false}
></Select>
)}
></Field>