Skip to content

Commit

Permalink
Merge pull request #760 from gravitl/hotfix/release-v0.25.0/saas-user…
Browse files Browse the repository at this point in the history
…-mgmt

Hotfix/release v0.25.0/saas user mgmt
  • Loading branch information
Aceix authored Sep 11, 2024
2 parents 4368b10 + dc361c9 commit 3e6c630
Show file tree
Hide file tree
Showing 7 changed files with 170 additions and 166 deletions.
3 changes: 1 addition & 2 deletions src/components/modals/invite-user-modal/InviteUserModal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ import { User, UserGroup, UserInvite, UserRole, UserRoleId } from '@/models/User
import { UsersService } from '@/services/UsersService';
import { DeleteOutlined } from '@ant-design/icons';
import { copyTextToClipboard, kebabCaseToTitleCase, useServerLicense } from '@/utils/Utils';
import { getInviteMagicLink } from '@/utils/RouteUtils';
import CreateUserGroupModal from '@/pages/users/CreateUserGroupModal';
import { isAdminUserOrRole } from '@/utils/UserMgmtUtils';

Expand Down Expand Up @@ -440,7 +439,7 @@ export default function InviteUserModal({ isOpen, onInviteFinish, onClose, onCan
type="link"
style={{ marginRight: '1rem' }}
onClick={async () => {
await copyTextToClipboard(getInviteMagicLink(invite.invite_code, invite.email));
await copyTextToClipboard(invite.invite_url);
notify.success({ message: 'Invite code copied to clipboard' });
}}
>
Expand Down
63 changes: 34 additions & 29 deletions src/components/modals/user-details-modal/UserDetailsModal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import { User, UserGroup, UserRole, UserRoleId } from '@/models/User';
import { UsersService } from '@/services/UsersService';
import { kebabCaseToTitleCase, snakeCaseToTitleCase, useServerLicense } from '@/utils/Utils';
import { isAdminUserOrRole } from '@/utils/UserMgmtUtils';
import { isSaasBuild } from '@/services/BaseService';

interface UserdetailsModalProps {
isOpen: boolean;
Expand Down Expand Up @@ -320,42 +321,46 @@ export default function UserDetailsModal({
</Col>
</Row>

<Row ref={addUserPasswordInputRef}>
<Col xs={24}>
<Form.Item label="Password" name="password">
{!isSaasBuild && (
<>
<Row ref={addUserPasswordInputRef}>
<Col xs={24}>
<Form.Item label="Password" name="password">
<Input
placeholder="(unchanged)"
type="password"
disabled={user.auth_type === 'oauth'}
title={user.auth_type === 'oauth' ? 'You cannot change the password of an OAuth user' : ''}
/>
</Form.Item>
</Col>
</Row>

<Form.Item
label="Confirm Password"
name="confirm-password"
rules={[
{
validator(_, value) {
if (value !== passwordVal) {
return Promise.reject('Password must match');
} else {
return Promise.resolve();
}
},
},
]}
dependencies={['password']}
>
<Input
placeholder="(unchanged)"
type="password"
disabled={user.auth_type === 'oauth'}
title={user.auth_type === 'oauth' ? 'You cannot change the password of an OAuth user' : ''}
/>
</Form.Item>
</Col>
</Row>

<Form.Item
label="Confirm Password"
name="confirm-password"
rules={[
{
validator(_, value) {
if (value !== passwordVal) {
return Promise.reject('Password must match');
} else {
return Promise.resolve();
}
},
},
]}
dependencies={['password']}
>
<Input
placeholder="(unchanged)"
type="password"
disabled={user.auth_type === 'oauth'}
title={user.auth_type === 'oauth' ? 'You cannot change the password of an OAuth user' : ''}
/>
</Form.Item>
</>
)}

{isServerEE && (
<>
Expand Down
115 changes: 60 additions & 55 deletions src/pages/users/ProfilePage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { UsersService } from '@/services/UsersService';
import { extractErrorMsg } from '@/utils/ServiceUtils';
import { useState } from 'react';
import { kebabCaseToTitleCase, snakeCaseToTitleCase } from '@/utils/Utils';
import { isSaasBuild } from '@/services/BaseService';

export default function ProfilePage(props: PageProps) {
const [notify, notifyCtx] = notification.useNotification();
Expand Down Expand Up @@ -90,63 +91,67 @@ export default function ProfilePage(props: PageProps) {
</Col>
</Row>

<Row>
<Col xs={24}>
<Form.Item label="Password" name="password">
<Input
placeholder="(unchanged)"
type="password"
disabled={store.user?.auth_type === 'oauth'}
title={store.user?.auth_type === 'oauth' ? 'Cannot change password of an oauth user' : ''}
/>
</Form.Item>
</Col>
</Row>
{!isSaasBuild && (
<>
<Row>
<Col xs={24}>
<Form.Item label="Password" name="password">
<Input
placeholder="(unchanged)"
type="password"
disabled={store.user?.auth_type === 'oauth'}
title={store.user?.auth_type === 'oauth' ? 'Cannot change password of an oauth user' : ''}
/>
</Form.Item>
</Col>
</Row>

<Row>
<Col xs={24}>
<Form.Item
label="Confirm Password"
name="confirm-password"
rules={[
{
validator(_, value) {
if (value !== passwordVal) {
return Promise.reject('Password must match');
} else {
return Promise.resolve();
}
},
},
]}
dependencies={['password']}
>
<Input
placeholder="(unchanged)"
type="password"
disabled={store.user?.auth_type === 'oauth'}
title={store.user?.auth_type === 'oauth' ? 'Cannot change password of an oauth user' : ''}
/>
</Form.Item>
</Col>
</Row>
<Row>
<Col xs={24}>
<Form.Item
label="Confirm Password"
name="confirm-password"
rules={[
{
validator(_, value) {
if (value !== passwordVal) {
return Promise.reject('Password must match');
} else {
return Promise.resolve();
}
},
},
]}
dependencies={['password']}
>
<Input
placeholder="(unchanged)"
type="password"
disabled={store.user?.auth_type === 'oauth'}
title={store.user?.auth_type === 'oauth' ? 'Cannot change password of an oauth user' : ''}
/>
</Form.Item>
</Col>
</Row>

<Divider />
<Row>
<Col xs={24} style={{ textAlign: 'end' }}>
<Form.Item>
<Button
type="primary"
loading={isSubmitting}
onClick={() => {
updateUser();
}}
>
Update Profile
</Button>
</Form.Item>
</Col>
</Row>
<Divider />
<Row>
<Col xs={24} style={{ textAlign: 'end' }}>
<Form.Item>
<Button
type="primary"
loading={isSubmitting}
onClick={() => {
updateUser();
}}
>
Update Profile
</Button>
</Form.Item>
</Col>
</Row>
</>
)}
</Form>
</Card>
</div>
Expand Down
86 changes: 44 additions & 42 deletions src/pages/users/UsersPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -182,12 +182,7 @@ export default function UsersPage(props: PageProps) {
}, []);

const onInviteUser = useCallback(() => {
if (isSaasBuild) {
window.location = getAmuiUrl('invite-user') as any;
return;
} else {
setIsInviteModalOpen(true);
}
setIsInviteModalOpen(true);
}, []);

const canDeleteUser: (user: User) => [boolean, string] = useCallback(
Expand Down Expand Up @@ -378,44 +373,51 @@ export default function UsersPage(props: PageProps) {
<Dropdown
placement="bottomRight"
menu={{
items: [
{
key: 'edit',
label: 'Change Password',
disabled: !canChangePassword(user)[0],
title: canChangePassword(user)[0] ? canChangePassword(user)[1] : '',
onClick: (ev: any) => {
ev.domEvent.stopPropagation();
const userClone = structuredClone(user);
onEditUser(userClone);
},
},
{
key: 'delete',
disabled: !canDeleteUser(user)[0],
title: canDeleteUser(user)[0] ? canDeleteUser(user)[1] : '',
label: 'Delete',
onClick: (ev: any) => {
ev.domEvent.stopPropagation();
confirmDeleteUser(user);
items: (() => {
const items = [
{
key: 'delete',
disabled: !canDeleteUser(user)[0],
title: canDeleteUser(user)[0] ? canDeleteUser(user)[1] : '',
label: 'Delete',
onClick: (ev: any) => {
ev.domEvent.stopPropagation();
confirmDeleteUser(user);
},
},
},
].concat(
!isSaasBuild && user.platform_role_id === 'super-admin' && store.username === user.username
? [
{
key: 'transfer',
label: 'Transfer Super Admin Rights',
disabled: false,
title: '',
onClick: (ev) => {
ev.domEvent.stopPropagation();
setIsTransferSuperAdminRightsModalOpen(true);
].concat(
!isSaasBuild && user.platform_role_id === 'super-admin' && store.username === user.username
? [
{
key: 'transfer',
label: 'Transfer Super Admin Rights',
disabled: false,
title: '',
onClick: (ev) => {
ev.domEvent.stopPropagation();
setIsTransferSuperAdminRightsModalOpen(true);
},
},
},
]
: [],
) as MenuProps['items'],
]
: [],
) as MenuProps['items'];

if (!isSaasBuild) {
items?.unshift({
key: 'edit',
label: 'Change Password',
disabled: !canChangePassword(user)[0],
title: canChangePassword(user)[0] ? canChangePassword(user)[1] : '',
onClick: (ev: any) => {
ev.domEvent.stopPropagation();
const userClone = structuredClone(user);
onEditUser(userClone);
},
});
}

return items;
})(),
}}
>
<Button type="text" icon={<MoreOutlined />} />
Expand Down
Loading

0 comments on commit 3e6c630

Please sign in to comment.