-
-
Notifications
You must be signed in to change notification settings - Fork 214
Improve user details UX on member page (#1889) #1934
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. Weβll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Improve user details UX on member page (#1889) #1934
Conversation
Summary by CodeRabbit
WalkthroughA memoized helper function was introduced in the Changes
Estimated code review effortπ― 2 (Simple) | β±οΈ ~8 minutes Assessment against linked issues
Assessment against linked issues: Out-of-scope changesNo out-of-scope changes were found. Note π MCP (Model Context Protocol) integration is now available in Early Access!Pro users can now connect to remote MCP servers under the Integrations page to get reviews and chat conversations that understand additional development context. β¨ Finishing Touches
π§ͺ Generate unit tests
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. πͺ§ TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
Documentation and Community
|
There was a problem hiding this 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
π Review details
Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
π Files selected for processing (1)
frontend/src/components/CardDetailsPage.tsx
(5 hunks)
π§° Additional context used
π§ Learnings (3)
π Common learnings
Learnt from: ahmedxgouda
PR: OWASP/Nest#1633
File: frontend/src/components/HealthMetrics.tsx:30-30
Timestamp: 2025-06-20T16:12:59.256Z
Learning: In the DetailsCard component (frontend/src/components/CardDetailsPage.tsx), there's a length check before rendering HealthMetrics: `healthMetricsData.length > 0`. This ensures that when HealthMetrics is rendered, the data array has at least one element, making accessing data[0] safe within the HealthMetrics component.
Learnt from: ahmedxgouda
PR: OWASP/Nest#1633
File: frontend/src/components/HealthMetrics.tsx:30-30
Timestamp: 2025-06-20T16:12:59.256Z
Learning: In the DetailsCard component (frontend/src/components/CardDetailsPage.tsx), there's a safety check that ensures HealthMetrics component is only rendered when healthMetricsData exists and has at least one element: `healthMetricsData && healthMetricsData.length > 0`. This makes accessing data[0] safe within the HealthMetrics component.
π Learning: in the detailscard component (frontend/src/components/carddetailspage.tsx), there's a length check b...
Learnt from: ahmedxgouda
PR: OWASP/Nest#1633
File: frontend/src/components/HealthMetrics.tsx:30-30
Timestamp: 2025-06-20T16:12:59.256Z
Learning: In the DetailsCard component (frontend/src/components/CardDetailsPage.tsx), there's a length check before rendering HealthMetrics: `healthMetricsData.length > 0`. This ensures that when HealthMetrics is rendered, the data array has at least one element, making accessing data[0] safe within the HealthMetrics component.
Applied to files:
frontend/src/components/CardDetailsPage.tsx
π Learning: in the detailscard component (frontend/src/components/carddetailspage.tsx), there's a safety check t...
Learnt from: ahmedxgouda
PR: OWASP/Nest#1633
File: frontend/src/components/HealthMetrics.tsx:30-30
Timestamp: 2025-06-20T16:12:59.256Z
Learning: In the DetailsCard component (frontend/src/components/CardDetailsPage.tsx), there's a safety check that ensures HealthMetrics component is only rendered when healthMetricsData exists and has at least one element: `healthMetricsData && healthMetricsData.length > 0`. This makes accessing data[0] safe within the HealthMetrics component.
Applied to files:
frontend/src/components/CardDetailsPage.tsx
π Additional comments (2)
frontend/src/components/CardDetailsPage.tsx (2)
158-158
: LGTM! Clean integration of the helper function.The usage of
renderDetailValue
is correct and cleanly replaces the previous fallback logic while adding the new interactive functionality.
153-153
: LGTM! Minor formatting improvements.The spacing and indentation adjustments improve code readability and maintain consistency.
Also applies to: 160-160, 189-189, 228-228, 257-262, 266-266
|
@coderabbitai Any suggestions from the above chat ? |
Tip For best results, initiate chat on the files or code changes. π§© Analysis chain@adithya-naik Great question! Looking at your SonarQube warning and the context of your implementation, I'd recommend going with Option 1: the simpler regex. Here's why: Recommended Solution: Simpler Regexconst EMAIL_REGEX = /^[^\s@]+@[^\s@]+\.[a-z]{2,}$/i; Reasons:
When to Use validator.js InsteadThe library approach would be better if you needed:
Updated ImplementationYour current usage in const EMAIL_REGEX = /^[^\s@]+@[^\s@]+\.[a-z]{2,}$/i;
// ... in renderDetailValue function
if (label === "Email") {
if (EMAIL_REGEX.test(value)) {
// render mailto link
}
// render plain text
} Since you're doing basic email format checking for UX purposes (not critical validation), the simpler regex is the perfect balance of security, performance, and maintainability! π―
( .. ) π Script executed:
Length of output: 10663 @adithya-naik Perfect! Looking at your current implementation, I strongly recommend Option 1: the simpler regex approach. Recommended FixUpdate line 26 in // Change this:
const EMAIL_REGEX = /^[^\s@]+@[^\s@]+\.[^\s@]+$/
// To this:
const EMAIL_REGEX = /^[^\s@]+@[^\s@]+\.[a-z]{2,}$/i Why This is the Best Choiceπ Security: Fixes the ReDoS vulnerability by eliminating problematic nested quantifiers β‘ Performance: Simple regex test is faster than library calls - perfect for your UX use case π― Fit for Purpose: Your π¦ Zero Dependencies: Keeps your bundle size lean - no need to add validator.js for this single use case π§ Easy Maintenance: Self-contained validation logic that's easy to understand and modify When to Consider validator.jsYou'd want the library approach if you needed:
But for your current implementation, the simpler regex is the perfect solution! π― The fix is a simple one-line change that addresses the security concern while maintaining your existing functionality perfectly.
( ^.^ ) |
https://github.com/OWASP/Nest/blob/main/CONTRIBUTING.md#code-quality-checks Also don't use comments that much -- they are needed in exceptional cases to describe reasons behind some nontrivial code. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@adithya-naik Please update the PR and resolve conflicts so I could review this. Thanks!
There was a problem hiding this 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 (1)
frontend/__tests__/unit/components/CardDetailsPage.test.tsx (1)
813-813
: Nit: Scope the query to avoid false positives if 'N/A' appears elsewhere.Consider narrowing the query to the details section (e.g., using within() on the details card container) to make the test more robust.
π Review details
Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
π Files selected for processing (2)
frontend/__tests__/unit/components/CardDetailsPage.test.tsx
(1 hunks)frontend/src/components/CardDetailsPage.tsx
(4 hunks)
π§ Files skipped from review as they are similar to previous changes (1)
- frontend/src/components/CardDetailsPage.tsx
π§° Additional context used
π§ Learnings (4)
π Common learnings
Learnt from: ahmedxgouda
PR: OWASP/Nest#1633
File: frontend/src/components/HealthMetrics.tsx:30-30
Timestamp: 2025-06-20T16:12:59.256Z
Learning: In the DetailsCard component (frontend/src/components/CardDetailsPage.tsx), there's a length check before rendering HealthMetrics: `healthMetricsData.length > 0`. This ensures that when HealthMetrics is rendered, the data array has at least one element, making accessing data[0] safe within the HealthMetrics component.
Learnt from: ahmedxgouda
PR: OWASP/Nest#1633
File: frontend/src/components/HealthMetrics.tsx:30-30
Timestamp: 2025-06-20T16:12:59.256Z
Learning: In the DetailsCard component (frontend/src/components/CardDetailsPage.tsx), there's a safety check that ensures HealthMetrics component is only rendered when healthMetricsData exists and has at least one element: `healthMetricsData && healthMetricsData.length > 0`. This makes accessing data[0] safe within the HealthMetrics component.
π Learning: 2025-06-20T16:12:59.256Z
Learnt from: ahmedxgouda
PR: OWASP/Nest#1633
File: frontend/src/components/HealthMetrics.tsx:30-30
Timestamp: 2025-06-20T16:12:59.256Z
Learning: In the DetailsCard component (frontend/src/components/CardDetailsPage.tsx), there's a length check before rendering HealthMetrics: `healthMetricsData.length > 0`. This ensures that when HealthMetrics is rendered, the data array has at least one element, making accessing data[0] safe within the HealthMetrics component.
Applied to files:
frontend/__tests__/unit/components/CardDetailsPage.test.tsx
π Learning: 2025-06-20T16:12:59.256Z
Learnt from: ahmedxgouda
PR: OWASP/Nest#1633
File: frontend/src/components/HealthMetrics.tsx:30-30
Timestamp: 2025-06-20T16:12:59.256Z
Learning: In the DetailsCard component (frontend/src/components/CardDetailsPage.tsx), there's a safety check that ensures HealthMetrics component is only rendered when healthMetricsData exists and has at least one element: `healthMetricsData && healthMetricsData.length > 0`. This makes accessing data[0] safe within the HealthMetrics component.
Applied to files:
frontend/__tests__/unit/components/CardDetailsPage.test.tsx
π Learning: 2025-07-12T17:36:57.255Z
Learnt from: Rajgupta36
PR: OWASP/Nest#1717
File: frontend/__tests__/unit/pages/createProgram.test.tsx:70-86
Timestamp: 2025-07-12T17:36:57.255Z
Learning: When testing React page components that use mocked form components, validation logic should be tested at the form component level, not the page level. Page-level tests should focus on authentication, role checking, submission handling, and navigation logic.
Applied to files:
frontend/__tests__/unit/components/CardDetailsPage.test.tsx
β° 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). (2)
- GitHub Check: Run frontend e2e tests
- GitHub Check: Run frontend unit tests
π Additional comments (1)
frontend/__tests__/unit/components/CardDetailsPage.test.tsx (1)
813-813
: Fallback to 'N/A' is correct and consistent with updated rendering logic.This aligns the test with the new display behavior for missing values. Good update.
render(<CardDetailsPage {...defaultProps} details={detailsWithMissingValues} />) | ||
|
||
expect(screen.getAllByText('Unknown')).toHaveLength(3) | ||
expect(screen.getAllByText('N/A')).toHaveLength(3) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
π‘ Verification agent
π§© Analysis chain
Verify consistency across tests for fallback changes.
Ensure no lingering expectations for "Unknown" remain in tests or UI. You can run:
π Script executed:
#!/bin/bash
set -euo pipefail
echo "Searching for 'Unknown' in tests (may indicate outdated fallback expectations)..."
rg -n --no-heading -S "Unknown" frontend/__tests__ || true
echo
echo "Searching for 'Unknown' in source (may indicate inconsistent fallback rendering)..."
rg -n --no-heading -S "Unknown" frontend/src || true
echo
echo "Optional: verify presence of tests for new link behaviors"
echo "Searching tests for mailto links..."
rg -n --no-heading -S "mailto:" frontend/__tests__ || true
echo
echo "Searching source for mailto links..."
rg -n --no-heading -S "mailto:" frontend/src || true
echo
echo "Searching tests for company '@' link rendering (heuristic)..."
rg -n --no-heading -S "@[a-zA-Z0-9_-]+" frontend/__tests__ || true
Length of output: 41269
Update fallback text from βUnknownβ to βN/Aβ throughout the codebase
Weβve verified that while the CardDetailsPage tests have been updated to expect βN/Aβ, both the source and many other tests still use βUnknownβ as the fallback. Those need to be aligned:
β’ In source files:
β frontend/src/components/LeadersList.tsx (line 16): replace <>Unknown</>
with <>N/A</>
.
β frontend/src/components/CardDetailsPage.tsx (lines 71 and 168): update both occurrences of 'Unknown'
to 'N/A'
.
β’ In unit tests:
Run rg -n "Unknown" frontend/__tests__
and replace all expect(...get(Text|ByText)('Unknown')β¦)
assertions with 'N/A'
. In particular:
β frontend/tests/unit/components/LeadersList.test.tsx
β frontend/tests/unit/global-error.test.tsx (if the literal βUnknown crashβ is now outdated)
β Any other component/page tests that assert on βUnknownβ
β’ Optional: add or update tests for the new mailto link behavior in CardDetailsPage (e.g. check href="mailto:β¦"
) to ensure coverage.
Once these changes are made, rerun your test suite to confirm no βUnknownβ expectations remain.
π€ Prompt for AI Agents
In frontend/__tests__/unit/components/CardDetailsPage.test.tsx at line 813 and
throughout the codebase, update all fallback text from "Unknown" to "N/A".
Specifically, replace `<>Unknown</>` with `<>N/A</>` in
frontend/src/components/LeadersList.tsx at line 16 and change both occurrences
of 'Unknown' to 'N/A' in frontend/src/components/CardDetailsPage.tsx at lines 71
and 168. Also, search all test files under frontend/__tests__ for assertions
expecting "Unknown" and update them to expect "N/A" instead, including in
LeadersList.test.tsx and global-error.test.tsx. Optionally, add or update tests
in CardDetailsPage to verify the new mailto link behavior. Finally, rerun tests
to ensure no "Unknown" expectations remain.
There was a problem hiding this 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
π Review details
Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
π Files selected for processing (2)
frontend/__tests__/unit/pages/UserDetails.test.tsx
(1 hunks)frontend/src/components/CardDetailsPage.tsx
(4 hunks)
π§ Files skipped from review as they are similar to previous changes (1)
- frontend/src/components/CardDetailsPage.tsx
π§° Additional context used
π§ Learnings (2)
π Common learnings
Learnt from: ahmedxgouda
PR: OWASP/Nest#1633
File: frontend/src/components/HealthMetrics.tsx:30-30
Timestamp: 2025-06-20T16:12:59.256Z
Learning: In the DetailsCard component (frontend/src/components/CardDetailsPage.tsx), there's a safety check that ensures HealthMetrics component is only rendered when healthMetricsData exists and has at least one element: `healthMetricsData && healthMetricsData.length > 0`. This makes accessing data[0] safe within the HealthMetrics component.
Learnt from: ahmedxgouda
PR: OWASP/Nest#1633
File: frontend/src/components/HealthMetrics.tsx:30-30
Timestamp: 2025-06-20T16:12:59.256Z
Learning: In the DetailsCard component (frontend/src/components/CardDetailsPage.tsx), there's a length check before rendering HealthMetrics: `healthMetricsData.length > 0`. This ensures that when HealthMetrics is rendered, the data array has at least one element, making accessing data[0] safe within the HealthMetrics component.
π Learning: 2025-07-12T17:36:57.255Z
Learnt from: Rajgupta36
PR: OWASP/Nest#1717
File: frontend/__tests__/unit/pages/createProgram.test.tsx:70-86
Timestamp: 2025-07-12T17:36:57.255Z
Learning: When testing React page components that use mocked form components, validation logic should be tested at the form component level, not the page level. Page-level tests should focus on authentication, role checking, submission handling, and navigation logic.
Applied to files:
frontend/__tests__/unit/pages/UserDetails.test.tsx
β° 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). (5)
- GitHub Check: Run backend tests
- GitHub Check: Run frontend unit tests
- GitHub Check: Run frontend e2e tests
- GitHub Check: CodeQL (python)
- GitHub Check: CodeQL (javascript-typescript)
π Additional comments (1)
frontend/__tests__/unit/pages/UserDetails.test.tsx (1)
468-468
: LGTM: placeholder updated to "Unknown" for 3 missing fieldsMatches the new UX baseline and keeps tests aligned with DetailsCardβs fallback behavior.
render(<UserDetailsPage />) | ||
await waitFor(() => { | ||
expect(screen.getAllByText('N/A').length).toBe(3) | ||
expect(screen.getAllByText('Unknown').length).toBe(3) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
π‘ Verification agent
π§© Analysis chain
Make this assertion more resilient and verify link semantics for email/company
Counting all "Unknown" instances can become brittle as the page evolves. Prefer field-scoped assertions (email/company/location) and add tests for:
- email renders as mailto link when valid, plain text when invalid
- company starting with "@" renders as GitHub link, otherwise plain text
Example tests to add:
test('renders email as a mailto link when valid', async () => {
;(useQuery as jest.Mock).mockReturnValue({
data: { ...mockUserDetailsData, user: { ...mockUserDetailsData.user, email: '[email protected]' } },
loading: false,
error: null,
})
render(<UserDetailsPage />)
await waitFor(() => {
const emailLink = screen.getByRole('link', { name: '[email protected]' })
expect(emailLink).toHaveAttribute('href', 'mailto:[email protected]')
})
})
test('does not render email as link when invalid', async () => {
;(useQuery as jest.Mock).mockReturnValue({
data: { ...mockUserDetailsData, user: { ...mockUserDetailsData.user, email: 'invalid@' } },
loading: false,
error: null,
})
render(<UserDetailsPage />)
await waitFor(() => {
expect(screen.getByText('invalid@')).toBeInTheDocument()
expect(screen.queryByRole('link', { name: 'invalid@' })).toBeNull()
})
})
test('renders company starting with "@" as GitHub link', async () => {
;(useQuery as jest.Mock).mockReturnValue({
data: { ...mockUserDetailsData, user: { ...mockUserDetailsData.user, company: '@acme' } },
loading: false,
error: null,
})
render(<UserDetailsPage />)
await waitFor(() => {
const companyLink = screen.getByRole('link', { name: '@acme' })
expect(companyLink).toHaveAttribute('href', 'https://github.com/acme')
})
})
test('renders company without "@" as plain text', async () => {
;(useQuery as jest.Mock).mockReturnValue({
data: { ...mockUserDetailsData, user: { ...mockUserDetailsData.user, company: 'Acme Inc' } },
loading: false,
error: null,
})
render(<UserDetailsPage />)
await waitFor(() => {
const companyText = screen.getByText('Acme Inc')
expect(companyText.closest('a')).toBeNull()
})
})
Quick check to see if such tests already exist:
π Script executed:
#!/bin/bash
# Verify there are tests asserting mailto/company link semantics.
rg -n --hidden --glob "frontend/**/__tests__/**" \
-e 'mailto:' \
-e 'toHaveAttribute\\(.*href.*,.*mailto:' \
-e 'https://github.com/' \
-e 'toHaveAttribute\\(.*href.*,.*https://github.com/'
Length of output: 427
Iβve adjusted the grep patterns to avoid the regex error and split the search for clarity. Letβs verify whether any mailto or GitHub link assertions already exist in our tests:
π Script executed:
#!/bin/bash
# Search for mailto link assertions
rg -n --hidden --glob "frontend/**/__tests__/**" "mailto:"
# Search for GitHub link assertions
rg -n --hidden --glob "frontend/**/__tests__/**" "github.com/"
Length of output: 13714
Letβs inspect the existing UserDetails tests around the GitHub link checks to see if any cover the company field (and confirm there are truly no mailto/email tests):
π Script executed:
#!/bin/bash
sed -n '330,380p' frontend/__tests__/unit/pages/UserDetails.test.tsx
Length of output: 1650
Make βUnknownβ assertion field-scoped and add email/company link tests
The catch-all
expect(screen.getAllByText('Unknown').length).toBe(3)
in frontend/tests/unit/pages/UserDetails.test.tsx (around line 468) is brittle and doesnβt verify email or company link behavior. Please:
- Replace it with explicit checks for each fieldβs βUnknownβ fallback (email, company, location).
- Add new tests for link semantics:
β’ Email
β valid address β renders as amailto:
link
β invalid address β renders as plain text (no<a>
)
β’ Company
β starts with β@β β renders as a GitHub link (https://github.com/<org>
)
β otherwise β renders plain text
Example tests to guide you:
test('renders valid email as mailto link', async () => {
(useQuery as jest.Mock).mockReturnValue({
data: { ...mockUserDetailsData, user: { ...mockUserDetailsData.user, email: '[email protected]' } },
loading: false, error: null,
});
render(<UserDetailsPage />);
await waitFor(() => {
const link = screen.getByRole('link', { name: '[email protected]' });
expect(link).toHaveAttribute('href', 'mailto:[email protected]');
});
});
test('renders company starting with "@" as GitHub link', async () => {
(useQuery as jest.Mock).mockReturnValue({
data: { ...mockUserDetailsData, user: { ...mockUserDetailsData.user, company: '@acme' } },
loading: false, error: null,
});
render(<UserDetailsPage />);
await waitFor(() => {
const link = screen.getByRole('link', { name: '@acme' });
expect(link).toHaveAttribute('href', 'https://github.com/acme');
});
});
π€ Prompt for AI Agents
In frontend/__tests__/unit/pages/UserDetails.test.tsx at line 468, replace the
broad check for 'Unknown' appearing three times with explicit assertions for
each field's fallback textβemail, company, and locationβto ensure clarity and
robustness. Additionally, add new tests to verify link rendering behavior: for
email, test that valid addresses render as mailto links and invalid ones as
plain text without links; for company, test that names starting with '@' render
as GitHub links and others as plain text. Use the provided example tests as a
guide to implement these specific and comprehensive checks.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Requested some changes β¬οΈ
I also resolved conflicts βοΈ
Hi @kasya I have made the requested chnages, Please find the latest commit and if any chnages needed let me know |
@coderabbitai are there any mistakes? |
Tip For best results, initiate chat on the files or code changes. π§© Analysis chainLet me also check the test file to ensure everything is properly tested: Now let me also check if there are any remaining issues with code style or other potential problems: @adithya-naik Looking at your latest implementation, I can see a few areas that need attention: β Good News First
π§ Issues to Address1. Excessive Comments (As noted by @arkid15r)You have quite a few comments that explain obvious code. Per the contributing guidelines, comments should only explain non-trivial logic. Consider removing these verbose comments: // Remove comments like these that explain obvious code:
// "Check if the value is a valid email"
// "Render mailto link for valid emails"
// "Check if company starts with @" 2. URL Sanitization ImprovementYour 3. Potential Edge Cases
π― Quick Fixes Needed
The core functionality is solid, but cleaning up the comments per the maintainer's feedback would definitely help with the review process! Would you like me to point out specific comment lines that should be removed? π Script executed:
Length of output: 13589 π Script executed:
Length of output: 14098 π Script executed:
Length of output: 73 π Script executed:
Length of output: 63 @adithya-naik Looking at your current implementation, I'm happy to report that there are no significant mistakes! π β What's Working Well1. ReDoS Fix Implemented Correctly
2. Clean Code Quality
3. Solid Implementation
4. Comprehensive Test Coverage
π― The Implementation is ReadyYour code successfully addresses:
The implementation is clean, secure, and well-tested. Great work addressing all the feedback! The PR looks ready for final review by the maintainers. π |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@adithya-naik I'd like to request you to come up with some more comprehensive solution with tests. We already have this code -- could you unify/extract the common logic to a separate function/module, add tests and use it as needed. I'll bump the task to level 2.
|
@adithya-naik hi! Are you still working on these updates? |
@kasya As i informed iam not good with writing test files.please do help me to commit these changes to the branch as the core functionality is done. |
@adithya-naik this may look like working solution however it's now enough for the code to be merged in some cases. We want to keep the code base clean and maintainable. This particular improvement introduces code duplication I described in my previous comment. I understand you aren't familiar with writing tests and I highly suggest to cover this gap ASAP (not in scope of this contribution of course). I'll check with @kasya on our options here but I can't merge it as is. |
Sure @arkid15r . Thanks for ur feedback |
π Summary
This PR addresses issue #1889 by enhancing the user experience of the member page. It makes the email and company fields interactive where appropriate.
β What's Implemented
mailto:
link if valid.@
.π§ͺ Test Scenarios
[email protected]
[[email protected]](mailto:[email protected])
null
@ServiceNow
[ServiceNow](https://github.com/ServiceNow)
ServiceNow
null
π Related Issue
Closes #1889
π§ Additional Notes
Thank you for reviewing! π