Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
69ae0e0
fix(admin-ui): unable to add Custom and Module properties in Scripts …
faisalsiddique4400 Oct 30, 2025
38a4851
code rabbit suggestions
faisalsiddique4400 Oct 30, 2025
a7c8332
code rabbit suggestions
faisalsiddique4400 Oct 30, 2025
5a84bf4
code rabbit suggestions
faisalsiddique4400 Oct 30, 2025
4809e95
pagination count issues fixed
faisalsiddique4400 Oct 30, 2025
eae25f9
fix(admin-ui): unable to map permission to a role using GUI (#2400)
faisalsiddique4400 Oct 30, 2025
94b105b
fix(admin-ui): adding uniformity in cancel and back buttons present …
faisalsiddique4400 Oct 30, 2025
4317ea8
Merge branch 'main' of github-faisal:GluuFederation/flex into admin-u…
faisalsiddique4400 Oct 30, 2025
b9fd682
Code rabbit suggestions
faisalsiddique4400 Oct 30, 2025
9bc53ff
Code rabbit suggestions
faisalsiddique4400 Oct 30, 2025
847a607
Code rabbit suggestions
faisalsiddique4400 Oct 30, 2025
793a56a
Code rabbit suggestions
faisalsiddique4400 Oct 30, 2025
7181998
Code rabbit suggestions
faisalsiddique4400 Oct 30, 2025
241e9c6
Code rabbit suggestions
faisalsiddique4400 Oct 30, 2025
5dc0919
Code rabbit suggestions
faisalsiddique4400 Oct 30, 2025
68f742d
buttons swapping
faisalsiddique4400 Oct 31, 2025
ea5aa6b
Code Rabbit fixes
faisalsiddique4400 Oct 31, 2025
0cd0df3
Code Rabbit fixes
faisalsiddique4400 Oct 31, 2025
7af2074
Code Rabbit fixes
faisalsiddique4400 Oct 31, 2025
4e86e97
Code Rabbit fixes
faisalsiddique4400 Oct 31, 2025
1bff777
Code Rabbit fixes
faisalsiddique4400 Oct 31, 2025
a288f10
Code Rabbit fixes
faisalsiddique4400 Oct 31, 2025
cb7b80e
feat(admin): adding uniformity in cancel and back buttons present in …
faisalsiddique4400 Oct 31, 2025
4c5e6d3
Merge branch 'main' into admin-ui-issue-2361-scim
faisalsiddique4400 Oct 31, 2025
89271ec
Saperating footer components
faisalsiddique4400 Nov 3, 2025
75b0358
Code rabbit changes
faisalsiddique4400 Nov 3, 2025
c90eec1
Code rabbit changes
faisalsiddique4400 Nov 3, 2025
b2b52b0
Code rabbit changes
faisalsiddique4400 Nov 3, 2025
8aba204
Code rabbit changes
faisalsiddique4400 Nov 3, 2025
f5fc2be
file notations fixes
faisalsiddique4400 Nov 3, 2025
00b2d45
file notations fixes
faisalsiddique4400 Nov 3, 2025
b9dad66
Rename Gluuformfooter.tsx to GluuFormFooter.tsx
faisalsiddique4400 Nov 3, 2025
d14e1b6
code rabbit fixes
faisalsiddique4400 Nov 3, 2025
1376956
code rabbit fixes
faisalsiddique4400 Nov 3, 2025
a838993
code rabbit fixes
faisalsiddique4400 Nov 3, 2025
820046c
feat(admin): adding uniformity in cancel and back buttons present in …
faisalsiddique4400 Nov 3, 2025
885a512
feat(admin): adding uniformity in cancel and back buttons present in …
faisalsiddique4400 Nov 3, 2025
3c45274
code rabbit changes
faisalsiddique4400 Nov 3, 2025
477a8f9
code rabbit changes
faisalsiddique4400 Nov 3, 2025
d8957fd
feat(admin): adding uniformity in cancel and back buttons present in …
faisalsiddique4400 Nov 3, 2025
3a48972
feat(admin): adding uniformity in cancel and back buttons present in …
faisalsiddique4400 Nov 3, 2025
acb2273
Merge branch 'main' into admin-ui-issue-2361-scim
faisalsiddique4400 Nov 5, 2025
c131426
Code rabbit changes
faisalsiddique4400 Nov 5, 2025
b99c7d7
Merge branch 'admin-ui-issue-2361-scim' into admin-ui-issue-2361-fido
faisalsiddique4400 Nov 5, 2025
2ea443e
Code rabbit changes
faisalsiddique4400 Nov 5, 2025
e993a85
Code rabbit changes
faisalsiddique4400 Nov 5, 2025
23b58bf
Merge branch 'main' into admin-ui-issue-2361-fido
faisalsiddique4400 Nov 5, 2025
8fc6890
Merge branch 'main' into admin-ui-issue-2361-fido
faisalsiddique4400 Nov 5, 2025
ea45bf1
Merge branch 'main' into admin-ui-issue-2361-fido
faisalsiddique4400 Nov 5, 2025
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
16 changes: 9 additions & 7 deletions admin-ui/app/routes/Apps/Gluu/GluuCommitDialog.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import React, { useState, useEffect, useContext } from 'react'
import React, { useState, useEffect, useContext, useRef } from 'react'
import {
FormGroup,
Col,
Expand Down Expand Up @@ -50,13 +50,15 @@ const GluuCommitDialog = ({
modal,
})

const prevModalRef = useRef<boolean>(false)
useEffect(() => {
if (userMessage.length >= 10 && userMessage.length <= 512) {
setActive(true)
} else {
setActive(false)
setActive(userMessage.length >= 10 && userMessage.length <= 512)

if (modal && !prevModalRef.current) {
setUserMessage('')
}
}, [userMessage])
prevModalRef.current = modal
}, [userMessage, modal])

function handleAccept() {
if (formik) {
Expand All @@ -77,7 +79,7 @@ const GluuCommitDialog = ({
const renderBadges = (values: any) => {
return (
<div className="d-flex flex-column gap-1 align-items-start">
{values.map((data: any, index: any) => (
{values.map((data: any) => (
<Badge
color={`primary-${selectedTheme} `}
style={{ width: 'fit-content' }}
Expand Down
2 changes: 1 addition & 1 deletion admin-ui/app/routes/Apps/Gluu/GluuFormFooter.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ const GluuFormFooter = ({
showBack,
backButtonLabel,
onBack,
disableBack,
disableBack = false,
showCancel,
cancelButtonLabel,
onCancel,
Expand Down
25 changes: 16 additions & 9 deletions admin-ui/plugins/fido/components/DynamicConfiguration.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@ import GluuInputRow from 'Routes/Apps/Gluu/GluuInputRow'
import GluuSelectRow from 'Routes/Apps/Gluu/GluuSelectRow'
import GluuToggleRow from 'Routes/Apps/Gluu/GluuToggleRow'
import GluuCommitDialog from 'Routes/Apps/Gluu/GluuCommitDialog'
import GluuCommitFooter from 'Routes/Apps/Gluu/GluuCommitFooter'
import GluuFormFooter from 'Routes/Apps/Gluu/GluuFormFooter'
import GluuLabel from 'Routes/Apps/Gluu/GluuLabel'
import GluuProperties from 'Routes/Apps/Gluu/GluuProperties'
import { fidoConstants, validationSchema, transformToFormValues } from '../helper'
import { DynamicConfigurationProps, DynamicConfigFormValues } from '../types/fido-types'
import { DynamicConfigurationProps, DynamicConfigFormValues } from '../types/fido'

const DynamicConfiguration: React.FC<DynamicConfigurationProps> = ({
fidoConfiguration,
Expand All @@ -30,6 +30,7 @@ const DynamicConfiguration: React.FC<DynamicConfigurationProps> = ({
onSubmit: toggle,
validationSchema: validationSchema[fidoConstants.VALIDATION_SCHEMAS.DYNAMIC_CONFIG],
enableReinitialize: true,
validateOnMount: true,
})

const submitForm = useCallback(
Expand Down Expand Up @@ -74,6 +75,7 @@ const DynamicConfiguration: React.FC<DynamicConfigurationProps> = ({
formik={formik}
lsize={4}
rsize={8}
required
showError={!!(formik.errors.issuer && formik.touched.issuer)}
errorMessage={formik.errors.issuer}
/>
Expand All @@ -87,6 +89,7 @@ const DynamicConfiguration: React.FC<DynamicConfigurationProps> = ({
formik={formik}
lsize={4}
rsize={8}
required
showError={!!(formik.errors.baseEndpoint && formik.touched.baseEndpoint)}
errorMessage={formik.errors.baseEndpoint}
/>
Expand Down Expand Up @@ -302,13 +305,17 @@ const DynamicConfiguration: React.FC<DynamicConfigurationProps> = ({
</FormGroup>
<Row>
<Col>
<GluuCommitFooter
saveHandler={toggle}
hideButtons={{ save: true, back: true }}
extraLabel="Cancel"
extraOnClick={handleCancel}
type="submit"
disabled={isSubmitting}
<GluuFormFooter
showBack={true}
showCancel={true}
showApply={true}
onApply={toggle}
onCancel={handleCancel}
disableBack={false}
disableCancel={!formik.dirty}
disableApply={!formik.isValid || !formik.dirty}
applyButtonType="button"
isLoading={isSubmitting ?? false}
/>
</Col>
</Row>
Expand Down
2 changes: 1 addition & 1 deletion admin-ui/plugins/fido/components/Fido.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import {
} from 'JansConfigApi'
import { updateToast } from 'Redux/features/toastSlice'
import { useDispatch, useSelector } from 'react-redux'
import { DynamicConfigFormValues, StaticConfigFormValues } from '../types/fido-types'
import { DynamicConfigFormValues, StaticConfigFormValues } from '../types/fido'
import { logAudit } from 'Utils/AuditLogger'
import { AuthRootState } from 'Utils/types'

Expand Down
63 changes: 45 additions & 18 deletions admin-ui/plugins/fido/components/StaticConfiguration.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import GluuInputRow from 'Routes/Apps/Gluu/GluuInputRow'
import GluuSelectRow from 'Routes/Apps/Gluu/GluuSelectRow'
import GluuToggleRow from 'Routes/Apps/Gluu/GluuToggleRow'
import GluuCommitDialog from 'Routes/Apps/Gluu/GluuCommitDialog'
import GluuCommitFooter from 'Routes/Apps/Gluu/GluuCommitFooter'
import GluuFormFooter from 'Routes/Apps/Gluu/GluuFormFooter'
import GluuLabel from 'Routes/Apps/Gluu/GluuLabel'
import GluuProperties from 'Routes/Apps/Gluu/GluuProperties'
import GluuTypeAhead from 'Routes/Apps/Gluu/GluuTypeAhead'
Expand All @@ -20,7 +20,12 @@ import {
getAvailableHintOptions,
getEmptyDropdownMessage,
} from '../helper'
import { StaticConfigurationProps, StaticConfigFormValues } from '../types/fido-types'
import {
StaticConfigurationProps,
StaticConfigFormValues,
MinimalFormik,
FormikSetFieldValue,
} from '../types/fido'
import { AttestationMode } from '../types'

const StaticConfiguration: React.FC<StaticConfigurationProps> = ({
Expand All @@ -46,6 +51,7 @@ const StaticConfiguration: React.FC<StaticConfigurationProps> = ({
onSubmit: toggle,
validationSchema: validationSchema[fidoConstants.VALIDATION_SCHEMAS.STATIC_CONFIG],
enableReinitialize: true,
validateOnMount: true,
})

const submitForm = useCallback(
Expand Down Expand Up @@ -86,25 +92,30 @@ const StaticConfiguration: React.FC<StaticConfigurationProps> = ({
}, [formik.values.metadataServers])

// Create a wrapper formik that transforms metadata servers between key/value and url/rootCert
const metadataServersFormik = useMemo(() => {
const setFieldValueWrapper = (name: string, value: any) => {
const metadataServersFormik = useMemo<MinimalFormik<StaticConfigFormValues>>(() => {
const setFieldValueWrapper: FormikSetFieldValue<StaticConfigFormValues> = (
name,
value,
shouldValidate,
) => {
if (name === fidoConstants.FORM_FIELDS.METADATA_SERVERS) {
// Transform {key, value} back to {url, rootCert}
const transformedValue = value.map((item: any) => ({
const arr = Array.isArray(value) ? (value as Array<{ key?: string; value?: string }>) : []
const transformedValue = arr.map((item) => ({
url: item.key || '',
rootCert: item.value || '',
}))
formik.setFieldValue(name, transformedValue)
formik.setFieldValue(name, transformedValue, shouldValidate)
} else {
formik.setFieldValue(name, value)
formik.setFieldValue(name, value, shouldValidate)
}
}

return {
...formik,
values: formik.values,
setFieldValue: setFieldValueWrapper,
}
}, [formik.values, formik.errors, formik.touched])
}, [formik.values, formik.setFieldValue])

const availableHintOptions = useMemo(() => {
return getAvailableHintOptions(formik.values.hints)
Expand Down Expand Up @@ -133,6 +144,7 @@ const StaticConfiguration: React.FC<StaticConfigurationProps> = ({
formik={formik}
lsize={4}
rsize={8}
required
showError={
!!(formik.errors.authenticatorCertsFolder && formik.touched.authenticatorCertsFolder)
}
Expand All @@ -147,6 +159,7 @@ const StaticConfiguration: React.FC<StaticConfigurationProps> = ({
formik={formik}
lsize={4}
rsize={8}
required
showError={!!(formik.errors.mdsCertsFolder && formik.touched.mdsCertsFolder)}
errorMessage={formik.errors.mdsCertsFolder}
/>
Expand All @@ -159,6 +172,7 @@ const StaticConfiguration: React.FC<StaticConfigurationProps> = ({
formik={formik}
lsize={4}
rsize={8}
required
showError={!!(formik.errors.mdsTocsFolder && formik.touched.mdsTocsFolder)}
errorMessage={formik.errors.mdsTocsFolder}
/>
Expand All @@ -173,6 +187,7 @@ const StaticConfiguration: React.FC<StaticConfigurationProps> = ({
formik={formik}
lsize={4}
rsize={8}
required
showError={
!!(
formik.errors.unfinishedRequestExpiration &&
Expand All @@ -192,6 +207,7 @@ const StaticConfiguration: React.FC<StaticConfigurationProps> = ({
formik={formik}
lsize={4}
rsize={8}
required
showError={
!!(
formik.errors.authenticationHistoryExpiration &&
Expand All @@ -210,6 +226,7 @@ const StaticConfiguration: React.FC<StaticConfigurationProps> = ({
formik={formik}
lsize={4}
rsize={8}
required
showError={
!!(formik.errors.serverMetadataFolder && formik.touched.serverMetadataFolder)
}
Expand All @@ -224,6 +241,7 @@ const StaticConfiguration: React.FC<StaticConfigurationProps> = ({
formik={formik}
lsize={4}
rsize={8}
required
doc_category={fidoConstants.DOC_CATEGORY}
/>
</Col>
Expand Down Expand Up @@ -297,16 +315,20 @@ const StaticConfiguration: React.FC<StaticConfigurationProps> = ({
<GluuTypeAhead
name={fidoConstants.FORM_FIELDS.HINTS}
label={fidoConstants.LABELS.HINTS}
formik={formik}
value={formik.values.hints || []}
options={availableHintOptions}
lsize={4}
rsize={8}
required
showError={!!(formik.errors.hints && formik.touched.hints)}
errorMessage={formik.errors.hints}
errorMessage={formik.errors.hints as string}
doc_category={fidoConstants.DOC_CATEGORY}
emptyLabel={emptyDropdownMessage}
allowNew={false}
onChange={(selected) => {
const next = (selected || []).filter((v): v is string => typeof v === 'string')
formik.setFieldValue(fidoConstants.FORM_FIELDS.HINTS, next)
}}
/>
</Col>

Expand All @@ -317,6 +339,7 @@ const StaticConfiguration: React.FC<StaticConfigurationProps> = ({
formik={formik}
lsize={4}
rsize={8}
required
doc_category={fidoConstants.DOC_CATEGORY}
/>
</Col>
Expand All @@ -342,13 +365,17 @@ const StaticConfiguration: React.FC<StaticConfigurationProps> = ({

<Row>
<Col>
<GluuCommitFooter
saveHandler={toggle}
hideButtons={{ save: true, back: true }}
extraLabel="Cancel"
extraOnClick={handleCancel}
type="submit"
disabled={isSubmitting}
<GluuFormFooter
showBack={true}
showCancel={true}
showApply={true}
onApply={toggle}
onCancel={handleCancel}
disableBack={false}
disableCancel={!formik.dirty}
disableApply={!formik.isValid || !formik.dirty}
applyButtonType="button"
isLoading={isSubmitting ?? false}
/>
</Col>
</Row>
Expand Down
10 changes: 7 additions & 3 deletions admin-ui/plugins/fido/helper/utils.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import { PublicKeyCredentialHints } from '../types'
import { PublicKeyCredentialHints, AttestationMode } from '../types'
import { fidoConstants } from './constants'
import { AppConfiguration1, Fido2Configuration } from 'JansConfigApi'
import {
DynamicConfigFormValues,
StaticConfigFormValues,
CreateFidoConfigPayloadParams,
PutPropertiesFido2Params,
} from '../types/fido-types'
} from '../types/fido'

const isStaticConfigType = (type?: string): type is typeof fidoConstants.STATIC => {
return type === fidoConstants.STATIC
Expand Down Expand Up @@ -68,7 +68,11 @@ const transformStaticConfigToFormValues = (
disableMetadataService: toBooleanValue(config?.disableMetadataService),
hints: arrayValidationWithSchema(config?.hints || [], PublicKeyCredentialHints),
enterpriseAttestation: toBooleanValue(config?.enterpriseAttestation),
attestationMode: config?.attestationMode || '',
attestationMode: (() => {
const mode = (config?.attestationMode as string) || ''
const validModes = Object.values(AttestationMode)
return validModes.includes(mode as AttestationMode) ? mode : ''
})(),
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,3 +59,15 @@ export interface CreateFidoConfigPayloadParams {
export interface PutPropertiesFido2Params {
data: AppConfiguration1
}

// Minimal Formik subset used by StaticConfiguration for typeahead adapters
export type FormikSetFieldValue<TValues> = <K extends keyof TValues>(
field: K,
value: TValues[K],
shouldValidate?: boolean,
) => void

export interface MinimalFormik<TValues> {
values: TValues
setFieldValue: FormikSetFieldValue<TValues>
}
28 changes: 16 additions & 12 deletions admin-ui/plugins/services/Components/Configuration/CachePage.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import React, { useEffect, useState } from 'react'
import BlockUi from '../../../../app/components/BlockUi/BlockUi'
import { Formik } from 'formik'
import { Form, FormGroup, Card, Col, CardBody, InputGroup, CustomInput } from 'Components'
import GluuCommitFooter from 'Routes/Apps/Gluu/GluuCommitFooter'
import GluuFormFooter from 'Routes/Apps/Gluu/GluuFormFooter'
import GluuLabel from 'Routes/Apps/Gluu/GluuLabel'
import GluuTooltip from 'Routes/Apps/Gluu/GluuTooltip'
import CacheInMemory from './CacheInMemory'
Expand Down Expand Up @@ -87,10 +87,6 @@ function CachePage() {
function toggle() {
setModal(!modal)
}
function submitForm() {
toggle()
document.getElementsByClassName('LdapUserActionSubmitButton')[0].click()
}
function handleCancel(formik) {
return () => {
formik.resetForm()
Expand Down Expand Up @@ -224,17 +220,25 @@ function CachePage() {
<CacheNative config={cacheNativeData} formik={formik} />
)}
<FormGroup row></FormGroup>
<GluuCommitFooter
saveHandler={toggle}
hideButtons={{ save: true, back: true }}
extraLabel="Cancel"
extraOnClick={handleCancel(formik)}
type="submit"
<GluuFormFooter
showBack={true}
showCancel={true}
showApply={true}
onApply={toggle}
onCancel={handleCancel(formik)}
disableBack={false}
disableCancel={!formik.dirty}
disableApply={!formik.isValid || !formik.dirty}
applyButtonType="button"
isLoading={loading}
/>
<GluuCommitDialog
handler={toggle}
modal={modal}
onAccept={submitForm}
onAccept={() => {
toggle()
formik.handleSubmit()
}}
formik={formik}
/>
</Form>
Expand Down
Loading
Loading