Skip to content

Split product cards into Installed Features and Available Features#179

Merged
d4mation merged 5 commits into
release/1.5.1from
cons-629-split-product-cards-into-installed-features-and-available
Jul 21, 2026
Merged

Split product cards into Installed Features and Available Features#179
d4mation merged 5 commits into
release/1.5.1from
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
estevao90
estevao90 previously approved these changes Jul 15, 2026
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

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Good eye! I've updated this to be a more generic skeleton.

c4a6d95

image

The skeleton showed each product's real logo and name in the hardcoded
catalog order, so when the computed Installed/Available layout replaced
it the named cards appeared to reorder. Render nameless placeholder
headers and a generic heading placeholder instead, since install state
and ownership are not known until the data resolves.

CONS-629
pauloiankoski
pauloiankoski previously approved these changes Jul 20, 2026
@d4mation
d4mation changed the base branch from main to release/1.5.1 July 21, 2026 15:51
@d4mation
d4mation dismissed pauloiankoski’s stale review July 21, 2026 15:51

The base branch was changed.

@d4mation

Copy link
Copy Markdown
Collaborator Author

Changed the base to a release bucket. It is based on main, so I'm going to merge this as-is.

@d4mation
d4mation merged commit d23fc70 into release/1.5.1 Jul 21, 2026
@d4mation
d4mation deleted the cons-629-split-product-cards-into-installed-features-and-available branch July 21, 2026 15:51
@d4mation d4mation mentioned this pull request Jul 21, 2026
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.

4 participants