Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
785ca4f
feat(admin-ui): work in process fro the users
faisalsiddique4400 Mar 5, 2026
308d9b8
Merge branch with the main
faisalsiddique4400 Mar 5, 2026
8fa4507
feat(admin-ui): revamp User Management module as per Figma (#2630)
faisalsiddique4400 Mar 10, 2026
6589738
Merge branch 'main' into admin-ui-issue-2630
faisalsiddique4400 Mar 10, 2026
e52dfb1
Resolve code rabbit issues
faisalsiddique4400 Mar 10, 2026
49e8122
Merge branch 'admin-ui-issue-2630' of github-faisal:GluuFederation/fl…
faisalsiddique4400 Mar 10, 2026
1e904f1
Resolve code rabbit issues
faisalsiddique4400 Mar 10, 2026
e9dcc3a
feat(admin-ui): Resolve coderabbit issues
faisalsiddique4400 Mar 11, 2026
842e639
Resolve code rabbit issues
faisalsiddique4400 Mar 11, 2026
69792e1
Resolve code rabbit issues
faisalsiddique4400 Mar 11, 2026
bd3a5dc
color fixes
faisalsiddique4400 Mar 11, 2026
b4ae6ad
webhook issue fixed
faisalsiddique4400 Mar 11, 2026
683a937
webhook issue fixed
faisalsiddique4400 Mar 11, 2026
4a45359
pass issue
faisalsiddique4400 Mar 11, 2026
b271bc3
generalize modal spacing
faisalsiddique4400 Mar 12, 2026
60a1b34
form
faisalsiddique4400 Mar 12, 2026
44eb4e9
form colors fixed
faisalsiddique4400 Mar 12, 2026
cc91d7d
formatting applied
faisalsiddique4400 Mar 12, 2026
af96d47
form styles fixed
faisalsiddique4400 Mar 12, 2026
7cecf7e
password change styles fixed
faisalsiddique4400 Mar 12, 2026
fa726ea
multi webhook calls fixed
faisalsiddique4400 Mar 13, 2026
90baa87
multi webhook calls fixed
faisalsiddique4400 Mar 13, 2026
ea21264
multi webhook calls fixed
faisalsiddique4400 Mar 13, 2026
9bb2026
multi webhook calls fixed
faisalsiddique4400 Mar 13, 2026
d0b6089
multi webhook calls fixed
faisalsiddique4400 Mar 13, 2026
fa20b07
user claims height issue fixed
faisalsiddique4400 Mar 13, 2026
10b231e
autoadding in user roles fixed
faisalsiddique4400 Mar 16, 2026
f3a0a36
autoadding in user roles fixed
faisalsiddique4400 Mar 16, 2026
ebe57bc
merged with main
faisalsiddique4400 Mar 16, 2026
70cc58a
test files fixed
faisalsiddique4400 Mar 16, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions admin-ui/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -33,4 +33,5 @@ plugins_repo
.eslintcache
.vscode/*
!.vscode/extensions.json
.claude/
configApiSpecs.yaml
3 changes: 2 additions & 1 deletion admin-ui/__tests__/setup.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,8 @@ jest.spyOn(global.console, 'error').mockImplementation((...args: unknown[]) => {
msg.includes('Problems getting API access token') ||
msg.includes('Problems posting user action audit log') ||
msg.includes('suspended resource finished loading') ||
(msg.includes('Failed prop type') && msg.includes('timeout') && msg.includes('Fade'))
(msg.includes('Failed prop type') && msg.includes('timeout') && msg.includes('Fade')) ||
msg.includes('not wrapped in act')

if (shouldSuppress) return
originalError(...args)
Expand Down
8 changes: 3 additions & 5 deletions admin-ui/app/components/Layout/LayoutContent.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import React, { useContext, useEffect, useMemo, useRef } from 'react'
import PropTypes from 'prop-types'
import { ThemeContext } from '@/context/theme/themeContext'
import getThemeColor, { themeConfig } from '@/context/theme/config'
import customColors, { hexToRgb, getCustomColorsAsCssVars } from '@/customColors'
import customColors, { getCustomColorsAsCssVars, getLoadingOverlayRgba } from '@/customColors'
import { SCROLLBAR } from '@/constants'
import { THEME_LIGHT, THEME_DARK } from '@/context/theme/constants'
import type { LayoutContentProps } from './types'
Expand All @@ -25,17 +25,15 @@ const LayoutContent: React.FC<LayoutContentProps> & { layoutPartName: string } =
const textColor = isDark ? customColors.white : customColors.textSecondary
const textColorActive = isDark ? customColors.white : customColors.primaryDark
const textColorHover = isDark ? customColors.white : customColors.primaryDark
const hoverBackground = isDark
? `rgba(${hexToRgb(customColors.white)}, 0.08)`
: customColors.sidebarHoverBg
const hoverBackground = getLoadingOverlayRgba(themeColors.fontColor, 0.08)

return {
textColor,
textColorActive,
textColorHover,
hoverBackground,
}
}, [isDark])
}, [isDark, themeColors.fontColor])

const cssVariables = useMemo(
() => ({
Expand Down
6 changes: 6 additions & 0 deletions admin-ui/app/constants/ui.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,12 @@ export const getScrollbarStyles = (themeColors: ThemeConfig) => ({
},
})

export const MODAL = {
WIDTH: 1007,
MAX_VW: '90vw',
MAX_VH: '90vh',
} as const

export const SPACING = {
PAGE: 24,
CONTENT_PADDING: 40,
Expand Down
10 changes: 10 additions & 0 deletions admin-ui/app/context/theme/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,10 @@ export interface ThemeConfig {
removeButton: { bg: string; text: string }
errorButtonText: string
}
/** Available Claims panel (User Management) */
availableClaims: {
focusOutline: string
}
}

const createLightTheme = (): ThemeConfig => {
Expand Down Expand Up @@ -147,6 +151,9 @@ const createLightTheme = (): ThemeConfig => {
removeButton: { bg: customColors.statusInactive, text: customColors.white },
errorButtonText: customColors.white,
},
availableClaims: {
focusOutline: customColors.lightBlue,
},
}
}

Expand Down Expand Up @@ -237,6 +244,9 @@ const createDarkTheme = (): ThemeConfig => {
removeButton: { bg: customColors.statusInactive, text: customColors.white },
errorButtonText: customColors.white,
},
availableClaims: {
focusOutline: customColors.lightBlue,
},
}
}

Expand Down
6 changes: 5 additions & 1 deletion admin-ui/app/customColors.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ export const customColors = {
primaryDark: '#0a2540',
darkBackground: '#0b2947',
darkCardBg: '#091e34',
userFormPageBg: '#1A3150',
darkDropdownBg: '#194169',
lightInputBg: '#f9fafb',
darkInputBg: '#15395d',
Expand All @@ -34,11 +35,14 @@ export const customColors = {
paleYellow: '#cfd76f',

// Status
statusActive: '#00a65d',
statusActive: '#00b875',
statusActiveBg: '#d3f5e6',
statusInactive: '#f13f44',
statusInactiveBg: '#ffe6e7',

// Claims selection (Available Claims panel)
claimsSelectionBorder: '#8FE4BF',

// Disabled Badge
disabledBadgeLightBg: '#D9E1E8',
disabledBadgeLightText: '#425466',
Expand Down
87 changes: 86 additions & 1 deletion admin-ui/app/locales/en/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,14 @@
"show_less": "Show Less",
"set": "Set",
"to": "to",
"Username": "Username",
"User Role": "User Role",
"User certificate": "User certificate",
"Email Verified": "Email Verified",
"Nickname": "Nickname",
"Gender, male or female": "Gender, male or female",
"Website URL": "Website URL",
"memberOf": "Member Of",
"actions": {
"accept": "Accept",
"add_attribute_mapping": "Add Attribute Mapping",
Expand Down Expand Up @@ -48,6 +56,7 @@
"change_password": "Change Password",
"close": "Close",
"clear": "Clear",
"clear_search": "Clear search",
"try_again": "Try Again",
"delete": "Delete",
"revoke": "Revoke",
Expand All @@ -68,6 +77,10 @@
"add_custom_attributes": "Add custom attributes",
"refresh": "Refresh"
},
"password": {
"show": "Show password",
"hide": "Hide password"
},
"serviceDownFallback": "Gluu Flex Admin UI is not getting any response from the backend (Jans Config Api).",
"roleNotFoundMessage": "Unauthorized User",
"roleNotFoundDescription": "The logged-in user does not have a valid role. Logging out of Admin UI",
Expand Down Expand Up @@ -248,6 +261,8 @@
"selected_idp": "Selected IDP",
"sp_metadata_file": "IDP Metadata File",
"displayName": "Display Name",
"firstName": "First Name",
"middleName": "Middle Name",
"enable_tr": "Enable TR",
"import_metadata_from_file": "Upload Metadata file",
"idp_entity_id": "Entity Id",
Expand Down Expand Up @@ -357,6 +372,7 @@
"introspection_scripts": "Introspection",
"ropcScripts": "Password Grant",
"inum": "inum",
"INUM": "INUM",
"ip_address": "IP Address",
"is_active": "Active",
"is_expirable_client": "Is Expirable Client?",
Expand Down Expand Up @@ -573,6 +589,7 @@
"deletable": "Deletable",
"email": "Email",
"userName": "User Name",
"userRole": "Jans Admin UI Role",
"nickName": "Nick Name",
"modality": "Modality",
"dateAdded": "Date Added",
Expand Down Expand Up @@ -759,6 +776,7 @@
"fido": "FIDO",
"schema": "Schema",
"user_claims": "User Claims",
"available_claims": "Available Claims",
"scopes": "Scopes",
"scripts": "Scripts",
"services": "Services",
Expand Down Expand Up @@ -823,6 +841,7 @@
"all_webhooks_triggered_successfully": "All webhooks triggered successfully.",
"failed_to_trigger_webhook": "Something went wrong while triggering webhook.",
"webhook_entity": "webhook",
"user_entity": "user",
"no_shortcodes_found": "No shortcodes found!",
"create_first_webhook": "Create your first webhook to get started",
"permission_name_error": "Please ensure the permission name is at least 5 characters long.",
Expand Down Expand Up @@ -859,6 +878,8 @@
"showing_entries": "Showing {{start}} to {{end}} of {{total}} entries",
"start_date_after_end": "Start date cannot be after end date",
"both_dates_required": "Both start and end dates are required for date range filtering",
"success": "Success",
"error": "Error",
"success_in_saving": "Changes saved successfully",
"fido_config_updated_successfully": "FIDO configuration updated successfully",
"fido_config_update_failed": "Failed to update FIDO configuration",
Expand Down Expand Up @@ -922,6 +943,8 @@
"view_client_details": "View client details",
"view_2FA_details": "View 2FA details",
"2FA_details": "2FA details",
"device_information": "Device Information",
"details": "Details",
"view_script_details": "View custom script details",
"add_new_user": "Add User",
"error_in_saving": "Error in saving.",
Expand Down Expand Up @@ -994,18 +1017,27 @@
"see_project_details": "See project details",
"add_ssa": "Add SSA",
"copied": "Copied",
"request_timeout_title": "Request Timeout",
"no_data_found": "No data found",
"no_data_to_export": "No data available to export",
"no_sessions_found": "No sessions found",
"role_already_exists": "Role already exists",
"user_created_successfully": "User created successfully",
"user_updated_successfully": "User updated successfully",
"user_deleted_successfully": "User deleted successfully",
"audit_logging_failed": "The action completed, but audit logging failed.",
"webhook_trigger_failed": "The action completed, but the webhook trigger failed.",
"query_invalidation_failed": "The action completed, but query cache invalidation failed.",
"post_delete_callback_failed": "The action completed, but a post-delete callback failed.",
"password_changed_successfully": "Password changed successfully",
"session_revoke_failed": "Password was changed but session could not be revoked. The user may still be signed in.",
"session_revoke_failed_changes_saved": "Session revocation failed; changes saved.",
"persistence_config_load_failed": "Failed to load persistence configuration",
"persistence_config_load_failed_detail": "Could not load persistence configuration. LDAP-specific settings may not be applied correctly.",
"revokeUserSession": "The user's session will be revoked as one or more of the following fields have been modified: Password, Status, Admin Role.",
"device_deleted_successfully": "Device deleted successfully",
"loading_roles": "Loading roles...",
"failed_load_roles": "Failed to load roles",
"service_status_up": "Service is running normally.",
"service_status_down": "Service is currently unavailable.",
"service_status_degraded": "Service is experiencing issues.",
Expand Down Expand Up @@ -1045,7 +1077,17 @@
"invalid_number": "Must be a valid number",
"invalid_email": "Must be a valid email address",
"invalid_json": "Must be valid JSON",
"invalid_pattern": "Invalid format"
"invalid_pattern": "Invalid format",
"password_required": "Password is required.",
"password_format": "Min 8 chars with uppercase, lowercase, number & special char",
"confirm_password_required": "Confirm password is required.",
"confirm_password_required_when_set": "Confirm password is required when password is provided",
"passwords_must_match": "Passwords must match",
"display_name_required": "Display name is required.",
"first_name_required": "First name is required.",
"last_name_required": "Last name is required.",
"username_required": "User name is required.",
"email_required": "Email is required."
},
"tooltips": {
"insert_shortcode": "Insert shortcode",
Expand Down Expand Up @@ -1080,6 +1122,9 @@
},
"placeholders": {
"id": "Enter id",
"search": "Search",
"search_here": "Search Here",
"new_selection": "New selection",
"action_commit_message": "Provide the reason of this change",
"activate_ldap_configuration": "Activate ldap configuration",
"client_description": "Enter the client description",
Expand Down Expand Up @@ -1112,6 +1157,7 @@
"redirect_uri": "Enter a redirect URI",
"redirect_uris": "Enter a redirect URI in format (e.g. https:// or schema://",
"search_pattern": "Search pattern",
"search_claims_here": "Search claims here",
"asset_upload": "Drag 'n' drop .jar/.css/.xhtml/.js/.png/.jpeg/.jpg/.gif/.properties file here, or click to select file",
"select_file_to_upload": "Select a file to upload",
"enter_here": "Enter Here",
Expand Down Expand Up @@ -2016,5 +2062,44 @@
"note_prefix": "Configure",
"note_suffix": "to manage roles and permissions. Once you save the cedarling configuration, roles and permissions will be automatically synced from the policy store."
}
},
"claims": {
"sn": "Last Name",
"jansBackchannelDeviceRegistrationTkn": "CIBA Device Registration Token",
"jansBackchannelUsrCode": "CIBA User Code",
"inum": "Inum",
"displayName": "Display Name",
"gender": "Gender",
"locale": "Locale",
"website": "Website URL",
"uid": "Username",
"jansIMAPData": "IMAP Data",
"jansStatus": "User Status",
"jansAdminUIRole": "Jans Admin UI Role",
"jansEnrollmentCode": "Enrollment Code",
"nickname": "Nickname",
"role": "User Role",
"preferredLanguage": "Preferred Language",
"profile": "Profile URL",
"secretQuestion": "Secret Question",
"emailVerified": "Email Verified",
"birthdate": "Birthdate",
"middleName": "Middle Name",
"zoneinfo": "Time Zone",
"userPassword": "Password",
"phoneNumberVerified": "Phone Number Verified",
"givenName": "First Name",
"jansPrefUsrName": "Preferred Username",
"transientId": "Transient ID",
"persistentId": "Persistent ID",
"c": "Country",
"updatedAt": "Last Updated",
"secretAnswer": "Secret Answer",
"address": "Address",
"userCertificate": "User Certificate",
"mail": "Email",
"o": "Organization",
"memberOf": "Member Of",
"picture": "Picture URL"
}
}
Loading
Loading