Skip to content

Commit 7464001

Browse files
committed
refactor: address feedback
1 parent bd98ba0 commit 7464001

14 files changed

Lines changed: 101 additions & 76 deletions

src/authz-module/index.scss

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,43 @@
7575
}
7676
}
7777

78+
.highlighted-users-input {
79+
&__layer {
80+
font-family: inherit;
81+
font-size: 1rem;
82+
line-height: 1.5;
83+
padding: 0.375rem 0.75rem;
84+
white-space: pre-wrap;
85+
word-break: break-word;
86+
overflow-wrap: break-word;
87+
width: 100%;
88+
}
89+
90+
&__overlay {
91+
position: absolute;
92+
inset: 0;
93+
background: #fff;
94+
border: 1px solid transparent;
95+
border-radius: 0.25rem;
96+
overflow: hidden;
97+
pointer-events: none;
98+
z-index: 0;
99+
}
100+
101+
&__textarea {
102+
position: relative;
103+
z-index: 1;
104+
min-height: 100px;
105+
resize: vertical;
106+
caret-color: #212529;
107+
108+
&--highlighted {
109+
color: transparent;
110+
background: transparent;
111+
}
112+
}
113+
}
114+
78115
.toast-container {
79116
// Ensure toast appears above modal
80117
z-index: 1000;

src/authz-module/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { ToastManagerProvider } from '@src/components/ToastManager/ToastManagerC
99
import { LibrariesUserManager, LibrariesLayout, LibrariesTeamManager } from './libraries-manager';
1010
import AuthzHome from './authz-home';
1111
import AuditUserPage from './audit-user';
12-
import AssignRoleWizardPage from './wizard/AssignRoleWizardPage';
12+
import AssignRoleWizardPage from './role-assignation-wizard/AssignRoleWizardPage';
1313
import { ROUTES } from './constants';
1414

1515
import './index.scss';

src/authz-module/libraries-manager/context.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@ import { usePermissionsByRole } from '@src/authz-module/data/hooks';
88
import { PermissionMetadata, ResourceMetadata, Role } from 'types';
99
import { CustomErrors } from '@src/constants';
1010
import {
11-
CONTENT_LIBRARY_PERMISSIONS, libraryPermissions, libraryResourceTypes, libraryRolesMetadata,
11+
CONTENT_LIBRARY_PERMISSIONS, libraryPermissions, libraryResourceTypes,
1212
} from '../constants';
13+
import { libraryRolesMetadata } from '../roles-permissions/library/constants';
1314

1415
const LIBRARY_TEAM_PERMISSIONS = [
1516
CONTENT_LIBRARY_PERMISSIONS.VIEW_LIBRARY_TEAM,

src/authz-module/wizard/AssignRoleWizard.test.tsx renamed to src/authz-module/role-assignation-wizard/AssignRoleWizard.test.tsx

File renamed without changes.

src/authz-module/wizard/AssignRoleWizard.tsx renamed to src/authz-module/role-assignation-wizard/AssignRoleWizard.tsx

Lines changed: 31 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,20 @@ interface AssignRoleWizardProps {
3434
roles?: RoleMetadata[];
3535
}
3636

37+
const parseUsers = (input: string): string[] => input
38+
.split(',')
39+
.map((u) => u.trim())
40+
.filter(Boolean);
41+
42+
const getInitialState = (initialUsers: string) => ({
43+
activeStep: STEPS.SELECT_USERS_AND_ROLE as StepKey,
44+
users: initialUsers,
45+
selectedRole: null as string | null,
46+
selectedScopes: new Set<string>(),
47+
invalidUsers: [] as string[],
48+
validatedUsers: [] as string[],
49+
});
50+
3751
const AssignRoleWizard = ({ onClose, initialUsers = '', roles = allRolesMetadata }: AssignRoleWizardProps) => {
3852
const intl = useIntl();
3953
const { showErrorToast } = useToastManager();
@@ -42,7 +56,6 @@ const AssignRoleWizard = ({ onClose, initialUsers = '', roles = allRolesMetadata
4256
const [selectedRole, setSelectedRole] = useState<string | null>(null);
4357
const [selectedScopes, setSelectedScopes] = useState<Set<string>>(new Set());
4458

45-
const [validationError, setValidationError] = useState<string | null>(null);
4659
const [invalidUsers, setInvalidUsers] = useState<string[]>([]);
4760
const [validatedUsers, setValidatedUsers] = useState<string[]>([]);
4861

@@ -52,31 +65,25 @@ const AssignRoleWizard = ({ onClose, initialUsers = '', roles = allRolesMetadata
5265

5366
const handleUsersChange = useCallback((value: string) => {
5467
setInvalidUsers((prev) => (prev.length > 0 ? [] : prev));
55-
setValidationError(null);
5668
setUsers(value);
5769
}, []);
5870

5971
const handleClose = () => {
60-
setActiveStep(STEPS.SELECT_USERS_AND_ROLE);
61-
setUsers('');
62-
setSelectedRole(null);
63-
setSelectedScopes(new Set());
64-
setValidationError(null);
65-
setInvalidUsers([]);
66-
setValidatedUsers([]);
72+
const initialState = getInitialState(initialUsers);
73+
setActiveStep(initialState.activeStep);
74+
setUsers(initialState.users);
75+
setSelectedRole(initialState.selectedRole);
76+
setSelectedScopes(initialState.selectedScopes);
77+
setInvalidUsers(initialState.invalidUsers);
78+
setValidatedUsers(initialState.validatedUsers);
6779
onClose();
6880
};
6981

70-
const parseUsers = (input: string): string[] => input
71-
.split(',')
72-
.map((u) => u.trim())
73-
.filter(Boolean);
74-
7582
const validateUsersAndProceed = async () => {
83+
if (validateUsersMutation.isPending) { return; }
7684
const usersList = parseUsers(users);
7785
if (usersList.length === 0 || !selectedRole) { return; }
7886

79-
setValidationError(null);
8087
setInvalidUsers([]);
8188

8289
try {
@@ -88,7 +95,6 @@ const AssignRoleWizard = ({ onClose, initialUsers = '', roles = allRolesMetadata
8895
setActiveStep(STEPS.DEFINE_APPLICATION_SCOPE);
8996
}
9097
} catch (error) {
91-
setValidationError(intl.formatMessage(messages['wizard.validate.error']));
9298
showErrorToast(error, validateUsersAndProceed);
9399
}
94100
};
@@ -107,15 +113,14 @@ const AssignRoleWizard = ({ onClose, initialUsers = '', roles = allRolesMetadata
107113
handleClose();
108114
};
109115

110-
const isError = invalidUsers.length > 0 || !!validationError;
111-
112116
useEffect(() => {
113-
if (isError && usersInputRef.current) {
117+
if (invalidUsers.length && usersInputRef.current) {
114118
usersInputRef.current.scrollIntoView({ behavior: 'smooth', block: 'center' });
115119
}
116-
}, [isError]);
120+
}, [invalidUsers]);
117121

118-
const canProceed = !!users.trim() && !!selectedRole;
122+
const parsedUsers = parseUsers(users);
123+
const canProceed = parsedUsers.length > 0 && !!selectedRole;
119124
const canSave = selectedScopes.size > 0;
120125

121126
return (
@@ -126,6 +131,9 @@ const AssignRoleWizard = ({ onClose, initialUsers = '', roles = allRolesMetadata
126131
<Stepper.Step
127132
eventKey={STEPS.SELECT_USERS_AND_ROLE}
128133
title={intl.formatMessage(messages['wizard.step.selectUsersAndRole.title'])}
134+
hasError={invalidUsers.length > 0}
135+
description={invalidUsers.length > 0 ? intl.formatMessage(messages['wizard.step.selectUsersAndRole.error']) : ''}
136+
index={0}
129137
>
130138
<SelectUsersAndRoleStep
131139
users={users}
@@ -141,6 +149,7 @@ const AssignRoleWizard = ({ onClose, initialUsers = '', roles = allRolesMetadata
141149
<Stepper.Step
142150
eventKey={STEPS.DEFINE_APPLICATION_SCOPE}
143151
title={intl.formatMessage(messages['wizard.step.defineScope.title'])}
152+
index={1}
144153
>
145154
<DefineApplicationScopeStep
146155
selectedRole={selectedRole}
@@ -162,7 +171,7 @@ const AssignRoleWizard = ({ onClose, initialUsers = '', roles = allRolesMetadata
162171
pending: intl.formatMessage(messages['wizard.button.next.pending']),
163172
}}
164173
icons={{ pending: <Icon src={SpinnerSimple} /> }}
165-
variant={isError ? 'danger' : 'primary'}
174+
variant={invalidUsers.length ? 'danger' : 'primary'}
166175
state={validateUsersMutation.isPending ? 'pending' : 'default'}
167176
onClick={validateUsersAndProceed}
168177
disabled={!canProceed || validateUsersMutation.isPending}

src/authz-module/wizard/AssignRoleWizardPage.test.tsx renamed to src/authz-module/role-assignation-wizard/AssignRoleWizardPage.test.tsx

File renamed without changes.

src/authz-module/wizard/AssignRoleWizardPage.tsx renamed to src/authz-module/role-assignation-wizard/AssignRoleWizardPage.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ const AssignRoleWizardPage = () => {
1111
const [searchParams] = useSearchParams();
1212
const initialUsers = searchParams.get('users') || '';
1313
const raw = searchParams.get('from') ?? '';
14-
const returnTo = raw.startsWith('/') ? raw : ROUTES.HOME_PATH;
14+
const returnTo = (raw.startsWith('/') && !raw.startsWith('//')) ? raw : ROUTES.HOME_PATH;
1515

1616
return (
1717
<AuthZLayout

src/authz-module/wizard/DefineApplicationScopeStep.test.tsx renamed to src/authz-module/role-assignation-wizard/DefineApplicationScopeStep.test.tsx

File renamed without changes.

src/authz-module/wizard/DefineApplicationScopeStep.tsx renamed to src/authz-module/role-assignation-wizard/DefineApplicationScopeStep.tsx

File renamed without changes.

src/authz-module/wizard/HighlightedUsersInput.test.tsx renamed to src/authz-module/role-assignation-wizard/HighlightedUsersInput.test.tsx

File renamed without changes.

0 commit comments

Comments
 (0)