From 0249102c085867b7a53201182a4e454ba6cf5885 Mon Sep 17 00:00:00 2001 From: Rohan Lahori <64496391+rohanlahori@users.noreply.github.com> Date: Mon, 21 Oct 2024 12:37:09 +0530 Subject: [PATCH] Pending Backlog Issues (#10823) * folder-count-fix * fixed query * fixed app sharing bug * minor css fix for delete group-button * changed delete button color for light mode * profile photo missing in groups * ui fix for alignment * css fix * updated regex for email validation * ui-fix for syncing the ui file with ee * fix for workspace settings page * workspace slug fix * reverted some minor change * minor ui fix * folder-rerender changes --- .../RightTopHeaderButtons/ManageAppUsers.jsx | 67 ++++++++++--------- frontend/src/HomePage/AppList.jsx | 8 +-- frontend/src/HomePage/Folders.jsx | 13 +++- frontend/src/HomePage/HomePage.jsx | 5 +- .../index.jsx | 15 +++-- .../src/OrganizationSettingsPage/index.jsx | 18 ++--- .../CreateOrganization.jsx | 3 +- frontend/src/_helpers/utils.js | 6 +- frontend/src/_styles/theme.scss | 11 ++- .../_ui/HttpHeaders/sourceEditorStyles.scss | 3 +- .../utility/group-permissions.utility.ts | 1 + server/src/services/folders.service.ts | 2 +- 12 files changed, 92 insertions(+), 60 deletions(-) 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..8818e65be6 100644 --- a/frontend/src/HomePage/Folders.jsx +++ b/frontend/src/HomePage/Folders.jsx @@ -25,6 +25,7 @@ export const Folders = function Folders({ canDeleteFolder, canCreateApp, darkMode, + searchedAppCount, }) { const [isLoading, setLoadingStatus] = useState(foldersLoading); const [showInput, setShowInput] = useState(false); @@ -40,11 +41,14 @@ export const Folders = function Folders({ const [activeFolder, setActiveFolder] = useState(currentFolder || {}); const [filteredData, setFilteredData] = useState(folders); const [errorText, setErrorText] = useState(''); + const [activeFolderAppCount, setActiveFolderAppCount] = useState(activeFolder.count); const navigate = useNavigate(); const { t } = useTranslation(); const { updateSidebarNAV } = useContext(BreadCrumbContext); - + useEffect(() => { + setActiveFolderAppCount(searchedAppCount); + }, [searchedAppCount]); useEffect(() => { setLoadingStatus(foldersLoading); // eslint-disable-next-line react-hooks/exhaustive-deps @@ -107,6 +111,7 @@ export const Folders = function Folders({ updateSidebarNAV(folder?.name ?? 'All apps'); //update the url query parameter with folder name updateFolderQuery(folder?.name); + setActiveFolderAppCount(folder.count); } function updateFolderQuery(name) { @@ -311,7 +316,11 @@ export const Folders = function Folders({ className="flex-grow-1 tj-folder-list tj-text-xsm" data-cy={`${folder.name.toLowerCase().replace(/\s+/g, '-')}-name`} > - {`${folder.name}${folder.count > 0 ? ` (${folder.count})` : ''}`} + {folder.id === activeFolder.id ? ( + {`${folder.name}${folder.count > 0 ? ` (${activeFolderAppCount})` : ''}`} + ) : ( + {`${folder.name}${folder.count > 0 ? ` (${folder.count})` : ''}`} + )} {(canDeleteFolder || canUpdateFolder) && ( diff --git a/frontend/src/HomePage/HomePage.jsx b/frontend/src/HomePage/HomePage.jsx index 5a84a84193..15219269e0 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, }) ); @@ -842,6 +843,7 @@ class HomePageComponent extends React.Component { canUpdateFolder={this.canUpdateFolder()} darkMode={this.props.darkMode} canCreateApp={this.canCreateApp()} + searchedAppCount={this.state.searchedAppCount} /> @@ -900,7 +902,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 +923,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/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/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/_helpers/utils.js b/frontend/src/_helpers/utils.js index bfe590b16c..581836006c 100644 --- a/frontend/src/_helpers/utils.js +++ b/frontend/src/_helpers/utils.js @@ -578,7 +578,7 @@ export function validateDates({ validationObject, widgetValue, currentState, cus export function validateEmail(email) { const emailRegex = - /^(([^<>()[\]\.,;:\s@\"]+(\.[^<>()[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i; + /^(([^<>()[\]\.,;:\s@\"]+(\.[^<>()[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[a-zA-Z]{2,})$/i; return emailRegex.test(email); } @@ -1099,9 +1099,9 @@ export const validateName = ( checkReservedWords = false, allowAllCases = false ) => { - const newName = name.trim(); + const newName = name; let errorMsg = ''; - if (emptyCheck && !newName) { + if (emptyCheck && (!newName || newName.trim().length === 0)) { errorMsg = `${nameType} can't be empty`; showError && toast.error(errorMsg, { diff --git a/frontend/src/_styles/theme.scss b/frontend/src/_styles/theme.scss index f81e2897f5..4b3bac7ce5 100644 --- a/frontend/src/_styles/theme.scss +++ b/frontend/src/_styles/theme.scss @@ -9841,7 +9841,7 @@ tbody { .manage-group-users-row { display: flex; flex-direction: row; - align-items: baseline; + align-items: center; padding: 12px 6px; width: 612px !important; height: 64px; @@ -10567,7 +10567,14 @@ tbody { } .disable { - color: var(--slate7); + color: var(--slate9); + } + .disable { + color: var(--slate9); + + &.dark-theme { + color: var(--slate11); + } } &__danger { diff --git a/frontend/src/_ui/HttpHeaders/sourceEditorStyles.scss b/frontend/src/_ui/HttpHeaders/sourceEditorStyles.scss index a625c2dcfd..c67709eb5e 100644 --- a/frontend/src/_ui/HttpHeaders/sourceEditorStyles.scss +++ b/frontend/src/_ui/HttpHeaders/sourceEditorStyles.scss @@ -1,3 +1,4 @@ +.query-manager-border-color{ input.form-control, textarea, .input-control { @@ -51,7 +52,7 @@ textarea, } } - +} .empty-key-value { border-radius: 6px; padding: 10px; diff --git a/server/src/modules/user_resource_permissions/utility/group-permissions.utility.ts b/server/src/modules/user_resource_permissions/utility/group-permissions.utility.ts index ef0af68895..c036d611c7 100644 --- a/server/src/modules/user_resource_permissions/utility/group-permissions.utility.ts +++ b/server/src/modules/user_resource_permissions/utility/group-permissions.utility.ts @@ -234,6 +234,7 @@ export function getUserInGroupQuery( 'users.firstName', 'users.lastName', 'users.email', + 'users.avatarId', 'userRole.id', 'role.name', 'organizationUsers.status', diff --git a/server/src/services/folders.service.ts b/server/src/services/folders.service.ts index 3c66a14425..94b0e336b1 100644 --- a/server/src/services/folders.service.ts +++ b/server/src/services/folders.service.ts @@ -107,7 +107,7 @@ export class FoldersService { .innerJoin('folderApp.app', 'app', 'folderApp.folderId = :id', { id: folder.id, }) - .where('app.name LIKE :name', { name: `%${searchKey}%` }) + .where('LOWER(app.name) LIKE :name', { name: `%${(searchKey ?? '').toLowerCase()}%` }) .getMany(); const userPermission = await this.abilityService.resourceActionsPermission(user, {