diff --git a/frontend/src/Editor/Header/RightTopHeaderButtons/ManageAppUsers.jsx b/frontend/src/Editor/Header/RightTopHeaderButtons/ManageAppUsers.jsx index a8d34774cb..094bac4414 100644 --- a/frontend/src/Editor/Header/RightTopHeaderButtons/ManageAppUsers.jsx +++ b/frontend/src/Editor/Header/RightTopHeaderButtons/ManageAppUsers.jsx @@ -401,40 +401,43 @@ class ManageAppUsersComponent extends React.Component { )} - - {((this?.props?.isVersionReleased && this?.props?.isPublic) || - window?.public_config?.ENABLE_PRIVATE_APP_EMBED === 'true') && ( -
- - - {embeddableLink} - - toast.success('Link copied to clipboard')}> - + + + {embeddableLink} + + toast.success('Link copied to clipboard')} > - - - - + + + + + + - -
- )} + + )} } diff --git a/frontend/src/HomePage/AppList.jsx b/frontend/src/HomePage/AppList.jsx index 496bb3ec20..2de3653baa 100644 --- a/frontend/src/HomePage/AppList.jsx +++ b/frontend/src/HomePage/AppList.jsx @@ -55,10 +55,10 @@ const AppList = (props) => { className={`d-block text-center text-body ${props.darkMode && 'text-white-50'}`} data-cy="empty-folder-text" > - {/* removed this error message display for now -> as it was leading to multiple message being shown in the UI*/} - {/* {props.currentFolder?.count == 0 - ? t('homePage.thisFolderIsEmpty', 'This folder is empty') - : t('homePage.nonAccessibleFolderApps', 'You do not have access to any applications in this folder.')} */} + {props.currentFolder?.count == 0 && + props.apps?.length == 0 && + props.appSearchKey == '' && + t('homePage.thisFolderIsEmpty', 'This folder is empty')} )} diff --git a/frontend/src/HomePage/Folders.jsx b/frontend/src/HomePage/Folders.jsx index 90eb79e9f1..e62bc1c919 100644 --- a/frontend/src/HomePage/Folders.jsx +++ b/frontend/src/HomePage/Folders.jsx @@ -44,7 +44,6 @@ export const Folders = function Folders({ const { t } = useTranslation(); const { updateSidebarNAV } = useContext(BreadCrumbContext); - useEffect(() => { setLoadingStatus(foldersLoading); // eslint-disable-next-line react-hooks/exhaustive-deps diff --git a/frontend/src/HomePage/HomePage.jsx b/frontend/src/HomePage/HomePage.jsx index 5a84a84193..9f93dfdf8c 100644 --- a/frontend/src/HomePage/HomePage.jsx +++ b/frontend/src/HomePage/HomePage.jsx @@ -107,6 +107,7 @@ class HomePageComponent extends React.Component { this.setState({ apps: data.apps, meta: { ...this.state.meta, ...data.meta }, + searchedAppCount: appSearchKey ? data.apps.length : this.state.currentFolder.count, isLoading: false, }) ); @@ -900,7 +901,7 @@ class HomePageComponent extends React.Component { canCreateApp={this.canCreateApp} /> )} - {!isLoading && meta.total_count === 0 && appSearchKey && ( + {!isLoading && apps?.length === 0 && appSearchKey && (
{this.props.t('homePage.noApplicationFound', 'No Applications found')} @@ -921,6 +922,7 @@ class HomePageComponent extends React.Component { darkMode={this.props.darkMode} appActionModal={this.appActionModal} removeAppFromFolder={this.removeAppFromFolder} + appSearchKey={this.state.appSearchKey} /> )}
diff --git a/frontend/src/ManageGranularAccess/AddEditResourceModal/AddEditResourcePermissionsModal.jsx b/frontend/src/ManageGranularAccess/AddEditResourceModal/AddEditResourcePermissionsModal.jsx index e70441a58e..783b008051 100644 --- a/frontend/src/ManageGranularAccess/AddEditResourceModal/AddEditResourcePermissionsModal.jsx +++ b/frontend/src/ManageGranularAccess/AddEditResourceModal/AddEditResourcePermissionsModal.jsx @@ -171,14 +171,16 @@ function AddEditResourcePermissionsModal({ - + {isCustom && ( + + )} diff --git a/frontend/src/ManageGroupPermissionResourcesV2/index.jsx b/frontend/src/ManageGroupPermissionResourcesV2/index.jsx index 80e3ff4fec..5783aaef8f 100644 --- a/frontend/src/ManageGroupPermissionResourcesV2/index.jsx +++ b/frontend/src/ManageGroupPermissionResourcesV2/index.jsx @@ -20,6 +20,8 @@ import { SearchBox } from '@/_components/SearchBox'; import EditRoleErrorModal from '@/ManageGroupPermissionsV2/ErrorModal/ErrorModal'; import ChangeRoleModal from '@/ManageGroupPermissionResourcesV2/ChangeRoleModal'; import { ToolTip } from '@/_components/ToolTip'; +import Avatar from '@/_ui/Avatar'; + class ManageGroupPermissionResourcesComponent extends React.Component { constructor(props) { super(props); @@ -339,7 +341,6 @@ class ManageGroupPermissionResourcesComponent extends React.Component { this.setState({ isChangeRoleModalOpen: true, updatingUserRole: updatingUser }); showChangeRoleModalMessage = () => { - console.log('called'); this.setState({ showRoleEditMessage: true }); }; @@ -435,7 +436,6 @@ class ManageGroupPermissionResourcesComponent extends React.Component { autoRoleChangeModalList, autoRoleChangeMessageType, } = this.state; - const isBasicPlan = false; const isPaidPlan = false; @@ -737,11 +737,16 @@ class ManageGroupPermissionResourcesComponent extends React.Component { key={user.id} className="manage-group-users-row" data-cy={`${String(user.email).toLowerCase().replace(/\s+/g, '-')}-user-row`} + style={{ alignItems: 'center' }} >

-

- {`${user?.firstName?.[0] ?? ''} ${user?.lastName?.[0] ?? ''}`} -
+ {`${user?.firstName ?? ''} ${user?.lastName ?? ''}`}

diff --git a/frontend/src/ManageGroupPermissionsV2/ManageGroupPermissionsV2.jsx b/frontend/src/ManageGroupPermissionsV2/ManageGroupPermissionsV2.jsx index 2a4d39d771..f973837817 100644 --- a/frontend/src/ManageGroupPermissionsV2/ManageGroupPermissionsV2.jsx +++ b/frontend/src/ManageGroupPermissionsV2/ManageGroupPermissionsV2.jsx @@ -684,7 +684,14 @@ class ManageGroupPermissionsComponent extends React.Component { /> )} - + {filteredGroup.length === 0 && showGroupSearchBar && groups.length !== 0 && ( +

+ + + No custom groups found + +
+ )} {groups.length ? ( filteredGroup.map((permissionGroup) => { return ( diff --git a/frontend/src/ManageOrgConstants/ManageOrgConstants.jsx b/frontend/src/ManageOrgConstants/ManageOrgConstants.jsx index bc171967ee..b6548197bd 100644 --- a/frontend/src/ManageOrgConstants/ManageOrgConstants.jsx +++ b/frontend/src/ManageOrgConstants/ManageOrgConstants.jsx @@ -15,8 +15,8 @@ import EmptyState from './EmptyState'; import FolderList from '@/_ui/FolderList/FolderList'; import { BreadCrumbContext } from '@/App'; import './ConstantFormStyle.scss'; -import { Constants } from '@/_helpers/utils'; - +import { Constants, redirectToWorkspace } from '@/_helpers/utils'; +import { SearchBox } from '@/_components/SearchBox'; const MODES = Object.freeze({ CREATE: 'create', EDIT: 'edit', @@ -47,6 +47,7 @@ const ManageOrgConstantsComponent = ({ darkMode }) => { const [searchTerm, setSearchTerm] = useState(''); const [globalCount, setGlobalCount] = useState(0); const [secretCount, setSecretCount] = useState(0); + const NoPermissionMessage = 'You do not have permissions to perform this action'; const handleTabChange = (tab) => { setCurrentPage(1); @@ -62,6 +63,14 @@ const ManageOrgConstantsComponent = ({ darkMode }) => { updateTableData(constants, activeTabEnvironment?.name, 0, perPage, true, activeTab, searchTerm); }; + const handleSearchClear = () => { + const searchTerm = ''; + setSearchTerm(searchTerm); + + // Re-filter the constants based on the current search term and active tab + updateTableData(constants, activeTabEnvironment?.name, 0, perPage, true, activeTab, searchTerm); + }; + const onCancelBtnClicked = () => { setSelectedConstant(null); setIsManageVarDrawerOpen(false); @@ -323,6 +332,9 @@ const ManageOrgConstantsComponent = ({ darkMode }) => { .catch(({ error }) => { setErrors(error); toast.error(error); + if (error === NoPermissionMessage) { + redirectToWorkspace(); + } }) .finally(() => fetchConstantsAndEnvironments()); } @@ -335,7 +347,10 @@ const ManageOrgConstantsComponent = ({ darkMode }) => { }) .catch(({ error }) => { setErrors(error); - toast.error('Constant could not be created'); + toast.error(error || 'Constant could not be created'); + if (error === NoPermissionMessage) { + redirectToWorkspace(); + } }) .finally(() => fetchConstantsAndEnvironments()); }; @@ -358,6 +373,9 @@ const ManageOrgConstantsComponent = ({ darkMode }) => { }) .catch(({ error }) => { toast.error(error); + if (error === NoPermissionMessage) { + redirectToWorkspace(); + } }) .finally(() => fetchConstantsAndEnvironments()); }; @@ -460,12 +478,13 @@ const ManageOrgConstantsComponent = ({ darkMode }) => {
-
diff --git a/frontend/src/OrganizationSettingsPage/index.jsx b/frontend/src/OrganizationSettingsPage/index.jsx index b79cdad83d..1ae96c4cc5 100644 --- a/frontend/src/OrganizationSettingsPage/index.jsx +++ b/frontend/src/OrganizationSettingsPage/index.jsx @@ -42,19 +42,20 @@ export function OrganizationSettings(props) { if (selectedTabFromRoute === 'workspace-settings') { // No Sub routes added loading first one setSelectedTab(admin ? workspaceSettingsLinks[0].id : 'workspacevariables'); + navigate(admin ? workspaceSettingsLinks[0].route : 'workspace-variables'); } else { + const selectedWorkspaceSetting = workspaceSettingsLinks?.find((m) => m.id === selectedTabFromRoute); + updateSidebarNAV(selectedWorkspaceSetting?.name || ''); setSelectedTab(getMenuFromRoute(selectedTabFromRoute)?.id); } return () => subscription.unsubscribe(); - }, [authenticationService.currentSessionValue?.admin]); - - useEffect(() => { - const menu = workspaceSettingsLinks?.find((m) => m.id === selectedTab); - updateSidebarNAV(menu?.name || ''); - navigate(menu?.route || ''); - }, [selectedTab]); + }, [admin, location.pathname]); + const handleClick = (data) => { + setSelectedTab(data.id); + updateSidebarNAV(data?.name || ''); + }; return (
@@ -67,6 +68,7 @@ export function OrganizationSettings(props) { { - setSelectedTab(item.id); + handleClick(item); }} selectedItem={selectedTab == item.id} renderBadgeForItems={[]} diff --git a/frontend/src/_components/OrganizationManager/CreateOrganization.jsx b/frontend/src/_components/OrganizationManager/CreateOrganization.jsx index 487b8a02f5..82bd046ae1 100644 --- a/frontend/src/_components/OrganizationManager/CreateOrganization.jsx +++ b/frontend/src/_components/OrganizationManager/CreateOrganization.jsx @@ -58,6 +58,7 @@ export const CreateOrganization = ({ showCreateOrg, setShowCreateOrg }) => { }; const handleInputChange = async (value, field) => { + const trimmedValue = value?.trim(); if (field === 'slug') { setSlug({ ...slug, @@ -83,7 +84,7 @@ export const CreateOrganization = ({ showCreateOrg, setShowCreateOrg }) => { if (error?.status === true) { try { await organizationService.checkWorkspaceUniqueness( - field === 'name' ? value : null, + field === 'name' ? trimmedValue : null, field === 'slug' ? value : null ); } catch (errResponse) { diff --git a/frontend/src/_components/OrganizationManager/CustomSelect.jsx b/frontend/src/_components/OrganizationManager/CustomSelect.jsx index 2642b3a9f1..d9b29ac1d8 100644 --- a/frontend/src/_components/OrganizationManager/CustomSelect.jsx +++ b/frontend/src/_components/OrganizationManager/CustomSelect.jsx @@ -1,52 +1,45 @@ import React, { useState } from 'react'; import Select from '@/_ui/Select'; import { components } from 'react-select'; -import { EditOrganization } from './EditOrganization'; import { CreateOrganization } from './CreateOrganization'; import { useTranslation } from 'react-i18next'; import { authenticationService } from '@/_services'; import SolidIcon from '@/_ui/Icon/SolidIcons'; import { ToolTip } from '@/_components'; import { decodeEntities } from '@/_helpers/utils'; - const Menu = (props) => { const { t } = useTranslation(); const { admin } = authenticationService.currentSessionValue; const darkMode = localStorage.getItem('darkMode') === 'true'; + return ( -
- {admin && ( - <> -
props.selectProps.setShowEditOrg(true)} - > -
-
{props?.selectProps?.value?.label}
-
- -
-
+
+ <> +
+
+
Workspaces ({props.options.length})
+ {admin && ( + +
+ +
+
+ )}
- - )} -
{props.children}
-
-
-
+ -
- -
- {t('header.organization.addNewWorkSpace', 'Add new workspace')} -
+
{props.children}
); @@ -65,22 +58,18 @@ const SingleValue = ({ selectProps }) => { }; export const CustomSelect = ({ ...props }) => { - const [showEditOrg, setShowEditOrg] = useState(false); const [showCreateOrg, setShowCreateOrg] = useState(false); const darkMode = localStorage.getItem('darkMode') === 'true'; - const currentValue = props?.options.find((option) => option?.value === props?.value); return ( <> -