Skip to content

Fleet UI: IPA custom packages - #34220

Merged
RachelElysia merged 6 commits into
mainfrom
34012-ipa-built-on-shpkg-branch
Oct 28, 2025
Merged

Fleet UI: IPA custom packages#34220
RachelElysia merged 6 commits into
mainfrom
34012-ipa-built-on-shpkg-branch

Conversation

@RachelElysia

@RachelElysia RachelElysia commented Oct 14, 2025

Copy link
Copy Markdown
Member

Issue

Closes #34012

Description

  • What will be needed for UI changes to add custom IPA packages to Fleet

Screenshot

Checklist for submitter

If some of the following don't apply, delete the relevant line.

  • Changes file added for user-visible changes in changes/, orbit/changes/ or ee/fleetd-chrome/changes.
    See Changes files for more information.

Testing

  • Added/updated automated tests
  • QA'd all new/changed functionality manually

F

Summary by CodeRabbit

  • New Features
    • Added install details modal for iOS/iPadOS (IPA) apps, accessible from Activity Feed, Host details, and Self-Service.
    • Support uploading .ipa packages.
  • Improvements
    • Expanded accepted file types (.ipa, .sh, .ps1) and enhanced uploader messages.
    • Clarified platform labeling with iOS/iPadOS tooltip.
    • Disabled automatic install and self-service options for IPA packages.
    • Prevented uninstall actions for IPA-installed apps.
    • UI tweaks to improve long app name handling and details readability.
  • Bug Fixes
    • Corrected Script details modal to use the appropriate host software data.

@codecov

codecov Bot commented Oct 14, 2025

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 67.54967% with 49 lines in your changes missing coverage. Please review.
✅ Project coverage is 64.21%. Comparing base (17245ab) to head (9a25e50).
⚠️ Report is 37 commits behind head on main.

Files with missing lines Patch % Lines
...allDetailsModal/SoftwareIpaInstallDetailsModal.tsx 76.92% 24 Missing ⚠️
.../DashboardPage/cards/ActivityFeed/ActivityFeed.tsx 16.66% 10 Missing ⚠️
.../cards/HostSoftwareLibrary/HostSoftwareLibrary.tsx 0.00% 8 Missing ⚠️
...details/cards/Software/SelfService/SelfService.tsx 42.85% 4 Missing ⚠️
...s/Software/InstallStatusCell/InstallStatusCell.tsx 0.00% 2 Missing ⚠️
frontend/utilities/file/fileUtils.tsx 50.00% 1 Missing ⚠️
Additional details and impacted files
@@           Coverage Diff            @@
##             main   #34220    +/-   ##
========================================
  Coverage   64.21%   64.21%            
========================================
  Files        2060     2061     +1     
  Lines      207211   207370   +159     
  Branches     6932     7119   +187     
========================================
+ Hits       133061   133170   +109     
- Misses      63713    63763    +50     
  Partials    10437    10437            
Flag Coverage Δ
frontend 53.66% <67.54%> (+0.11%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@@ -77,7 +90,8 @@ interface IPackageFormProps {
gitopsCompatible?: boolean;
}
// application/gzip is used for .tar.gz files because browsers can't handle double-extensions correctly
const ACCEPTED_EXTENSIONS = ".pkg,.msi,.exe,.deb,.rpm,application/gzip,.tgz";

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

TODO: add .sh and .ps1 to 33736-script-only-pkg-ui branch

// We currently don't support replacing a tarball package
const canEditFile = isEditingSoftware && !isTarballPackage;

// If a user preselects automatic install and then uploads a .exe

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

update in 33736-script-only-pkg-ui branch

Base automatically changed from 33736-script-only-pkg-ui to main October 15, 2025 13:41
@RachelElysia
RachelElysia force-pushed the 34012-ipa-built-on-shpkg-branch branch from aafe2d2 to 511faa9 Compare October 15, 2025 19:37
@RachelElysia

Copy link
Copy Markdown
Member Author

@coderabbitai summary

@coderabbitai

coderabbitai Bot commented Oct 15, 2025

Copy link
Copy Markdown
Contributor
✅ Actions performed

Summary regeneration triggered.

@coderabbitai

coderabbitai Bot commented Oct 15, 2025

Copy link
Copy Markdown
Contributor

Walkthrough

Adds end-to-end support for in-house iOS/iPadOS IPA install details: new modal component with tests and styles; UI wiring across Activity Feed, Host Software Library, Self Service, and Install Status cell; type/interface extensions (package type, host software, uploader/file utils); minor copy/comment updates; and IPA-aware package form/options logic.

Changes

Cohort / File(s) Summary
New IPA install details modal
frontend/components/ActivityDetails/InstallDetails/SoftwareIpaInstallDetailsModal/SoftwareIpaInstallDetailsModal.tsx, .../SoftwareIpaInstallDetailsModal.tests.tsx, .../SoftwareIpaInstallDetailsModal/_styles.scss, .../SoftwareIpaInstallDetailsModal/index.ts
Introduces IPA install details modal with status logic, data fetching (device token or command UUID), error/loading handling, action buttons, collapsible details; adds comprehensive tests; adds styles; re-exports index.
Activity feed integration
frontend/pages/DashboardPage/cards/ActivityFeed/ActivityFeed.tsx
Routes InstalledSoftware details with command_uuid to IPA modal; adds state and renders modal.
Host details: wiring IPA flows
frontend/pages/hosts/details/cards/HostSoftwareLibrary/HostSoftwareLibrary.tsx, .../HostSoftwareLibraryTable/HostSoftwareLibraryTableConfig.tsx, .../Software/InstallStatusCell/InstallStatusCell.tsx, .../Software/InstallStatusCell/InstallStatusCell.tests.tsx, .../Software/SelfService/SelfService.tsx, .../Software/SelfService/SelfServiceTableConfig.tsx, .../HostInstallerActionCell/HostInstallerActionCell.tsx
Adds onShowIpaInstallDetails callbacks and state; opens IPA modal from status cell; treats ios/ipados sources as IPA path; prevents uninstall for IPA packages; threads new handler through table configs; updates tests to include new prop.
Types and package kinds
frontend/interfaces/package_type.ts, frontend/interfaces/software.ts
Adds ios/iPadOS package type "ipa", type guard, and inclusion in unions; adds optional platform to IHostSoftwarePackage.
Uploader and file utils adjustments
frontend/components/FileUploader/FileUploader.tsx, frontend/utilities/file/fileUtils.tsx
Expands message/description prop types to ReactNode; adds ipa platform display (with tooltip), updates file details typing.
Package form and options
frontend/pages/SoftwarePage/components/forms/PackageForm/PackageForm.tsx, .../SoftwareOptionsSelector/SoftwareOptionsSelector.tsx, .../PackageAdvancedOptions/PackageAdvancedOptions.tsx
Adds .ipa to accepted extensions; disallows auto-install/self-service for IPA; hides advanced options for IPA; passes isIpaPackage; updates mapping text.
Comments/documentation updates
frontend/components/ActivityDetails/InstallDetails/SoftwareInstallDetailsModal/SoftwareInstallDetailsModal.tsx, .../VppInstallDetailsModal/VppInstallDetailsModal.tsx
Clarifies usage notes for payload-free/script vs IPA vs VPP modals; no logic changes.

Sequence Diagram(s)

sequenceDiagram
  autonumber
  participant U as User
  participant AF as ActivityFeed / Host Tables
  participant MOD as SoftwareIpaInstallDetailsModal
  participant API as API (software/device endpoints)

  U->>AF: Click install status/details
  alt Source is iOS/iPadOS or details has command_uuid
    AF->>MOD: Open IPA modal with props
    alt My Device (deviceAuthToken)
      MOD->>API: GET device install results (token)
    else Command UUID available
      MOD->>API: GET software install results (commandUuid)
    end
    API-->>MOD: Install result (payload/result base64)
    MOD->>MOD: Decode + compute display status/message
    MOD-->>U: Render status, details, actions
    opt Retry (failed_install with deviceAuthToken)
      U->>MOD: Click Retry
      MOD->>AF: onRetry(hostSoftwareId)
    end
    U->>MOD: Close (Done/Cancel)
  else Non-IPA source
    AF->>AF: Open existing modal flow
  end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~30 minutes

Possibly related PRs

Suggested reviewers

  • ghernandez345
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch 34012-ipa-built-on-shpkg-branch

📜 Recent review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between cbde3f7 and c891241.

📒 Files selected for processing (21)
  • frontend/components/ActivityDetails/InstallDetails/SoftwareInstallDetailsModal/SoftwareInstallDetailsModal.tsx (1 hunks)
  • frontend/components/ActivityDetails/InstallDetails/SoftwareIpaInstallDetailsModal/SoftwareIpaInstallDetailsModal.tests.tsx (1 hunks)
  • frontend/components/ActivityDetails/InstallDetails/SoftwareIpaInstallDetailsModal/SoftwareIpaInstallDetailsModal.tsx (1 hunks)
  • frontend/components/ActivityDetails/InstallDetails/SoftwareIpaInstallDetailsModal/_styles.scss (1 hunks)
  • frontend/components/ActivityDetails/InstallDetails/SoftwareIpaInstallDetailsModal/index.ts (1 hunks)
  • frontend/components/ActivityDetails/InstallDetails/VppInstallDetailsModal/VppInstallDetailsModal.tsx (1 hunks)
  • frontend/components/FileUploader/FileUploader.tsx (2 hunks)
  • frontend/interfaces/package_type.ts (2 hunks)
  • frontend/interfaces/software.ts (1 hunks)
  • frontend/pages/DashboardPage/cards/ActivityFeed/ActivityFeed.tsx (4 hunks)
  • frontend/pages/SoftwarePage/components/forms/PackageAdvancedOptions/PackageAdvancedOptions.tsx (1 hunks)
  • frontend/pages/SoftwarePage/components/forms/PackageForm/PackageForm.tsx (6 hunks)
  • frontend/pages/SoftwarePage/components/forms/SoftwareOptionsSelector/SoftwareOptionsSelector.tsx (3 hunks)
  • frontend/pages/hosts/details/cards/HostSoftwareLibrary/HostInstallerActionCell/HostInstallerActionCell.tsx (1 hunks)
  • frontend/pages/hosts/details/cards/HostSoftwareLibrary/HostSoftwareLibrary.tsx (6 hunks)
  • frontend/pages/hosts/details/cards/HostSoftwareLibrary/HostSoftwareLibraryTable/HostSoftwareLibraryTableConfig.tsx (3 hunks)
  • frontend/pages/hosts/details/cards/Software/InstallStatusCell/InstallStatusCell.tests.tsx (23 hunks)
  • frontend/pages/hosts/details/cards/Software/InstallStatusCell/InstallStatusCell.tsx (3 hunks)
  • frontend/pages/hosts/details/cards/Software/SelfService/SelfService.tsx (6 hunks)
  • frontend/pages/hosts/details/cards/Software/SelfService/SelfServiceTableConfig.tsx (3 hunks)
  • frontend/utilities/file/fileUtils.tsx (4 hunks)

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 and usage tips.

@RachelElysia
RachelElysia marked this pull request as ready for review October 15, 2025 20:25
@RachelElysia
RachelElysia requested a review from a team as a code owner October 15, 2025 20:25

@ghernandez345 ghernandez345 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.

looks good but I think we should make some changes a small change to how we are testing the IPA modal

describe("getStatusMessage helper function", () => {
it("shows NotNow message when isStatusNotNow is true", () => {
render(
getStatusMessage({

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.

I think we want to test the component itself like the last test in this file and not the helper methods. That way it is testing the component as a user would be seeing it. This method could change at some point but what we care about testing is what the user is gonna see and not what this function takes as argumnts or returns

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

done

@RachelElysia

Copy link
Copy Markdown
Member Author

Sorry, rebasing on main but still pointing to the BE feature branch that hadn't been rebased in awhile caused a lot of commits already merged to main to be suggested for review. Removed all those reviewers and pointed to main as BE should be merged shortly.

@RachelElysia

Copy link
Copy Markdown
Member Author

This is going into 4.77, relying on #34802 to be merged first

@RachelElysia
RachelElysia merged commit e1b3251 into main Oct 28, 2025
1 check passed
@RachelElysia
RachelElysia deleted the 34012-ipa-built-on-shpkg-branch branch October 28, 2025 16:44
@coderabbitai coderabbitai Bot mentioned this pull request Oct 29, 2025
11 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

UI/Copy Updates for deploying in-house iOS/iPadOS packages

2 participants