Split product cards into Installed Features and Available Features#179
Conversation
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
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
| { isLoading | ||
| ? PRODUCTS.map( ( product ) => ( | ||
| <ProductSectionSkeleton key={ product.slug } product={ product } /> | ||
| ) ) |
There was a problem hiding this comment.
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
There was a problem hiding this comment.
@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
Then resolves to the computed order
There was a problem hiding this comment.
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
|
Changed the base to a release bucket. It is based on |

🎫 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_versionandtypealready reach the client onGET /liquidweb/harbor/v1/features, so no PHP or REST changes.Notes
resources/js/lib/product-install.tsholdsisProductInstalled(truthyinstalled_versioncheck) andisProductOwned(used only for the Available sub-ordering).resources/js/hooks/useFeatureRow.ts:123comparesinstalled_version !== null, but the field isstring | undefinedand nevernull, so it readstruewhen absent.