{% extends "base.html" %} {% block title %}Nowe ogłoszenie - Norda Biznes Partner{% endblock %} {% block head_extra %} {% endblock %} {% block extra_css %} {% endblock %} {% block content %}
Powrót do tablicy

Nowe ogłoszenie

Dodaj ogłoszenie biznesowe dla członków Norda Biznes

Ogłoszenie będzie widoczne przez 30 dni. Po tym czasie wygaśnie automatycznie.
{% if has_multiple_companies %}
Ogłoszenie będzie widoczne na profilu wybranej firmy
{% else %} {% endif %}

Przeciągnij obrazy lub kliknij tutaj (max 10 plików, JPG/PNG/GIF do 5MB)

📷 Dodaj zdjęcie z galerii

Anuluj
{% endblock %} {% block extra_js %} var quill = new Quill('#quill-editor', { theme: 'snow', placeholder: 'Opisz szczegółowo czego szukasz lub co oferujesz...', modules: { toolbar: [ ['bold', 'italic'], [{'list': 'ordered'}, {'list': 'bullet'}], ['link'], ['clean'] ] } }); // Sync Quill content to hidden textarea on form submit + validate non-empty. // Note: hidden textarea cannot use `required` (browser cannot show validation // UI on display:none fields, which silently blocks submit). (function() { var qc = document.getElementById('quill-editor'); // Restore from server-rendered textarea (e.g. after POST validation error) var initialDesc = document.getElementById('description').value; if (initialDesc) { quill.root.innerHTML = initialDesc; } // Toggle .field-valid on a .form-group based on a "is filled" check. function setValid(group, ok) { if (!group) return; if (ok) { group.classList.add('field-valid'); group.classList.remove('field-error'); } else { group.classList.remove('field-valid'); } } var titleEl = document.getElementById('title'); var titleGrp = titleEl.closest('.form-group'); var catEl = document.getElementById('category'); var catGrp = catEl.closest('.form-group'); var radios = document.querySelectorAll('input[name="listing_type"]'); var radiosGrp = radios.length ? radios[0].closest('.form-group') : null; var descGrp = qc ? qc.closest('.form-group') : null; function refreshTitle() { setValid(titleGrp, titleEl.value.trim().length > 0); } function refreshCat() { setValid(catGrp, catEl.value !== ''); } function refreshRadios() { var any = Array.from(radios).some(function(r) { return r.checked; }); setValid(radiosGrp, any); } function refreshDesc() { var html = quill.root.innerHTML; var ok = !(html === '


' || quill.getText().trim() === ''); setValid(descGrp, ok); if (ok && qc) qc.classList.remove('field-error'); } titleEl.addEventListener('input', refreshTitle); catEl.addEventListener('change', refreshCat); radios.forEach(function(r) { r.addEventListener('change', refreshRadios); }); quill.on('text-change', refreshDesc); // Initial pass — pre-filled fields (after POST validation error) get // their green check immediately on page load. refreshTitle(); refreshCat(); refreshRadios(); refreshDesc(); document.getElementById('classifiedForm').addEventListener('submit', function(e) { var html = quill.root.innerHTML; var empty = (html === '


' || quill.getText().trim() === ''); if (empty) { e.preventDefault(); qc && qc.classList.add('field-error'); qc && qc.scrollIntoView({behavior: 'smooth', block: 'center'}); quill.focus(); return; } qc && qc.classList.remove('field-error'); document.getElementById('description').value = html; }); })(); (function() { const dropzone = document.getElementById('dropzone'); if (!dropzone) return; const fileInput = document.getElementById('attachmentInput'); const previewsContainer = document.getElementById('previewsContainer'); const uploadCounter = document.getElementById('uploadCounter'); const MAX_FILES = 10; const MAX_SIZE = 5 * 1024 * 1024; const ALLOWED_TYPES = ['image/jpeg', 'image/png', 'image/gif']; let filesMap = new Map(); let fileIdCounter = 0; dropzone.addEventListener('click', () => fileInput.click()); dropzone.addEventListener('dragover', (e) => { e.preventDefault(); dropzone.classList.add('drag-over'); }); dropzone.addEventListener('dragleave', () => dropzone.classList.remove('drag-over')); dropzone.addEventListener('drop', (e) => { e.preventDefault(); dropzone.classList.remove('drag-over'); addFiles(Array.from(e.dataTransfer.files).filter(f => f.type.startsWith('image/'))); }); fileInput.addEventListener('change', (e) => { addFiles(Array.from(e.target.files)); fileInput.value = ''; }); // Paste from clipboard document.addEventListener('paste', (e) => { const desc = document.getElementById('description'); if (document.activeElement !== desc) return; const items = e.clipboardData?.items; if (!items) return; const pastedFiles = []; for (let i = 0; i < items.length; i++) { if (items[i].type.startsWith('image/')) { e.preventDefault(); const file = items[i].getAsFile(); if (file) pastedFiles.push(file); } } if (pastedFiles.length > 0) addFiles(pastedFiles); }); function addFiles(newFiles) { const availableSlots = MAX_FILES - filesMap.size; if (availableSlots <= 0) return; newFiles.slice(0, availableSlots).forEach(file => { if (file.size > MAX_SIZE || !ALLOWED_TYPES.includes(file.type)) return; const fileId = 'file_' + (fileIdCounter++); filesMap.set(fileId, file); createPreview(fileId, file); }); updateCounter(); syncFilesToInput(); } function createPreview(fileId, file) { const preview = document.createElement('div'); preview.className = 'upload-preview-item'; preview.dataset.fileId = fileId; const img = document.createElement('img'); const info = document.createElement('div'); info.className = 'preview-info'; info.textContent = file.name.substring(0, 15) + (file.name.length > 15 ? '...' : '') + ' (' + formatFileSize(file.size) + ')'; const removeBtn = document.createElement('button'); removeBtn.type = 'button'; removeBtn.className = 'remove-preview'; removeBtn.innerHTML = '×'; removeBtn.onclick = () => { filesMap.delete(fileId); preview.remove(); updateCounter(); syncFilesToInput(); }; preview.appendChild(img); preview.appendChild(info); preview.appendChild(removeBtn); previewsContainer.appendChild(preview); const reader = new FileReader(); reader.onload = (e) => { img.src = e.target.result; }; reader.readAsDataURL(file); } function updateCounter() { const count = filesMap.size; if (count === 0) { uploadCounter.textContent = ''; uploadCounter.classList.remove('limit-reached'); dropzone.style.display = 'block'; } else { uploadCounter.textContent = 'Wybrano: ' + count + '/' + MAX_FILES + ' plików'; uploadCounter.classList.toggle('limit-reached', count >= MAX_FILES); dropzone.style.display = count >= MAX_FILES ? 'none' : 'block'; } } function syncFilesToInput() { try { const dataTransfer = new DataTransfer(); filesMap.forEach(file => dataTransfer.items.add(file)); fileInput.files = dataTransfer.files; } catch (e) {} } // FormData fallback for mobile const form = dropzone.closest('form'); form.addEventListener('submit', function(e) { if (filesMap.size === 0) return; if (fileInput.files && fileInput.files.length > 0) return; e.preventDefault(); const formData = new FormData(form); formData.delete('attachments[]'); filesMap.forEach(file => formData.append('attachments[]', file)); fetch(form.action, { method: 'POST', body: formData }) .then(resp => { if (resp.redirected) { window.location.href = resp.url; } else { window.location.reload(); } }) .catch(() => alert('Błąd wysyłania')); }); function formatFileSize(bytes) { if (bytes < 1024) return bytes + ' B'; if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + ' KB'; return (bytes / (1024 * 1024)).toFixed(1) + ' MB'; } })(); {% endblock %}