239 lines
9.7 KiB
HTML
239 lines
9.7 KiB
HTML
{% extends "portal_base.html" %}
|
|
{% load static %}
|
|
{% load i18n %}
|
|
{% block title %}{% if form.instance.pk %}{% trans "Reply to Message" %}{% else %}{% trans "Compose Message" %}{% endif %}{% endblock %}
|
|
|
|
{% block content %}
|
|
<div class="container-fluid">
|
|
<div class="row">
|
|
<div class="col-12">
|
|
<div class="card">
|
|
<div class="card-header">
|
|
<h5 class="mb-0">
|
|
{% if form.instance.pk %}
|
|
<i class="fas fa-reply"></i> Reply to Message
|
|
{% else %}
|
|
<i class="fas fa-envelope"></i> Compose Message
|
|
{% endif %}
|
|
</h5>
|
|
</div>
|
|
<div class="card-body">
|
|
{% if form.instance.parent_message %}
|
|
<div class="alert alert-info mb-4">
|
|
<strong>Replying to:</strong> {{ form.instance.parent_message.subject }}
|
|
<br>
|
|
<small class="text-muted">
|
|
From {{ form.instance.parent_message.sender.get_full_name|default:form.instance.parent_message.sender.username }}
|
|
on {{ form.instance.parent_message.created_at|date:"M d, Y H:i" }}
|
|
</small>
|
|
<div class="mt-2">
|
|
<strong>Original message:</strong>
|
|
<div class="border-start ps-3 mt-2">
|
|
{{ form.instance.parent_message.content|linebreaks }}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
|
|
<form method="post" id="messageForm">
|
|
{% csrf_token %}
|
|
|
|
<div class="row">
|
|
<div class="col-md-4">
|
|
<div class="mb-3">
|
|
<label for="{{ form.job.id_for_label }}" class="form-label">
|
|
Related Job <span class="text-danger">*</span>
|
|
</label>
|
|
{{ form.job }}
|
|
{% if form.job.errors %}
|
|
<div class="text-danger small mt-1">
|
|
{{ form.job.errors.0 }}
|
|
</div>
|
|
{% endif %}
|
|
<div class="form-text">
|
|
Select a job if this message is related to a specific position
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-4">
|
|
<div class="mb-3">
|
|
<label for="{{ form.recipient.id_for_label }}" class="form-label">
|
|
Recipient <span class="text-danger">*</span>
|
|
</label>
|
|
{{ form.recipient }}
|
|
|
|
{% if form.recipient.errors %}
|
|
<div class="text-danger small mt-1">
|
|
{{ form.recipient.errors.0 }}
|
|
</div>
|
|
{% endif %}
|
|
<div class="form-text">
|
|
Select the user who will receive this message
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-4">
|
|
<div class="mb-3">
|
|
<label for="{{ form.message_type.id_for_label }}" class="form-label">
|
|
Message Type <span class="text-danger">*</span>
|
|
</label>
|
|
{{ form.message_type }}
|
|
{% if form.message_type.errors %}
|
|
<div class="text-danger small mt-1">
|
|
{{ form.message_type.errors.0 }}
|
|
</div>
|
|
{% endif %}
|
|
<div class="form-text">
|
|
Select the type of message you're sending
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row">
|
|
<div class="col-md-6">
|
|
<div class="mb-3">
|
|
<label for="{{ form.subject.id_for_label }}" class="form-label">
|
|
Subject <span class="text-danger">*</span>
|
|
</label>
|
|
{{ form.subject }}
|
|
{% if form.subject.errors %}
|
|
<div class="text-danger small mt-1">
|
|
{{ form.subject.errors.0 }}
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="mb-3">
|
|
<label for="{{ form.content.id_for_label }}" class="form-label">
|
|
Message <span class="text-danger">*</span>
|
|
</label>
|
|
{{ form.content }}
|
|
{% if form.content.errors %}
|
|
<div class="text-danger small mt-1">
|
|
{{ form.content.errors.0 }}
|
|
</div>
|
|
{% endif %}
|
|
<div class="form-text">
|
|
Write your message here. You can use line breaks and basic formatting.
|
|
</div>
|
|
</div>
|
|
|
|
<div class="d-flex justify-content-between">
|
|
<a href="{% url 'message_list' %}" class="btn btn-secondary">
|
|
<i class="fas fa-times"></i> Cancel
|
|
</a>
|
|
<button type="submit" class="btn btn-main-action">
|
|
<i class="fas fa-paper-plane"></i>
|
|
{% if form.instance.pk %}
|
|
Send Reply
|
|
{% else %}
|
|
Send Message
|
|
{% endif %}
|
|
</button>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% endblock %}
|
|
|
|
{% block extra_css %}
|
|
<style>
|
|
#id_content {
|
|
min-height: 200px;
|
|
resize: vertical;
|
|
}
|
|
|
|
.form-select {
|
|
{% if form.recipient.field.widget.attrs.disabled %}
|
|
background-color: #f8f9fa;
|
|
{% endif %}
|
|
}
|
|
|
|
.border-start {
|
|
border-left: 3px solid #0d6efd;
|
|
}
|
|
|
|
.ps-3 {
|
|
padding-left: 1rem;
|
|
}
|
|
</style>
|
|
{% endblock %}
|
|
|
|
{% block extra_js %}
|
|
<script>
|
|
document.addEventListener('DOMContentLoaded', function() {
|
|
// Auto-resize textarea based on content
|
|
const textarea = document.getElementById('id_content');
|
|
if (textarea) {
|
|
textarea.addEventListener('input', function() {
|
|
this.style.height = 'auto';
|
|
this.style.height = (this.scrollHeight) + 'px';
|
|
});
|
|
|
|
// Set initial height
|
|
textarea.style.height = 'auto';
|
|
textarea.style.height = (textarea.scrollHeight) + 'px';
|
|
}
|
|
|
|
// Character counter for subject
|
|
const subjectField = document.getElementById('id_subject');
|
|
const maxLength = 200;
|
|
|
|
if (subjectField) {
|
|
// Add character counter display
|
|
const counter = document.createElement('small');
|
|
counter.className = 'text-muted';
|
|
counter.style.float = 'right';
|
|
subjectField.parentNode.appendChild(counter);
|
|
|
|
function updateCounter() {
|
|
const remaining = maxLength - subjectField.value.length;
|
|
counter.textContent = `${subjectField.value.length}/${maxLength} characters`;
|
|
if (remaining < 20) {
|
|
counter.className = 'text-warning';
|
|
} else {
|
|
counter.className = 'text-muted';
|
|
}
|
|
}
|
|
|
|
subjectField.addEventListener('input', updateCounter);
|
|
updateCounter();
|
|
}
|
|
|
|
// Form validation before submit
|
|
const form = document.getElementById('messageForm');
|
|
if (form) {
|
|
form.addEventListener('submit', function(e) {
|
|
const content = document.getElementById('id_content').value.trim();
|
|
const subject = document.getElementById('id_subject').value.trim();
|
|
const recipient = document.getElementById('id_recipient').value;
|
|
|
|
if (!recipient) {
|
|
e.preventDefault();
|
|
alert('Please select a recipient.');
|
|
return false;
|
|
}
|
|
|
|
if (!subject) {
|
|
e.preventDefault();
|
|
alert('Please enter a subject.');
|
|
return false;
|
|
}
|
|
|
|
if (!content) {
|
|
e.preventDefault();
|
|
alert('Please enter a message.');
|
|
return false;
|
|
}
|
|
});
|
|
}
|
|
});
|
|
</script>
|
|
{% endblock %}
|