Skip to content

Conversation

@Arukuen
Copy link
Contributor

@Arukuen Arukuen commented Aug 18, 2025

fixes #3565

Summary by CodeRabbit

  • New Features

    • Role options in Role Manager and Custom Fields now populate dynamically from a centralized roles source with a safe fallback.
    • Current search state is now propagated into Settings so filtering applies consistently across panels and sidenav.
  • Bug Fixes

    • Improved behavior when no settings match a search—shows a “No matching settings” message and prevents rendering errors by handling empty/null groups.

@coderabbitai
Copy link

coderabbitai bot commented Aug 18, 2025

Walkthrough

Replaces hard-coded role labels with dynamic values from editorRoles, threads currentSearch into settings rendering, changes SEARCH_TREE so groups set children = null when search is empty, and adds per-section hasGroupMatch checks to render a “No matching settings” message when no groups match.

Changes

Cohort / File(s) Summary
Role source & dynamic children
src/welcome/admin.js
Import editorRoles; replace fixed role label arrays in Role Manager and Custom Fields with `Object.values(editorRoles
SEARCH_TREE & filtering logic
src/welcome/admin.js
Remove early-return for empty search; set group.children = null when currentSearch is empty; preserve per-group filtering when search active.
Rendering guards & no-match handling
src/welcome/admin.js
Add hasGroupMatch checks across multiple sections; replace group.children.length > 0 with `(group.children === null
State propagation
src/welcome/admin.js
Thread currentSearch into Settings props and adapt Sidenav/other components to accept dynamic/null children for filtering state.

Sequence Diagram(s)

sequenceDiagram
  actor User
  participant UI as Settings UI
  participant Roles as editorRoles
  participant Search as Search logic
  participant Renderer as Renderer

  User->>UI: open Settings / type search
  UI->>Roles: read editorRoles (Object.values or {})
  Roles-->>UI: role list (possibly empty)
  Search->>UI: currentSearch value
  UI->>UI: build SEARCH_TREE (set group.children = null if currentSearch empty)
  UI->>Renderer: send SEARCH_TREE + hasGroupMatch flags
  alt any group has children
    Renderer-->>User: render matching groups and items
  else no groups usable
    Renderer-->>User: render "No matching settings"
  end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Assessment against linked issues

Objective Addressed Explanation
Role Manager settings remain visible and functional regardless of site language (#3565)

Assessment against linked issues: Out-of-scope changes

Code Change Explanation
SEARCH_TREE empty-search behavior and nullified group.children (src/welcome/admin.js) Introduces broader search/filter behavior changes and null children semantics beyond the language/role visibility fix in #3565; not required by the issue.

"I hop through code and munch a log,
Replaced the strings with a living cog.
Roles now fetched no matter the tongue,
Empty-search hush made safe and young.
Tiny rabbit cheers — the UI's sprung!" 🐇✨

Tip

🔌 Remote MCP (Model Context Protocol) integration is now available!

Pro plan users can now connect to remote MCP servers from the Integrations page. Connect with popular remote MCPs such as Notion and Linear to add more context to your reviews and chats.

✨ Finishing Touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch fix/3565-translated-roles

🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

CodeRabbit Commands (Invoked using PR/Issue comments)

Type @coderabbitai help to get the list of available commands.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Status, Documentation and Community

  • Visit our Status Page to check the current availability of CodeRabbit.
  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@github-actions
Copy link

github-actions bot commented Aug 18, 2025

🤖 Pull request artifacts

file commit
pr3580-stackable-3580-merge.zip 4afe14b

github-actions bot added a commit that referenced this pull request Aug 18, 2025
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (3)
src/welcome/admin.js (3)

171-172: Defensive guard to prevent runtime error if editorRoles is undefined.

If, for any reason, editorRoles isn’t exported/initialized (older bundles, feature flags, or race during module wiring), Object.values(editorRoles) will throw. A small guard avoids a hard crash and gracefully degrades to an empty list. Also, coercing to String is a safe hedge for unexpected non-string values.

Apply this diff:

-					...Object.values( editorRoles ),
+					...Object.values( editorRoles || {} ).map( String ),

184-185: Mirror the same safeguard in Custom Fields.

Keep the behavior consistent across both sections by guarding and normalizing the values here as well.

Apply this diff:

-					...Object.values( editorRoles ),
+					...Object.values( editorRoles || {} ).map( String ),

571-587: Optional: make the search more robust to non-string entries.

The filter assumes all children are strings. Given SEARCH_TREE now partially depends on imported data, a small normalization prevents failures or false negatives if any entry isn’t a string.

Apply this diff:

-				const filteredChildren = group.children.filter( child => {
-					return child.toLowerCase().includes( loweredSearch.toLowerCase() )
-				} )
+				const filteredChildren = group.children.filter( child => {
+					const c = String( child )
+					return c.toLowerCase().includes( loweredSearch )
+				} )
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

💡 Knowledge Base configuration:

  • MCP integration is disabled by default for public repositories
  • Jira integration is disabled by default for public repositories
  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 398f38b and 959c687.

📒 Files selected for processing (1)
  • src/welcome/admin.js (3 hunks)
🔇 Additional comments (2)
src/welcome/admin.js (2)

32-32: Good call: centralizing role labels via editorRoles.

Importing editorRoles from the shared source eliminates hard-coded strings and keeps role labels in sync and localized.


26-33: Manual Verification Required: Confirm editorRoles Export in stackable

Please ensure that the editorRoles symbol you’re importing from the stackable package:

  • Exists and is exported in the source (JS/TS) of stackable
  • Is defined with the expected shape (string values, properly localized)
  • Remains available across all supported versions/releases of stackable

Steps to verify:

  • Inspect the editorRoles definition in stackable’s source (e.g., in node_modules/stackable/src or its GitHub repo)
  • Review any accompanying TypeScript declaration files (.d.ts) to confirm the export and its type
  • Check release notes or version history to ensure no breaking changes around editorRoles

github-actions bot added a commit that referenced this pull request Aug 18, 2025
Copy link
Contributor

@bfintal bfintal left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this seems to be the wrong fix for this. the underlying issue is this line in AdminBaseSetting:

const isSearched = props.searchedSettings ? props.searchedSettings.includes( props.label ) : true

It's searching right away without any search string and not matching because it's a different language.

For me the fix should be that if there's no searching being done, there should be no filtering.

github-actions bot added a commit that referenced this pull request Aug 20, 2025
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (4)
src/welcome/admin.js (4)

595-604: Null sentinel for “no search” is sensible; harden search and remove redundant lowercase

Using children: null to indicate “no active search” is a clean way to distinguish from “no results.” Two micro-fixes:

  • Guard non-string children defensively: use String(child).toLowerCase() to avoid crashes if any child isn’t a string.
  • loweredSearch is already lowercase; drop the second .toLowerCase().
-               const filteredChildren = group.children.filter( child => {
-                   return child.toLowerCase().includes( loweredSearch.toLowerCase() )
-               } )
+               const filteredChildren = group.children.filter( child => {
+                   return String( child ).toLowerCase().includes( loweredSearch )
+               } )

Also verify that downstream components (Admin*Setting, etc.) safely handle searchedSettings={null} as “no search highlight,” not as an array.


657-658: Consistent “hasGroupMatch” gating and null-aware children checks

Nice, consistent pattern across sections:

  • hasGroupMatch = groups.some(group => group.children === null || group.children.length > 0)
  • Render “No matching settings” when applicable.
  • Per-group rendering guarded by (group.children === null || group.children.length > 0).

Optional DRY: extract helpers to reduce repetition and future drift.

Example:

  • const groupHasVisibleChildren = g => g.children === null || g.children.length > 0
  • const tabHasAnyMatches = groups => groups.some(groupHasVisibleChildren)

Also applies to: 661-661, 665-665, 691-691, 750-750, 801-801, 840-840, 845-845, 849-849, 912-913, 1093-1093, 1112-1112, 1180-1180, 1184-1184, 1188-1188, 1221-1221, 1225-1225, 1229-1229, 1252-1253, 1263-1263, 1266-1266, 1304-1305, 1316-1316, 1319-1319, 1366-1367, 1377-1377, 1381-1381, 1474-1474, 1484-1484, 1488-1488, 1545-1545, 1608-1608, 1620-1621


1476-1479: searchClassname: null-aware check looks good; consider optional chaining

You already handle children === null. Minor polish: optional chaining avoids assumptions on the shape of searchedSettings.

-   return searchedSettings.children === null || searchedSettings.children.includes( label )
+   return searchedSettings?.children === null || searchedSettings?.children?.includes( label )
        ? ''
        : 'ugb-admin-setting--not-highlight'

443-445: FYI: Sidenav highlight relies on short-circuit to avoid null children

Not a change here, but with the new null sentinel, isSearched = currentSearch && groups.some( g => g.children.length > 0 ) is safe because of short-circuiting. If you want to align readability with the rest of the file, you can mirror the (children === null || children.length > 0) guard here too.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

💡 Knowledge Base configuration:

  • MCP integration is disabled by default for public repositories
  • Jira integration is disabled by default for public repositories
  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between abbe634 and 57aa761.

📒 Files selected for processing (1)
  • src/welcome/admin.js (25 hunks)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (7)
  • GitHub Check: PHP 7.3 and WP 6.5.5
  • GitHub Check: PHP 8.2 and WP 6.5.5
  • GitHub Check: PHP 8.2 and WP 6.7.2
  • GitHub Check: PHP 8.2 and WP 6.6.2
  • GitHub Check: PHP 7.3 and WP latest
  • GitHub Check: PHP 8.2 and WP latest
  • GitHub Check: build
🔇 Additional comments (2)
src/welcome/admin.js (2)

32-33: Importing editorRoles looks right; verify export shape and availability

Confirm that editorRoles is a defined object (or array of strings) at runtime and contains translated role labels when the site language changes. If it can be an empty object in some locales or load after this file, add a defensive fallback (see role children comments below).


610-614: Passing currentSearch down is appropriate

Plumbing currentSearch via props aligns with the new filtering semantics.

Comment on lines 170 to 181
children: ( editorRoles
? Object.values( editorRoles )
: [
__( 'Role Manager', i18n ),
__( 'Administrator', i18n ),
__( 'Editor', i18n ),
__( 'Author', i18n ),
__( 'Contributor', i18n ),
__( 'Subscriber', i18n ),
]
),
},
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

❓ Verification inconclusive

Make fallback robust and retain group keyword in search results

Good move switching to dynamic, translated role labels. Two improvements:

  • Robust fallback: editorRoles may be defined but empty (e.g., missing translations). The current truthy check will select [] instead of the fallback labels. Check for a non-empty values array.
  • Retain discoverability: keep the group keyword in the searchable children so typing “Role Manager” still surfaces this section when editorRoles is present.

Apply these diffs:

Role Manager group

-               children: ( editorRoles
-                   ? Object.values( editorRoles )
-                   : [
-                       __( 'Role Manager', i18n ),
-                       __( 'Administrator', i18n ),
-                       __( 'Editor', i18n ),
-                       __( 'Author', i18n ),
-                       __( 'Contributor', i18n ),
-                       __( 'Subscriber', i18n ),
-                   ]
-               ),
+               children: [
+                   __( 'Role Manager', i18n ),
+                   ...(
+                       editorRoles && Object.values( editorRoles ).length > 0
+                           ? Object.values( editorRoles )
+                           : [
+                               __( 'Administrator', i18n ),
+                               __( 'Editor', i18n ),
+                               __( 'Author', i18n ),
+                               __( 'Contributor', i18n ),
+                               __( 'Subscriber', i18n ),
+                           ]
+                   ),
+               ],

Custom Fields group

-                   ...( editorRoles
-                       ? Object.values( editorRoles )
-                       : [
-                           __( 'Role Manager', i18n ),
-                           __( 'Administrator', i18n ),
-                           __( 'Editor', i18n ),
-                           __( 'Author', i18n ),
-                           __( 'Contributor', i18n ),
-                           __( 'Subscriber', i18n ),
-                       ]
-                   ),
+                   ...(
+                       editorRoles && Object.values( editorRoles ).length > 0
+                           ? Object.values( editorRoles )
+                           : [
+                               __( 'Role Manager', i18n ),
+                               __( 'Administrator', i18n ),
+                               __( 'Editor', i18n ),
+                               __( 'Author', i18n ),
+                               __( 'Contributor', i18n ),
+                               __( 'Subscriber', i18n ),
+                           ]
+                   ),

Also applies to: 192-202


Ensure robust fallback and preserve “Role Manager” in searchable children

We should guard against an empty editorRoles object (truthy but no entries) and always include the “Role Manager” keyword so this group remains discoverable when translations are available.

– In src/welcome/admin.js (lines 170–181 and 192–202):
• Change the fallback logic to check Object.values(editorRoles).length > 0 rather than just editorRoles.
• Always prepend __( 'Role Manager', i18n ) to the children array.

Apply these diffs:

Role Manager group (around line 170)

-               children: ( editorRoles
-                   ? Object.values( editorRoles )
-                   : [
-                       __( 'Role Manager', i18n ),
-                       __( 'Administrator', i18n ),
-                       __( 'Editor', i18n ),
-                       __( 'Author', i18n ),
-                       __( 'Contributor', i18n ),
-                       __( 'Subscriber', i18n ),
-                   ]
-               ),
+               children: [
+                   __( 'Role Manager', i18n ),
+                   ...(
+                       editorRoles && Object.values( editorRoles ).length > 0
+                           ? Object.values( editorRoles )
+                           : [
+                               __( 'Administrator', i18n ),
+                               __( 'Editor', i18n ),
+                               __( 'Author', i18n ),
+                               __( 'Contributor', i18n ),
+                               __( 'Subscriber', i18n ),
+                           ]
+                   ),
+               ],

Custom Fields group (around line 192)

-                   ...( editorRoles
-                       ? Object.values( editorRoles )
-                       : [
-                           __( 'Role Manager', i18n ),
-                           __( 'Administrator', i18n ),
-                           __( 'Editor', i18n ),
-                           __( 'Author', i18n ),
-                           __( 'Contributor', i18n ),
-                           __( 'Subscriber', i18n ),
-                       ]
-                   ),
+                   ...(
+                       editorRoles && Object.values( editorRoles ).length > 0
+                           ? Object.values( editorRoles )
+                           : [
+                               __( 'Role Manager', i18n ),
+                               __( 'Administrator', i18n ),
+                               __( 'Editor', i18n ),
+                               __( 'Author', i18n ),
+                               __( 'Contributor', i18n ),
+                               __( 'Subscriber', i18n ),
+                           ]
+                   ),
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
children: ( editorRoles
? Object.values( editorRoles )
: [
__( 'Role Manager', i18n ),
__( 'Administrator', i18n ),
__( 'Editor', i18n ),
__( 'Author', i18n ),
__( 'Contributor', i18n ),
__( 'Subscriber', i18n ),
]
),
},
// — Role Manager group (originally lines 170–181)
children: [
__( 'Role Manager', i18n ),
...(
editorRoles && Object.values( editorRoles ).length > 0
? Object.values( editorRoles )
: [
__( 'Administrator', i18n ),
__( 'Editor', i18n ),
__( 'Author', i18n ),
__( 'Contributor', i18n ),
__( 'Subscriber', i18n ),
]
),
],
// — Custom Fields group (originally lines 192–202)
children: [
// … any existing items before the roles …
...(
editorRoles && Object.values( editorRoles ).length > 0
? Object.values( editorRoles )
: [
__( 'Role Manager', i18n ),
__( 'Administrator', i18n ),
__( 'Editor', i18n ),
__( 'Author', i18n ),
__( 'Contributor', i18n ),
__( 'Subscriber', i18n ),
]
),
// … any existing items after the roles …
],
🤖 Prompt for AI Agents
In src/welcome/admin.js around lines 170–181 and 192–202, the current fallback
uses a truthy check on editorRoles and can produce an empty children list when
editorRoles is an object with no entries, and it also omits the “Role Manager”
keyword; change the condition to use Object.values(editorRoles).length > 0 for
the fallback and ensure __("'Role Manager'", i18n) is always prepended to the
children array (so build children as [__( 'Role Manager', i18n ),
...(Object.values(editorRoles).length > 0 ? Object.values(editorRoles) : [ other
translated defaults ])] for both the Role Manager group and the Custom Fields
group locations).

github-actions bot added a commit that referenced this pull request Aug 20, 2025
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

♻️ Duplicate comments (1)
src/welcome/admin.js (1)

170-171: Make fallback robust and keep “Role Manager” discoverable in search

If editorRoles is defined but empty, Object.values(editorRoles || {}) yields [], hiding role entries from search. Also, removing the "Role Manager" keyword makes this section harder to find via search. Use a non-empty check and always include the “Role Manager” keyword.

Apply these diffs:

-               children: Object.values( editorRoles || {} ),
+               children: [
+                   __( 'Role Manager', i18n ),
+                   ...(
+                       editorRoles && Object.values( editorRoles ).length > 0
+                           ? Object.values( editorRoles )
+                           : [
+                               __( 'Administrator', i18n ),
+                               __( 'Editor', i18n ),
+                               __( 'Author', i18n ),
+                               __( 'Contributor', i18n ),
+                               __( 'Subscriber', i18n ),
+                           ]
+                   ),
+               ],
-                   ...Object.values( editorRoles || {} ),
+                   ...(
+                       editorRoles && Object.values( editorRoles ).length > 0
+                           ? Object.values( editorRoles )
+                           : [
+                               __( 'Role Manager', i18n ),
+                               __( 'Administrator', i18n ),
+                               __( 'Editor', i18n ),
+                               __( 'Author', i18n ),
+                               __( 'Contributor', i18n ),
+                               __( 'Subscriber', i18n ),
+                           ]
+                   ),

Verification: Please sanity-check in a locale where editorRoles may be temporarily empty/missing to ensure the section remains searchable and populated.

Also applies to: 179-183

🧹 Nitpick comments (2)
src/welcome/admin.js (2)

575-585: Tighten filteredSearchTree: remove redundant lowercase and fix typo

Two small cleanups:

  • loweredSearch is already lowercased, no need to lowercase it again inside includes.
  • Typo: filtedGroups → filteredGroups.
-       return SEARCH_TREE.map( tabs => {
-           const filtedGroups = tabs.groups.map( group => {
+       return SEARCH_TREE.map( tabs => {
+           const filteredGroups = tabs.groups.map( group => {
                if ( ! currentSearch ) {
                    return { ...group, children: null }
                }
                const filteredChildren = group.children.filter( child => {
-                   return child.toLowerCase().includes( loweredSearch.toLowerCase() )
+                   return child.toLowerCase().includes( loweredSearch )
                } )
                return { ...group, children: filteredChildren }
            } )
-           return { ...tabs, groups: filtedGroups }
+           return { ...tabs, groups: filteredGroups }
        } )

637-638: Reduce duplication for group match checks with a small helper

The pattern groups.some(group => group.children === null || group.children.length > 0) is repeated in many sections. A tiny utility improves readability and reduces the chance of inconsistent checks.

Example refactor (add once near the top-level of the file):

// Utility for search visibility
const hasMatches = children => children == null || children.length > 0
const anyGroupHasMatches = groups => groups.some(group => hasMatches(group.children))

Then replace repeated checks with anyGroupHasMatches(groups) and group-level guards with hasMatches(group.children).

Also applies to: 820-821, 892-893, 1160-1160, 1201-1201, 1232-1233, 1284-1285, 1347-1347, 1454-1454

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

💡 Knowledge Base configuration:

  • MCP integration is disabled by default for public repositories
  • Jira integration is disabled by default for public repositories
  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 57aa761 and 4afe14b.

📒 Files selected for processing (1)
  • src/welcome/admin.js (25 hunks)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (7)
  • GitHub Check: PHP 8.2 and WP 6.5.5
  • GitHub Check: PHP 8.2 and WP 6.6.2
  • GitHub Check: PHP 8.2 and WP 6.7.2
  • GitHub Check: PHP 7.3 and WP latest
  • GitHub Check: PHP 7.3 and WP 6.5.5
  • GitHub Check: PHP 8.2 and WP latest
  • GitHub Check: build
🔇 Additional comments (4)
src/welcome/admin.js (4)

32-33: Importing translated editorRoles looks good

Using editorRoles from stackable directly aligns with the PR goal of surfacing translated role labels in the search tree.


575-577: Setting children to null changes contract; verify all consumers are guarded

Switching to children: null when no search is active requires all consumers to handle null. Most callsites were updated, but third-party injected components (via applyFilters) might still assume arrays.

Please verify:

  • EditorModeSettings and CustomFields* injected components handle searchedSettings being null.
  • No runtime errors in the console when toggling search on/off across all tabs.

If needed, consider centralizing a helper (e.g., const hasMatches = c => c == null || c.length > 0) and consistently using it for guards to avoid missed spots.


590-594: Threading currentSearch through props is appropriate

Propagating currentSearch enables consistent “No matching settings” handling across sections. Looks correct.


641-671: Guard patterns for group sections are consistent—nice coverage

Across all sections you consistently used (group.children === null || group.children.length > 0) to conditionally render groups and the “No matching settings” banner otherwise. This aligns with the new null semantics from filteredSearchTree and prevents crashes.

Also applies to: 671-729, 730-781, 781-805, 824-870, 1073-1145, 1164-1192, 1205-1225, 1242-1277, 1296-1333, 1356-1439, 1464-1524, 1524-1571, 1588-1606

@bfintal bfintal merged commit 7210e8c into develop Aug 21, 2025
8 of 9 checks passed
@bfintal bfintal deleted the fix/3565-translated-roles branch August 21, 2025 04:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Role Manager settings do not display when changing site language

3 participants