Skip to content

feat(org-lens): preview deployment experiment for foundations and projects#708

Closed
ahmedomosanya wants to merge 14 commits into
mainfrom
demo/LFXV2-1680-deploy-preview-experiment
Closed

feat(org-lens): preview deployment experiment for foundations and projects#708
ahmedomosanya wants to merge 14 commits into
mainfrom
demo/LFXV2-1680-deploy-preview-experiment

Conversation

@ahmedomosanya
Copy link
Copy Markdown

DO NOT MERGE — temporary demo PR. Created solely to test whether a fresh PR number provisions a working ui-pr-N.dev.v2.cluster.linuxfound.info preview, since #646's preview has been stuck (every 🚀 Deployment Status comment update since 13:46 UTC has been followed by an unreachable URL — 404 page not found ingress response, no app served).

Will be closed once the experiment concludes. Same head commit as #646's tip (d7e7f10e), so no diff-review intent.

What's being tested

  • Whether the cluster-side ArgoCD ApplicationSet provisions the namespace + app for a fresh PR number
  • Whether the ui-pr-N URL serves the SPA end-to-end
  • (If green) a Playwright smoke test of /org/overview to confirm the new Foundations and Projects section renders against the dev ANALYTICS_DEV.LF_AOPEYEMI_PLATINUM_LFX_ONE schema

Source PR

The actual review target is #706 (stacked on #646). This PR exists only because #706 inherits #646's stuck preview namespace.

ahmedomosanya and others added 14 commits May 5, 2026 23:00
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>
Copilot AI review requested due to automatic review settings May 14, 2026 14:22
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 14, 2026

Important

Review skipped

Draft detected.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 2bc3dcdf-993f-4743-9969-e5e3768bf683

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch demo/LFXV2-1680-deploy-preview-experiment

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

@ahmedomosanya ahmedomosanya added ai-assisted A task or activity that was supported by AI, such as CoPilot, ChatGPT, or other AI technology. deploy-preview WIP labels May 14, 2026
@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 14, 2026

🚀 Deployment Status

Your branch has been deployed to: https://ui-pr-708.dev.v2.cluster.linuxfound.info

Deployment Details:

  • Environment: Development
  • Namespace: ui-pr-708
  • ArgoCD App: ui-pr-708

The deployment will be automatically removed when this PR is closed.

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

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';
Comment on lines +24 to +30
interface ContributorsMonthlyRow {
ACCOUNT_ID: string;
ACCOUNT_NAME: string;
MONTH_START_DATE: Date;
UNIQUE_CONTRIBUTORS: number;
TOTAL_ACTIVE_CONTRIBUTORS: number;
}
Comment on lines +136 to +141
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' })),
};
Comment on lines +35 to +40
/**
* 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).
*/
Comment on lines +16 to +23
OrgInvolvementCertifiedEmployeesMonthlyResponse,
OrgInvolvementContributorsMonthlyResponse,
OrgInvolvementEventAttendanceMonthlyResponse,
OrgFoundationCoverageResponse,
OrgInvolvementMaintainersMonthlyResponse,
OrgTrainingEnrollmentsResponse,
} from '@lfx-one/shared/interfaces/org-involvement.interface';
import type { DashboardMetricCard, FilterPillOption } from '@lfx-one/shared/interfaces';
Comment on lines +43 to +46
private readonly coverageLoading = signal(true);

private readonly selectedAccountId$ = toObservable(this.accountContextService.selectedAccount).pipe(map((account) => account.accountId));

Comment on lines +68 to +72
private readonly retryTrigger = signal(0);

private readonly accountId$ = toObservable(this.accountContextService.selectedAccount).pipe(map((account) => account.accountId));
private readonly retryTrigger$ = toObservable(this.retryTrigger);

Comment on lines +116 to +120
public constructor() {
effect(() => {
// Re-read selectedAccount so this effect re-runs on every change.
this.accountContextService.selectedAccount();
this.expansionState.set({});
@ahmedomosanya ahmedomosanya deleted the demo/LFXV2-1680-deploy-preview-experiment branch May 14, 2026 14:37
@github-actions
Copy link
Copy Markdown

🧹 Deployment Removed

The deployment for PR #708 has been removed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ai-assisted A task or activity that was supported by AI, such as CoPilot, ChatGPT, or other AI technology. deploy-preview WIP

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants