{% extends 'freelance_tracker/base.html' %} {% load i18n %} {% load humanize %} {% load freelance_tracker %} {% block page_title %} {% translate "All Freelance Jobs" %} {% endblock page_title %} {% block header_nav_brand %} {% translate "All Freelance Jobs" %} {% endblock header_nav_brand %} {% block header_nav_collapse_right %} {% translate "My Jobs" as nav_item_title %} {% url "freelance_tracker:my_jobs" as nav_item_link %} {% include "framework/header/nav-collapse-button.html" with btn_modifier="outline-light" url=nav_item_link title=nav_item_title fa_icon="fa-solid fa-user" icon_on_mobile=True %} {% translate "Leaderboard" as nav_item_title %} {% url "freelance_tracker:leaderboard" as nav_item_link %} {% include "framework/header/nav-collapse-button.html" with btn_modifier="outline-light" url=nav_item_link title=nav_item_title fa_icon="fa-solid fa-ranking-star" icon_on_mobile=True %} {% if perms.freelance_tracker.add_corp_owner %} {% translate "Add / Refresh Corp Token" as nav_item_title %} {% url "freelance_tracker:add_corp" as nav_item_link %} {% include "framework/header/nav-collapse-button.html" with btn_modifier="success" url=nav_item_link title=nav_item_title fa_icon="fa-solid fa-arrows-rotate" icon_on_mobile=True %} {% endif %} {% endblock header_nav_collapse_right %} {% block details %} {% if not jobs %}

{% translate "No freelance jobs are being tracked yet." %} {% if perms.freelance_tracker.add_corp_owner %} {% translate "Use the Add / Refresh Corp Token button above to link a corporation's ESI token." %} {% endif %}

{% else %}

{% translate "No jobs match the current filter." %}

{% for job in jobs %}
{{ job.owner.corporation }} {{ job.get_state_display }}

{{ job.name }}

{{ job.get_career_display }}
{{ job.progress_current|intcomma }} / {{ job.progress_desired|intcomma }}
{{ job.reward_remaining|floatformat:2|intcomma }} {% translate "ISK left" %}
{{ job.expires|naturaltime }}
{% endfor %}
{% endif %} {% endblock %} {% block extra_script %} (function () { var searchInput = document.getElementById("fjt-search-input"); var grid = document.getElementById("fjt-grid"); var statusFilter = document.getElementById("fjt-status-filter"); var sortSelect = document.getElementById("fjt-sort"); if (!searchInput || !grid || !statusFilter || !sortSelect) { return; } var cards = grid.querySelectorAll(".fjt-job-col"); var originalOrder = Array.prototype.slice.call(cards); var emptyMessage = document.getElementById("fjt-search-empty"); function applyFilters() { var query = searchInput.value.trim().toLowerCase(); var status = statusFilter.value; var visibleCount = 0; cards.forEach(function (card) { var matchesQuery = card.dataset.search.indexOf(query) !== -1; var matchesStatus = status === "all" || card.dataset.status === status; var matches = matchesQuery && matchesStatus; card.classList.toggle("d-none", !matches); if (matches) { visibleCount += 1; } }); emptyMessage.classList.toggle("d-none", visibleCount !== 0); } function applySort() { var sort = sortSelect.value; if (sort === "default") { originalOrder.forEach(function (card) { grid.appendChild(card); }); return; } var sorted = Array.prototype.slice.call(cards).sort(function (a, b) { if (sort === "expires-asc") { var aExpires = a.dataset.expires === "" ? Infinity : Number(a.dataset.expires); var bExpires = b.dataset.expires === "" ? Infinity : Number(b.dataset.expires); return aExpires - bExpires; } if (sort === "reward-desc") { return Number(b.dataset.rewardRemaining) - Number(a.dataset.rewardRemaining); } return 0; }); sorted.forEach(function (card) { grid.appendChild(card); }); } searchInput.addEventListener("input", applyFilters); statusFilter.addEventListener("change", applyFilters); sortSelect.addEventListener("change", applySort); applyFilters(); })(); {% endblock extra_script %}