Skip to content

Split product cards into Installed Features and Available Features#179

Open
d4mation wants to merge 3 commits into
mainfrom
cons-629-split-product-cards-into-installed-features-and-available
Open

Split product cards into Installed Features and Available Features#179
d4mation wants to merge 3 commits into
mainfrom
cons-629-split-product-cards-into-installed-features-and-available

Conversation

@d4mation

Copy link
Copy Markdown
Collaborator

🎫 https://linear.app/nexcess/issue/CONS-629/split-product-cards-into-installed-features-and-available-features

📹 https://www.loom.com/share/f672920bd04c4693a54e2b1a5059829f

Splits the Feature Manager product list into two sections. Products with at least one installed plugin/theme feature render under Installed Features first; everything else renders under Available Features. Within Available, owned-but-not-installed products sort above products the user does not own. Available cards suppress the header license badge.

Frontend-only. installed_version and type already reach the client on GET /liquidweb/harbor/v1/features, so no PHP or REST changes.

Notes

  • New resources/js/lib/product-install.ts holds isProductInstalled (truthy installed_version check) and isProductOwned (used only for the Available sub-ordering).
  • Section placement is purely install state; ownership never moves a product between sections.
  • Flagged but out of scope: resources/js/hooks/useFeatureRow.ts:123 compares installed_version !== null, but the field is string | undefined and never null, so it reads true when absent.

d4mation and others added 2 commits July 14, 2026 14:43
Partition the Feature Manager product list into two sections. Products
with at least one installed plugin/theme feature render under "Installed
Features" first; everything else renders under "Available Features".
Within Available, owned-but-not-installed products (covered by the
unified or a legacy license) sort above products the user does not own.
Available cards suppress the header license badge.

CONS-629
@linear

linear Bot commented Jul 14, 2026

Copy link
Copy Markdown

CONS-629

Update the heading assertions from the removed "Your Features" to
"Available Features", and add a dedicated spec covering the split:
install state moving a product into Installed Features, owned-but-not-
installed products sorting to the top of Available, and license-badge
suppression on Available cards.

Adds fixture install/uninstall endpoints that toggle a product's install
state by writing a stub plugin file with a version header, and cleans
those stubs up on reset.

CONS-629
@d4mation d4mation marked this pull request as ready for review July 15, 2026 13:46
Comment on lines 84 to 87
{ isLoading
? PRODUCTS.map( ( product ) => (
<ProductSectionSkeleton key={ product.slug } product={ product } />
) )

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 can't remember exactly how this looks but the loading state here might be a little weird once the installed and activated products get loaded and replace the skeleton. we may want to think about updating the skeleton so this transition seems more seamless somehow

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.

@d4mation yeah I just noticed this in your loom around 3:25. Maybe we could add the loading states within each installed and available sections but turn the skeleton headers into a nameless one without being specific about which feature it is

The skeleton loads the hardcoded order

Screenshot 2026-07-15 at 5 15 38 PM

Then resolves to the computed order

Screenshot 2026-07-15 at 5 15 42 PM

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.

3 participants