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')}>
-
-
+
+
+
-
-
- )}
+
+ )}
}
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, {