feat(admin-ui): revamp Scripts module as per Figma with partial TS migration#2681
feat(admin-ui): revamp Scripts module as per Figma with partial TS migration#2681
Conversation
Made-with: Cursor
Signed-off-by: faisalsiddique4400 <faisalsiddique10886@gmail.com>
|
Important Review skippedToo many files! This PR contains 175 files, which is 25 over the limit of 150. ⚙️ Run configurationConfiguration used: Organization UI Review profile: ASSERTIVE Plan: Pro Run ID: 📒 Files selected for processing (175)
You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
Tip Try Coding Plans. Let us write the prompt for your AI agent so you can ship faster (with fewer bugs). Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 36
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (10)
admin-ui/plugins/auth-server/components/Ssa/SsaAddPage.tsx (1)
13-21: 🧹 Nitpick | 🔵 TrivialImport path style is inconsistent within this file.
The updated import on line 13 now uses the
@/alias (@/routes/Apps/Gluu/styles/applicationStyle), but lines 14–21 still use the non-aliasedRoutes/Apps/Gluu/...paths. This creates a mix of import styles for modules from the same location.If this is part of an incremental migration, this is fine to merge as-is. Otherwise, consider aligning the remaining imports for consistency:
♻️ Optional: Align remaining imports to use alias
import applicationStyle from '@/routes/Apps/Gluu/styles/applicationStyle' -import GluuInputRow from 'Routes/Apps/Gluu/GluuInputRow' -import GluuTypeAhead from 'Routes/Apps/Gluu/GluuTypeAhead' -import GluuToogleRow from 'Routes/Apps/Gluu/GluuToogleRow' -import GluuLabel from 'Routes/Apps/Gluu/GluuLabel' -import GluuRemovableInputRow from 'Routes/Apps/Gluu/GluuRemovableInputRow' -import GluuFormFooter from 'Routes/Apps/Gluu/GluuFormFooter' -import GluuCommitDialogLegacy from 'Routes/Apps/Gluu/GluuCommitDialogLegacy' -import GluuLoader from 'Routes/Apps/Gluu/GluuLoader' +import GluuInputRow from '@/routes/Apps/Gluu/GluuInputRow' +import GluuTypeAhead from '@/routes/Apps/Gluu/GluuTypeAhead' +import GluuToogleRow from '@/routes/Apps/Gluu/GluuToogleRow' +import GluuLabel from '@/routes/Apps/Gluu/GluuLabel' +import GluuRemovableInputRow from '@/routes/Apps/Gluu/GluuRemovableInputRow' +import GluuFormFooter from '@/routes/Apps/Gluu/GluuFormFooter' +import GluuCommitDialogLegacy from '@/routes/Apps/Gluu/GluuCommitDialogLegacy' +import GluuLoader from '@/routes/Apps/Gluu/GluuLoader'🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@admin-ui/plugins/auth-server/components/Ssa/SsaAddPage.tsx` around lines 13 - 21, The imports in SsaAddPage mix alias and non-alias paths — change the remaining imports for GluuInputRow, GluuTypeAhead, GluuToogleRow, GluuLabel, GluuRemovableInputRow, GluuFormFooter, GluuCommitDialogLegacy, and GluuLoader to use the same '@/routes/Apps/Gluu/...' alias style as applicationStyle so all imports are consistent; update each import statement to the aliased path (keep the same imported symbol names) or revert applicationStyle to the non-aliased form if you prefer the original style across the file.admin-ui/plugins/user-management/components/User2FADevicesModal.tsx (1)
192-219: 🧹 Nitpick | 🔵 TrivialRemove unused dependency from callback.
The
handleRemove2Facallback includesotpDevicesListin its dependency array (line 218), but this value is never referenced within the function body. This causes unnecessary re-creation of the callback wheneverotpDevicesListchanges, which can impact performance.♻️ Remove unused dependency
}, - [userDetails, deleteFido2Mutation, updateUserData, otpDevicesList], + [userDetails, deleteFido2Mutation, updateUserData], )🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@admin-ui/plugins/user-management/components/User2FADevicesModal.tsx` around lines 192 - 219, The handleRemove2Fa useCallback incorrectly lists otpDevicesList in its dependency array even though otpDevicesList is never read inside the callback; remove otpDevicesList from the dependency array so the callback depends only on userDetails, deleteFido2Mutation, and updateUserData (i.e., update the dependency array for handleRemove2Fa to [userDetails, deleteFido2Mutation, updateUserData]).admin-ui/plugins/admin/__tests__/components/CustomScripts/CustomScriptForm.test.tsx (1)
69-82:⚠️ Potential issue | 🟠 MajorUse a fresh store per test render to avoid state leakage.
A module-level Redux store is shared across all tests, so state changes from future dispatched actions or reducer updates could affect later tests.
Proposed fix
-const store = configureStore({ +const createStore = () => + configureStore({ reducer: combineReducers({ authReducer: (state = { hasSession: true, permissions: [] }) => state, webhookReducer: ( state = { featureWebhooks: [], loadingWebhooks: false, webhookModal: false, triggerWebhookInProgress: false, }, ) => state, noReducer: (state = {}) => state, }), -}) +}) const createQueryClient = () => new QueryClient({ defaultOptions: { queries: { retry: false } } }) -const Wrapper = ({ children }: { children: React.ReactNode }) => ( - <QueryClientProvider client={createQueryClient()}> +const createWrapper = () => { + const store = createStore() + const queryClient = createQueryClient() + return ({ children }: { children: React.ReactNode }) => ( + <QueryClientProvider client={queryClient}> + <AppTestWrapper> + <Provider store={store}>{children}</Provider> + </AppTestWrapper> + </QueryClientProvider> + ) +} - <AppTestWrapper> - <Provider store={store}>{children}</Provider> - </AppTestWrapper> - </QueryClientProvider> -)Then update test renders to call
createWrapper()once per test.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@admin-ui/plugins/admin/__tests__/components/CustomScripts/CustomScriptForm.test.tsx` around lines 69 - 82, The module-level Redux store (store created via configureStore with combineReducers and referenced as store) is shared across tests causing state leakage; change to create a factory function (e.g., createStore or createTestStore) that returns a new configureStore instance and update createWrapper() to call this factory so each test render uses a fresh store instance (call createTestStore inside createWrapper or within each test) instead of the module-level store; ensure reducers/authReducer/webhookReducer/noReducer remain the same when constructing the fresh store.admin-ui/app/components/GluuButton/GluuButton.tsx (1)
53-109:⚠️ Potential issue | 🟡 MinorMissing
disableHoverStylesinuseMemodependency array.The
buttonStylecomputation usesdisableHoverStyles(Line 58, Line 74-76), but it's missing from the dependency array (Lines 90-109). This can cause stale style computations ifdisableHoverStylesprop changes.🐛 Proposed fix
], [ sizeConfig, outlined, isHovered, isDisabled, block, themeColors, isDark, backgroundColor, textColor, borderColor, borderRadius, fontSize, fontWeight, padding, minHeight, useOpacityOnHover, hoverOpacity, + disableHoverStyles, style, ])🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@admin-ui/app/components/GluuButton/GluuButton.tsx` around lines 53 - 109, The memoized buttonStyle (created with useMemo) reads disableHoverStyles (and passes it into resolveBackgroundColor) but disableHoverStyles is not included in the useMemo dependency array; update the dependency array for the useMemo that defines buttonStyle to include disableHoverStyles so style recalculation triggers when that prop changes (i.e., add disableHoverStyles alongside the other props like useOpacityOnHover, hoverOpacity, style, etc.).admin-ui/app/routes/Dashboards/components/UserInfoItem.tsx (1)
34-42: 🧹 Nitpick | 🔵 TrivialInconsistent styling: active badge uses theme colors, inactive uses hardcoded
customColors.The active badge styling correctly uses
themeColors.badges.*, but the inactive state on lines 40-41 still usescustomColors.statusInactiveandcustomColors.statusInactiveBg. For consistency and proper theme support, consider using theme-aware colors for the inactive state as well.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@admin-ui/app/routes/Dashboards/components/UserInfoItem.tsx` around lines 34 - 42, badgeColors builds active vs inactive styles but the inactive branch still references hardcoded customColors (customColors.statusInactive, customColors.statusInactiveBg); change the inactive branch to use theme-aware values from themeColors.badges (e.g., themeColors.badges.statusInactive and themeColors.badges.statusInactiveBg or the appropriate badge text/bg keys) and keep the same isDark conditional logic using themeColors.badges so the component (badgeColors, isActive, isDark) consistently respects the theme.admin-ui/app/routes/Dashboards/DashboardPage.style.ts (1)
305-310: 🧹 Nitpick | 🔵 TrivialConsider applying theme-based coloring to
statusDotInactivefor consistency.
statusDotActivenow correctly usesthemeColors.statusActive, butstatusDotInactivestill usescustomColors.statusInactive. For full theme consistency across light/dark modes, consider migratingstatusDotInactiveto use a theme color as well.♻️ Suggested consistency fix
statusDotActive: { backgroundColor: themeColors.statusActive, }, statusDotInactive: { - backgroundColor: customColors.statusInactive, + backgroundColor: themeColors.statusInactive, },This would require adding
statusInactive: stringto theDashboardThemeColorsinterface and ensuring it's provided by the theme configuration.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@admin-ui/app/routes/Dashboards/DashboardPage.style.ts` around lines 305 - 310, Change statusDotInactive to use a theme color instead of customColors by referencing themeColors.statusInactive in the style (replace customColors.statusInactive with themeColors.statusInactive), add a new statusInactive: string property to the DashboardThemeColors interface, and update the theme configuration/provider to supply statusInactive for both light and dark themes so the component uses theme-driven colors consistently; ensure references to statusDotActive and statusDotInactive remain in DashboardPage.style.ts and any consumers still work with the new themed property.admin-ui/app/index.tsx (1)
12-19:⚠️ Potential issue | 🟠 MajorDisabling query retries globally may degrade resilience.
Setting
retry: falsedisables automatic retries for all React Query queries application-wide. This means transient network failures or temporary server issues will immediately surface as errors to users without recovery attempts.Consider:
- Re-enabling retries with a reasonable count (e.g.,
retry: 2) and exponential backoff for production resilience.- If this change is intentional for testing/development determinism, ensure it's reverted before production deployment or made environment-conditional.
💡 Suggested environment-conditional approach
const queryClient = new QueryClient({ defaultOptions: { queries: { ...queryDefaults.queryOptions, - retry: false, + retry: process.env.NODE_ENV === 'development' ? false : 2, }, }, })🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@admin-ui/app/index.tsx` around lines 12 - 19, The global QueryClient instantiation currently forces retry: false (in the const queryClient using QueryClient and queryDefaults.queryOptions); change this to a safer default—e.g., set retry to 2 (or conditionally 0 for development) and add an exponential backoff retryDelay function for production resilience, or make retry environment-conditional (use NODE_ENV or a config flag to apply retry: 0 only in dev/testing and retry: 2 with retryDelay in production).admin-ui/app/components/Accordion/AccordionIndicator.tsx (1)
17-27:⚠️ Potential issue | 🟡 MinorType assertions on
open/closedmay cause runtime errors.The
as React.ReactElementassertions on lines 20 and 23 assume thatopenandclosedare always valid React elements with aprops.classNameproperty. If a non-elementReactNode(e.g., a string or number) is passed,React.cloneElementwill throw.Consider adding runtime validation or refining the prop types to only accept
React.ReactElement.🛡️ Suggested type refinement
interface AccordionIndicatorProps { - open?: ReactNode - closed?: ReactNode + open?: React.ReactElement + closed?: React.ReactElement className?: string }This makes the expected input explicit and removes the need for type assertions.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@admin-ui/app/components/Accordion/AccordionIndicator.tsx` around lines 17 - 27, The AccordionIndicator currently force-casts open/closed to React.ReactElement before calling React.cloneElement which can throw at runtime if a consumer passes a non-element ReactNode; either tighten the prop type of the AccordionIndicator component (e.g., require open and closed be React.ReactElement) or add a runtime guard in the Consumer render path that checks React.isValidElement(open) and React.isValidElement(closed) and falls back (render the node directly or wrap it) instead of calling React.cloneElement when the check fails; update the prop type declarations and the Consumer branch handling where React.cloneElement is used to use these guards or the refined types so the clone calls are safe.admin-ui/plugins/admin/components/Health/components/ServiceStatusCard.tsx (1)
46-66: 🧹 Nitpick | 🔵 TrivialInconsistent theme adoption across status types.
The 'up' status now uses
themeColors.badges.*for styling, but 'down', 'degraded', and 'unknown' statuses still use hardcodedcustomColors.*. This creates visual inconsistency if the theme is updated.Consider migrating all status badge colors to use theme-derived values for consistency, or document why 'up' is treated differently.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@admin-ui/plugins/admin/components/Health/components/ServiceStatusCard.tsx` around lines 46 - 66, The badge color logic in ServiceStatusCard (useMemo named badgeColors) mixes themeColors for 'up' with hardcoded customColors for 'down', 'degraded', and 'unknown'; update those cases to derive their bg/text values from themeColors (e.g., themeColors.badges.statusInactiveBg / statusInactive / filledBadgeText equivalents) instead of customColors so all statuses consistently follow the theme, and ensure the useMemo dependency array still includes any theme objects you reference (themeColors and isDark).admin-ui/plugins/scripts/components/CustomScripts/hooks/useCustomScriptApi.ts (1)
118-137:⚠️ Potential issue | 🔴 CriticalDo not reject successful write mutations because side-effects fail.
After the API write succeeds, failures in invalidation/audit/webhook still reject
mutateAsync. That can lead to false failure UX and duplicate retries.🛡️ Suggested pattern (apply to create/update/delete)
- await Promise.all([ + await Promise.allSettled([ queryClient.invalidateQueries({ queryKey: getGetConfigScriptsQueryKey() }), queryClient.invalidateQueries({ queryKey: getGetConfigScriptsByTypeQueryKey(variables.data.scriptType || ''), }), ]) - webhookTrigger({ createdFeatureValue: result }) - await logAuditAction(CREATE, SCRIPT, { + try { + webhookTrigger({ createdFeatureValue: result }) + } catch (error) { + devLogger.error('Failed to trigger webhook:', error) + } + void logAuditAction(CREATE, SCRIPT, { action: { action_data: structuredClone(variables.data), action_message: actionMessage, }, - } as AdditionalPayload) + } as AdditionalPayload).catch((error) => { + devLogger.error('Failed to log audit action:', error) + })Also applies to: 149-178, 189-217
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@admin-ui/plugins/scripts/components/CustomScripts/hooks/useCustomScriptApi.ts` around lines 118 - 137, The mutateAsync implementation currently awaits side-effects (queryClient.invalidateQueries, webhookTrigger, logAuditAction) directly so any failure there rejects the whole mutation even when baseMutation.mutateAsync succeeded; change mutateAsync to capture result from baseMutation.mutateAsync and then run the invalidation/webhook/audit calls inside a try/catch (or Promise.allSettled) so errors are logged but not re-thrown, ensuring mutateAsync always returns the successful result; apply the same pattern to the other similar handlers referenced (lines with baseMutation.mutateAsync, queryClient.invalidateQueries, webhookTrigger, logAuditAction, and the CREATE/SCRIPT audit payload).
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@admin-ui/__tests__/setup.ts`:
- Around line 29-33: The global test setup currently ignores any console
messages that include the substring "not wrapped in act(" which suppresses real
React async test bugs; remove the clause that checks msg.includes('not wrapped
in act(') from the global ignore list in admin-ui/__tests__/setup.ts and instead
fix the underlying tests that trigger the warning by wrapping stateful updates
in act(...) or using RTL utilities like waitFor/async user events, or, if
absolutely necessary, suppress the warning only inside the specific failing test
using a scoped jest.spyOn(console, 'error') mock and restore it after the test.
In `@admin-ui/app/components/GluuDetailGrid/__tests__/GluuDetailGrid.test.tsx`:
- Around line 33-35: The test 'renders with labelStyle' for GluuDetailGrid
currently only checks presence; update it to assert the passed labelStyle is
applied by selecting the label element rendered from mockFields (e.g., via
screen.getByText(/Inum/i) or a role/query that targets the label) and asserting
its computed style/color equals 'red' (use the testing-library matcher like
toHaveStyle or check getComputedStyle on the returned element) while keeping the
render call with Wrapper and the same mockFields and labelStyle prop.
In `@admin-ui/app/components/GluuInlineAlert/GluuInlineAlert.tsx`:
- Around line 30-31: The component GluuInlineAlert currently hardcodes
role="alert" on the container (rootClassName) which is assertive for all
severities; change the semantics to be severity-aware by mapping the severity
prop (e.g., severity === 'error' or similar) to role and aria-live values: use
role="alert" and aria-live="assertive" only for errors, and use role="status"
with aria-live="polite" (or "off" for non-announcements) for info/warning.
Update the JSX in GluuInlineAlert to compute these attributes from the severity
prop and apply them to the div instead of always using role="alert".
In `@admin-ui/app/components/GluuTable/GluuTable.style.ts`:
- Around line 58-67: The expand-button background tokens are inverted: change
the default selector '& tbody tr [data-expand-button]' (and the equivalent block
at lines ~206-207) to use expandButtonBg and set hover selectors '& tbody
tr:hover [data-expand-button]' and '& tbody tr [data-expand-button]:hover' to
use expandButtonHoverBg so the hover state uses the *Hover* token and the
default uses the base *Bg* token; update both occurrences in GluuTable.style.ts
accordingly.
In `@admin-ui/app/components/GluuTable/GluuTable.tsx`:
- Around line 21-29: The parseMinWidth function currently strips CSS units by
using parseInt on string values; update parseMinWidth to preserve units by
returning the original trimmed string when col.minWidth is a non-empty string
that contains non-digit characters (e.g., "12ch", "30%"), only converting pure
numeric strings to numbers; adjust the return type from number | undefined to
number | string | undefined and update callers that expect a number accordingly;
locate the function parseMinWidth and the usage of col.minWidth to implement
this change.
In `@admin-ui/app/components/Widgets/GroupedButtons/Counter.tsx`:
- Around line 34-45: The two symbol-only Buttons in the Counter component should
have explicit accessible names: update the Button rendering that uses "-"
(handled by handleDecrement) and the Button rendering that uses "+" (handled by
handleIncrement) to include aria-label attributes (e.g., aria-label="Decrease
value" and aria-label="Increase value") so screen readers announce the action;
keep the existing className={classes.stepButton} and onClick handlers
(handleDecrement, handleIncrement) intact and consider adding an aria-live or
title if localization is required.
In `@admin-ui/app/locales/fr/translation.json`:
- Around line 867-868: Update the French strings for the translation keys
script_usage_type_required and script_usage_type_valid to clearly refer to the
"type d’utilisation" field rather than implying "Interactif" is the field name;
for example change script_usage_type_required to a concise phrase like "Le type
d’utilisation est requis pour l’authentification" (mentioning
person_authentication conceptually if needed) and change script_usage_type_valid
to something like "Le type d’utilisation doit être 'interactive', 'service' ou
'both'" so users clearly understand which field is required and what valid
values are.
In `@admin-ui/app/locales/pt/translation.json`:
- Line 854: The PT translation uses “roteiro” in the "error_in_script" key but
the codebase consistently uses the English term "script", so update
"error_in_script" value to use "script" (e.g., "Erro no script!") for
consistency; additionally locate the option-label entry that currently has the
lowercase "sim" (the option at the referenced translation entry around line
1175) and change it to match surrounding option-label casing (e.g., "Sim") so
option labels are stylistically consistent.
In `@admin-ui/app/routes/Apps/Gluu/GluuScriptErrorModal.tsx`:
- Line 62: The Close button's aria-label in GluuScriptErrorModal is hardcoded as
"Close"; update the component (GluuScriptErrorModal) to use your app's i18n
translation function (e.g., import and call useTranslation().t or i18n.t) and
replace aria-label="Close" with aria-label={t('close') or the appropriate
translation key}, ensuring you add the necessary i18n import and
hook/initializer in the component if missing.
- Around line 37-41: The copyToClipboard handler currently sets isCopied via
setIsCopied(true) before navigator.clipboard.writeText(error) resolves, which
can show a false "copied" state if the clipboard API is unavailable or writeText
rejects; update the copyToClipboard function to first verify navigator.clipboard
exists, call navigator.clipboard.writeText(error) and await/handle its Promise,
only calling setIsCopied(true) on success, and on failure catch the error to
surface feedback (e.g., set an error state or show a toast) and keep the copy
button enabled; reference the copyToClipboard useCallback, isCopied/setIsCopied
state, and navigator.clipboard.writeText to locate and modify the code.
In `@admin-ui/app/routes/Apps/Gluu/GluuTypeAheadWithAdd.tsx`:
- Around line 24-25: The GluuTypeAheadWithAddProps interface declares a
`multiple` prop that isn't used: update the GluuTypeAheadWithAdd component to
either remove `multiple` from GluuTypeAheadWithAddProps if `Typeahead` should
always be multiple, or destructure `multiple` from the component props and pass
it into the `Typeahead` component (replace the hardcoded `multiple={true}`) so
the prop is honored; refer to GluuTypeAheadWithAddProps, the component function
that consumes those props, and the `Typeahead` usage to apply the change.
In `@admin-ui/app/routes/Apps/Gluu/styles/GluuScriptErrorModal.style.ts`:
- Around line 35-38: The close button duplicates hover/focus opacity styles
already defined in buttonHoverOpacity; remove the opacity rules from closeButton
and either add the buttonHoverOpacity class to the close button element or
extract the opacity rules into a shared mixin used by both buttonHoverOpacity
and closeButton (referencing the buttonHoverOpacity and closeButton style
objects to locate and update the definitions).
- Line 9: Replace the hardcoded HOVER_OPACITY constant in
GluuScriptErrorModal.style.ts with the shared theme-aware utility
getHoverOpacity(isDark) from '@/constants/ui.ts': remove HOVER_OPACITY and call
getHoverOpacity with the component's theme flag (e.g., isDark or
theme.palette.mode check) where HOVER_OPACITY was used so hover opacity is
consistent with other components (refer to getHoverOpacity(isDark) and the
previous HOVER_OPACITY symbol to locate usages).
In `@admin-ui/app/routes/Dashboards/components/UserInfoItem.tsx`:
- Around line 20-24: The optional chaining around theme in the useMemo for
themeColors is unnecessary because useTheme throws when outside ThemeProvider;
update the useMemo to reference theme.state.theme directly (e.g.,
getThemeColor(theme.state.theme ?? DEFAULT_THEME)) and change the dependency
array to [theme.state.theme] so the memoization is correct and avoids redundant
optional checks; keep DEFAULT_THEME fallback as before and ensure references are
to useTheme, theme.state.theme, getThemeColor, DEFAULT_THEME, and useMemo.
In `@admin-ui/app/routes/Dashboards/DashboardPage.tsx`:
- Around line 252-260: The current visibleStatusDetails memo shows all
STATUS_DETAILS while healthLoading is true, then filters to only services with
status 'up' or 'down' after loading, causing items with 'degraded', 'unknown' or
other statuses to disappear; update the logic in the visibleStatusDetails
useMemo (which uses STATUS_DETAILS and allServices) to keep services visible
after load by either removing the strict filter and including any service that
has a non-null status (e.g., service != null) or explicitly include additional
statuses like 'degraded' and 'unknown' so the UI consistently shows all services
with their appropriate status styling.
In `@admin-ui/app/styles/main.scss`:
- Around line 31-41: The scrollbar CSS uses variables --theme-scrollbar-width,
--theme-scrollbar-height, and --theme-scrollbar-radius but those are not defined
in the theme blocks; add definitions for these variables inside both theme-dark
and theme-light blocks (or the global :root if preferred) so the selectors
*::-webkit-scrollbar, *::-webkit-scrollbar-track, and *::-webkit-scrollbar-thumb
have concrete values; set sensible defaults (e.g., widths, heights, and radius)
matching your design tokens to ensure consistent rendering across themes.
In
`@admin-ui/plugins/admin/__tests__/components/CustomScripts/CustomScriptForm.test.tsx`:
- Around line 143-153: Replace direct DOM queries in the CustomScriptForm tests
with Testing Library queries: instead of using
document.querySelector('input#level') and
document.querySelector('input#enabled[type="checkbox"]') cast to
HTMLInputElement, use screen.getByLabelText or screen.getByRole to locate the
"Level" input and the "Enabled" checkbox (or getByRole('checkbox', { name:
/enabled/i })), then assert on .value and .checked; apply the same replacement
for the other occurrences mentioned (around the blocks that reference
levelInput, toggle, and similar selectors) so assertions produce better failure
messages and preserve accessibility checks for the CustomScriptForm component
and its tests.
- Around line 174-179: The test titled "renders footer with Back, Cancel, and
Apply" asserts Back and Cancel but omits Apply; update the test for
CustomScriptForm (the it block) to include an explicit assertion that the Apply
control is present — e.g. after the existing expect calls add an assertion for
the Apply button using a query like getByText(/Apply/i) or getByRole('button', {
name: /Apply/i }) so the test matches its name.
- Around line 279-289: The test "triggers commit dialog flow when Apply is
clicked on dirty form" modifies the form but lacks any assertions; update the
test in CustomScriptForm.test.tsx to assert the Apply button exists and is
enabled before clicking, then fire the click and assert the commit flow happened
by checking the handleSubmit mock was called (or that the commit dialog element
rendered) for the CustomScriptForm component; reference the existing test's
handleSubmit mock and the Apply button lookup to add these expectations so the
test actually verifies the outcome.
In `@admin-ui/plugins/admin/components/Assets/types/FormTypes.ts`:
- Around line 4-7: Replace the overly-permissive "object" union member in the
AssetFormValues type with a safer type (e.g., Record<string, unknown> or a
specific interface) to improve type safety; update the union inside the exported
interface AssetFormValues so any arbitrary object uses Record<string, unknown>
(or a more constrained shape if known) instead of the bare object type, and run
type checks to ensure callers compile cleanly.
In `@admin-ui/plugins/admin/components/Audit/AuditListPage.style.ts`:
- Line 48: The container currently sets 'overflow': 'visible' which removes the
horizontal scroll path for wide audit rows (the first-column nowrap styles
around Line 71); change the container style to enable horizontal scrolling by
replacing 'overflow': 'visible' with overflowX: 'auto' (or 'scroll') and, if
needed, keep vertical behavior via overflowY: 'visible' so tall content still
expands. Update the style entry that currently contains 'overflow': 'visible'
and verify it coexists with the first-column nowrap rules so wide rows can be
scrolled horizontally inside the card.
In `@admin-ui/plugins/admin/components/Health/components/ServiceStatusCard.tsx`:
- Around line 34-38: Remove the unnecessary optional chaining on the useTheme()
return: use theme.state.theme directly (since useTheme throws outside a
ThemeProvider) when calling getThemeColor and in the dependency array; update
the getThemeColor call that produces themeColors to use
getThemeColor(theme.state.theme ?? DEFAULT_THEME) and change the useMemo
dependency to [theme.state.theme] while keeping DEFAULT_THEME as a fallback.
Reference: useTheme, getThemeColor, themeColors, DEFAULT_THEME.
In `@admin-ui/plugins/admin/redux/sagas/WebhookSaga.ts`:
- Line 33: The import of RootState in WebhookSaga.ts is pointing to
Redux/sagas/types/audit which doesn't export RootState; locate the module that
actually exports RootState (e.g., the central types barrel such as
Redux/sagas/types or the app's root types file) and update the import statement
in WebhookSaga.ts to import RootState from that correct module name (or remove
the import and use the correct exported type alias if renamed); ensure the
symbol RootState referenced by selectors in WebhookSaga (e.g., any select...
functions) matches the exported type name and update usages if the exported type
has a different name.
In `@admin-ui/plugins/saml/components/WebsiteSsoServiceProviderList.tsx`:
- Line 8: Update the import for the applicationStyle symbol in
WebsiteSsoServiceProviderList.tsx to use the project’s Route-alias convention
used elsewhere in the file (replace the current
'@/routes/Apps/Gluu/styles/applicationStyle' import with the
'Routes/Apps/Gluu/styles/applicationStyle' alias) so all imports in the file are
consistent.
In `@admin-ui/plugins/scripts/components/CustomScripts/CustomScriptAddPage.tsx`:
- Around line 32-37: The Add page is gated by read permission
(useCedarling().hasCedarReadPermission) so read-only users can access create UI;
update the checks to use the write permission instead: replace
hasCedarReadPermission with hasCedarWritePermission (and rename canRead to
canWrite) where the page gating uses scriptsResourceId (the occurrences around
the useMemo at top and the similar check at lines ~76-77) so only users with
hasCedarWritePermission(scriptsResourceId) can access the Add page.
In `@admin-ui/plugins/scripts/components/CustomScripts/CustomScriptEditPage.tsx`:
- Around line 36-40: The component currently uses hasCedarReadPermission to
compute canRead, which allows read-only users to access the edit route; change
these checks to require write permission instead: use hasCedarWritePermission
from useCedarling and compute a canWrite via useMemo (dependent on
hasCedarWritePermission and scriptsResourceId) and replace all uses of canRead
(and the other read-based checks at the same locations) with canWrite so only
users with write permission can enter edit flows (update references to
hasCedarReadPermission, canRead, and any read-based guards to the new
hasCedarWritePermission/canWrite).
In `@admin-ui/plugins/scripts/components/CustomScripts/CustomScriptForm.tsx`:
- Around line 131-136: The customScript payload is hardcoding locationType to
LOCATION_TYPE_DB and clearing locationPath instead of using the form values;
update the object construction in CustomScriptForm (the customScript variable)
to set locationType: values.locationType and locationPath: values.locationPath
(or undefined only if the form value is empty) so the user-selected file-based
settings are preserved when saving.
- Line 278: The Button component uses an invalid size token "small"; update the
Button (the JSX using Button with className={classes.errorButton} and
onClick={showErrorModal}) to use a valid Reactstrap/Bootstrap size prop such as
size="sm" (or size="lg" if you want large) so it maps to .btn-sm/.btn-lg
correctly.
In `@admin-ui/plugins/scripts/components/CustomScripts/CustomScriptListPage.tsx`:
- Around line 42-43: The constant DELETE_SUBJECT_SCRIPT is hardcoded to English;
replace it with a localized string by obtaining the translation from the app
i18n utility (e.g., via the component's translation hook or t/i18n function) and
assign that localized value where DELETE_SUBJECT_SCRIPT is used in
CustomScriptListPage (also update the similar hardcoded occurrences around the
delete dialog usage near the later block referenced). Keep
EMPTY_DESCRIPTION_PLACEHOLDER unchanged; ensure DELETE_SUBJECT_SCRIPT is
computed in-component (so translations are available) and used wherever the
delete-dialog subject is rendered.
In `@admin-ui/plugins/scripts/components/CustomScripts/helper/utils.ts`:
- Around line 74-76: The form defaults are forcibly overwriting existing script
location fields (script_path, locationPath, location_type) with empty/DB values;
change the initialization so you only apply those defaults when the incoming
value is missing (e.g., use existing.script_path ?? '' , existing.locationPath
?? undefined, and existing.location_type ?? LOCATION_TYPE_DB) instead of
unconditionally setting script_path: '', locationPath: undefined, location_type:
LOCATION_TYPE_DB—this preserves existing location data during edit while still
providing sensible fallbacks.
- Around line 50-56: The normalizeProperty function currently returns early when
either 'description' or 'hide' exist on p, which discards the other field;
change the logic in normalizeProperty to build a single result object from base,
then conditionally set result.description = String(p.description) if
'description' in p && p.description != null and result.hide = Boolean(p.hide) if
'hide' in p && p.hide != null, and finally return that merged result (keeping
references to base, p and the function name normalizeProperty to locate the
change).
In
`@admin-ui/plugins/scripts/components/CustomScripts/PersonAuthenticationFields.tsx`:
- Around line 39-46: The interactiveFormik object only provides handleChange but
GluuSelectRow expects a full Formik-like object (it reads formik.handleChange
and formik.handleBlur); update the useMemo that creates interactiveFormik to
also include a handleBlur function with the same signature as Formik (e:
React.FocusEvent<HTMLInputElement | HTMLSelectElement>) => void — e.g., a no-op
or a simple e => e?.persist?.() if you don’t need special blur behavior — so
GluuSelectRow’s references to formik.handleBlur (and formik.handleChange) (used
around the GluuSelectRow usage) are defined; keep usageTypeChange for
handleChange and add handleBlur to the returned object.
In
`@admin-ui/plugins/scripts/components/CustomScripts/styles/CustomScriptFormPage.style.ts`:
- Around line 204-210: The focus rule currently suppresses visible focus by
setting outline and boxShadow to OUTLINE_NONE in the '&:focus, &:active'
selector; restore an accessible focus indicator instead: remove OUTLINE_NONE
assignments and set a visible, high-contrast focus style (for example a 2px or
3px ring/outline using themeColors or a designated focus color) while keeping
backgroundColor and color as needed; update the same pattern for the other
occurrences of the '&:focus, &:active' rule (the blocks referenced at the other
ranges) so keyboard users can see focus consistently across CustomScriptFormPage
styles.
In
`@admin-ui/plugins/scripts/components/CustomScripts/styles/CustomScriptListPage.style.ts`:
- Around line 87-116: The isDark value is destructured from params in useStyles
but never used; update the function signature to stop destructuring isDark (keep
const { classes } = useStylesBase(params) and use params.themeColors or const {
themeColors } = params) or explicitly reference isDark where needed (e.g., in
badgeStyles/useMemo) — alternatively add a brief comment explaining isDark is
reserved for future use; adjust useStyles, params, and badgeStyles/useMemo to
remove the unused isDark binding or document its intentional reservation.
- Around line 109-113: The errorBadge style uses themeColors.errorColor with
textColor: activeText which fails WCAG contrast; update the errorBadge (property
name errorBadge) to set textColor to a color that meets at least 4.5:1 contrast
against themeColors.errorColor (or 3:1 for large text) — either pick an existing
accessible token (e.g., themeColors.errorText or themeColors.onError) or compute
one via your contrast helper (e.g.,
getAccessibleTextColor(themeColors.errorColor)) and replace activeText with that
token/function so the badge text meets accessibility requirements.
In `@admin-ui/plugins/user-management/components/User2FADevicesModal.tsx`:
- Around line 6-7: Update the import for GluuViewDetailModal to use the project
path alias to match applicationStyle's import; replace the old-style import
"Routes/Apps/Gluu/GluuViewDetailsModal" with the alias-based
"@/routes/Apps/Gluu/GluuViewDetailsModal" so the GluuViewDetailModal import uses
the same "@/..." style as applicationStyle in User2FADevicesModal.tsx.
---
Outside diff comments:
In `@admin-ui/app/components/Accordion/AccordionIndicator.tsx`:
- Around line 17-27: The AccordionIndicator currently force-casts open/closed to
React.ReactElement before calling React.cloneElement which can throw at runtime
if a consumer passes a non-element ReactNode; either tighten the prop type of
the AccordionIndicator component (e.g., require open and closed be
React.ReactElement) or add a runtime guard in the Consumer render path that
checks React.isValidElement(open) and React.isValidElement(closed) and falls
back (render the node directly or wrap it) instead of calling React.cloneElement
when the check fails; update the prop type declarations and the Consumer branch
handling where React.cloneElement is used to use these guards or the refined
types so the clone calls are safe.
In `@admin-ui/app/components/GluuButton/GluuButton.tsx`:
- Around line 53-109: The memoized buttonStyle (created with useMemo) reads
disableHoverStyles (and passes it into resolveBackgroundColor) but
disableHoverStyles is not included in the useMemo dependency array; update the
dependency array for the useMemo that defines buttonStyle to include
disableHoverStyles so style recalculation triggers when that prop changes (i.e.,
add disableHoverStyles alongside the other props like useOpacityOnHover,
hoverOpacity, style, etc.).
In `@admin-ui/app/index.tsx`:
- Around line 12-19: The global QueryClient instantiation currently forces
retry: false (in the const queryClient using QueryClient and
queryDefaults.queryOptions); change this to a safer default—e.g., set retry to 2
(or conditionally 0 for development) and add an exponential backoff retryDelay
function for production resilience, or make retry environment-conditional (use
NODE_ENV or a config flag to apply retry: 0 only in dev/testing and retry: 2
with retryDelay in production).
In `@admin-ui/app/routes/Dashboards/components/UserInfoItem.tsx`:
- Around line 34-42: badgeColors builds active vs inactive styles but the
inactive branch still references hardcoded customColors
(customColors.statusInactive, customColors.statusInactiveBg); change the
inactive branch to use theme-aware values from themeColors.badges (e.g.,
themeColors.badges.statusInactive and themeColors.badges.statusInactiveBg or the
appropriate badge text/bg keys) and keep the same isDark conditional logic using
themeColors.badges so the component (badgeColors, isActive, isDark) consistently
respects the theme.
In `@admin-ui/app/routes/Dashboards/DashboardPage.style.ts`:
- Around line 305-310: Change statusDotInactive to use a theme color instead of
customColors by referencing themeColors.statusInactive in the style (replace
customColors.statusInactive with themeColors.statusInactive), add a new
statusInactive: string property to the DashboardThemeColors interface, and
update the theme configuration/provider to supply statusInactive for both light
and dark themes so the component uses theme-driven colors consistently; ensure
references to statusDotActive and statusDotInactive remain in
DashboardPage.style.ts and any consumers still work with the new themed
property.
In
`@admin-ui/plugins/admin/__tests__/components/CustomScripts/CustomScriptForm.test.tsx`:
- Around line 69-82: The module-level Redux store (store created via
configureStore with combineReducers and referenced as store) is shared across
tests causing state leakage; change to create a factory function (e.g.,
createStore or createTestStore) that returns a new configureStore instance and
update createWrapper() to call this factory so each test render uses a fresh
store instance (call createTestStore inside createWrapper or within each test)
instead of the module-level store; ensure
reducers/authReducer/webhookReducer/noReducer remain the same when constructing
the fresh store.
In `@admin-ui/plugins/admin/components/Health/components/ServiceStatusCard.tsx`:
- Around line 46-66: The badge color logic in ServiceStatusCard (useMemo named
badgeColors) mixes themeColors for 'up' with hardcoded customColors for 'down',
'degraded', and 'unknown'; update those cases to derive their bg/text values
from themeColors (e.g., themeColors.badges.statusInactiveBg / statusInactive /
filledBadgeText equivalents) instead of customColors so all statuses
consistently follow the theme, and ensure the useMemo dependency array still
includes any theme objects you reference (themeColors and isDark).
In `@admin-ui/plugins/auth-server/components/Ssa/SsaAddPage.tsx`:
- Around line 13-21: The imports in SsaAddPage mix alias and non-alias paths —
change the remaining imports for GluuInputRow, GluuTypeAhead, GluuToogleRow,
GluuLabel, GluuRemovableInputRow, GluuFormFooter, GluuCommitDialogLegacy, and
GluuLoader to use the same '@/routes/Apps/Gluu/...' alias style as
applicationStyle so all imports are consistent; update each import statement to
the aliased path (keep the same imported symbol names) or revert
applicationStyle to the non-aliased form if you prefer the original style across
the file.
In
`@admin-ui/plugins/scripts/components/CustomScripts/hooks/useCustomScriptApi.ts`:
- Around line 118-137: The mutateAsync implementation currently awaits
side-effects (queryClient.invalidateQueries, webhookTrigger, logAuditAction)
directly so any failure there rejects the whole mutation even when
baseMutation.mutateAsync succeeded; change mutateAsync to capture result from
baseMutation.mutateAsync and then run the invalidation/webhook/audit calls
inside a try/catch (or Promise.allSettled) so errors are logged but not
re-thrown, ensuring mutateAsync always returns the successful result; apply the
same pattern to the other similar handlers referenced (lines with
baseMutation.mutateAsync, queryClient.invalidateQueries, webhookTrigger,
logAuditAction, and the CREATE/SCRIPT audit payload).
In `@admin-ui/plugins/user-management/components/User2FADevicesModal.tsx`:
- Around line 192-219: The handleRemove2Fa useCallback incorrectly lists
otpDevicesList in its dependency array even though otpDevicesList is never read
inside the callback; remove otpDevicesList from the dependency array so the
callback depends only on userDetails, deleteFido2Mutation, and updateUserData
(i.e., update the dependency array for handleRemove2Fa to [userDetails,
deleteFido2Mutation, updateUserData]).
ℹ️ Review info
Configuration used: Organization UI
Review profile: ASSERTIVE
Plan: Pro
📒 Files selected for processing (170)
admin-ui/__tests__/setup.tsadmin-ui/app/components/Accordion/AccordionBody.tsxadmin-ui/app/components/Accordion/AccordionIndicator.tsxadmin-ui/app/components/Accordion/index.tsadmin-ui/app/components/App/index.tsadmin-ui/app/components/Avatar/Avatar.tsxadmin-ui/app/components/Avatar/index.tsadmin-ui/app/components/Card/Card.tsxadmin-ui/app/components/Card/index.tsadmin-ui/app/components/CardHeader/index.tsadmin-ui/app/components/CustomInput/CustomInput.tsxadmin-ui/app/components/CustomInput/index.tsadmin-ui/app/components/Divider/Divider.tsxadmin-ui/app/components/Divider/index.tsadmin-ui/app/components/GluuButton/GluuButton.tsxadmin-ui/app/components/GluuDatePicker/GluuDatePicker.style.tsadmin-ui/app/components/GluuDetailGrid/GluuDetailGrid.style.tsadmin-ui/app/components/GluuDetailGrid/GluuDetailGrid.tsxadmin-ui/app/components/GluuDetailGrid/__tests__/GluuDetailGrid.test.tsxadmin-ui/app/components/GluuDetailGrid/index.tsadmin-ui/app/components/GluuDetailGrid/types.tsadmin-ui/app/components/GluuInlineAlert/GluuInlineAlert.style.tsadmin-ui/app/components/GluuInlineAlert/GluuInlineAlert.tsxadmin-ui/app/components/GluuInlineAlert/index.tsadmin-ui/app/components/GluuInlineAlert/types.tsadmin-ui/app/components/GluuSearchToolbar/GluuSearchToolbar.tsxadmin-ui/app/components/GluuSearchToolbar/types.tsadmin-ui/app/components/GluuSpinner/GluuSpinner.style.tsadmin-ui/app/components/GluuSpinner/GluuSpinner.tsxadmin-ui/app/components/GluuTable/GluuTable.style.tsadmin-ui/app/components/GluuTable/GluuTable.tsxadmin-ui/app/components/GluuTable/types.tsadmin-ui/app/components/Layout/LayoutContent.tsxadmin-ui/app/components/Widgets/GroupedButtons/Counter.tsxadmin-ui/app/components/Widgets/GroupedButtons/styles/Counter.style.tsadmin-ui/app/constants/ui.tsadmin-ui/app/context/theme/config.tsadmin-ui/app/i18n.tsadmin-ui/app/index.tsxadmin-ui/app/locales/en/translation.jsonadmin-ui/app/locales/es/translation.jsonadmin-ui/app/locales/fr/translation.jsonadmin-ui/app/locales/pt/translation.jsonadmin-ui/app/redux/types/index.tsadmin-ui/app/routes/Apps/Gluu/GluuCommitDialog.tsxadmin-ui/app/routes/Apps/Gluu/GluuCommitFooter.tsxadmin-ui/app/routes/Apps/Gluu/GluuFormDetailRow.tsxadmin-ui/app/routes/Apps/Gluu/GluuFormFooter.tsxadmin-ui/app/routes/Apps/Gluu/GluuInfo.tsxadmin-ui/app/routes/Apps/Gluu/GluuInlineInput.tsxadmin-ui/app/routes/Apps/Gluu/GluuInputEditor.tsxadmin-ui/app/routes/Apps/Gluu/GluuInputRow.tsxadmin-ui/app/routes/Apps/Gluu/GluuLabel.tsxadmin-ui/app/routes/Apps/Gluu/GluuRemovableInputRow.tsxadmin-ui/app/routes/Apps/Gluu/GluuRemovableSelectRow.tsxadmin-ui/app/routes/Apps/Gluu/GluuRemovableTypeAhead.tsxadmin-ui/app/routes/Apps/Gluu/GluuScriptErrorModal.tsxadmin-ui/app/routes/Apps/Gluu/GluuTypeAheadWithAdd.tsxadmin-ui/app/routes/Apps/Gluu/GluuWebhookErrorDialog.tsxadmin-ui/app/routes/Apps/Gluu/Tests/GluuTypeAheadWithAdd.test.tsxadmin-ui/app/routes/Apps/Gluu/styles/GluuCommitDialog.style.tsadmin-ui/app/routes/Apps/Gluu/styles/GluuScriptErrorModal.style.tsadmin-ui/app/routes/Apps/Gluu/styles/applicationStyle.tsxadmin-ui/app/routes/Apps/Profile/ProfilePage.style.tsadmin-ui/app/routes/Apps/Profile/ProfilePage.tsxadmin-ui/app/routes/Dashboards/DashboardPage.style.tsadmin-ui/app/routes/Dashboards/DashboardPage.tsxadmin-ui/app/routes/Dashboards/Reports/ReportPiChartItem.tsxadmin-ui/app/routes/Dashboards/components/UserInfoItem.tsxadmin-ui/app/styles/main.scssadmin-ui/app/utils/hooks/useWebhookDialogAction.tsxadmin-ui/app/utils/queryUtils.tsadmin-ui/jest.config.tsadmin-ui/plugins/admin/__tests__/api/CustomScripts.test.tsadmin-ui/plugins/admin/__tests__/api/setup.test.tsadmin-ui/plugins/admin/__tests__/components/CustomScripts/CustomScriptAddPage.test.tsxadmin-ui/plugins/admin/__tests__/components/CustomScripts/CustomScriptDetailPage.test.tsxadmin-ui/plugins/admin/__tests__/components/CustomScripts/CustomScriptEditPage.test.tsxadmin-ui/plugins/admin/__tests__/components/CustomScripts/CustomScriptForm.test.tsxadmin-ui/plugins/admin/__tests__/components/CustomScripts/item.test.tsadmin-ui/plugins/admin/__tests__/components/CustomScripts/script.test.tsadmin-ui/plugins/admin/components/Assets/types/FormTypes.tsadmin-ui/plugins/admin/components/Audit/AuditListPage.style.tsadmin-ui/plugins/admin/components/Audit/AuditListPage.tsxadmin-ui/plugins/admin/components/CustomScripts/CustomScriptAddPage.tsxadmin-ui/plugins/admin/components/CustomScripts/CustomScriptDetailPage.tsxadmin-ui/plugins/admin/components/CustomScripts/CustomScriptEditPage.tsxadmin-ui/plugins/admin/components/CustomScripts/CustomScriptForm.tsxadmin-ui/plugins/admin/components/CustomScripts/CustomScriptListPage.tsxadmin-ui/plugins/admin/components/CustomScripts/PersonAuthenticationFields.tsxadmin-ui/plugins/admin/components/CustomScripts/constants.tsadmin-ui/plugins/admin/components/CustomScripts/helper/utils.tsadmin-ui/plugins/admin/components/CustomScripts/helper/validations.tsadmin-ui/plugins/admin/components/Health/components/ServiceStatusCard.tsxadmin-ui/plugins/admin/components/Webhook/ShortcodePopover.tsxadmin-ui/plugins/admin/components/Webhook/WebhookListPage.tsxadmin-ui/plugins/admin/components/Webhook/styles/WebhookFormPage.style.tsadmin-ui/plugins/admin/components/Webhook/styles/WebhookListPage.style.tsadmin-ui/plugins/admin/helper/assets.tsadmin-ui/plugins/admin/redux/api/ScriptApi.tsadmin-ui/plugins/admin/redux/api/types/ScriptApiTypes.tsadmin-ui/plugins/admin/redux/features/customScriptSlice.tsadmin-ui/plugins/admin/redux/features/types/customScript.tsadmin-ui/plugins/admin/redux/features/types/index.tsadmin-ui/plugins/admin/redux/sagas/CustomScriptSaga.tsadmin-ui/plugins/admin/redux/sagas/WebhookSaga.tsadmin-ui/plugins/admin/redux/sagas/types/audit.tsadmin-ui/plugins/admin/redux/sagas/types/customScript.tsadmin-ui/plugins/admin/redux/sagas/types/index.tsadmin-ui/plugins/admin/redux/sagas/types/state.tsadmin-ui/plugins/auth-server/__tests__/api/AuthN.test.jsadmin-ui/plugins/auth-server/components/Agama/AgamaAliasListPage.tsxadmin-ui/plugins/auth-server/components/Agama/AgamaListPage.tsxadmin-ui/plugins/auth-server/components/AuthN/AuthNEditPage.tsxadmin-ui/plugins/auth-server/components/AuthN/AuthNListPage.tsxadmin-ui/plugins/auth-server/components/AuthN/index.tsxadmin-ui/plugins/auth-server/components/Clients/ClientActiveTokens.jsadmin-ui/plugins/auth-server/components/Clients/ClientCibaParUmaPanel.jsadmin-ui/plugins/auth-server/components/Clients/ClientListPage.jsadmin-ui/plugins/auth-server/components/Clients/ClientWizardForm.jsadmin-ui/plugins/auth-server/components/Configuration/ConfigApiConfiguration/ConfigApiPage.tsxadmin-ui/plugins/auth-server/components/Configuration/DefaultAcrInput.tsxadmin-ui/plugins/auth-server/components/Configuration/Defaults/LoggingPage.tsxadmin-ui/plugins/auth-server/components/Configuration/Keys/KeysPage.tsxadmin-ui/plugins/auth-server/components/Message/LockPage.jsadmin-ui/plugins/auth-server/components/Scopes/ScopeAddPage.tsxadmin-ui/plugins/auth-server/components/Scopes/ScopeEditPage.tsxadmin-ui/plugins/auth-server/components/Scopes/ScopeListPage.tsxadmin-ui/plugins/auth-server/components/Sessions/SessionListPage.tsxadmin-ui/plugins/auth-server/components/Ssa/SsaAddPage.tsxadmin-ui/plugins/auth-server/components/Ssa/SsaListPage.tsxadmin-ui/plugins/auth-server/plugin-metadata.jsadmin-ui/plugins/fido/components/Fido.tsxadmin-ui/plugins/jans-lock/components/JansLock.tsxadmin-ui/plugins/saml/components/SamlPage.tsxadmin-ui/plugins/saml/components/WebsiteSsoIdentityBrokeringList.tsxadmin-ui/plugins/saml/components/WebsiteSsoServiceProviderList.tsxadmin-ui/plugins/schema/components/Person/AttributeAddPage.tsxadmin-ui/plugins/schema/components/Person/AttributeEditPage.tsxadmin-ui/plugins/schema/components/Person/AttributeListPage.tsxadmin-ui/plugins/schema/components/Person/AttributeViewPage.tsxadmin-ui/plugins/scim/components/ScimPage.tsxadmin-ui/plugins/scripts/components/CustomScripts/CustomScriptAddPage.tsxadmin-ui/plugins/scripts/components/CustomScripts/CustomScriptEditPage.tsxadmin-ui/plugins/scripts/components/CustomScripts/CustomScriptForm.tsxadmin-ui/plugins/scripts/components/CustomScripts/CustomScriptListPage.tsxadmin-ui/plugins/scripts/components/CustomScripts/PersonAuthenticationFields.tsxadmin-ui/plugins/scripts/components/CustomScripts/ScriptListPage.tsxadmin-ui/plugins/scripts/components/CustomScripts/constants.tsadmin-ui/plugins/scripts/components/CustomScripts/helper/auditUtils.tsadmin-ui/plugins/scripts/components/CustomScripts/helper/index.tsadmin-ui/plugins/scripts/components/CustomScripts/helper/utils.tsadmin-ui/plugins/scripts/components/CustomScripts/helper/validations.tsadmin-ui/plugins/scripts/components/CustomScripts/hooks/index.tsadmin-ui/plugins/scripts/components/CustomScripts/hooks/useCustomScriptActions.tsadmin-ui/plugins/scripts/components/CustomScripts/hooks/useCustomScriptApi.tsadmin-ui/plugins/scripts/components/CustomScripts/hooks/useMutationEffects.tsadmin-ui/plugins/scripts/components/CustomScripts/styles/CustomScriptFormPage.style.tsadmin-ui/plugins/scripts/components/CustomScripts/styles/CustomScriptListPage.style.tsadmin-ui/plugins/scripts/components/CustomScripts/types/actions.tsadmin-ui/plugins/scripts/components/CustomScripts/types/customScript.tsadmin-ui/plugins/scripts/components/CustomScripts/types/forms.tsadmin-ui/plugins/scripts/components/CustomScripts/types/index.tsadmin-ui/plugins/scripts/plugin-metadata.tsadmin-ui/plugins/services/Components/Configuration/CachePage.tsxadmin-ui/plugins/services/Components/Configuration/LdapListPage.tsxadmin-ui/plugins/services/Components/Configuration/PersistenceDetail.tsxadmin-ui/plugins/smtp-management/components/SmtpManagement/SmtpEditPage.tsxadmin-ui/plugins/user-management/components/User2FADevicesModal.tsxadmin-ui/plugins/user-management/components/UserList.tsx
💤 Files with no reviewable changes (29)
- admin-ui/plugins/scripts/components/CustomScripts/types/forms.ts
- admin-ui/plugins/admin/redux/features/types/index.ts
- admin-ui/plugins/admin/components/CustomScripts/constants.ts
- admin-ui/plugins/admin/components/CustomScripts/CustomScriptDetailPage.tsx
- admin-ui/app/components/App/index.ts
- admin-ui/plugins/admin/components/CustomScripts/CustomScriptAddPage.tsx
- admin-ui/plugins/admin/components/CustomScripts/helper/validations.ts
- admin-ui/app/components/Card/index.ts
- admin-ui/plugins/admin/redux/features/types/customScript.ts
- admin-ui/plugins/admin/redux/sagas/types/index.ts
- admin-ui/plugins/admin/tests/components/CustomScripts/item.test.ts
- admin-ui/app/components/CardHeader/index.ts
- admin-ui/plugins/admin/components/CustomScripts/CustomScriptForm.tsx
- admin-ui/plugins/admin/redux/api/types/ScriptApiTypes.ts
- admin-ui/plugins/admin/components/CustomScripts/PersonAuthenticationFields.tsx
- admin-ui/plugins/admin/redux/sagas/types/customScript.ts
- admin-ui/plugins/admin/components/CustomScripts/helper/utils.ts
- admin-ui/plugins/admin/redux/sagas/CustomScriptSaga.ts
- admin-ui/app/components/CustomInput/index.ts
- admin-ui/plugins/admin/components/CustomScripts/CustomScriptEditPage.tsx
- admin-ui/app/components/Divider/index.ts
- admin-ui/plugins/admin/redux/api/ScriptApi.ts
- admin-ui/plugins/admin/components/CustomScripts/CustomScriptListPage.tsx
- admin-ui/app/redux/types/index.ts
- admin-ui/plugins/auth-server/tests/api/AuthN.test.js
- admin-ui/plugins/admin/redux/sagas/types/state.ts
- admin-ui/plugins/admin/tests/api/CustomScripts.test.ts
- admin-ui/plugins/admin/redux/features/customScriptSlice.ts
- admin-ui/plugins/admin/tests/components/CustomScripts/CustomScriptDetailPage.test.tsx
admin-ui/app/components/GluuDetailGrid/__tests__/GluuDetailGrid.test.tsx
Outdated
Show resolved
Hide resolved
admin-ui/plugins/scripts/components/CustomScripts/PersonAuthenticationFields.tsx
Show resolved
Hide resolved
admin-ui/plugins/scripts/components/CustomScripts/styles/CustomScriptFormPage.style.ts
Show resolved
Hide resolved
admin-ui/plugins/scripts/components/CustomScripts/styles/CustomScriptListPage.style.ts
Show resolved
Hide resolved
admin-ui/plugins/scripts/components/CustomScripts/styles/CustomScriptListPage.style.ts
Show resolved
Hide resolved
Signed-off-by: faisalsiddique4400 <faisalsiddique10886@gmail.com>
Signed-off-by: faisalsiddique4400 <faisalsiddique10886@gmail.com>
Signed-off-by: faisalsiddique4400 <faisalsiddique10886@gmail.com>
Signed-off-by: faisalsiddique4400 <faisalsiddique10886@gmail.com>
Signed-off-by: faisalsiddique4400 <faisalsiddique10886@gmail.com>
Signed-off-by: faisalsiddique4400 <faisalsiddique10886@gmail.com>
Signed-off-by: faisalsiddique4400 <faisalsiddique10886@gmail.com>
Signed-off-by: faisalsiddique4400 <faisalsiddique10886@gmail.com>
Signed-off-by: faisalsiddique4400 <faisalsiddique10886@gmail.com>
Signed-off-by: faisalsiddique4400 <faisalsiddique10886@gmail.com>
duttarnab
left a comment
There was a problem hiding this comment.
Location Typefield has been removed in previous release. location_type isdbby default. Please check on https://duttarnab-sincere-warthog.gluu.info/admin
Signed-off-by: faisalsiddique4400 <faisalsiddique10886@gmail.com>
|



feat(admin-ui): revamp Scripts module as per Figma with partial TS migration (#2631)
Summary
This PR revamps the Scripts module to align with the latest Figma designs as part of the ongoing Admin UI redesign initiative. Additionally, a few smaller JavaScript components within this module have been migrated to TypeScript to improve type safety and maintainability.
Changes Included
Result
Parent Initiative
This work is part of the following parent feature:
feat(admin-ui): Revamp the existing design of the admin-ui according to the new design🔗 Ticket
Closes: #2631
Summary by CodeRabbit
New Features
Improvements
Bug Fixes