Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
64 commits
Select commit Hold shift + click to select a range
0680486
UISAUTHCOM-55 Filter out any capabilities with property `dummyCapabil…
ryandberger Apr 7, 2025
9a4254b
Sync CHANGELOG with 2.0.1 release (#86)
ryandberger Apr 9, 2025
2a245ed
bump version to 2.0.1
aidynoJ Apr 15, 2025
65d6ced
Merge pull request #88 from folio-org/bump-v2.0.1
aidynoJ Apr 15, 2025
d7bbf25
UISAUTHCOM-51: Provide `expand=false` parameter to `useRoleCapabiliti…
aidynoJ Apr 15, 2025
8619f00
Update translation strings
folio-translations Apr 18, 2025
9633f3d
Update translation strings
folio-translations Apr 29, 2025
8e6ad6b
UISAUTHCOM-60 Make role details users links clickable only in setting…
azizjonnurov Apr 30, 2025
cd5cc3b
UISAUTHCOM-59: Increase request timeouts in useCreateRoleMutation, us…
aidynoJ Apr 30, 2025
eaaa11d
UISAUTHCOM-59 Increase default timeout for create role API calls to m…
ryandberger May 12, 2025
219403e
Update translation strings
folio-translations May 13, 2025
77a0013
Update translation strings
folio-translations Jun 7, 2025
b88dd4b
Update translation strings
folio-translations Jun 24, 2025
fe35b74
Update translation strings
folio-translations Jul 7, 2025
156a290
Update translation strings
folio-translations Jul 18, 2025
e95cdb4
UISAUTHCOM-65 Provide the ability to pass props to control whether ce…
usavkov-epam Jul 19, 2025
abef407
Update translation strings
folio-translations Jul 29, 2025
fa61348
Update translation strings
folio-translations Aug 30, 2025
f60ae69
[UISAUTHCOM-66] Suppress edit and delete menu buttons for default rol…
ryandberger Sep 4, 2025
8264963
[UISAUTHCOM-67] Match GET role capabilities query key to match edit r…
ryandberger Oct 1, 2025
28a3ed2
[UISAUTHCOM-68] Group keycloak create errors together and ensure all …
ryandberger Oct 14, 2025
99b77f4
Update translation strings
folio-translations Oct 15, 2025
8530f02
[UISAUTHCOM-69] Display warning and require confirmation before unche…
ryandberger Oct 23, 2025
754fa7b
[UISAUTHCOM-70] Fix slowness when typing in name/description fields (…
ryandberger Oct 29, 2025
920cb17
Update translation strings
folio-translations Oct 30, 2025
060eef6
[UISAUTHCOM-69] Add application deselect warning use case for Create …
ryandberger Nov 4, 2025
888b68a
[UISAUTHCOM-69] Rename confirmation button from "Okay" to "Continue" …
ryandberger Nov 6, 2025
8f1c80c
UISAUTHCOM-72 Pass tenantId prop to the ViewMetaData component (#113)
usavkov-epam Nov 10, 2025
d951728
Update translation strings
folio-translations Nov 20, 2025
76cc76c
Update translation strings
folio-translations Dec 1, 2025
07ee049
UISAUTHCOM-73 Include capabilities inside capability sets when calcul…
ryandberger Dec 5, 2025
8f0194d
Update translation strings
folio-translations Dec 16, 2025
bc02241
UISAUTHCOM-76: Update the message for sharing a role to indicate that…
Dmitriy-Litvinenko Dec 24, 2025
893dafb
[UISAUTHCOM-73] Fix capability calculations when showing warning to u…
ryandberger Dec 30, 2025
6d2915b
UISAUTHCOM-78: Add timeout to `useOkapiKy` in `useDeleteRoleMutation`…
Dmytro-Melnyshyn Jan 3, 2026
f5fe06d
UISAUTHCOM-81 Increase default timeout for role mutations (#122)
usavkov-epam Jan 5, 2026
6ad1fd7
[UISAUTHCOM-74] When previously saved capability sets are deselected,…
ryandberger Jan 9, 2026
d9ba447
Lokalise: updates
folio-translations Jan 27, 2026
a3ee892
Update translation strings
folio-translations Jan 27, 2026
b88c20b
[UISAUTHCOM-74] Ensure that deselecting a column of capability sets a…
ryandberger Feb 2, 2026
59efc4e
Lokalise: updates
folio-translations Feb 4, 2026
cf23b44
Update translation strings
folio-translations Feb 4, 2026
6268635
Lokalise: updates
folio-translations Feb 12, 2026
eca9ba2
Update translation strings
folio-translations Feb 12, 2026
4fbe6b4
UISAUTHCOM-86 Handling sharing of a role when an authorization role w…
usavkov-epam Feb 26, 2026
6d73024
UISAUTHCOM-88 Escape CQL values on sharing validation request (#134)
usavkov-epam Mar 10, 2026
69d5995
UISAUTHCOM-83: Preserve session-selected capabilities when unchecking…
Dmytro-Melnyshyn Mar 12, 2026
dbddfbb
UISAUTHCOM-87 omit errant whitespace (#132)
zburke Mar 16, 2026
5883d9c
Update translation strings
folio-translations Mar 16, 2026
82fc90b
UISAUTHCOM-83: Prevent initially selected capabilities from being res…
Dmytro-Melnyshyn Mar 17, 2026
f1da435
UISAUTHCOM-86 Introduce `RoleMutationClientError` to separate client …
usavkov-epam Mar 18, 2026
09f5e0c
UISAUTHCOM-90 Add validation to ensure role names are unique across t…
usavkov-epam Mar 26, 2026
d8105be
Release v2.1.0
BogdanDenis Apr 20, 2026
7813080
Merge pull request #141 from folio-org/release-v2.1.0
BogdanDenis Apr 20, 2026
da9644e
[UISAUTHCOM-93] Send full object body in PUT /roles request (#143)
ryandberger Apr 29, 2026
2c86d1b
[UISAUTHCOM-73] Include capabilities actions when calculating counts …
ryandberger Apr 30, 2026
3ccc60c
Update translation strings
folio-translations May 2, 2026
1cf5a77
Release v2.2.0 (#145)
ryandberger May 11, 2026
b7872c8
[UIROLES-170] Allow Save button to be enabled after first character e…
ryandberger Jun 1, 2026
16a7a81
[UISAUTHCOM-98] Display warning and require confirmation before unche…
ryandberger Jun 26, 2026
1254183
UISAUTHCOM-97 Add Role Name validation to RoleForm. (#150)
JohnC-80 Aug 7, 2026
d9d15ca
set 'expand=true' on useRoleCapabilities in order to load all applica…
JohnC-80 Aug 11, 2026
678245a
set 'expand=true' on useRoleCapabilities to restore all associated ap…
JohnC-80 Aug 12, 2026
7be4be1
log changes
JohnC-80 Aug 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

# production
/build
/translations/**/compiled/*

# misc
.DS_Store
Expand Down
51 changes: 47 additions & 4 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,11 +1,54 @@
# Change history for stripes-authorization-components

# 2.0.0 (IN PROGRESS)
# IN-PROGRESS

* [UISAUTHCOM-97](https://folio-org.atlassian.net/browse/UISAUTHCOM-97) Add validation to RoleForm for Role Name. Disallowed forward slash "/" and required the name field for form submission.
* [UISAUTHCOM-96](https://folio-org.atlassian.net/browse/UISAUTHCOM-96) Add missing associated applications back to Role Edit view.

# [2.2.0](https://github.com/folio-org/stripes-authorization-components/tree/v2.2.0)

* [UISAUTHCOM-73](https://folio-org.atlassian.net/browse/UISAUTHCOM-73) Include capabilities actions when calculating counts for warning when de-selecting an application assigned to a role.
* [UISAUTHCOM-93](https://folio-org.atlassian.net/browse/UISAUTHCOM-93) Send full object body in PUT /roles request.
* [UIROLES-170](https://folio-org.atlassian.net/browse/UIROLES-170) Allow Save button to be enabled after first character entered in required `Role Name` field.
* [UISAUTHCOM-98](https://folio-org.atlassian.net/browse/UISAUTHCOM-98) Display warning and require confirmation before unchecking a capability set.

# [2.1.0](https://github.com/folio-org/stripes-authorization-components/tree/v2.1.0)

* [UISAUTHCOM-60](https://folio-org.atlassian.net/browse/UISAUTHCOM-60) Add new `hideUserLink` prop to `RoleDetails` component that will display users in assigned users list as a text if enabled.
* [UISAUTHCOM-59](https://folio-org.atlassian.net/browse/UISAUTHCOM-59) Increase request timeout in `useCreateRoleMutation`, `useEditRoleMutation` from default 30 seconds to 10 minutes. This can be decreased if back-end performance improves.
* [UISAUTHCOM-65](https://folio-org.atlassian.net/browse/UISAUTHCOM-65) Provide the ability to pass props to control whether certain actions can be performed.
* [UISAUTHCOM-66](https://folio-org.atlassian.net/browse/UISAUTHCOM-66) Suppress edit and delete menu buttons for default roles.
* [UISAUTHCOM-67](https://folio-org.atlassian.net/browse/UISAUTHCOM-67) Match GET role capabilities query key to match edit request, so `react-query` `invalidateQueries()` is called and new data is fetched.
* [UISAUTHCOM-68](https://folio-org.atlassian.net/browse/UISAUTHCOM-68) Group keycloak create errors together and ensure all user records in batch are attempted.
* [UISAUTHCOM-70](https://folio-org.atlassian.net/browse/UISAUTHCOM-70) Fix slowness when typing in name/description fields, by having component re-render onBlur instead of every keystroke.
* [UISAUTHCOM-69](https://folio-org.atlassian.net/browse/UISAUTHCOM-69) Display warning and require confirmation before unchecking an application for both Create and Edit Role. Rename confirmation button from "Okay" to "Continue".
* [UISAUTHCOM-72](https://folio-org.atlassian.net/browse/UISAUTHCOM-72) Pass `tenantId` prop to `<ViewMetaData>` component on the role details pane.
* [UISAUTHCOM-73](https://folio-org.atlassian.net/browse/UISAUTHCOM-73) Include capabilities inside capability sets when calculating counts for warning when de-selecting an application assigned to a role.
* [UISAUTHCOM-73](https://folio-org.atlassian.net/browse/UISAUTHCOM-73) Fix capability calculations to de-dupe individual capabilities and those contained within capability sets, so correct value is shown when de-selecting an application assigned to a role.
* [UISAUTHCOM-76](https://folio-org.atlassian.net/browse/UISAUTHCOM-76) Update the message for sharing a role to indicate that it can be a lengthy process.
* [UISAUTHCOM-78](https://folio-org.atlassian.net/browse/UISAUTHCOM-78) Refactor timeout handling by introducing TIMEOUT constant for useOkapiKy in role sharing and delete role mutation hooks.
* [UISAUTHCOM-81](https://folio-org.atlassian.net/browse/UISAUTHCOM-81) Increase default timeout for role mutations.
* [UISAUTHCOM-74](https://folio-org.atlassian.net/browse/UISAUTHCOM-74) When previously saved capability sets are deselected, child capabilities are now deselected too. Also, ensure that deselecting a column of capability sets also deslects all child capabilities.
* [UISAUTHCOM-86](https://folio-org.atlassian.net/browse/UISAUTHCOM-86) Handling sharing of a role when an authorization role with the same name already exists in data tenant.
* [UISAUTHCOM-88](https://folio-org.atlassian.net/browse/UISAUTHCOM-88) Escape CQL values on sharing validation request.
* [UISAUTHCOM-87](https://folio-org.atlassian.net/browse/UISAUTHCOM-87) OmittheerrantwhitespacethattripsupPluggable's`children`'slengthcalculation.
* [UISAUTHCOM-83](https://folio-org.atlassian.net/browse/UISAUTHCOM-83) Preserve session-selected capabilities when unchecking a capability set that includes them. Keep `isInitialDataReady` false while fetching data to prevent data from being displayed after the page is reopened.
* [UISAUTHCOM-90](https://folio-org.atlassian.net/browse/UISAUTHCOM-90) Add validation to ensure role names are unique across tenants when editing shared authorization roles.

# [2.0.2](https://github.com/folio-org/stripes-authorization-components/tree/v2.0.2)

* [UISAUTHCOM-51](https://folio-org.atlassian.net/browse/UISAUTHCOM-51) Provide `expand=false` parameter to `useRoleCapabilities` that used in `useInitalRoleSharing` to correctly retrieve directly assigned capabilities

# [2.0.1](https://github.com/folio-org/stripes-authorization-components/tree/v2.0.1) (2025-04-09)

* [UISAUTHCOM-55](https://folio-org.atlassian.net/browse/UISAUTHCOM-55) Filter out any capabilities with property `dummyCapability = true` since they are invalid. API will suppress once MODROLESKC-285 is completed, but this immediately fixes the issue in the UI.

# [2.0.0](https://github.com/folio-org/stripes-authorization-components/tree/v2.0.0) (2025-03-13)

* *BREAKING* [UISAUTHCOM-46](https://folio-org.atlassian.net/browse/UISAUTHCOM-46) migrate react-intl to v7.
* *BREAKING* [UISAUTHCOM-50](https://folio-org.atlassian.net/browse/UISAUTHCOM-50) migrate stripes dependencies to their Sunflower versions.
* *BREAKING* [UISAUTHCOM-50](https://folio-org.atlassian.net/browse/UISAUTHCOM-50) migrate stripes dependencies to their Sunflower versions.

## 1.1.0
## 1.1.0

* [UISAUTHCOM-44](https://folio-org.atlassian.net/browse/UISAUTHCOM-44) Add Deque Axe a11y tests.
* [UISAUTHCOM-47](https://folio-org.atlassian.net/browse/UISAUTHCOM-47) Retry get publication details request for `404` response status.
Expand Down Expand Up @@ -44,7 +87,7 @@
* [UISAUTHCOM-12](https://folio-org.atlassian.net/browse/UISAUTHCOM-12) Ensure support for the passed `tenantId` value for manipulations in the context of a specific tenant.
* [UISAUTHCOM-17](https://folio-org.atlassian.net/browse/UISAUTHCOM-17) Create reusable components for editing, saving Authorization policies for the consortium.
* [UISAUTHCOM-15](https://folio-org.atlassian.net/browse/UISAUTHCOM-15) Check if user exists in Keycloak on assign users to role. If not show confirmation dialog to create user records in Keycloak.
* [UISAUTHCOM-18](https://folio-org.atlassian.net/browse/UISAUTHCOM-18) Add button to unassign all assigned capabilities/sets when editing an authorization role in RoleForm.
* [UISAUTHCOM-18](https://folio-org.atlassian.net/browse/UISAUTHCOM-18) Add button to unassign all assigned capabilities/sets when editing an authorization role in RoleForm.
* [UISAUTHCOM-19](https://folio-org.atlassian.net/browse/UISAUTHCOM-19) Create reusable hooks and components for duplicate authorization role.
* [UISAUTHCOM-22](https://folio-org.atlassian.net/browse/UISAUTHCOM-22) Move "Select application" button to the top of the role form
* [UISAUTHCOM-14](https://folio-org.atlassian.net/browse/UISAUTHCOM-14) ECS - Support sharing of authorization roles and policies.
Expand Down
2 changes: 1 addition & 1 deletion lib/Capabilities/CapabilitiesGrid/CapabilitiesGrid.js
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ export const CapabilitiesGrid = ({
return <div key={action}>{formatMessage({ id:`stripes-authorization-components.columns.${action}` })} <Checkbox
checked={isAllActionCapabilitiesSelected(action, type)}
onChange={(event) => {
toggleCapabilitiesHeaderCheckbox(event, type, action);
toggleCapabilitiesHeaderCheckbox(event.target.checked, type, action);
}}
aria-label={formatMessage({ id:'stripes-authorization-components.columns.header.checkbox' }, { action })}
/></div>;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@ export const CapabilitiesSetsAccordion = ({
isCapabilitySetSelected,
isLoading,
onChangeCapabilitySetCheckbox,
toggleCapabilitySetsHeaderCheckbox, isAllActionCapabilitySetsSelected
toggleCapabilitySetsHeaderCheckbox,
isAllActionCapabilitySetsSelected
}) => {
return (
<Accordion
Expand Down
42 changes: 33 additions & 9 deletions lib/Role/RoleCreate/RoleCreate.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import PropTypes from 'prop-types';
import { useState } from 'react';
import { useHistory } from 'react-router';
import isEmpty from 'lodash/isEmpty';
import { isEmpty } from 'lodash';

import { useQueryClient } from 'react-query';
import { MUTATION_ACTION_TYPE } from '../../constants';
Expand All @@ -13,7 +13,7 @@ import {
useShowCallout,
} from '../../hooks';
import { RoleForm } from '../RoleForm';
import { getCheckboxHandlers } from '../utils';
import { getCheckboxHandlers, changesForUnselect } from '../utils';

export const RoleCreate = ({
path,
Expand All @@ -26,6 +26,8 @@ export const RoleCreate = ({
const [description, setDescription] = useState('');
const [checkedAppIdsMap, setCheckedAppIdsMap] = useState({});
const [disabledCapabilities, setDisabledCapabilities] = useState({});
const [isUnselectApplicationConfirmationOpen, setIsUnselectApplicationConfirmationOpen] = useState(false);
const [unselectedItemsInfo, setUnselectedItemsInfo] = useState({});

const {
capabilities,
Expand Down Expand Up @@ -109,26 +111,43 @@ export const RoleCreate = ({
}
};

const onSubmitSelectApplications = (appIds, callback) => {
if (callback) {
callback();
}
const unselectAllCapabilitiesAndSets = () => {
setSelectedCapabilitiesMap({});
setSelectedCapabilitySetsMap({});
setDisabledCapabilities({});
};

const applyAppIdsChanges = (appIds) => {
if (isEmpty(appIds)) {
setSelectedCapabilitiesMap({});
setSelectedCapabilitySetsMap({});
setDisabledCapabilities({});
unselectAllCapabilitiesAndSets();
}
setCheckedAppIdsMap(appIds);
};

const onSubmitSelectApplications = (selectedAppIds, onCloseHandler) => {
const unselectedAppInfo = changesForUnselect(selectedAppIds, checkedAppIdsMap,
capabilities, capabilitySetsList, selectedCapabilitiesMap, selectedCapabilitySetsMap);

if (unselectedAppInfo.isConfirmationNeeded) {
setUnselectedItemsInfo({ ...unselectedAppInfo, selectedAppIds, onCloseHandler });
setIsUnselectApplicationConfirmationOpen(true);
} else if (onCloseHandler) { // Changes can be applied directly if no capabilities or capability sets would be unselected
applyAppIdsChanges(selectedAppIds);
onCloseHandler();
}
};

return (
<RoleForm
title="stripes-authorization-components.crud.createRole"
roleName={roleName}
description={description}
isLoading={isLoading}
capabilities={capabilities}
disabledCapabilities={disabledCapabilities}
capabilitySets={capabilitySets}
capabilitySetsList={capabilitySetsList}
actionCapabilitySets={actionCapabilitySets}
isCapabilityDisabled={isCapabilityDisabled}
isCapabilitySetSelected={isCapabilitySetSelected}
isCapabilitySelected={isCapabilitySelected}
Expand All @@ -138,6 +157,7 @@ export const RoleCreate = ({
onClose={onClose}
onChangeCapabilityCheckbox={onChangeCapabilityCheckbox}
onChangeCapabilitySetCheckbox={onChangeCapabilitySetCheckbox}
selectedCapabilitySetsMap={selectedCapabilitySetsMap}
selectedCapabilitiesMap={selectedCapabilitiesMap}
onSaveSelectedApplications={onSubmitSelectApplications}
checkedAppIdsMap={checkedAppIdsMap}
Expand All @@ -147,6 +167,10 @@ export const RoleCreate = ({
isAllActionCapabilitiesSelected={isAllActionCapabilitiesSelected}
toggleCapabilitySetsHeaderCheckbox={toggleCapabilitySetsHeaderCheckbox}
isAllActionCapabilitySetsSelected={isAllActionCapabilitySetsSelected}
isUnselectApplicationConfirmationOpen={isUnselectApplicationConfirmationOpen}
setIsUnselectApplicationConfirmationOpen={setIsUnselectApplicationConfirmationOpen}
unselectedItemsInfo={unselectedItemsInfo}
applyAppIdsChanges={applyAppIdsChanges}
/>
);
};
Expand Down
10 changes: 10 additions & 0 deletions lib/Role/RoleCreate/RoleCreate.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,10 @@ describe('RoleCreate', () => {
afterEach(() => {
jest.clearAllMocks();
});
beforeEach(() => {
mockMutateRole.mockClear();
});

it('submit button', async () => {
const { getByTestId, getByRole } = renderComponent();

Expand All @@ -153,6 +157,12 @@ describe('RoleCreate', () => {

await act(async () => {
await userEvent.type(getByTestId('rolename-input'), 'New Role');
await userEvent.tab();
});

expect(submitButton).toBeEnabled();

await act(async () => {
await userEvent.click(submitButton);
});

Expand Down
Loading