Itβs Not Impossible
Find work that matters to you.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Filtered Employer Listings</title>
<style>
body { font-family: Arial, sans-serif; background-color: #ffffff; color: #333; }
#filter-container { text-align: center; margin-bottom: 20px; }
.filters {
display: flex;
flex-wrap: wrap;
gap: 15px;
justify-content: center;
}
.filter-group {
display: flex;
flex-direction: column;
align-items: center;
}
.button-group {
display: flex;
justify-content: center;
margin-top: 10px;
}
select, input {
width: 200px;
padding: 8px;
font-size: 14px;
}
.company-card {
background-color: #FFF3F0;
border: 1px solid #FF6145;
padding: 15px;
margin: 10px auto;
width: 90%;
max-width: 600px;
text-align: center;
border-radius: 10px;
cursor: pointer;
word-wrap: break-word;
white-space: normal;
overflow-wrap: break-word;
}
.company-card.selected {
background-color: #FF6145;
color: white;
}
.section-title { text-align: center; font-size: 1.8rem; font-weight: bold; margin: 20px 0; color: #000; }
</style>
</head>
<body>
<!-- Filter Section -->
<div id="filter-container">
<div class="filters">
<div class="filter-group">
<h4>Select Your Interests:</h4>
<select id="interestDropdown" multiple></select>
</div>
<div class="filter-group">
<h4>Select Company Size:</h4>
<select id="sizeDropdown"></select>
</div>
<div class="filter-group">
<h4>Search Employers:</h4>
<input type="text" id="chatbotInput" placeholder="e.g., Engineering, Design, Nature" onkeyup="filterAndRecommend()">
</div>
</div>
<div class="button-group">
<button id="showEmployers" onclick="filterAndRecommend()">Show Employers</button>
<button id="clearFilters" onclick="clearFilters()">Clear Filters</button>
</div>
</div>
β
<!-- Recommended Companies Section -->
<div id="recommendations"></div>
<div class="bottom-buttons">
<button id="similarExperienceBtn" onclick="getSimilarExperience()">Get me work experience at similar organisations</button>
<button id="jobAlertsBtn" onclick="subscribeJobAlerts()">Send me job alerts</button>
<div class="email-subscribe">
<label for="emailInput">π© Enter your email for updates (Press Enter to submit):</label>
<input type="email" id="emailInput" placeholder="your@email.com">
<p id="emailMessage" class="email-message"></p>
</div>
</div>
β
<script>
let employerData = [];
let allSystems = [];
let selectedCompanies = new Set();
async function fetchEmployers() {
try {
let url = "https://sweet-wood-3cee.luke-3f7.workers.dev/";
const response = await fetch(url);
if (!response.ok) {
throw new Error(`HTTP error! Status: ${response.status}`);
}
const data = await response.json();
console.log("Fetched Data:", data);
employerData = data.records.map(record => ({
name: record.fields["CompanyName"] || "N/A",
description: record.fields["Description"] || "No description available",
systems: record.fields["Systems Names"]
? (Array.isArray(record.fields["Systems Names"])
? record.fields["Systems Names"].map(s => s.toLowerCase().trim())
: [record.fields["Systems Names"].toLowerCase().trim()])
: [],
size: record.fields["Size"]
? (typeof record.fields["Size"] === "object"
? (record.fields["Size"].value ? record.fields["Size"].value.trim().toLowerCase() : "unknown")
: record.fields["Size"].trim().toLowerCase())
: "unknown"
}));
extractSystems();
} catch (error) {
console.error("Error fetching employers:", error);
}
}
(async () => {
await fetchEmployers();
})();
function extractSystems() {
let systemsSet = new Set();
let sizeSet = new Set();
employerData.forEach(emp => {
if (Array.isArray(emp.systems)) {
emp.systems.forEach(system => systemsSet.add(system));
} else if (emp.systems) {
systemsSet.add(emp.systems);
}
sizeSet.add(emp.size);
});
allSystems = Array.from(systemsSet);
populateDropdown();
populateSizeDropdown(sizeSet);
}
function populateDropdown() {
let dropdown = document.getElementById("interestDropdown");
dropdown.innerHTML = "";
allSystems.forEach(system => {
let option = document.createElement("option");
option.value = system;
option.textContent = system;
dropdown.appendChild(option);
});
}
function populateSizeDropdown(sizeSet) {
let sizeDropdown = document.getElementById("sizeDropdown");
sizeDropdown.innerHTML = "<option value=''>All Sizes</option>";
Array.from(sizeSet).forEach(size => {
let option = document.createElement("option");
option.value = size;
option.textContent = size;
sizeDropdown.appendChild(option);
});
}
function filterAndRecommend() {
console.log("π Filtering...");
let selectedOptions = Array.from(document.getElementById("interestDropdown").selectedOptions).map(option => option.value.toLowerCase());
let selectedSize = document.getElementById("sizeDropdown").value.trim().toLowerCase();
let userInput = document.getElementById("chatbotInput").value.toLowerCase();
let recommendations = document.getElementById("recommendations");
recommendations.innerHTML = "<h3 class='section-title'>Select Favourite Employers</h3>";
if (selectedOptions.length === 0) {
selectedOptions = allSystems;
}
let filteredMatches = employerData.filter(emp => {
let empSystems = Array.isArray(emp.systems) ? emp.systems : [emp.systems];
let matchesSystem = selectedOptions.some(selectedSystem => empSystems.includes(selectedSystem));
let matchesSize = (selectedSize === "" || emp.size === selectedSize);
let matchesSearch = emp.name.toLowerCase().includes(userInput) || emp.description.toLowerCase().includes(userInput);
return matchesSystem && matchesSize && matchesSearch;
});
if (filteredMatches.length === 0) {
recommendations.innerHTML += "<p>No matches found. Try another filter!</p>";
} else {
filteredMatches.forEach(emp => {
let card = document.createElement("div");
card.classList.add("company-card");
card.innerHTML = `<strong>${emp.name}</strong><br>${emp.description}<br><em>Systems: ${emp.systems.join(", ")}</em><br><em>Size: ${emp.size}</em>`;
card.onclick = () => toggleCompanySelection(card, emp.name);
recommendations.appendChild(card);
});
}
}
function clearFilters() {
document.getElementById("interestDropdown").selectedIndex = -1;
document.getElementById("sizeDropdown").value = "";
document.getElementById("chatbotInput").value = "";
filterAndRecommend();
}
function toggleCompanySelection(card, companyName) {
card.classList.toggle("selected");
selectedCompanies.has(companyName) ? selectedCompanies.delete(companyName) : selectedCompanies.add(companyName);
}
document.addEventListener("DOMContentLoaded", applyFiltersFromURL);
function toggleButtonSelection(buttonId) {
let button = document.getElementById(buttonId);
button.classList.toggle("selected");
}
// β
Update existing functions to use toggle selection
function getSimilarExperience() {
toggleButtonSelection("similarExperienceBtn");
}
function subscribeJobAlerts() {
toggleButtonSelection("jobAlertsBtn");
}
async function applyFiltersFromURL() {
const urlParams = new URLSearchParams(window.location.search);
// Wait for dropdowns to be populated
await new Promise(resolve => setTimeout(resolve, 1000));
const interestParams = urlParams.get("interests"); // Example: "engineering,design"
const sizeParam = urlParams.get("size"); // Example: "medium"
const searchParam = urlParams.get("search"); // Example: "tech"
console.log("Applying URL Filters:", { interestParams, sizeParam, searchParam });
// π΄ INSERT THIS: Check if dropdown has options before selecting
console.log("Dropdown Options Before Applying Filters:",
Array.from(document.getElementById("interestDropdown").options).map(o => o.value));
// β
Select Interests (Systems) Based on URL Params
if (interestParams) {
const interestsArray = interestParams.split(",").map(i => i.toLowerCase().trim());
const dropdown = document.getElementById("interestDropdown");
Array.from(dropdown.options).forEach(option => {
if (interestsArray.includes(option.value.toLowerCase().trim())) {
option.selected = true;
console.log("β
Selected Interest:", option.value); // Debugging log
}
});
}
// β
Select Company Size Based on URL Params
if (sizeParam) {
document.getElementById("sizeDropdown").value = sizeParam.toLowerCase();
}
// β
Set Search Input Based on URL Params
if (searchParam) {
document.getElementById("chatbotInput").value = searchParam;
}
// β
Apply filters after setting values
filterAndRecommend();
}
window.onload = function () {
applyFiltersFromURL();
};
async function sendSelectedCompaniesToAirtable() {
if (selectedCompanies.size === 0) {
alert("Please select at least one company.");
return;
}
let email = document.getElementById("emailInput").value.trim();
if (!email) {
alert("β Please enter your email before submitting.");
return;
}
let url = "https://sweet-wood-3cee.luke-3f7.workers.dev/"; // Cloudflare Worker URL
const requestBody = {
email: email,
selectedCompanies: Array.from(selectedCompanies),
selectedButtons: Array.from(document.querySelectorAll(".bottom-buttons button.selected"))
.map(button => button.textContent.trim())
};
try {
const response = await fetch(url, {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(requestBody)
});
if (!response.ok) {
throw new Error(`HTTP error! Status: ${response.status}`);
}
const responseData = await response.json();
console.log("β
Successfully sent to Airtable:", responseData);
alert("β
Your selected companies have been sent!");
} catch (error) {
console.error("β Error sending data:", error);
alert("β Failed to send data. Please try again.");
}
}
document.getElementById("emailInput").addEventListener("keypress", async function(event) {
if (event.key === "Enter") {
event.preventDefault(); // Prevent form submission (if inside a form)
let email = this.value.trim();
if (!email) {
document.getElementById("emailMessage").textContent = "β Please enter a valid email.";
return;
}
document.getElementById("emailMessage").textContent = `β
Thanks! We'll share next steps to your email (${email}).`;
// Call the function to send selected companies to Airtable
await sendSelectedCompaniesToAirtable();
this.value = ""; // Clear input after submission
}
});
</script>
</body>
</html>
<style>
body { font-family: Arial, sans-serif; background-color: #ffffff; color: #333; }
#filter-container { text-align: center; margin-bottom: 20px; }
select, input, button { width: 100%; max-width: 400px; padding: 10px; font-size: 16px; margin: 5px auto; }
.company-card { background-color: #FFF3F0; border: 1px solid #FF6145; padding: 15px; margin: 10px auto; width: 90%; max-width: 600px; text-align: center; border-radius: 10px; cursor: pointer; word-wrap: break-word; white-space: normal; overflow-wrap: break-word; }
.company-card.selected { background-color: #FF6145; color: white; }
.section-title { text-align: center; font-size: 1.8rem; font-weight: bold; margin: 20px 0; color: #000; }
.bottom-buttons {
display: flex;
flex-wrap: wrap; /* β
Allows buttons to wrap to the next line */
justify-content: center;
gap: 15px;
margin-top: 20px;
}
.bottom-buttons {
display: flex;
flex-wrap: wrap; /* β
Allows buttons to wrap to the next line */
justify-content: center;
gap: 15px;
margin-top: 20px;
}
.bottom-buttons {
display: flex;
flex-wrap: wrap; /* Allows buttons to wrap */
justify-content: center;
gap: 15px;
margin-top: 20px;
}
.bottom-buttons button {
padding: 12px 18px;
font-size: 16px;
border: 2px solid #FF6145; /* β
Matches company cards */
background-color: #FFF3F0; /* β
Matches company cards */
color: black;
border-radius: 8px;
cursor: pointer;
transition: background 0.3s ease, color 0.3s ease;
white-space: normal;
word-wrap: break-word;
width: 100%;
max-width: 300px;
text-align: center;
}
/* β
Selected button style (Matches company cards) */
.bottom-buttons button.selected {
background-color: #FF6145 !important;
color: white !important;
}
}
.email-subscribe {
display: flex;
flex-direction: column;
align-items: center;
margin-top: 20px;
padding: 15px;
border: 2px solid #FF6145;
border-radius: 8px;
background-color: #FFF3F0;
width: 90%;
max-width: 400px;
text-align: center;
margin-left: auto;
margin-right: auto;
}
.email-subscribe label {
font-size: 16px;
font-weight: bold;
margin-bottom: 8px;
}
.email-subscribe input {
width: 100%;
padding: 10px;
font-size: 16px;
border: 1px solid #FF6145;
border-radius: 5px;
text-align: center;
}
.email-message {
font-size: 14px;
color: green;
margin-top: 8px;
}
</style>
β

