Skip to content

[CSM Portal] remove runtime mock-data mode and its dead filters - #931

Merged
dilshanfardil merged 1 commit into
wso2-open-operations:v2from
rksk:csm-remove-mocks
Jun 24, 2026
Merged

[CSM Portal] remove runtime mock-data mode and its dead filters#931
dilshanfardil merged 1 commit into
wso2-open-operations:v2from
rksk:csm-remove-mocks

Conversation

@rksk

@rksk rksk commented Jun 24, 2026

Copy link
Copy Markdown
Contributor

What

Removes the runtime mock-data mode (the header Mock/Live toggle) and the entire seeded-mock layer, so the app always talks to the live backend.

Removed:

  • The header mock toggle, its context provider, and boot-time hydration.
  • isMockMode() and its branches in every data hook.
  • The seeded cases / comments / dashboard mock modules and the mock-only client-side cases filter.
  • The build-time mock config flags and the local-gateway mode's mock pinning.

With the mock data gone, this also drops the cases-filter controls that only ever worked against it and have no live /cases/search support:

  • the My-ABT / All-customers scope toggle, and the SLA and product filters;
  • the orphaned, never-rendered MyQueueSection / SlaAtRiskSection dashboard widgets built around those filters.

The assignee filter is kept (left disabled with a "coming soon" note); it is wired to the live backend in the stacked follow-up PR. The cases filter keeps search, severity, state, and project — all backed by the search API.

Merge order

This PR is independent of the case-filters PR and is intended to merge first. The case-type + assignee work stacks on top of it.

Testing

  • pnpm lint, pnpm test, pnpm build, tsc -b all green.
  • Bundle shrinks ~35 KB (seeded mock data dropped).

@coderabbitai

coderabbitai Bot commented Jun 24, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Warning

Review limit reached

@rksk, we couldn't start this review because you've reached your PR review rate limit.

More reviews will be available in 44 minutes and 59 seconds. Learn how PR review limits work.

Your organization has used up its prepaid credits, and credit purchases are no longer available. Enable the review add-on in the billing tab to keep reviews running — you're only billed for reviews past your plan's rate limits ($0.25/file).

⌛ How to resolve this issue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based credits.

🚦 How do rate limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 7424418b-0795-4967-924a-01df4089f070

📥 Commits

Reviewing files that changed from the base of the PR and between 7be54e4 and ea22052.

📒 Files selected for processing (33)
  • apps/csm-portal/webapp/src/AppWithConfig.tsx
  • apps/csm-portal/webapp/src/api/backend/client.ts
  • apps/csm-portal/webapp/src/api/useDirectoryUsers.ts
  • apps/csm-portal/webapp/src/components/header/Actions.tsx
  • apps/csm-portal/webapp/src/components/header/MockModeToggle.tsx
  • apps/csm-portal/webapp/src/config/authConfig.ts
  • apps/csm-portal/webapp/src/context/mock-mode/MockModeContext.tsx
  • apps/csm-portal/webapp/src/features/csm-cases/api/mocks/casesMocks.ts
  • apps/csm-portal/webapp/src/features/csm-cases/api/mocks/commentsMocks.ts
  • apps/csm-portal/webapp/src/features/csm-cases/api/useCsmCaseAttachments.ts
  • apps/csm-portal/webapp/src/features/csm-cases/api/useCsmCaseComments.ts
  • apps/csm-portal/webapp/src/features/csm-cases/api/useFindMyOngoingCases.ts
  • apps/csm-portal/webapp/src/features/csm-cases/api/useGetCsmCaseDetail.ts
  • apps/csm-portal/webapp/src/features/csm-cases/api/useGetCsmCases.ts
  • apps/csm-portal/webapp/src/features/csm-cases/api/usePatchCsmCase.ts
  • apps/csm-portal/webapp/src/features/csm-cases/api/usePostCsmCase.ts
  • apps/csm-portal/webapp/src/features/csm-cases/api/useQuickCaseSearch.ts
  • apps/csm-portal/webapp/src/features/csm-cases/components/CaseActionBar.test.tsx
  • apps/csm-portal/webapp/src/features/csm-cases/components/CasesFilterBar.tsx
  • apps/csm-portal/webapp/src/features/csm-cases/pages/CsmCaseDetailPage.tsx
  • apps/csm-portal/webapp/src/features/csm-cases/pages/CsmCasesPage.tsx
  • apps/csm-portal/webapp/src/features/csm-cases/types/csmCases.ts
  • apps/csm-portal/webapp/src/features/csm-cases/utils/casesClientFilter.ts
  • apps/csm-portal/webapp/src/features/csm-cases/utils/casesFiltersUrl.test.ts
  • apps/csm-portal/webapp/src/features/csm-cases/utils/casesFiltersUrl.ts
  • apps/csm-portal/webapp/src/features/csm-dashboard/api/mocks/dashboardMocks.ts
  • apps/csm-portal/webapp/src/features/csm-dashboard/api/useCaseComposition.ts
  • apps/csm-portal/webapp/src/features/csm-dashboard/api/useCaseCountsMatrix.ts
  • apps/csm-portal/webapp/src/features/csm-dashboard/api/useGetCsmDashboard.ts
  • apps/csm-portal/webapp/src/features/csm-dashboard/components/MyQueueSection.tsx
  • apps/csm-portal/webapp/src/features/csm-dashboard/components/SlaAtRiskSection.tsx
  • apps/csm-portal/webapp/src/main.tsx
  • apps/csm-portal/webapp/vite.config.ts
📝 Walkthrough

Walkthrough

Removes the entire mock-mode system (context, provider, toggle UI, seeded data files, isMockMode(), Window.config flags) and strips all mock branches from every API hook so they call the real backend exclusively. Simultaneously refactors the cases filter model to drop scope/SLA/assignee/product dimensions and introduce a caseTypes multi-select backed by a new caseType.ts utility.

Changes

Mock-mode removal and case-type filter

Layer / File(s) Summary
Mock-mode infrastructure teardown
src/context/mock-mode/MockModeContext.tsx, src/api/backend/client.ts, src/config/authConfig.ts, src/main.tsx, src/AppWithConfig.tsx, src/components/header/MockModeToggle.tsx, src/components/header/Actions.tsx, vite.config.ts
Deletes MockModeContext (localStorage sync, useMockMode hook, query-cache invalidation), removes MockModeProvider from the app tree, removes MockModeToggle from the header, deletes isMockMode() from the backend client, strips CSM_PORTAL_USE_MOCKS/CSM_PORTAL_ALLOW_MOCK_TOGGLE from Window.config, removes hydrateMockModeFromStorage() from startup, and clears mock overrides from vite.config. Dev server port changes from 3000 to 3001.
Seeded mock data files removed
src/features/csm-cases/api/mocks/casesMocks.ts, .../commentsMocks.ts, src/features/csm-dashboard/api/mocks/dashboardMocks.ts
Deletes all in-memory seeded mock data: case lists/details/attachments with SLA/transition data, comment threads and runtime map, and the ABT dashboard generator (combined ~2350 lines removed).
Case-type utility and type model updates
src/features/csm-cases/utils/caseType.ts, .../types/csmCases.ts, .../utils/casesFiltersUrl.ts, .../utils/casesFiltersUrl.test.ts
Adds caseType.ts exporting ALL_CASE_TYPES and CASE_TYPE_LABEL; adds optional caseType?: BeCaseType to CsmCaseRow; removes scope: DashboardScope from CsmCasesListResponse; rewrites DEFAULT_CASES_FILTERS, readCasesFiltersFromUrl, writeCasesFiltersToUrl, and countActiveFilters to use caseTypes/projects and drop scope/sla/assignees/products; updates all URL serialization tests.
CasesFilterBar refactor
src/features/csm-cases/components/CasesFilterBar.tsx
Removes exported SlaFilter, AssigneeUser, ASSIGNEE_ME_TOKEN, ASSIGNEE_UNASSIGNED; drops scope, sla, assignees, products from CasesFilters; adds caseTypes: BeCaseType[]; replaces SLA/assignee/product controls with a "Case type" multi-select built from ALL_CASE_TYPES/CASE_TYPE_LABEL; removes availableAssigneeUsers/availableProducts props; simplifies header layout.
Cases API hooks: mock branches removed, caseTypes wired
src/features/csm-cases/api/useGetCsmCases.ts, ...useGetCsmCaseDetail.ts, ...useFindMyOngoingCases.ts, ...usePostCsmCase.ts, ...usePatchCsmCase.ts, ...useQuickCaseSearch.ts
All six hooks drop their isMockMode() conditional branches and always call the real backend. useGetCsmCases adds caseTypes to the query key and sends typeKeys in the search payload; maps caseType onto each CsmCaseRow; removes scope from the return object.
Attachment and comment hooks: mock branches removed
src/features/csm-cases/api/useCsmCaseAttachments.ts, ...useCsmCaseComments.ts
Strips mock-mode paths (logger, artificial delays, mock posts) from get/post/download attachment hooks and get/post comment hooks; all paths now execute real backend requests.
Dashboard API hooks: mock branches removed
src/features/csm-dashboard/api/useGetCsmDashboard.ts, ...useCaseComposition.ts, ...useCaseCountsMatrix.ts
Removes mock data generators from dashboard hooks; useCaseComposition rewrites its queryFn to fire parallel POST /cases/search count requests for per-severity, per-state, and closed totals.
Page wiring and test fixture updates
src/features/csm-cases/pages/CsmCasesPage.tsx, .../CsmCaseDetailPage.tsx, .../components/CaseActionBar.test.tsx
CsmCasesPage removes useDirectoryUsers and assignee/product option derivation, passes only availableProjects to CasesFilterBar, resets filters to DEFAULT_CASES_FILTERS. CaseActionBar.test replaces getMockCsmCaseDetailById with an inline BASE_CASE fixture.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • wso2-open-operations/cs-tools#893: Modifies overlapping hooks (useGetCsmCaseDetail, usePatchCsmCase) with workState/patch-contract changes that interact with the mock-branch removal in this PR.
  • wso2-open-operations/cs-tools#919: Expands the backend case search filter model and case-type contract that this PR's frontend caseTypes/typeKeys wiring depends on.
  • wso2-open-operations/cs-tools#923: Touches the same case hooks/mappers (useGetCsmCaseDetail, useGetCsmCases) with v2 contract realignment changes that overlap with this PR's mock-removal edits.

Suggested reviewers

  • dilshanfardil
  • Rashmika998

Poem

🐇 Hop hop, the mocks are gone today,
No more fake data in the way!
Case types bloom where scope once grew,
The backend speaks with data true.
One filter bar, refreshed and lean—
The cleanest cases ever seen!

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 70.37% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Description check ⚠️ Warning The description covers the change and testing, but it omits most required template sections like Purpose, Goals, Approach, Release note, and Security checks. Reformat the PR body to follow the template and add the missing sections, including purpose, goals, approach, release note, docs, tests, security, and other required items.
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly states the main change: removing runtime mock mode and dead filters from CSM Portal.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with 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.

❤️ Share

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

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
apps/csm-portal/webapp/src/features/csm-dashboard/api/useCaseCountsMatrix.ts (1)

91-103: 🚀 Performance & Scalability | 🟠 Major | 🏗️ Heavy lift

This turns one dashboard load into a large search fan-out.

This hook now does one /cases/search call per matrix cell, and useCaseComposition adds another per-severity/per-state count wave on the same page. After removing mock mode, a dashboard refresh now fans out into many live backend searches instead of one aggregated read, which is likely to dominate both page latency and backend load. Please collapse these counts behind a single aggregate endpoint (or reuse an existing dashboard payload) before shipping.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/csm-portal/webapp/src/features/csm-dashboard/api/useCaseCountsMatrix.ts`
around lines 91 - 103, The counting logic in useCaseCountsMatrix is issuing one
/cases/search request per matrix cell, which creates a heavy fan-out on
dashboard load. Refactor the counting path to use a single aggregated backend
call or reuse an existing dashboard payload instead of mapping over cells and
calling api.post repeatedly; keep the result shaping in useCaseCountsMatrix and
align any related counting flow in useCaseComposition to share the same
aggregated source.
apps/csm-portal/webapp/src/features/csm-cases/components/CasesFilterBar.tsx (1)

261-261: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Align the search placeholder with the live backend contract.

Line 261 still advertises customer, project, and assignee search, but the live searchQuery only covers case number/subject/WSO2 ID. Now that the mock/client-side path is gone, this copy will send users down unsupported paths.

💡 Suggested copy update
-            placeholder="Search by case #, subject, customer, project, assignee…"
+            placeholder="Search by case #, subject, or WSO2 case ID…"
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/csm-portal/webapp/src/features/csm-cases/components/CasesFilterBar.tsx`
at line 261, The search placeholder in CasesFilterBar should match the live
backend search scope, since searchQuery now only supports case number, subject,
and WSO2 ID. Update the placeholder text in CasesFilterBar to remove customer,
project, and assignee references and keep it aligned with the actual supported
fields.
🧹 Nitpick comments (1)
apps/csm-portal/webapp/src/features/csm-cases/utils/caseType.ts (1)

24-40: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Derive ALL_CASE_TYPES from the label map.

These two exports duplicate the same key set, so the next type addition can easily update one and forget the other. That would make casesFiltersUrl.ts accept a different set of values than CasesFilterBar.tsx can render. Keeping one source of truth here avoids that drift.

♻️ Suggested refactor
-/** All case types, in the order they appear in the type dropdown. */
-export const ALL_CASE_TYPES: BeCaseType[] = [
-  "support",
-  "service_request",
-  "security_report_analysis",
-  "announcement",
-  "engagement",
-];
-
 /** Human-readable label per case type. */
 export const CASE_TYPE_LABEL: Record<BeCaseType, string> = {
   support: "Support",
   service_request: "Service request",
   security_report_analysis: "Security report",
   announcement: "Announcement",
   engagement: "Engagement",
 };
+
+/** All case types, in the order they appear in the type dropdown. */
+export const ALL_CASE_TYPES = Object.keys(CASE_TYPE_LABEL) as BeCaseType[];
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/csm-portal/webapp/src/features/csm-cases/utils/caseType.ts` around lines
24 - 40, The case type list and label map in caseType.ts duplicate the same
keys, which can drift out of sync. Update ALL_CASE_TYPES to be derived from
CASE_TYPE_LABEL so there is one source of truth for the BeCaseType set, and keep
CASE_TYPE_LABEL as the canonical map used by CasesFilterBar.tsx and
casesFiltersUrl.ts. Ensure any new case type only needs to be added once in
CASE_TYPE_LABEL and ALL_CASE_TYPES updates automatically.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@apps/csm-portal/webapp/src/features/csm-cases/components/CasesFilterBar.tsx`:
- Line 261: The search placeholder in CasesFilterBar should match the live
backend search scope, since searchQuery now only supports case number, subject,
and WSO2 ID. Update the placeholder text in CasesFilterBar to remove customer,
project, and assignee references and keep it aligned with the actual supported
fields.

In
`@apps/csm-portal/webapp/src/features/csm-dashboard/api/useCaseCountsMatrix.ts`:
- Around line 91-103: The counting logic in useCaseCountsMatrix is issuing one
/cases/search request per matrix cell, which creates a heavy fan-out on
dashboard load. Refactor the counting path to use a single aggregated backend
call or reuse an existing dashboard payload instead of mapping over cells and
calling api.post repeatedly; keep the result shaping in useCaseCountsMatrix and
align any related counting flow in useCaseComposition to share the same
aggregated source.

---

Nitpick comments:
In `@apps/csm-portal/webapp/src/features/csm-cases/utils/caseType.ts`:
- Around line 24-40: The case type list and label map in caseType.ts duplicate
the same keys, which can drift out of sync. Update ALL_CASE_TYPES to be derived
from CASE_TYPE_LABEL so there is one source of truth for the BeCaseType set, and
keep CASE_TYPE_LABEL as the canonical map used by CasesFilterBar.tsx and
casesFiltersUrl.ts. Ensure any new case type only needs to be added once in
CASE_TYPE_LABEL and ALL_CASE_TYPES updates automatically.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: b377612b-0a9c-4c39-8da2-bba6622e0316

📥 Commits

Reviewing files that changed from the base of the PR and between e98d69c and 7be54e4.

📒 Files selected for processing (34)
  • apps/csm-portal/webapp/src/AppWithConfig.tsx
  • apps/csm-portal/webapp/src/api/backend/client.ts
  • apps/csm-portal/webapp/src/api/useDirectoryUsers.ts
  • apps/csm-portal/webapp/src/components/header/Actions.tsx
  • apps/csm-portal/webapp/src/components/header/MockModeToggle.tsx
  • apps/csm-portal/webapp/src/config/authConfig.ts
  • apps/csm-portal/webapp/src/context/mock-mode/MockModeContext.tsx
  • apps/csm-portal/webapp/src/features/csm-cases/api/mocks/casesMocks.ts
  • apps/csm-portal/webapp/src/features/csm-cases/api/mocks/commentsMocks.ts
  • apps/csm-portal/webapp/src/features/csm-cases/api/useCsmCaseAttachments.ts
  • apps/csm-portal/webapp/src/features/csm-cases/api/useCsmCaseComments.ts
  • apps/csm-portal/webapp/src/features/csm-cases/api/useFindMyOngoingCases.ts
  • apps/csm-portal/webapp/src/features/csm-cases/api/useGetCsmCaseDetail.ts
  • apps/csm-portal/webapp/src/features/csm-cases/api/useGetCsmCases.ts
  • apps/csm-portal/webapp/src/features/csm-cases/api/usePatchCsmCase.ts
  • apps/csm-portal/webapp/src/features/csm-cases/api/usePostCsmCase.ts
  • apps/csm-portal/webapp/src/features/csm-cases/api/useQuickCaseSearch.ts
  • apps/csm-portal/webapp/src/features/csm-cases/components/CaseActionBar.test.tsx
  • apps/csm-portal/webapp/src/features/csm-cases/components/CasesFilterBar.tsx
  • apps/csm-portal/webapp/src/features/csm-cases/pages/CsmCaseDetailPage.tsx
  • apps/csm-portal/webapp/src/features/csm-cases/pages/CsmCasesPage.tsx
  • apps/csm-portal/webapp/src/features/csm-cases/types/csmCases.ts
  • apps/csm-portal/webapp/src/features/csm-cases/utils/caseType.ts
  • apps/csm-portal/webapp/src/features/csm-cases/utils/casesClientFilter.ts
  • apps/csm-portal/webapp/src/features/csm-cases/utils/casesFiltersUrl.test.ts
  • apps/csm-portal/webapp/src/features/csm-cases/utils/casesFiltersUrl.ts
  • apps/csm-portal/webapp/src/features/csm-dashboard/api/mocks/dashboardMocks.ts
  • apps/csm-portal/webapp/src/features/csm-dashboard/api/useCaseComposition.ts
  • apps/csm-portal/webapp/src/features/csm-dashboard/api/useCaseCountsMatrix.ts
  • apps/csm-portal/webapp/src/features/csm-dashboard/api/useGetCsmDashboard.ts
  • apps/csm-portal/webapp/src/features/csm-dashboard/components/MyQueueSection.tsx
  • apps/csm-portal/webapp/src/features/csm-dashboard/components/SlaAtRiskSection.tsx
  • apps/csm-portal/webapp/src/main.tsx
  • apps/csm-portal/webapp/vite.config.ts
💤 Files with no reviewable changes (13)
  • apps/csm-portal/webapp/src/main.tsx
  • apps/csm-portal/webapp/src/features/csm-dashboard/components/MyQueueSection.tsx
  • apps/csm-portal/webapp/src/api/useDirectoryUsers.ts
  • apps/csm-portal/webapp/src/features/csm-cases/api/mocks/casesMocks.ts
  • apps/csm-portal/webapp/src/features/csm-cases/utils/casesClientFilter.ts
  • apps/csm-portal/webapp/src/components/header/MockModeToggle.tsx
  • apps/csm-portal/webapp/src/config/authConfig.ts
  • apps/csm-portal/webapp/src/features/csm-dashboard/api/mocks/dashboardMocks.ts
  • apps/csm-portal/webapp/src/components/header/Actions.tsx
  • apps/csm-portal/webapp/src/features/csm-cases/api/mocks/commentsMocks.ts
  • apps/csm-portal/webapp/src/api/backend/client.ts
  • apps/csm-portal/webapp/src/context/mock-mode/MockModeContext.tsx
  • apps/csm-portal/webapp/src/features/csm-dashboard/components/SlaAtRiskSection.tsx

Remove the header mock-vs-live toggle and the entire mock data layer:
the MockModeToggle + MockModeProvider, isMockMode() and its branches in
every data hook, the seeded cases/comments/dashboard mock modules, and
the mock-only client-side cases filter. The app now always calls the
live backend.

With mock data gone, drop the cases-filter controls that only ever
worked against it and have no live /cases/search support: the My-ABT/
All-customers scope toggle, and the SLA and product filters (plus the
orphaned, never-rendered MyQueueSection / SlaAtRiskSection dashboard
widgets built around them).

The assignee filter is KEPT (disabled with a 'coming soon' note) — it
will be wired to the live backend in a follow-up. The cases filter keeps
search, severity, state, and project, all backed by the search API.
@rksk
rksk force-pushed the csm-remove-mocks branch from 7be54e4 to ea22052 Compare June 24, 2026 08:12
@rksk

rksk commented Jun 24, 2026

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jun 24, 2026

Copy link
Copy Markdown
Contributor
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@dilshanfardil
dilshanfardil merged commit 17bdb6e into wso2-open-operations:v2 Jun 24, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

App/CSM Portal Area/Frontend Type/Improvement Marks enhancements or improvements to existing features

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants