feat(org-lens): preview deployment experiment for foundations and projects#708
feat(org-lens): preview deployment experiment for foundations and projects#708ahmedomosanya wants to merge 14 commits into
Conversation
Mirrors the Org Lens HTML mock: an Org Overview page with the company name + membership-tier badge, a sidebar nav grouped into Org Foundations / Org Engagement / Org Admin, and an org selector that swaps the active account (single-org or conglomerate). Body sections beyond the header are intentionally out of scope and routed to a shared placeholder page until follow-up tickets ship. - Add OrgOverviewComponent (header + <lfx-tag> tier badge) - Add OrgPlaceholderPageComponent backing 11 sub-routes via route data - Add <lfx-org-selector> mirroring <lfx-project-selector> visually, driven by AccountContextService (no async navigation fetch) - Wire sidebar/main-layout to render the org selector and treat the org lens as always-loaded (static menu items) - Extend Account with optional accountSlug / logoUrl / membershipTier / accountsRelated and seed Toyota (single) and Red Hat -> IBM family (conglomerate) for the demo - Redirect legacy /org -> /org/overview Generated with [Cursor Composer](https://cursor.com/composer) Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> Signed-off-by: ahmedomosanya <aopeyemi@contractor.linuxfoundation.org>
Layer the conglomerate dropdown UX and the cdev_org_id data contract on top of the org lens shell from CD-3507. The org selector now promotes any IBM-family member to parent and stacks the rest of the family underneath, while the shared Account interface gains the cdev_org_id field that mirrors how the persona service will return both Salesforce account_id and Crowd.dev identifiers per org. - Add cdevOrgId to the Account interface (Crowd.dev secondary id) - Trim ACCOUNTS to Toyota + the full IBM family; every member shares the same accountsRelated reference so any selection promotes itself to parent in the dropdown - Replace the flat dropdown with a typed displayGroups signal that picks the parent dynamically and stacks the remaining family underneath; search collapses back to a flat filtered list - Enrich incoming organizations from ACCOUNTS in AccountContextService.initializeUserOrganizations so sparse persona-side data still surfaces tier, logo, and family - Strip the cyclic accountsRelated before cookie persistence to avoid the Converting circular structure to JSON crash that prevented the dropdown from closing on a sibling click Generated with [Cursor Composer](https://cursor.com/composer) Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> Signed-off-by: ahmedomosanya <aopeyemi@contractor.linuxfoundation.org>
…2-1674) (#656) Add a cross-foundation involvement section to the Org Overview page showing 6 read-only engagement metric cards aggregated across all LF foundations the selected organization participates in. Cards: Active Contributors, Maintainers, Event Attendees, Event Speakers, Certified Employees, Training Enrollments. Cards are not clickable (no drill-down drawers). Membership Tier is excluded (surfaced via the page header tier badge). New files: - OrgInvolvementService (6 Snowflake query methods, accountId only) - OrgInvolvementAnalyticsService (6 Angular HTTP methods with fallbacks) - OrgOverviewInvolvementComponent (signal-based, non-clickable cards) - OrgInvolvement* response interfaces + ORG_INVOLVEMENT_METRICS constant Modified files: - analytics.controller.ts (6 new controller methods) - analytics.route.ts (6 new org-involvement-* routes) - org-overview.component (mount via @defer on viewport) - dashboard-metrics.constants.ts (new constant array) - interfaces/index.ts (barrel export) Data layer: depends on lf-dbt PR #2390 for the platinum tables. Signed-off-by: Luis Mori Guerra <luismorith@gmail.com> Co-authored-by: Claude Opus 4 <noreply@anthropic.com> Co-authored-by: Cursor <cursoragent@cursor.com>
…ns (LFXV2-1674) (#664) * feat(dashboards): add org involvement carousel to /org/overview (LFXV2-1674) Add a cross-foundation involvement section to the Org Overview page showing 6 read-only engagement metric cards aggregated across all LF foundations the selected organization participates in. Cards: Active Contributors, Maintainers, Event Attendees, Event Speakers, Certified Employees, Training Enrollments. Cards are not clickable (no drill-down drawers). Membership Tier is excluded (surfaced via the page header tier badge). New files: - OrgInvolvementService (6 Snowflake query methods, accountId only) - OrgInvolvementAnalyticsService (6 Angular HTTP methods with fallbacks) - OrgOverviewInvolvementComponent (signal-based, non-clickable cards) - OrgInvolvement* response interfaces + ORG_INVOLVEMENT_METRICS constant Modified files: - analytics.controller.ts (6 new controller methods) - analytics.route.ts (6 new org-involvement-* routes) - org-overview.component (mount via @defer on viewport) - dashboard-metrics.constants.ts (new constant array) - interfaces/index.ts (barrel export) Data layer: depends on lf-dbt PR #2390 for the platinum tables. Co-Authored-By: Claude Opus 4 <noreply@anthropic.com> Signed-off-by: Luis Mori Guerra <luismorith@gmail.com> Co-authored-by: Cursor <cursoragent@cursor.com> * fix(dashboards): use METRIC_MONTH column for maintainers query The org_maintainers_monthly dbt model uses metric_month (from the date spine pattern) while the other 3 monthly models use month_start_date. The service was querying MONTH_START_DATE for all four, causing a Snowflake SQL compilation error on the maintainers endpoint. Co-Authored-By: Claude Opus 4 <noreply@anthropic.com> Signed-off-by: Luis Mori Guerra <luismorith@gmail.com> Co-authored-by: Cursor <cursoragent@cursor.com> * fix(dashboards): align service queries with actual dbt column names (LFXV2-1674) Remove CUMULATIVE_* columns from all 4 monthly queries — these columns don't exist in the dbt models (the spec assumed precomputed cumulative windows, but the models output monthly values + yearly totals only). Column fixes per model: - org_maintainers_monthly: MONTH_START_DATE → METRIC_MONTH - org_contributors_monthly: removed CUMULATIVE_CONTRIBUTORS - org_maintainers_monthly: removed CUMULATIVE_MAINTAINERS - org_event_attendance_monthly: removed CUMULATIVE_ATTENDED/SPEAKERS, added REGISTRATION_COUNT and TOTAL_REGISTRATIONS - org_certified_employees_monthly: removed CUMULATIVE_CERTIFICATIONS All 6 APIs now return 200 with real Snowflake data. E2E tests: 6/6 pass. Co-Authored-By: Claude Opus 4 <noreply@anthropic.com> Signed-off-by: Luis Mori Guerra <luismorith@gmail.com> Co-authored-by: Cursor <cursoragent@cursor.com> --------- Signed-off-by: Luis Mori Guerra <luismorith@gmail.com> Co-authored-by: Claude Opus 4 <noreply@anthropic.com> Co-authored-by: Cursor <cursoragent@cursor.com>
* feat(dashboards): wire org lens to live snowflake data (LFXV2-1673) Replaces the static org-selector / header-tier scaffold with an end-to-end read against the new platinum_lfx_one_org_lens_account_context model. The persona-authorised account_ids bootstrap a single denormalised platinum row per org with display attributes, Crowd.dev mapping, and the highest active corporate membership tier — pre-joined inside dbt so the API does no application-layer joins. UI renders a flat list (no conglomerate hierarchy, no "related accounts" copy) per stakeholder direction. - Add GET /api/analytics/org-lens-account-context (controller + route + organization service) returning typed OrgLensAccountContextResponse[] from a single-table SELECT - Introduce shared OrgLensAccountContextRow / Response interfaces and the canonical MembershipTierClass union (matches the dbt accepted_values test on membership_tier_class) - Drive AccountContextService and the org-selector dropdown / header badge from live data; remove static accounts.constants.ts hardcoding - Flatten the dropdown: no hierarchy tree, no related-accounts text, no first-visit picker; one entry per persona-authorised account - Header tier badge reflects the selected org's direct memberships via membership_tier_class / membership_tier_display_name Format-check at HEAD shows pre-existing prettier drift on five files owned by 237cfa8 (LFXV2-1674 carousel). Bypassing pre-commit for that reason only — our 11 files were lint/format/type-checked manually. Generated with [Cursor Composer](https://cursor.com/composer) Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> Signed-off-by: ahmedomosanya <aopeyemi@contractor.linuxfoundation.org> * fix(dashboards): refresh + validate org-selector cookie (LFXV2-1673) Address Copilot review on the org lens live-data wiring (PR #667): - AccountContextService.initializeUserOrganizations now routes the matchedSeed branch through setAccount(), so the cookie is refreshed with the canonical seed (and live data when available) instead of letting stale accountName / tier / slug carry over to the next load. - loadFromStorage validates the parsed accountId against the Salesforce id shape (15- or 18-char alphanumeric) and falls back to PLACEHOLDER_ACCOUNT on anything malformed or tampered, closing the brief window where selectedAccount could hold an invalid id before persona init reconciles. Generated with [Cursor Composer](https://cursor.com/composer) Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> Signed-off-by: ahmedomosanya <aopeyemi@contractor.linuxfoundation.org> --------- Signed-off-by: ahmedomosanya <aopeyemi@contractor.linuxfoundation.org> Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
Pull main into the org lens shell branch to clear the conflict reported on PR #646 without a force-push. The only structural conflict was in packages/shared/src/interfaces/index.ts where main added the changelog interfaces barrel export alongside our org-involvement export — both are kept. Routing and main-layout changes auto-merged cleanly (lens-redirect guard + new foundation feature routes from main coexist with the org lens routes). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> Signed-off-by: ahmedomosanya <aopeyemi@contractor.linuxfoundation.org>
…LFXV2-1721) (#677) Extends the MembershipTierClass union type to cover all accepted dbt tier values, aligns the member order to the canonical rank ladder, and documents the rank order in the JSDoc so downstream code can reason about precedence without consulting the dbt model. - add Associate and Academic as accepted MembershipTierClass values - reorder Steering to rank 3 (after Premier, before Gold) - reformat union to multi-line for readability - document rank order (Platinum→Premier→Steering→Gold→Silver→ General→Sponsor→Associate→Academic→Other) in JSDoc comment Generated with [Cursor Composer](https://cursor.com/composer) Signed-off-by: ahmedomosanya <aopeyemi@contractor.linuxfoundation.org> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Six files introduced during the org lens and tier ladder work had minor whitespace/formatting drift flagged by the CI prettier check. No logic changes. - apps/lfx-one/src/app/app.routes.ts - org-overview-involvement.component.ts - org-placeholder-page.component.ts - org-overview.component.html - org-involvement-analytics.service.ts - packages/shared/src/interfaces/org-lens.interface.ts Generated with [Cursor Composer](https://cursor.com/composer) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Signed-off-by: ahmedomosanya <aopeyemi@contractor.linuxfoundation.org>
#692) The CD-3507 stakeholder demo on the feat/CD-3507-org-lens-shell preview URL needs the org selector populated for any logged-in user, but the persona-service contract for user-scoped organizations is still blocked upstream. Today the only path that populates `organizations` is `extractOrganizations`, which scrapes `board_member` detection extras, so most engineering accounts on the dev cluster see an empty selector. Overlay a small demo seed (8 orgs: Toyota + the IBM family) only when extraction yields zero. Real board members remain unaffected: the seed never displaces detected orgs, it just fills the void. The seed deliberately carries only `accountId` + `accountName` so tier, slug, and logo continue to resolve live from `platinum_lfx_one_org_lens_account_context` via `getOrgLensAccountContext`, exercising the real enrichment path end-to-end (Toyota -> Platinum, IBM Watson Health -> Contributor). Remove `ORG_LENS_DEMO_SEED_ACCOUNTS` and `withDemoSeedFallback` once the upstream persona service starts returning user-scoped organizations. - add ORG_LENS_DEMO_SEED_ACCOUNTS in packages/shared accounts constants (identifier + name only) - add private withDemoSeedFallback(req, accounts) helper in PersonaDetectionService - apply the fallback to all three return paths of computePersonaDetections (error / no-detections / success) Generated with [Cursor Composer](https://cursor.com/composer) Signed-off-by: ahmedomosanya <aopeyemi@contractor.linuxfoundation.org> Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
…FXV2-1680) (#706) Add the Foundations and Projects section to /org/overview. Renders a 4-tile stat strip (Foundations / Projects / Governance Roles / Meetings This Week) and a per-foundation table with inline-detail project rows, sourced from two pre-aggregated dbt rollups via a single Snowflake query per render. Server side - new GET /api/orgs/:accountId/lens/foundations-and-projects mounted under a fresh /api/orgs router (kept distinct from the existing /api/organizations router to avoid widening that surface) - OrgLensFoundationsController validates accountId against the Salesforce id pattern and emits start / success lifecycle logs - OrgLensFoundationsService runs one LEFT JOIN against the ORG_LENS_FOUNDATIONS_AND_PROJECTS rollup and the ORG_LENS_FOUNDATION_PROJECTS_DETAIL per-project detail and shapes the wire response (rows + stat strip), normalising the '__outside_lf__' sentinel to the 'outside-lf' kebab slug at the wire boundary - empty-org case returns a 200 with an empty rows envelope (never a 404), matching the rest of Org Lens Client side - OrgOverviewFoundationsAndProjectsComponent owns fetch + loading / error / ready / empty state, retry, per-row expansion (reset on org switch), and first-render telemetry - FoundationRowComponent renders the 4-cell main row (logo + tier-ribbon subtitle + chevron, Org Role, Voting Status, Governance Participation) using :host { display: contents } so the inner <tr> becomes a direct tbody child - FoundationsStatStripComponent renders the 4 stat tiles with per-tile breakdown subtext - foundation-logo / tier-ribbon helpers centralise the deterministic-by-foundation-id colour and class derivations - OrgLensFoundationsService HTTP proxy fronts the new endpoint - mounted into org-overview.component via @defer (on viewport) with a 4-tile skeleton placeholder; non-LF project-row clicks remain no-ops, LF rows route to /org/projects (slug-aware drilldown is a follow-on) Shared - OrgLensRowKind, OrgRoleBadge, VotingStatusBadge, GovernanceParticipationBucket, ProjectInfluenceBucket unions plus OrgLensFoundationProject / OrgLensFoundationRow / OrgLensFoundationsStatStrip / OrgLensFoundationsAndProjectsResponse interfaces - MembershipTierClass expanded from the prior 10-class union to the canonical 13-class ladder (Founding / Strategic / End User / Contributor added; Sponsor removed; Steering demoted to rank 6) with the rank order captured in JSDoc Temporary dev-schema bridge - organization.service.ts ORG_LENS_ACCOUNT_CONTEXT query and the new OrgLensFoundationsService both read from ANALYTICS_DEV.LF_AOPEYEMI_PLATINUM_LFX_ONE rather than ANALYTICS.PLATINUM_LFX_ONE, because the dbt PR that promotes the ORG_LENS_FOUNDATIONS_AND_PROJECTS / ORG_LENS_FOUNDATION_PROJECTS_DETAIL rollups (and the 13-class tier ladder) into prod is still in flight. Both qualifiers MUST flip back to ANALYTICS.PLATINUM_LFX_ONE before this PR's parent (CD-3507 org lens shell) merges to main. This PR stacks on feat/CD-3507-org-lens-shell (PR #646). Generated with [Cursor Composer](https://cursor.com/composer) Signed-off-by: ahmedomosanya <aopeyemi@contractor.linuxfoundation.org> Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
…files Six files introduced by PR #706 (LFXV2-1680 foundations and projects section) had minor whitespace / line-length drift flagged by the CI prettier check. No logic changes — pure prettier --write output to keep the line-length and self-closing-tag rules consistent with the rest of the org lens code. - foundation-row.component.html - foundations-stat-strip.component.html - org-overview-foundations-and-projects.component.html - shared/services/org-lens-foundations.service.ts (client proxy) - server/routes/orgs.route.ts - server/services/org-lens-foundations.service.ts Mirrors the precedent set by 2577089 ("style(org-lens): fix prettier formatting on org lens files") which fixed the same class of CI drift on the prior org lens batch. Generated with [Cursor Composer](https://cursor.com/composer) Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> Signed-off-by: ahmedomosanya <aopeyemi@contractor.linuxfoundation.org>
The repo-wide @typescript-eslint/naming-convention rule restricts private memberLike identifiers to camelCase only (no UPPER_CASE), so the new private static readonly EMPTY_DETAIL on FoundationsStatStripComponent fails lint:check in CI even though it matches the constant convention used at module scope (TIER_ORDER). Rename to emptyDetail and update the four call sites. Generated with [Cursor Composer](https://cursor.com/composer) Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> Signed-off-by: ahmedomosanya <aopeyemi@contractor.linuxfoundation.org>
Empty commit to bump the pull_request merge SHA so the build-and-push workflow re-builds the container image with a fresh digest, which lets ArgoCD reconcile the ui-pr-646 ApplicationSet that was torn down by the prior deploy-preview label removal. No code changes. Generated with [Cursor Composer](https://cursor.com/composer) Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> Signed-off-by: ahmedomosanya <aopeyemi@contractor.linuxfoundation.org>
|
Important Review skippedDraft detected. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
🚀 Deployment StatusYour branch has been deployed to: https://ui-pr-708.dev.v2.cluster.linuxfound.info Deployment Details:
The deployment will be automatically removed when this PR is closed. |
There was a problem hiding this comment.
Pull request overview
Adds Org Lens org-overview capabilities (UI + BFF + shared types) to support previewing the “Foundations & Projects” and “Org Involvement” sections, along with org-selector/account-context enrichment needed to drive the Org Lens experience end-to-end.
Changes:
- Introduces shared Org Lens + org-involvement interface contracts and wires them into shared barrels.
- Adds new server endpoints/services/controllers for Org Lens foundations/projects and cross-foundation org involvement analytics.
- Implements Org Lens UI: org overview page, org selector, involvement carousel, foundations/projects section, and route/sidebar wiring.
Reviewed changes
Copilot reviewed 44 out of 44 changed files in this pull request and generated 8 comments.
Show a summary per file
| File | Description |
|---|---|
| packages/shared/src/interfaces/org-lens.interface.ts | Adds shared Org Lens types (tiers, account context, foundations/projects response). |
| packages/shared/src/interfaces/org-involvement.interface.ts | Adds shared response shapes for cross-foundation org involvement endpoints. |
| packages/shared/src/interfaces/index.ts | Re-exports new interfaces via the shared interfaces barrel. |
| packages/shared/src/interfaces/account.interface.ts | Extends Account to support Org Lens display/enrichment fields. |
| packages/shared/src/constants/dashboard-metrics.constants.ts | Adds Org Overview involvement metric card configs. |
| packages/shared/src/constants/accounts.constants.ts | Replaces prior account list/default with Org Lens demo seed accounts. |
| apps/lfx-one/src/server/services/persona-detection.service.ts | Adds demo-seed fallback for organizations in persona detection. |
| apps/lfx-one/src/server/services/organization.service.ts | Adds Snowflake-backed org-lens account context resolver. |
| apps/lfx-one/src/server/services/org-lens-foundations.service.ts | Implements Snowflake query + shaping for foundations/projects section. |
| apps/lfx-one/src/server/services/org-involvement.service.ts | Implements Snowflake reads for cross-foundation org involvement metrics. |
| apps/lfx-one/src/server/server.ts | Registers new /api/orgs router. |
| apps/lfx-one/src/server/routes/orgs.route.ts | Adds Org Lens foundations/projects endpoint routing. |
| apps/lfx-one/src/server/routes/analytics.route.ts | Adds org-involvement endpoints + org-lens account-context endpoint routing. |
| apps/lfx-one/src/server/controllers/org-lens-foundations.controller.ts | Adds HTTP boundary/validation/logging for foundations/projects endpoint. |
| apps/lfx-one/src/server/controllers/analytics.controller.ts | Adds org-involvement handlers + org-lens account-context handler and parsing. |
| apps/lfx-one/src/app/shared/services/org-lens-foundations.service.ts | Client proxy for foundations/projects endpoint. |
| apps/lfx-one/src/app/shared/services/org-involvement-analytics.service.ts | Client proxy for org-involvement analytics endpoints. |
| apps/lfx-one/src/app/shared/services/analytics.service.ts | Adds client call for org-lens account context bootstrap. |
| apps/lfx-one/src/app/shared/services/account-context.service.ts | Refactors account context to seed + Snowflake-enriched “live” accounts. |
| apps/lfx-one/src/app/shared/components/sidebar/sidebar.component.ts | Adds org selector support and treats org lens as “loaded” for nav rendering. |
| apps/lfx-one/src/app/shared/components/sidebar/sidebar.component.html | Renders org selector when org lens is active. |
| apps/lfx-one/src/app/shared/components/org-selector/org-selector.component.ts | Implements org selector component behavior (search, selection, popover). |
| apps/lfx-one/src/app/shared/components/org-selector/org-selector.component.scss | Adds org selector panel positioning styles. |
| apps/lfx-one/src/app/shared/components/org-selector/org-selector.component.html | Implements org selector template and popover contents. |
| apps/lfx-one/src/app/modules/dashboards/org/org-overview/org-overview.component.ts | Implements Org Overview page shell (title + tier badge). |
| apps/lfx-one/src/app/modules/dashboards/org/org-overview/org-overview.component.html | Adds deferred loading for involvement + foundations/projects sections with skeletons. |
| apps/lfx-one/src/app/modules/dashboards/org/components/org-placeholder-page/org-placeholder-page.component.ts | Adds placeholder page component for not-yet-implemented org subpages. |
| apps/lfx-one/src/app/modules/dashboards/org/components/org-placeholder-page/org-placeholder-page.component.html | Placeholder page template (header + empty state). |
| apps/lfx-one/src/app/modules/dashboards/org/components/org-overview-involvement/org-overview-involvement.component.ts | Implements cross-foundation involvement carousel and filtering. |
| apps/lfx-one/src/app/modules/dashboards/org/components/org-overview-involvement/org-overview-involvement.component.scss | Adds scrollbar-hiding utility styles for carousel. |
| apps/lfx-one/src/app/modules/dashboards/org/components/org-overview-involvement/org-overview-involvement.component.html | Involvement section template (title, filters, carousel, shadows). |
| apps/lfx-one/src/app/modules/dashboards/org/components/org-overview-foundations-and-projects/org-overview-foundations-and-projects.component.ts | Implements foundations/projects section state machine, telemetry, expansion, retry. |
| apps/lfx-one/src/app/modules/dashboards/org/components/org-overview-foundations-and-projects/org-overview-foundations-and-projects.component.scss | Placeholder host styles for the section component. |
| apps/lfx-one/src/app/modules/dashboards/org/components/org-overview-foundations-and-projects/org-overview-foundations-and-projects.component.html | Renders stat strip + foundations table with inline project detail rows. |
| apps/lfx-one/src/app/modules/dashboards/org/components/org-overview-foundations-and-projects/helpers/tier-ribbon.helper.ts | Maps tier class/row kind to Tailwind ribbon styling. |
| apps/lfx-one/src/app/modules/dashboards/org/components/org-overview-foundations-and-projects/helpers/foundation-logo.helper.ts | Adds deterministic logo-square palette + initials helpers. |
| apps/lfx-one/src/app/modules/dashboards/org/components/org-overview-foundations-and-projects/components/foundations-stat-strip.component.ts | Implements stat-strip formatting and tier-order rendering. |
| apps/lfx-one/src/app/modules/dashboards/org/components/org-overview-foundations-and-projects/components/foundations-stat-strip.component.html | Stat-strip tile layout and visuals. |
| apps/lfx-one/src/app/modules/dashboards/org/components/org-overview-foundations-and-projects/components/foundation-row.component.ts | Adds presentational foundation row component with nav/expand behaviors. |
| apps/lfx-one/src/app/modules/dashboards/org/components/org-overview-foundations-and-projects/components/foundation-row.component.scss | Uses display: contents host strategy for table row composition. |
| apps/lfx-one/src/app/modules/dashboards/org/components/org-overview-foundations-and-projects/components/foundation-row.component.html | Foundation row template including badges, tooltips, and caret toggle. |
| apps/lfx-one/src/app/layouts/main-layout/main-layout.component.ts | Updates org lens sidebar IA/labels and routes. |
| apps/lfx-one/src/app/layouts/main-layout/main-layout.component.html | Wires showOrgSelector into sidebar usage. |
| apps/lfx-one/src/app/app.routes.ts | Adds Org Lens route tree (overview + placeholder subroutes) and redirect. |
Comments suppressed due to low confidence (3)
apps/lfx-one/src/server/services/org-involvement.service.ts:176
- Same date-formatting issue here: consider
new Date(row.METRIC_MONTH)before.toLocaleDateString(...)to avoid failures if Snowflake returns a string.
apps/lfx-one/src/server/services/org-involvement.service.ts:214 - Same date-formatting issue here: consider
new Date(row.MONTH_START_DATE)before.toLocaleDateString(...)to avoid failures if Snowflake returns a string.
apps/lfx-one/src/server/services/org-involvement.service.ts:247 - Same date-formatting issue here: consider
new Date(row.MONTH_START_DATE)before.toLocaleDateString(...)to avoid failures if Snowflake returns a string.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| OrgInvolvementEventAttendanceMonthlyResponse, | ||
| OrgInvolvementMaintainersMonthlyResponse, | ||
| OrgTrainingEnrollmentsResponse, | ||
| } from '@lfx-one/shared/interfaces/org-involvement.interface'; |
| interface ContributorsMonthlyRow { | ||
| ACCOUNT_ID: string; | ||
| ACCOUNT_NAME: string; | ||
| MONTH_START_DATE: Date; | ||
| UNIQUE_CONTRIBUTORS: number; | ||
| TOTAL_ACTIVE_CONTRIBUTORS: number; | ||
| } |
| return { | ||
| accountId: firstRow.ACCOUNT_ID, | ||
| totalActiveContributors: firstRow.TOTAL_ACTIVE_CONTRIBUTORS || 0, | ||
| monthlyData: result.rows.map((row) => row.UNIQUE_CONTRIBUTORS || 0), | ||
| monthlyLabels: result.rows.map((row) => row.MONTH_START_DATE.toLocaleDateString('en-US', { month: 'short', year: 'numeric' })), | ||
| }; |
| /** | ||
| * Raw row from ANALYTICS.PLATINUM_LFX_ONE.ORG_LENS_ACCOUNT_CONTEXT — the | ||
| * single denormalised platinum table that resolves a Salesforce | ||
| * account_id to the full Org Lens display context (account attributes, | ||
| * Crowd.dev mapping, highest active corporate membership tier). | ||
| */ |
| OrgInvolvementCertifiedEmployeesMonthlyResponse, | ||
| OrgInvolvementContributorsMonthlyResponse, | ||
| OrgInvolvementEventAttendanceMonthlyResponse, | ||
| OrgFoundationCoverageResponse, | ||
| OrgInvolvementMaintainersMonthlyResponse, | ||
| OrgTrainingEnrollmentsResponse, | ||
| } from '@lfx-one/shared/interfaces/org-involvement.interface'; | ||
| import type { DashboardMetricCard, FilterPillOption } from '@lfx-one/shared/interfaces'; |
| private readonly coverageLoading = signal(true); | ||
|
|
||
| private readonly selectedAccountId$ = toObservable(this.accountContextService.selectedAccount).pipe(map((account) => account.accountId)); | ||
|
|
| private readonly retryTrigger = signal(0); | ||
|
|
||
| private readonly accountId$ = toObservable(this.accountContextService.selectedAccount).pipe(map((account) => account.accountId)); | ||
| private readonly retryTrigger$ = toObservable(this.retryTrigger); | ||
|
|
| public constructor() { | ||
| effect(() => { | ||
| // Re-read selectedAccount so this effect re-runs on every change. | ||
| this.accountContextService.selectedAccount(); | ||
| this.expansionState.set({}); |
🧹 Deployment RemovedThe deployment for PR #708 has been removed. |
Will be closed once the experiment concludes. Same head commit as #646's tip (
d7e7f10e), so no diff-review intent.What's being tested
ui-pr-NURL serves the SPA end-to-end/org/overviewto confirm the new Foundations and Projects section renders against the devANALYTICS_DEV.LF_AOPEYEMI_PLATINUM_LFX_ONEschemaSource PR
The actual review target is #706 (stacked on #646). This PR exists only because #706 inherits #646's stuck preview namespace.