I am the lead developer of a Elite HubSpot agency in the Netherlands. I love developing for the HubSpot CMS, but get really excited for API work, NodeJS applications and React.
Starting work on a version 2 of our custom CMS theme and am trying to figure out what is the absolute minimum needed from the cms-theme-boilerplate? Which files, css folders, etc are must haves in order for all of the drag-n-drop items and default H read more
Hi @tmcmillan99 ,
You would at least need the layout.css and if you want to use theme settings, you need something like the theme-overrides...read more
We are needing to duplicate a whole bunch of Email Templates into various languages (11 langs x 15 templates = 165 new templates). I noticed there’s no clone endpoint (like the one on email marketing) for templates in the api. Does anyone have a su read more
Hi all! Here's a short summary of my webinars project, which consists of a module and a page template: Webinars Module (webinars listing): Webinar List Display: Lists webinars from a HubDB table, sorted by date, categorizing them read more
Hi @JTapper ,
In this case, I would store the video in the same HubDB and create another page that uses the same HubDB table as a data source...read more
We are needing to duplicate a whole bunch of Email Templates into various languages (11 langs x 15 templates = 165 new templates). I noticed there’s no clone endpoint (like the one on email marketing) for templates in the api. Does anyone have a su read more
I would like to retrieve engagements associated with a specific contact, filtered by a date/timestamp range. Currently, I'm using this API: https://api.hubapi.com/engagements/v1/engagements/associated/contact/{vid}/paged?limit=200. Is t read more
Hi @Mahadev , Wouldn't you be able to use the Search API for this use-case? You could create a search API call where you search for all engagem...read more
Hi, We've been experiencing a significant number of 500 errors during contact PATCH API calls for the past week. Here's the daily count of errors: 09/14: 6 errors 09/15: 0 errors 09/16: 8 errors 09/17: 6 errors 09/18: 3 errors 09/19: 14 erro read more
Hi @FedericoGior ,
I've been experiencing the same. This has been the case since the big outage in August. I know HubSpot is monitoring this,...read more
Currently, all major browsers support the WebP format. Which is a great format performance-wise. Now I know that HubSpot converts other formats to WebP serverside, but we should expect users to upload the WebP format as well.
One of the most powe read more
Hi @timmfin ,
It does seem that the 'resize_image_url' function is generating the correct links now! So this might have been fixed after I po...read more
We are currently migrating a lot of transactional emails from a different platform to HubSpot. One of those e-mails is a order confirmation. Currently, it is not possible to send an attachment with a transactional email unless you use the SMTP API. read more
By default, it seems impossible to use functionality like 'Blog content' modules and 'Smart content' in custom modules. Since the release of the 'Local development beta' we have a lot more possibilities to create innovative and dynamic websites. Usi read more
@katie Good news! Smart content for all modules would solve the problems, so smart pages isn't needed anymore if we have smart modules. If you hav...read more
Right now, the only way to add custom HTML (<style>, <script> or <meta> tags) to the head of an e-mail is to use a template. When using a template, our marketeers can not use the fancy drag and drop functionality the current editor read more
The default 'Rich text' module in Hubspot allows us to use the 'expanded view' and live editing of content in Hubspot pages. This gives an great overview of all the content and makes it quite easy to make adjustments. The 'richtext' field in custom read more
Currently, you can filter workflows from an object's activity timeline, but this means you see no workflow activities on the timeline at all.
We sometimes have workflows that enroll an object daily (or even more frequently).
It would be great i read more
//
//
//
//
//
(function($) {
//START END-USER CONFIGURATION
//------------------------------
//selectors for hover card triggers
var allHoverCardTriggers = '.author-name-link,.friend-list .friend a,.username a,.avatar,.user-avatar,.author-img, .authors a, .messageauthorusername a, a.lia-user-name-link, .js-latest-post-by-from a, .user-online-list li a, a.UserAvatar, .customUsersOnline a, #authors a,.dashboard-followers a.user-name, .dashboard-following a.user-name,.author-login-wrapper a, .hb-leaderboard a, .author-img-floated';
// Forward calling page's URL params to endpoint URL as well, helps with testing!
var params = (new URL(location.href)).searchParams;
var userApiUrl = '/plugins/custom/hubspot/hubspot/hovercardendpoint?' + ((params.set('user_id', '') == []._) && params.toString());
if($('.hover-card-container').length<1){
$('body').append('');
}
var cardWrapper = $('.hover-card-container');
var error = false;
var thisUserID = '';
var thisUserLogin = '';
var userLink ='';
var cardTimer;
var leaveTimer;
function mouseenter(Elem) {
var thisEl = Elem;
cardTimer = setTimeout(function(){
var docWidth = $(document).width();
var rightSide = false;
var userLink = thisEl.attr('href');
if($('.ViewProfilePage').length && $('img.lia-user-avatar-profile',thisEl).length){thisUserID = '101258';}
else if(thisEl.attr('href')=='#' || thisEl.attr('href')=='' || !userLink.match('viewprofilepage')){
return false;}
else{
var thisLen = (userLink).split('/');
thisUserID = (thisLen)[thisLen.length-1];
}
var thisCard = $('.profileCard[data-user='+thisUserID+']',cardWrapper);
var cardId = 'userProfileCard-'+ thisUserID;
var addAttr = thisEl.attr('aria-describedby',cardId);
var thisElTopOffset = Math.round(thisEl.offset().top+(thisEl.height()/2)+30);
var thisElbottomoffset = "auto";
var className = "";
var winHeight = $(window).height();
var elOffset = thisEl.offset();
var scrollTop = $(window).scrollTop();
var elementOffset = thisEl.offset().top;
var distanceTop = (elementOffset - scrollTop);
var distanceBottom = (winHeight + scrollTop) - (elOffset.top + thisEl.outerHeight(true));
var distanceLeft = Math.round(thisEl.offset().left);
var bodyHight = $('body').height();
var topParam = '';
var bottomparam = '';
var position = '';
var className = 'topArrow';
cardId
if(distanceBottom < 300 ){
if(distanceLeft < 59){
thisCard.removeClass('bottomArrow');
var className = 'leftArrow';
var distanceLeft = (distanceLeft)+(39);
var thisElTopOffset = (thisElTopOffset)-(150);
}else{
var thisElTopOffset = (thisElTopOffset)-(301); var className = 'bottomArrow'; thisCard.removeClass('topArrow');
thisCard.removeClass('leftArrow');
var distanceLeft = (distanceLeft)-(45);
}
}
else{
if(distanceLeft < 59){
thisCard.removeClass('topArrow');
var className = 'leftArrow';
var distanceLeft = (distanceLeft)+(39);
var thisElTopOffset = (thisElTopOffset)-(150);
}else{
thisCard.removeClass('leftArrow');
thisCard.removeClass('bottomArrow').addClass('topArrow');
var distanceLeft = (distanceLeft)-(45);
}
}
if(thisCard.length && $('.profileCard[data-user='+thisUserID+'] .preloader',cardWrapper).length<1){
$('.profileCard',cardWrapper).hide();
thisCard.addClass(className);
rightSide?thisCard.addClass('rightArrow'):thisCard.removeClass('rightArrow');
thisCard.delay(0).css({'top':(thisElTopOffset),'left':distanceLeft,'bottom':thisElbottomoffset}).fadeIn();
} else {
var ajaxReturn = '';
//just in case
thisCard.remove();
//hover card wrapper markup
var rightArrowClass = rightSide?'rightArrow':'';
if(thisElTopOffset != "auto"){
topParam = 'px';
}
if(thisElbottomoffset != "auto"){
bottomparam = 'px';
}
var profileCardHtml = '';
$.when(
//get the background
$.ajax({
type: 'GET',
url: userApiUrl+thisUserID,
dataType: 'html',
success: function(data) {
$('.profileCard',cardWrapper).hide();
ajaxReturn = data;
}
})
)
.done(function(){
cardWrapper.append(profileCardHtml);
$('.profileCard[data-user='+thisUserID+']',cardWrapper).eq(0).empty().html(ajaxReturn);
if($('.profileCard[data-user='+thisUserID+'] .preloader',cardWrapper).length){
$('.profileCard[data-user='+thisUserID+'] .preloader',cardWrapper).parents('div.profileCard').remove();
}
})
.fail(function(){
//uh oh - bail out!
$('.profileCard',cardWrapper).hide();
});
}
}, 360);
}
function mouseleave(e) {
clearTimeout(cardTimer);
// glowingblue: When the user leaves the hovercard trigger, wait because the leaving could be
// to interact with the hovercard, if we don't wait it will just disappear...because
// we left the trigger, right...so we'll have another handler that check if the mouse is
// over the hovercard and if so clears this timer, so the card doesn't close here
leaveTimer = setTimeout(function() {
if ($('.profileCard[data-user="'+thisUserID+'"]',cardWrapper).length) {
$('.profileCard[data-user="'+thisUserID+'"]',cardWrapper).fadeOut('fast');
} else {
$(".profileCard").fadeOut('fast');
}
}, 2400);
}
$(document).on("mouseenter focusin", allHoverCardTriggers, function(event) {
if(!($(this).parents().hasClass('custom-header'))&& !($(this).parents().hasClass('green-wrap'))){
(leaveTimer !== []._) && clearTimeout(leaveTimer);
mouseenter($(this));
event.stopPropagation();
}
});
$(document).on("mouseleave focusout", allHoverCardTriggers, function(event) {
(leaveTimer !== []._) && clearTimeout(leaveTimer);
mouseleave(event);
event.stopPropagation();
});
// glowingblue: Add handlers for when the users interacts with the hovercard, no closing!
$('.hover-card-container').on('mouseenter', function(e) {
(leaveTimer !== []._) && clearTimeout(leaveTimer);
});
$('.hover-card-container').on('mouseleave', function(e) {
(leaveTimer !== []._) && clearTimeout(leaveTimer);
if ( $(e.target).is('.profileCard[style*="block"]') ) {
leaveTimer = setTimeout(function() {
$(e.target).fadeOut('fast');
}, 2400);
}
});
// glowingblue: add one global root level click handler to also close any visible hovercards
// if the user taps/clicks outside the hovercard
$(document).on('mousedown', function(e) {
if ( !$(e.target).parents('.hover-card-container').length ) {
(leaveTimer != []._) && clearTimeout(leaveTimer);
$('.hover-card-container .profileCard[style*="block"]').each(function() {
$(this).fadeOut('fast');
});
}
});
})(LITHIUM.jQuery);
(function($) {
$(document).ready(function(){
var originalElementId;
function setCookie(cname,cvalue,exdays) {
var d = new Date();
d.setTime(d.getTime() + (exdays*24*60*60*1000));
var expires = "expires=" + d.toGMTString();
document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/";
}
function getCookie(cname) {
var name = cname + "=";
var decodedCookie = decodeURIComponent(document.cookie);
var ca = decodedCookie.split(';');
for(var i = 0; i < ca.length; i++) {
var c = ca[i];
while (c.charAt(0) == ' ') {
c = c.substring(1);
}
if (c.indexOf(name) == 0) {
return c.substring(name.length, c.length);
}
}
return "";
}
function errorDisplay(errType) {
var errAuth = '
To access this area of the Community, please log in.
';
var errAuthLogin = '
To access the HubSpot Community Champions program and complete opportunities, confirm you are logged in by clicking here. Find additional troubleshooting steps here
';
var noBadges = '
To start earning advocacy badges, go to the Community Champions advocacy program page and start completing opportunities.
';
var noAsks = '
Hooray! You\'ve completed all available opportunities. Check back in for more opportunities next month.