This website uses cookies to ensure you get the best experience.

Lyzr AI and our selected partners use cookies and similar technologies (together “cookies”) that are necessary to present this website, and to ensure you get the best experience of it. If you consent to it, we will also use cookies for analytics purposes.

See our Cookie Policy to read more about the cookies we set.

You can withdraw and manage your consent at any time, by clicking “Manage cookies” at the bottom of each website page.

Select which cookies you accept

On this site, we always set cookies that are strictly necessary, meaning they are necessary for the site to function properly.

If you consent to it, we will also set other types of cookies. You can provide or withdraw your consent to the different types of cookies using the toggles below. You can change or withdraw your consent at any time, by clicking the link “Manage Cookies”, that is always available at the bottom of the site.

To learn more about what the different types of cookies do, how your data is used when they are set etc, see our Cookie Policy.

These cookies are necessary to make the site work properly, and are always set when you visit the site.

Vendors Teamtailor

These cookies collect information to help us understand how the site is being used.

Vendors Teamtailor
Skip to main content
Marketing · Bengaluru

Marketing Lead

Lead Lyzr's product marketing in Bangalore — own messaging, campaigns, content, and demand gen to drive adoption and pipeline for one AI product.

Marketing · Bengaluru

Marketing Lead

Lead Lyzr's product marketing in Bangalore — own messaging, campaigns, content, and demand gen to drive adoption and pipeline for one AI product.

Loading application form

Already working at Lyzr AI?

Let’s recruit together and find your next colleague.

@lyzr.ai
/** * ============================================ * TEAMTAILOR JOBS CUSTOM JAVASCRIPT * Enhanced functionality for job listings * ============================================ */ (function() { 'use strict'; // Configuration const CONFIG = { animationDelay: 100, searchDebounceTime: 300, enableAnalytics: false, // Set to true if you want to track interactions customWrapperClass: 'tt-jobs-custom', // Your custom wrapper class from Teamtailor }; // Wait for DOM to be ready if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', init); } else { init(); } /** * Initialize all functionality */ function init() { console.log('Teamtailor Custom Jobs: Initializing...'); // Find job containers const jobsContainer = findJobsContainer(); if (!jobsContainer) { console.warn('Teamtailor Custom Jobs: Jobs container not found'); return; } // Initialize features enhanceJobCards(jobsContainer); initializeFilters(jobsContainer); initializeSearch(jobsContainer); addScrollAnimations(); addAccessibilityFeatures(jobsContainer); trackJobClicks(jobsContainer); console.log('Teamtailor Custom Jobs: Initialized successfully'); } /** * Find the main jobs container * @returns {HTMLElement|null} */ function findJobsContainer() { const selectors = [ `.${CONFIG.customWrapperClass}`, '[class*="jobs-block"]', '[class*="career-jobs"]', '.jobs-section', '.jobs-list', '.jobs-grid', '[class*="jobs-container"]' ]; for (const selector of selectors) { const element = document.querySelector(selector); if (element) return element; } return null; } /** * Enhance job cards with additional functionality * @param {HTMLElement} container */ function enhanceJobCards(container) { const jobCards = container.querySelectorAll('[class*="job-"], [class*="career-job"], li[class*="job"]'); jobCards.forEach((card, index) => { // Add staggered animation card.style.animationDelay = `${index * CONFIG.animationDelay}ms`; // Make entire card clickable makeCardClickable(card); // Add hover effects addCardHoverEffects(card); // Extract and normalize job data normalizeJobData(card); }); } /** * Make entire job card clickable * @param {HTMLElement} card */ function makeCardClickable(card) { const link = card.querySelector('a[href*="/jobs/"]'); if (!link) return; const href = link.getAttribute('href'); card.style.cursor = 'pointer'; card.addEventListener('click', (e) => { // Don't trigger if clicking on a link or button if (e.target.tagName === 'A' || e.target.tagName === 'BUTTON') return; window.location.href = href; }); // Add keyboard navigation card.setAttribute('tabindex', '0'); card.setAttribute('role', 'link'); card.addEventListener('keydown', (e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); window.location.href = href; } }); } /** * Add enhanced hover effects * @param {HTMLElement} card */ function addCardHoverEffects(card) { card.addEventListener('mouseenter', () => { card.style.transform = 'translateY(-4px)'; }); card.addEventListener('mouseleave', () => { card.style.transform = 'translateY(0)'; }); } /** * Normalize job data attributes for filtering * @param {HTMLElement} card */ function normalizeJobData(card) { // Extract job information const titleEl = card.querySelector('[class*="title"], h3, h4'); const departmentEl = card.querySelector('[class*="department"], [class*="category"]'); const locationEl = card.querySelector('[class*="location"]'); if (titleEl) { card.setAttribute('data-job-title', titleEl.textContent.trim().toLowerCase()); } if (departmentEl) { card.setAttribute('data-job-department', departmentEl.textContent.trim().toLowerCase()); } if (locationEl) { card.setAttribute('data-job-location', locationEl.textContent.trim().toLowerCase()); } } /** * Initialize filter functionality * @param {HTMLElement} container */ function initializeFilters(container) { const filterButtons = container.querySelectorAll('[class*="filter-button"], [class*="filter-tag"], button[class*="filter"]'); if (filterButtons.length === 0) return; filterButtons.forEach(button => { button.addEventListener('click', () => { const filterType = button.getAttribute('data-filter-type') || 'department'; const filterValue = button.getAttribute('data-filter-value') || button.textContent.trim().toLowerCase(); // Toggle active state const isActive = button.classList.contains('active'); if (isActive) { button.classList.remove('active'); button.setAttribute('aria-pressed', 'false'); showAllJobs(container); } else { // Remove active from other buttons filterButtons.forEach(btn => { btn.classList.remove('active'); btn.setAttribute('aria-pressed', 'false'); }); button.classList.add('active'); button.setAttribute('aria-pressed', 'true'); filterJobs(container, filterType, filterValue); } // Track filter usage if (CONFIG.enableAnalytics) { trackEvent('job_filter', { type: filterType, value: filterValue }); } }); }); } /** * Filter jobs based on criteria * @param {HTMLElement} container * @param {string} filterType * @param {string} filterValue */ function filterJobs(container, filterType, filterValue) { const jobCards = container.querySelectorAll('[class*="job-"], [class*="career-job"], li[class*="job"]'); let visibleCount = 0; jobCards.forEach(card => { const jobData = card.getAttribute(`data-job-${filterType}`); if (jobData && jobData.includes(filterValue)) { card.classList.remove('tt-hidden'); card.classList.add('tt-fade-in'); visibleCount++; } else { card.classList.add('tt-hidden'); card.classList.remove('tt-fade-in'); } }); // Show no results message if needed showNoResultsMessage(container, visibleCount); } /** * Show all jobs * @param {HTMLElement} container */ function showAllJobs(container) { const jobCards = container.querySelectorAll('[class*="job-"], [class*="career-job"], li[class*="job"]'); jobCards.forEach(card => { card.classList.remove('tt-hidden'); card.classList.add('tt-fade-in'); }); // Remove no results message const noResultsEl = container.querySelector('.tt-no-results'); if (noResultsEl) noResultsEl.remove(); } /** * Initialize search functionality * @param {HTMLElement} container */ function initializeSearch(container) { const searchInput = container.querySelector('[class*="search-input"], input[type="search"]'); if (!searchInput) return; let searchTimeout; searchInput.addEventListener('input', (e) => { clearTimeout(searchTimeout); searchTimeout = setTimeout(() => { const searchTerm = e.target.value.trim().toLowerCase(); if (searchTerm === '') { showAllJobs(container); } else { searchJobs(container, searchTerm); } // Track search usage if (CONFIG.enableAnalytics && searchTerm) { trackEvent('job_search', { term: searchTerm }); } }, CONFIG.searchDebounceTime); }); } /** * Search jobs by keyword * @param {HTMLElement} container * @param {string} searchTerm */ function searchJobs(container, searchTerm) { const jobCards = container.querySelectorAll('[class*="job-"], [class*="career-job"], li[class*="job"]'); let visibleCount = 0; jobCards.forEach(card => { const title = card.getAttribute('data-job-title') || ''; const department = card.getAttribute('data-job-department') || ''; const location = card.getAttribute('data-job-location') || ''; const matchFound = title.includes(searchTerm) || department.includes(searchTerm) || location.includes(searchTerm); if (matchFound) { card.classList.remove('tt-hidden'); card.classList.add('tt-fade-in'); visibleCount++; } else { card.classList.add('tt-hidden'); card.classList.remove('tt-fade-in'); } }); // Show no results message if needed showNoResultsMessage(container, visibleCount); } /** * Show no results message * @param {HTMLElement} container * @param {number} visibleCount */ function showNoResultsMessage(container, visibleCount) { // Remove existing message const existingMessage = container.querySelector('.tt-no-results'); if (existingMessage) existingMessage.remove(); if (visibleCount === 0) { const jobsList = container.querySelector('[class*="jobs-list"], [class*="jobs-grid"], [class*="jobs-container"]'); if (jobsList) { const noResultsEl = document.createElement('div'); noResultsEl.className = 'tt-no-results'; noResultsEl.innerHTML = `

No jobs found

Try adjusting your filters or search terms

`; jobsList.appendChild(noResultsEl); } } } /** * Add scroll animations for job cards */ function addScrollAnimations() { if (!('IntersectionObserver' in window)) return; const observer = new IntersectionObserver((entries) => { entries.forEach(entry => { if (entry.isIntersecting) { entry.target.classList.add('tt-fade-in'); observer.unobserve(entry.target); } }); }, { threshold: 0.1, rootMargin: '0px 0px -50px 0px' }); const jobCards = document.querySelectorAll('[class*="job-"], [class*="career-job"], li[class*="job"]'); jobCards.forEach(card => observer.observe(card)); } /** * Add accessibility features * @param {HTMLElement} container */ function addAccessibilityFeatures(container) { // Add ARIA labels to job cards const jobCards = container.querySelectorAll('[class*="job-"], [class*="career-job"], li[class*="job"]'); jobCards.forEach(card => { const titleEl = card.querySelector('[class*="title"], h3, h4'); if (titleEl) { const jobTitle = titleEl.textContent.trim(); card.setAttribute('aria-label', `View ${jobTitle} job posting`); } }); // Add skip link for keyboard users const firstJobCard = jobCards[0]; if (firstJobCard) { firstJobCard.setAttribute('id', 'first-job-card'); } } /** * Track job card clicks * @param {HTMLElement} container */ function trackJobClicks(container) { if (!CONFIG.enableAnalytics) return; const jobCards = container.querySelectorAll('[class*="job-"], [class*="career-job"], li[class*="job"]'); jobCards.forEach(card => { card.addEventListener('click', () => { const title = card.getAttribute('data-job-title'); const department = card.getAttribute('data-job-department'); const location = card.getAttribute('data-job-location'); trackEvent('job_click', { title: title, department: department, location: location }); }); }); } /** * Track analytics events * @param {string} eventName * @param {object} eventData */ function trackEvent(eventName, eventData) { // Google Analytics 4 if (typeof gtag !== 'undefined') { gtag('event', eventName, eventData); } // Google Analytics Universal if (typeof ga !== 'undefined') { ga('send', 'event', 'Jobs', eventName, JSON.stringify(eventData)); } // Mixpanel if (typeof mixpanel !== 'undefined') { mixpanel.track(eventName, eventData); } // Console log for debugging console.log('Event tracked:', eventName, eventData); } /** * Create custom filters programmatically (optional) * Call this function if Teamtailor doesn't provide filters */ function createCustomFilters(container) { const jobCards = container.querySelectorAll('[class*="job-"], [class*="career-job"], li[class*="job"]'); const departments = new Set(); const locations = new Set(); // Extract unique departments and locations jobCards.forEach(card => { const dept = card.getAttribute('data-job-department'); const loc = card.getAttribute('data-job-location'); if (dept) departments.add(dept); if (loc) locations.add(loc); }); // Create filter UI const filtersContainer = document.createElement('div'); filtersContainer.className = 'jobs-filters tt-custom-filters'; filtersContainer.innerHTML = `
Filter by: ${createFilterButtons('department', departments)} ${createFilterButtons('location', locations)}
`; // Insert before jobs list const jobsList = container.querySelector('[class*="jobs-list"], [class*="jobs-grid"]'); if (jobsList) { jobsList.parentNode.insertBefore(filtersContainer, jobsList); // Initialize filter functionality initializeFilters(container); // Add clear filters functionality const clearBtn = filtersContainer.querySelector('.tt-clear-filters'); clearBtn.addEventListener('click', () => { const allFilters = filtersContainer.querySelectorAll('.filter-button'); allFilters.forEach(btn => { btn.classList.remove('active'); btn.setAttribute('aria-pressed', 'false'); }); showAllJobs(container); }); } } /** * Helper: Create filter buttons HTML * @param {string} type * @param {Set} values * @returns {string} */ function createFilterButtons(type, values) { const buttons = Array.from(values).map(value => `` ).join(''); return buttons; } /** * Helper: Capitalize first letter * @param {string} str * @returns {string} */ function capitalizeFirst(str) { return str.charAt(0).toUpperCase() + str.slice(1); } // Expose functions for external use if needed window.TeamtailorCustomJobs = { init: init, filterJobs: filterJobs, searchJobs: searchJobs, showAllJobs: showAllJobs, createCustomFilters: createCustomFilters }; })();