<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE html>
<html b:css='false' b:defaultwidgetversion='2' b:layoutsVersion='3' b:responsive='true' b:templateUrl='job_aggregation_template.xml' b:templateVersion='1.0.0' expr:dir='data:blog.languageDirection' expr:lang='data:blog.locale' xmlns='http://www.w3.org/1999/xhtml' xmlns:b='http://www.google.com/2005/gml/b' xmlns:data='http://www.google.com/2005/gml/data' xmlns:expr='http://www.google.com/2005/gml/expr'>
<head>
<meta content='width=device-width, initial-scale=1' name='viewport'/>
<title><data:view.title.escaped/></title>
<!-- SEO Meta Tags -->
<meta expr:content='data:blog.title + " - Job Portal"' property='og:title'/>
<meta content='Find the latest job opportunities across technology, healthcare, finance, and education sectors.' name='description'/>
<meta content='jobs, career, employment, hiring, job portal, job search' name='keywords'/>
<!-- Font Awesome -->
<link href='https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css' rel='stylesheet'/>
<b:include data='blog' name='all-head-content'/>
<b:skin><![CDATA[
/* Variable definitions and basic styling */
body {
font-family: 'Segoe UI', 'Inter', 'Roboto', sans-serif;
background-color: #f8fafc;
color: #334155;
line-height: 1.6;
margin: 0;
padding: 0;
}
a {
color: #2563eb;
text-decoration: none;
}
a:hover {
color: #1e40af;
}
.container {
max-width: 1200px;
margin: 0 auto;
padding: 0 15px;
}
]]></b:skin>
<style>
/* Header Styling */
.header {
background-color: #ffffff;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
padding: 1rem 0;
position: sticky;
top: 0;
z-index: 100;
}
.header-container {
display: flex;
justify-content: space-between;
align-items: center;
}
.logo {
font-size: 1.5rem;
font-weight: bold;
color: #2563eb;
}
.nav-menu {
display: flex;
list-style: none;
margin: 0;
padding: 0;
}
.nav-menu li {
margin-left: 1.5rem;
}
.nav-menu a {
color: #334155;
font-weight: 500;
transition: color 0.3s ease;
}
.nav-menu a:hover {
color: #2563eb;
}
/* Main content styling */
.main-content {
padding: 2rem 0;
}
/* Search and Filter styles */
.search-filter-container {
margin-bottom: 2rem;
}
.search-container {
display: flex;
margin-bottom: 1rem;
}
#job-search {
flex-grow: 1;
padding: 0.5rem;
border: 1px solid #e2e8f0;
border-radius: 4px 0 0 4px;
font-size: 1rem;
}
.search-button {
background-color: #2563eb;
color: white;
border: none;
padding: 0.5rem 1rem;
border-radius: 0 4px 4px 0;
cursor: pointer;
}
.filter-container {
display: flex;
flex-wrap: wrap;
gap: 0.5rem;
}
.filter-button {
background-color: #e2e8f0;
border: none;
padding: 0.5rem 1rem;
border-radius: 4px;
cursor: pointer;
transition: background-color 0.3s ease;
}
.filter-button.active {
background-color: #2563eb;
color: white;
}
/* Job Grid */
.job-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
gap: 1.5rem;
}
.job-item {
background-color: white;
border-radius: 8px;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
padding: 1.5rem;
transition: transform 0.3s ease, box-shadow 0.3s ease;
}
.job-item:hover {
transform: translateY(-5px);
box-shadow: 0 10px 20px rgba(0,0,0,0.1);
}
.job-item h2 {
margin-top: 0;
margin-bottom: 0.5rem;
font-size: 1.25rem;
}
.job-snippet {
color: #4b5563;
margin-bottom: 1rem;
}
.job-labels a {
display: inline-block;
background-color: #e2e8f0;
color: #4b5563;
padding: 0.25rem 0.5rem;
border-radius: 4px;
font-size: 0.875rem;
margin-right: 0.5rem;
margin-bottom: 0.5rem;
transition: background-color 0.2s ease;
}
.job-labels a:hover {
background-color: #d1d5db;
}
/* Empty State */
.empty-state {
text-align: center;
padding: 3rem 1rem;
background-color: white;
border-radius: 8px;
box-shadow: 0 2px 4px rgba(0,0,0,0.05);
grid-column: 1 / -1;
}
.empty-state i {
color: #94a3b8;
margin-bottom: 1rem;
}
.empty-state h3 {
margin-top: 0;
color: #334155;
}
.empty-state p {
color: #64748b;
}
/* No Jobs Found */
.no-jobs-found {
margin-bottom: 2rem;
}
/* Footer Styling */
.footer {
background-color: #1e293b;
color: #e2e8f0;
padding: 3rem 0 1rem;
margin-top: 3rem;
}
.footer-content {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
margin-bottom: 2rem;
}
.footer-logo h2 {
margin-top: 0;
margin-bottom: 0.5rem;
color: white;
}
.footer-logo p {
color: #94a3b8;
}
.footer-links {
display: flex;
flex-wrap: wrap;
gap: 3rem;
}
.footer-section h3 {
color: white;
margin-top: 0;
margin-bottom: 1rem;
font-size: 1.1rem;
}
.footer-section ul {
list-style: none;
padding: 0;
margin: 0;
}
.footer-section li {
margin-bottom: 0.5rem;
}
.footer-section a {
color: #94a3b8;
transition: color 0.2s ease;
}
.footer-section a:hover {
color: white;
}
.copyright {
border-top: 1px solid #334155;
padding-top: 1rem;
text-align: center;
color: #64748b;
font-size: 0.875rem;
}
@media (max-width: 768px) {
.footer-content {
flex-direction: column;
}
.footer-logo {
margin-bottom: 2rem;
}
.footer-links {
gap: 1.5rem;
}
}
</style>
</head>
<body>
<!-- Header -->
<header class='header'>
<div class='container header-container'>
<a class='logo' href='/'>Job Portal</a>
<nav>
<ul class='nav-menu'>
<li><a href='/'>Home</a></li>
<li><a href='/search'>Search Jobs</a></li>
<li><a href='/about'>About</a></li>
<li><a href='/contact'>Contact</a></li>
</ul>
</nav>
</div>
</header>
<!-- Main content -->
<main class='main-content'>
<div class='container'>
<b:section id='main' showaddelement='false'>
<b:widget id='Blog1' locked='true' title='Blog Posts' type='Blog' version='2'>
<b:widget-settings>
<b:widget-setting name='showDateHeader'>false</b:widget-setting>
<b:widget-setting name='style.textcolor'>#000000</b:widget-setting>
<b:widget-setting name='showShareButtons'>false</b:widget-setting>
<b:widget-setting name='showCommentLink'>false</b:widget-setting>
<b:widget-setting name='style.urlcolor'>#008000</b:widget-setting>
<b:widget-setting name='showAuthor'>false</b:widget-setting>
<b:widget-setting name='style.linkcolor'>#0000ff</b:widget-setting>
<b:widget-setting name='style.unittype'>TextAndImage</b:widget-setting>
<b:widget-setting name='style.bgcolor'>#ffffff</b:widget-setting>
<b:widget-setting name='showAuthorProfile'>false</b:widget-setting>
<b:widget-setting name='style.layout'>1x1</b:widget-setting>
<b:widget-setting name='showLabels'>true</b:widget-setting>
<b:widget-setting name='showLocation'>false</b:widget-setting>
<b:widget-setting name='showTimestamp'>false</b:widget-setting>
<b:widget-setting name='postsPerAd'>1</b:widget-setting>
<b:widget-setting name='showBacklinks'>false</b:widget-setting>
<b:widget-setting name='style.bordercolor'>#ffffff</b:widget-setting>
<b:widget-setting name='showInlineAds'>false</b:widget-setting>
<b:widget-setting name='showReactions'>false</b:widget-setting>
</b:widget-settings>
<b:includable id='main'>
<!-- Search and Filter Section (moved outside grid) -->
<div class='search-filter-container'>
<div class='search-container'>
<input id='job-search' placeholder='Search for jobs...' type='text'/>
<button class='search-button'><i class='fas fa-search'></i></button>
</div>
<div class='filter-container'>
<button class='filter-button active' data-category='all'>All Jobs</button>
<button class='filter-button' data-category='technology'>Technology</button>
<button class='filter-button' data-category='healthcare'>Healthcare</button>
<button class='filter-button' data-category='finance'>Finance</button>
<button class='filter-button' data-category='education'>Education</button>
</div>
</div>
<!-- Debug Information (temporary - remove after testing) -->
<div style='background: #f0f8ff; padding: 10px; margin: 10px 0; border: 1px solid #ccc; border-radius: 4px;'>
<p><strong>Debug Info:</strong></p>
<p>Posts empty: <data:posts.empty/></p>
<p>Number of posts: <data:posts.size/></p>
<b:if cond='!data:posts.empty'>
<p>First post title: <b:eval expr='data:posts.first.title'/></p>
</b:if>
</div>
<!-- No jobs found message (initially hidden) -->
<div class='no-jobs-found' style='display: none;'>
<div class='empty-state'>
<i class='fas fa-search fa-4x'></i>
<h3>No jobs found</h3>
<p>Try adjusting your search or filter criteria</p>
</div>
</div>
<!-- Jobs Grid -->
<div class='job-grid'>
<b:if cond='data:posts.empty'>
<div class='empty-state'>
<i class='fas fa-briefcase fa-4x'></i>
<h3>No jobs available at the moment</h3>
<p>Please check back later for new opportunities</p>
</div>
<b:else/>
<b:loop values='data:posts' var='post'>
<div class='job-item' expr:data-categories='data:post.labels map (label => label.name) join ","'>
<h2><a expr:href='data:post.url'><data:post.title/></a></h2>
<div class='job-snippet'>
<b:if cond='data:post.snippets.short'>
<data:post.snippets.short/>
<b:else/>
<data:post.body/>
</b:if>
</div>
<b:if cond='data:post.labels'>
<div class='job-labels'>
<b:loop values='data:post.labels' var='label'>
<a expr:href='data:label.url'><data:label.name/></a>
</b:loop>
</div>
</b:if>
</div>
</b:loop>
</b:if>
</div>
<!-- Pagination -->
<b:include name='nextprev'/>
</b:includable>
<!-- Post includable (required for individual post display) -->
<b:includable id='post' var='post'>
<div class='job-item' expr:data-categories='data:post.labels map (label => label.name) join ","'>
<h2><a expr:href='data:post.url'><data:post.title/></a></h2>
<div class='job-snippet'>
<b:if cond='data:post.snippets.short'>
<data:post.snippets.short/>
<b:else/>
<data:post.body/>
</b:if>
</div>
<b:if cond='data:post.labels'>
<div class='job-labels'>
<b:loop values='data:post.labels' var='label'>
<a expr:href='data:label.url'><data:label.name/></a>
</b:loop>
</div>
</b:if>
</div>
</b:includable>
<!-- Post Quick Edit includable -->
<b:includable id='postQuickEdit' var='post'>
<b:if cond='data:post.editUrl'>
<span expr:class='"item-control " + data:post.adminClass'>
<a expr:href='data:post.editUrl' expr:title='data:top.editPostMsg'>
<img alt='' class='icon-action' height='18' src='https://resources.blogblog.com/img/icon18_edit_allbkg.gif' width='18'/>
</a>
</span>
</b:if>
</b:includable>
<!-- Comments includable -->
<b:includable id='comments' var='post'>
<!-- Comments are disabled in widget settings, but includable is required -->
</b:includable>
<!-- Backlinks includable -->
<b:includable id='backlinks' var='post'>
<!-- Backlinks are disabled in widget settings, but includable is required -->
</b:includable>
<!-- Post Footer includable -->
<b:includable id='postFooter' var='post'>
<!-- Post footer content if needed -->
</b:includable>
</b:widget>
</b:section>
</div>
</main>
<!-- Footer Section -->
<footer class='footer'>
<div class='container'>
<div class='footer-content'>
<div class='footer-logo'>
<h2>Job Portal</h2>
<p>Find your dream job today</p>
</div>
<div class='footer-links'>
<div class='footer-section'>
<h3>Quick Links</h3>
<ul>
<li><a href='/'>Home</a></li>
<li><a href='/search'>Search Jobs</a></li>
<li><a href='/about'>About</a></li>
<li><a href='/contact'>Contact</a></li>
</ul>
</div>
<div class='footer-section'>
<h3>Job Categories</h3>
<ul>
<li><a href='/search/label/technology'>Technology</a></li>
<li><a href='/search/label/healthcare'>Healthcare</a></li>
<li><a href='/search/label/finance'>Finance</a></li>
<li><a href='/search/label/education'>Education</a></li>
</ul>
</div>
</div>
</div>
<div class='copyright'>
<p>© <span id='current-year'></span> Job Portal. All rights reserved.</p>
</div>
</div>
</footer>
<!-- JavaScript for filters and search -->
<script>
//<![CDATA[
document.addEventListener('DOMContentLoaded', function() {
// Set current year
document.getElementById('current-year').textContent = new Date().getFullYear();
// DOM elements
const jobItems = document.querySelectorAll('.job-item');
const filterButtons = document.querySelectorAll('.filter-button');
const searchInput = document.getElementById('job-search');
const noJobsFound = document.querySelector('.no-jobs-found');
// Filter functionality
filterButtons.forEach(button => {
button.addEventListener('click', function() {
// Update active button
filterButtons.forEach(btn => btn.classList.remove('active'));
this.classList.add('active');
const category = this.getAttribute('data-category');
// Filter jobs
let foundJobs = 0;
jobItems.forEach(job => {
// If "all" is selected or job has the selected category
if (category === 'all') {
job.style.display = 'block';
foundJobs++;
} else {
const categories = job.getAttribute('data-categories').toLowerCase();
if (categories.includes(category.toLowerCase())) {
job.style.display = 'block';
foundJobs++;
} else {
job.style.display = 'none';
}
}
});
// Show/hide "no jobs found" message
noJobsFound.style.display = foundJobs > 0 ? 'none' : 'block';
// Apply search filter as well (if there's text in the search box)
if (searchInput.value.trim() !== '') {
filterBySearchTerm(searchInput.value.trim());
}
});
});
// Search functionality
searchInput.addEventListener('keyup', function() {
filterBySearchTerm(this.value.trim());
});
function filterBySearchTerm(term) {
if (term === '') {
// If search is cleared, reapply only category filter
const activeCategory = document.querySelector('.filter-button.active').getAttribute('data-category');
filterButtons.forEach(btn => {
if (btn.getAttribute('data-category') === activeCategory) {
btn.click();
}
});
return;
}
// Get current active category
const activeCategory = document.querySelector('.filter-button.active').getAttribute('data-category');
let foundJobs = 0;
// Loop through all job items
jobItems.forEach(job => {
// First check if the job should be visible based on category
let visibleByCategory = (activeCategory === 'all') ||
job.getAttribute('data-categories').toLowerCase().includes(activeCategory.toLowerCase());
// If visible by category, then apply search filter
if (visibleByCategory) {
const title = job.querySelector('h2').textContent.toLowerCase();
const snippet = job.querySelector('.job-snippet') ? job.querySelector('.job-snippet').textContent.toLowerCase() : '';
if (title.includes(term.toLowerCase()) || snippet.includes(term.toLowerCase())) {
job.style.display = 'block';
foundJobs++;
} else {
job.style.display = 'none';
}
} else {
job.style.display = 'none';
}
});
// Show/hide "no jobs found" message
noJobsFound.style.display = foundJobs > 0 ? 'none' : 'block';
}
});
//]]>
</script>
<script>
//<![CDATA[
// Your JavaScript code here
//]]>
</script>
</body>
</html>
Comments
Post a Comment