Release Notes — OKR Management UX Improvements
Date: February 11, 2026
Affected Modules: OKR Management (Focus View), OKR Cycle Detail
Affected Files: OkrManagePage.tsx, OkrManagePageV3.tsx, OkrCycleDetailDrawer.tsx
Bug Fixes
1. Approval Button Loading Issue
Problem: When clicking any unit's approval button (Submit, Approve, Revise, Withdraw) on the OKR Management page, all units' same-type buttons showed loading simultaneously.
Root Cause: approvalMutation.isPending was a single boolean passed to all UnitTree nodes identically, with no way to distinguish which unit's button was clicked.
Fix:
- OkrManagePage.tsx:
approvalLoadingprop changed frombooleantostring | null(clicked unit ID). EachUnitTreenode shows spinner only whenapprovalLoading === node.id. - OkrManagePageV3.tsx:
pendingApprovalStatusvariable tracks which status transition is pending, isolating loading to the clicked button.
2. "Role is not defined" Runtime Error
Problem: Role is not defined error in the console when opening OkrCycleDetailDrawer on the /okr/cycles page.
Root Cause: import { Role } from '../../types/rbac.types' caused the enum's runtime value to be erased under isolatedModules: true + Vite HMR.
Fix: Changed to import type { Role } and replaced enum values with a string literal array (['SUPER_ADMIN', 'ADMIN', ...] as Role[]).
Improvements
3. OKR Stats Cards — Correct Calculation
Problem: Stats cards (Total Objectives, Total KRs, Initiatives, etc.) showed incorrect numbers by aggregating all descendant units.
Fix: Removed backend /new-okr/stats call. Stats are now computed on the frontend via useMemo:
| Metric | Scope |
|---|---|
| Total Objectives | Selected unit + all sub-units |
| Approved / Pending / Draft | Selected unit + all sub-units |
| Total KR | Selected unit + all sub-units |
| Initiatives | Selected unit + all sub-units |
| Sub-units | Selected unit + all sub-units |
| Weighted Achievement | Only the selected unit's direct objectives |
| Weighted Health | Only the selected unit's direct objectives |
New Features
4. OKR Owner & Contributor System
Description: Added granular ownership (owner) and contributor assignment at Objective, Key Result, and Initiative levels.
Ownership Rules:
| OKR Record | Owner | Contributor |
|---|---|---|
| Objective | Automatic: Unit leader (read-only) | Multi-select (on create + edit) |
| Key Result | Single search & select | Multi-select (on create + edit) |
| Initiative | Single search & select | Multi-select (on create + edit) |
Confidentiality & Visibility:
- A record's owner or contributor can see confidential records regardless of unit membership.
- Ancestor unit leaders can always see all descendant records.
- SUPER_ADMIN and GROUP_ADMIN can see all records.
Backend Changes:
new-okr.service.ts: 6 CRUD methods withownerMembershipIdandcontributorIdssupportnew-okr.controller.ts: Objective contributor CRUD endpointsconfidentiality.service.ts: 3 new owner/contributor visibility methods- Hierarchy response includes
ownerMembershipandcontributorsdata
Frontend Changes:
OkrManagePageV3.tsxandOkrManagePage.tsx: All 6 form drawers (3 create + 3 edit) with owner/contributor UI on both pages- Edit/view drawers converted to 2-tab structure ("Details" + "Contributors")
- "Edit" button added to view mode (hidden for locked units)
- Create forms redesigned to match edit form layout (grid md:grid-cols-2, section dividers)
- Dynamic owner/contributor selection via member search API
Affected Files:
cos-be/src/new-okr/new-okr.service.tscos-be/src/new-okr/new-okr.controller.tscos-be/src/common/services/confidentiality.service.tscos-be/src/rbac/registries/okr.registry.tscos-fe/src/pages/Okr/OkrManagePageV3.tsxcos-fe/src/pages/Okr/OkrManagePage.tsx
Installation / Upgrade
This release includes both frontend and backend changes. Prisma schema was updated in prior releases; no additional migration needed.
cd cos-be && npm run buildto rebuild the backend.cd cos-fe && npm run buildto rebuild the frontend.- Deploy.