Favourite (save) marketplace channels for later
Favourite (save) marketplace channels for later
Recruiters can now favourite ("save for later") a marketplace channel straight from the search results or the product detail view, so channels they trust are quick to find again for future vacancies.
What's new
- Star toggle on every channel card and on the product-detail header. Click it to save a channel; click again to remove it. The star fills in when the channel is saved and is briefly disabled while the request is in flight.
- Toasts confirm each action — "Channel saved to your favourites" when you save, and "Channel removed from your favourites" when you remove.
- Saved state is shared everywhere. A channel saved from search shows as saved in the product detail (and vice versa), and search-result cards for saved channels carry a "Saved by you" badge. A saved card never shows the "Recommended channel" banner as well — the badge takes its place, and saved channels still appear in the recommendations section.
- "Your saved channels" section on the product landing lists your favourites above the recommendations, with a count in its heading (for example "Your saved channels (7)"). It only appears when you have saved channels. Cards here are marked "Your go-to channel", and the section notes that unavailable saved channels are hidden.
- A "Saved Only" option in the marketplace "Filter By" dropdown turns the
whole search grid into your saved channels — the complete list, not only those
on the page you have scrolled to. It appears once saved channels are known to
be available (see
favoriteProductIdsHaveLoadedbelow). - No broken cards. If a saved channel is no longer available, it is simply omitted from your saved channels — you never see a broken card.
Using it from the SDK
The following functions are available on window.hapi.product.service (all
additive):
await window.hapi.product.service.getFavoriteProductIds.run()
await window.hapi.product.service.getFavoriteProducts.run()
await window.hapi.product.service.favoriteProduct.run(productId)
await window.hapi.product.service.unfavoriteProduct.run(productId)
await window.hapi.product.service.toggleFavoriteProduct.run(productId)The saved state is also readable on window.hapi.product.state:
window.hapi.product.state.favoriteProductIds.value // string[]
window.hapi.product.state.favoriteProductIdsAreLoading.value // boolean
window.hapi.product.state.favoriteProductIdsHaveLoaded.value // boolean (see below)
window.hapi.product.state.favoriteProductIdsBeingUpdated.value // string[] (in-flight)
window.hapi.product.state.favoriteProducts.value // full product objects
window.hapi.product.state.favoriteProductsAreLoading.value // boolean"Saved Only" is a new member of the existing product type filter, so you can select it yourself:
window.hapi.product.state.searchTypeFilterBy.value =
window.hapi.utils.product.typeFilterByKeys.savedOnly
await window.hapi.product.service.onChangeFilters.run()While selected, window.hapi.product.state.products holds the saved channels
rather than search results, and loadMoreProducts does nothing — the full list
is fetched up front.
favoriteProductIdsHaveLoaded tells "this user has no saved channels" apart from
"we could not find out". An empty favoriteProductIds cannot express the
difference, and acting on an unknown saved state would either re-save a channel
that is already saved or remove one the recruiter meant to save. Saved channels
require an ATS-user token, so for partner-token-only integrations this stays
false and the star toggle stays disabled — read it before rendering your own
saved-state UI.
Theming
The star and the two new badges take their colours from five new global theme variables, so they follow your branding like the rest of the widgets:
window.hapi.theming.state.theme = {
global: {
favoriteStarColor: "#FFA11E",
savedBadgeBackgroundColor: "#FFEABD",
savedBadgeTextColor: "#753600",
goToChannelBadgeBackgroundColor: "#80CAFF",
goToChannelBadgeTextColor: "#002A4E",
},
}The values above are the defaults. They are separate variables rather than the
existing warning / info pairs because those pairs are used for warnings and
informational states elsewhere — restyling them to brand a saved badge would
change alerts and banners too.
Backwards compatibility
- Purely additive. No SDK function, getter, setter, property, or event was removed or renamed.
- No widget element
id,class, ordata-*attribute was removed or renamed; the star button and the "Saved by you" badge add new selectors only. - No translation keys were removed.
I18n
The following i18n translations have been added:
| Key | "en" value | "de" value | "nl" value | "fr" value | "es" value | "it" value |
|---|---|---|---|---|---|---|
| product.favorite.add | Save channel for later | Kanal für später speichern | Kanaal opslaan voor later | Enregistrer le canal pour plus tard | Guardar canal para más tarde | Salva il canale per dopo |
| product.favorite.remove | Remove from saved channels | Aus gespeicherten Kanälen entfernen | Verwijderen uit opgeslagen kanalen | Retirer des canaux enregistrés | Quitar de los canales guardados | Rimuovi dai canali salvati |
| product.favorite.add.success | Channel saved to your favourites | Kanal zu deinen Favoriten hinzugefügt | Kanaal opgeslagen in je favorieten | Canal ajouté à vos favoris | Canal añadido a tus favoritos | Canale aggiunto ai tuoi preferiti |
| product.favorite.remove.success | Channel removed from your favourites | Kanal aus deinen Favoriten entfernt | Kanaal verwijderd uit je favorieten | Canal retiré de vos favoris | Canal eliminado de tus favoritos | Canale rimosso dai tuoi preferiti |
| products.details.saved-channels-heading | Your saved channels | Deine gespeicherten Kanäle | Je opgeslagen kanalen | Vos canaux enregistrés | Tus canales guardados | I tuoi canali salvati |
| products.details.saved-channel | Saved by you | Von dir gespeichert | Door jou opgeslagen | Enregistré par vous | Guardado por ti | Salvato da te |
| products.details.saved-channels-description | Quick-add from your go-to channels before browsing the marketplace. | Füge schnell aus deinen bevorzugten Kanälen hinzu, bevor du den Marktplatz durchsuchst. | Voeg snel toe vanuit je favoriete kanalen voordat je de marktplaats doorzoekt. | Ajoutez rapidement depuis vos canaux de prédilection avant de parcourir la marketplace. | Añade rápidamente desde tus canales de confianza antes de explorar el marketplace. | Aggiungi rapidamente dai tuoi canali di fiducia prima di esplorare il marketplace. |
| products.details.saved-channels-unavailable-note | Some saved channels may no longer be available and are hidden. | Einige gespeicherte Kanäle sind möglicherweise nicht mehr verfügbar und werden ausgeblendet. | Sommige opgeslagen kanalen zijn mogelijk niet langer beschikbaar en worden verborgen. | Certains canaux enregistrés ne sont peut-être plus disponibles et sont masqués. | Algunos canales guardados pueden ya no estar disponibles y se ocultan. | Alcuni canali salvati potrebbero non essere più disponibili e sono nascosti. |
| products.details.go-to-channel | Your go-to channel | Dein bevorzugter Kanal | Jouw favoriete kanaal | Votre canal de prédilection | Tu canal de confianza | Il tuo canale di fiducia |
| products.type-filter-by.saved-only | Saved Only | Nur gespeicherte | Alleen opgeslagen | Seulement les enregistrés | Solo Guardados | Solo Salvati |