first commit
This commit is contained in:
commit
b71ea45681
898 changed files with 138202 additions and 0 deletions
184
templates/_toasts.html
Normal file
184
templates/_toasts.html
Normal file
|
@ -0,0 +1,184 @@
|
|||
{% load static %}
|
||||
|
||||
<!-- Toast Container -->
|
||||
<div class="toast-container position-fixed top-0 start-0 p-3" style="z-index: 2000;">
|
||||
<!-- Django Messages Toast -->
|
||||
{% if messages %}
|
||||
{% for message in messages %}
|
||||
<div class="bs-toast toast fade {% if message.tags == 'error' %}bg-danger{% elif message.tags == 'success' %}bg-success{% elif message.tags == 'warning' %}bg-warning{% else %}bg-blue{% endif %} text-white border-0" role="alert" aria-live="assertive" aria-atomic="true">
|
||||
<div class="toast-header">
|
||||
<button type="button" class="btn-close" data-bs-dismiss="toast" aria-label="Close"></button>
|
||||
</div>
|
||||
<div class="toast-body d-flex align-items-center">
|
||||
{% if message.tags == 'error' %}
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-alert-circle me-2" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
|
||||
<path d="M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0"></path>
|
||||
<path d="M12 8v4"></path>
|
||||
<path d="M12 16h.01"></path>
|
||||
</svg>
|
||||
{% elif message.tags == 'success' %}
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-circle-check me-2" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
|
||||
<path d="M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0"></path>
|
||||
<path d="M9 12l2 2l4 -4"></path>
|
||||
</svg>
|
||||
{% elif message.tags == 'warning' %}
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-alert-triangle me-2" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
|
||||
<path d="M12 9v4"></path>
|
||||
<path d="M10.363 3.591l-8.106 13.534a1.914 1.914 0 0 0 1.636 2.871h16.214a1.914 1.914 0 0 0 1.636 -2.87l-8.106 -13.536a1.914 1.914 0 0 0 -3.274 0z"></path>
|
||||
<path d="M12 16h.01"></path>
|
||||
</svg>
|
||||
{% else %}
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-info-circle me-2" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
|
||||
<path d="M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0"></path>
|
||||
<path d="M12 9h.01"></path>
|
||||
<path d="M11 12h1v4h1"></path>
|
||||
</svg>
|
||||
{% endif %}
|
||||
{{ message }}
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
|
||||
<!-- JavaScript/AJAX Toast Template -->
|
||||
<div id="js-toast-template" class="bs-toast toast fade" role="alert" aria-live="assertive" aria-atomic="true" style="display: none;">
|
||||
<div class="toast-header">
|
||||
<button type="button" class="btn-close" data-bs-dismiss="toast" aria-label="Close"></button>
|
||||
</div>
|
||||
<div class="toast-body d-flex align-items-center">
|
||||
<!-- Icon will be inserted here -->
|
||||
<!-- Message will be inserted here -->
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
// Function to show toast from JavaScript/AJAX
|
||||
window.showToast = function(message, type = 'success') {
|
||||
// Clone the template
|
||||
const toastTemplate = document.getElementById('js-toast-template').cloneNode(true);
|
||||
|
||||
// Set message and style
|
||||
const toastBody = toastTemplate.querySelector('.toast-body');
|
||||
toastBody.textContent = message;
|
||||
|
||||
// Add icon based on type
|
||||
let iconHtml = '';
|
||||
switch(type) {
|
||||
case 'success':
|
||||
iconHtml = `<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-circle-check me-2" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
|
||||
<path d="M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0"></path>
|
||||
<path d="M9 12l2 2l4 -4"></path>
|
||||
</svg>`;
|
||||
break;
|
||||
case 'danger':
|
||||
iconHtml = `<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-alert-circle me-2" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
|
||||
<path d="M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0"></path>
|
||||
<path d="M12 8v4"></path>
|
||||
<path d="M12 16h.01"></path>
|
||||
</svg>`;
|
||||
break;
|
||||
case 'warning':
|
||||
iconHtml = `<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-alert-triangle me-2" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
|
||||
<path d="M12 9v4"></path>
|
||||
<path d="M10.363 3.591l-8.106 13.534a1.914 1.914 0 0 0 1.636 2.871h16.214a1.914 1.914 0 0 0 1.636 -2.87l-8.106 -13.536a1.914 1.914 0 0 0 -3.274 0z"></path>
|
||||
<path d="M12 16h.01"></path>
|
||||
</svg>`;
|
||||
break;
|
||||
default:
|
||||
iconHtml = `<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-info-circle me-2" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
|
||||
<path d="M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0"></path>
|
||||
<path d="M12 9h.01"></path>
|
||||
<path d="M11 12h1v4h1"></path>
|
||||
</svg>`;
|
||||
}
|
||||
toastBody.innerHTML = iconHtml + message;
|
||||
|
||||
// Set background color
|
||||
toastTemplate.classList.remove('bg-success', 'bg-danger', 'bg-warning', 'bg-blue');
|
||||
toastTemplate.classList.add(`bg-${type}`);
|
||||
toastTemplate.style.display = 'block';
|
||||
|
||||
// Add to container
|
||||
document.querySelector('.toast-container').appendChild(toastTemplate);
|
||||
|
||||
// Initialize and show toast
|
||||
const toast = new bootstrap.Toast(toastTemplate, {
|
||||
autohide: true,
|
||||
delay: 6000
|
||||
});
|
||||
toast.show();
|
||||
|
||||
// Remove from DOM after hiding
|
||||
toastTemplate.addEventListener('hidden.bs.toast', function () {
|
||||
this.remove();
|
||||
});
|
||||
}
|
||||
|
||||
// Initialize Django message toasts
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
const djangoToasts = document.querySelectorAll('.toast:not(#js-toast-template)');
|
||||
djangoToasts.forEach(toast => {
|
||||
const bsToast = new bootstrap.Toast(toast, {
|
||||
autohide: true,
|
||||
delay: 6000
|
||||
});
|
||||
bsToast.show();
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
{#<!-- Usage Examples -->#}
|
||||
{#<!--#}
|
||||
{#1. Django Messages (in views.py):#}
|
||||
{# from django.contrib import messages#}
|
||||
{# #}
|
||||
{# # Success message#}
|
||||
{# messages.success(request, 'عملیات با موفقیت انجام شد')#}
|
||||
{# #}
|
||||
{# # Error message#}
|
||||
{# messages.error(request, 'خطا در انجام عملیات')#}
|
||||
{# #}
|
||||
{# # Warning message#}
|
||||
{# messages.warning(request, 'هشدار: این عملیات قابل بازگشت نیست')#}
|
||||
{# #}
|
||||
{# # Info message#}
|
||||
{# messages.info(request, 'اطلاعات جدید در دسترس است')#}
|
||||
{##}
|
||||
{#2. JavaScript/AJAX Messages:#}
|
||||
{# // Success toast#}
|
||||
{# showToast('عملیات با موفقیت انجام شد', 'success');#}
|
||||
{# #}
|
||||
{# // Error toast#}
|
||||
{# showToast('خطا در انجام عملیات', 'danger');#}
|
||||
{# #}
|
||||
{# // Warning toast#}
|
||||
{# showToast('هشدار: این عملیات قابل بازگشت نیست', 'warning');#}
|
||||
{# #}
|
||||
{# // Info toast#}
|
||||
{# showToast('اطلاعات جدید در دسترس است', 'blue');#}
|
||||
{##}
|
||||
{#3. AJAX Example:#}
|
||||
{# $.ajax({#}
|
||||
{# url: '/your-endpoint/',#}
|
||||
{# method: 'POST',#}
|
||||
{# success: function(response) {#}
|
||||
{# if (response.success) {#}
|
||||
{# showToast('عملیات با موفقیت انجام شد', 'success');#}
|
||||
{# } else {#}
|
||||
{# showToast(response.error || 'خطا در انجام عملیات', 'danger');#}
|
||||
{# }#}
|
||||
{# },#}
|
||||
{# error: function() {#}
|
||||
{# showToast('خطا در ارتباط با سرور', 'danger');#}
|
||||
{# }#}
|
||||
{# });#}
|
||||
{#--> #}
|
Loading…
Add table
Add a link
Reference in a new issue