Changes from V2 to main - #1049
Conversation
…oyment-management [CSM Portal] Deployment management + deployed-products view
…loyment-type-string-enum [CSM Portal][BE] feat: accept type string enum in deployment POST/PATCH endpoints
The CR description, justification, and plan fields come from ServiceNow as rich-text HTML, but the detail page rendered them as plain pre-wrap text, so the raw markup showed. Sanitize with DOMPurify (allow-list mirroring the case comment renderer) and render via dangerouslySetInnerHTML; hide sections whose HTML has no visible content.
…portal
Extract sanitizeRichTextHtml + isBlankHtml into @utils/sanitizeHtml and use it
from both the change-request detail page and the case comment bubble, removing
the duplicated DOMPurify allow-lists.
Align the policy with the customer portal, which renders the same ServiceNow
HTML with bare DOMPurify.sanitize (its INLINE_COMMENT_HTML_PURIFY is {}). The
previous CSM allow-list was stricter and silently dropped legitimate content
(tables, headings); DOMPurify defaults still strip scripts/handlers/js: URLs.
…tml-render [CSM Portal] Render change-request rich-text fields as sanitized HTML
…d-products/{id} in entity service
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…/deployments/{id}/products/{productId}
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
… prevent IDOR Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…serialises as 100.0) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
… type Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…to {deploymentId}
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…note Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ma tightening, and Description json.RawMessage Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Implements three call request endpoints wired through the ServiceNow
integration service, with corresponding BFF routes scoped under cases.
Entity service:
- POST /call-requests
- POST /call-requests/search
- PATCH /call-requests/{id}
CSM Portal BFF:
- POST /cases/{id}/call-requests
- POST /cases/{id}/call-requests/search
- PATCH /cases/{id}/call-requests/{callRequestId}
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Maps domain CallRequestStateType strings to SN integer keys server-side, following the same pattern as deployment type mapping. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…variant
Go ServeMux treats {id} and {caseId} as the same wildcard pattern.
Removed the {id} route and updated the handler to read r.PathValue("caseId").
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…dations - Rename SearchCallRequestsFilters.StateKeys []int → States []CallRequestStateType; translate to SN int keys in the service layer - Add validateUUIDs for caseId in CreateCallRequest and SearchCallRequests - Add durationInMinutes > 0 and non-empty utcTimes validation in UpdateCallRequest - Add CaseID to UpdateCallRequestRequest; BFF injects it via injectCaseIDField; SN service does paginated ownership check before applying the patch (IDOR guard) - Fix SearchCallRequestsPayload pagination default (20) in BFF openapi spec Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…entity service Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- entity-service: requestBody required: false, add 401 to both endpoints - csm-portal: add 413 to search endpoint, inline pagination defaults, clarify README Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
SN returns state.id as a string for time cards; since only the label is used, removing the id field avoids the unmarshal type mismatch. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…called Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…loyed-products-create-update
[CSM] feat: add POST /deployed-products and PATCH /deployed-products/{id} endpoints
…l-requests [CSM] feat: add call request APIs (POST, search, PATCH) under cases
…ability and call-request changes Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adds an optional productNames filter to the case-search path so callers can filter cases by product family name (e.g. "API Manager", "Asgardeo"). Additive passthrough to the ServiceNow cases/search scripted API; product names are matched against product.name (all versions). PG case path unaffected. - domain.SearchCasesFilters: add ProductNames []string - snCaseFilters + SearchCases mapping: direct passthrough (no id conversion) - openapi.yaml: document productNames
- CsmIssuesView: only blank subtitle during initial load (isLoading), not every background refetch — isFetching caused the count to flicker on filter/search/page changes while stale rows stayed visible - useGetCsmCases: update stale comment to say blank names not em-dash - CsmCaseDetailPage: restore em-dash fallback in case header when both wso2CaseId and caseNumber are absent Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ns#1042 - Remove unused SemanticChip import (Chip replaced it) — fixes lint/CI - Restore SemanticChip role={tierColor(tier)} variant="outlined" so each tier keeps its distinct semantic colour instead of all rendering primary - Add type="button" to Box component="button" collapse toggle Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…rd cases Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ning Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…a998/csm-portal-web-ux-polish [CSM][Web] UX polish: case list, chips, internal notes, state dropdown, service request routing
…ct-filter-entity [CSM Portal] entity-service: add productNames case-search filter
Adds a Product multi-select to the cases filter bar. Options are the distinct product family names from /products/search (deduped); the selected names are sent as filters.productNames on /cases/search, which matches every version of each product. URL param "products"; round-trips via the shared filter URL codec.
Mirrors the customer portal: for cloud-support projects (cloud_support / cloud_evaluation_support) the case-creation form hides the deployment picker and files against the project's single primary-production deployment, so the user goes straight to product selection. Non-cloud projects keep the normal deployment -> product cascade. The cloud deployment is derived (not synced via an effect) so downstream product/validation/payload key off it.
…ct-filter-fe [CSM Portal] cases: product filter + cloud-project case creation
- Add productNames to the useGetCsmCases React Query key so an in-app product-only filter change triggers a new search. It was in the request payload but not the query key, so React Query served the cached page and never refetched when only the product changed. - Populate the list Product column from the case's product when no deployed product is set (e.g. cloud cases like Asgardeo), so product-filtered rows are no longer blank; add the product field to BeCaseSearchView.
Drop the separate Work state column and render the work-state chip (only present for WIP cases) stacked under the state chip in the State column, since it only ever appears for one state and doesn't warrant its own column.
Rewrite the case filter multi-selects (severity, state, work state, engagement type, case type) to the same Autocomplete-with-chips control the product filter uses, replacing the Select + comma-joined-text rendering, so every filter field shows its selected values consistently as chips with type-to-search.
…ct-filter-fixes [CSM Portal] cases list: product filter fixes + filter UX refinements
…verlineSlot.tsx Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
…/feat/support-page-v2 [Customer Portal MicroApp] feat: show recent chats/cases by activity, allow replying to chats
|
Important Review skippedToo many files! This PR contains 454 files, which is 304 over the limit of 150. To get a review, narrow the scope: Upgrade to a paid plan to raise the limit. ⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: ⛔ Files ignored due to path filters (8)
📒 Files selected for processing (454)
You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
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 |
hidden: true was reintroduced in wso2-open-operations#1267 with no recorded rationale, three weeks after the tab shipped visible in wso2-open-operations#1049/wso2-open-operations#1079. The underlying data path (useGetCsmCaseSlas -> BFF/entity-service POST /slas/search) works and is already being fetched on page load; only the tab button was unreachable.
No description provided.