New changes

main
emile 1 year ago
parent 2be01e4860
commit e0cdb10fab

Binary file not shown.

Binary file not shown.

@ -45,4 +45,5 @@ admin.site.register(DailyReport)
admin.site.register(BusinessType)
admin.site.register(PointActivity)
admin.site.register(Connection)
admin.site.register(Reaction)

@ -0,0 +1,25 @@
# Generated by Django 4.2.5 on 2024-03-22 17:00
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('osinacore', '0063_alter_connection_date'),
]
operations = [
migrations.CreateModel(
name='Reaction',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('emoji', models.CharField(max_length=15)),
('status', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osinacore.status')),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
),
]

@ -304,6 +304,12 @@ class Status(models.Model):
staff = models.ForeignKey(StaffProfile, on_delete=models.CASCADE, null=True,blank=True, related_name='staff')
class Reaction(models.Model):
status = models.ForeignKey(Status, on_delete=models.CASCADE)
emoji = models.CharField(max_length=15)
user = models.ForeignKey(User, on_delete=models.CASCADE)
class DailyReport(models.Model):

@ -3,6 +3,7 @@
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{% block title %} Osina {% endblock %}</title>

@ -15,7 +15,7 @@
</div>
<p class="text-xl text-secondosiblue text-center mt-3">Add Reaction</p>
{% csrf_token %}
<!-- EMOJIS CATEGORIES BAR -->
<div class="w-full px-3 py-1 bg-gray-200 rounded-md flex gap-2 items-center mt-5">
<div class="w-[30px] rounded-full selectedEmojiCategory p-1 emoji-category" data-category="smiley">
@ -43,6 +43,31 @@
</div>
</div>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>
$(document).ready(function() {
$('.emoji-category-container p').click(function() {
var statusId = $('#emojiPicker').data('statusId');
var emoji = $(this).text();
var csrftoken = $("[name=csrfmiddlewaretoken]").val(); // Fetch CSRF token from the page
$.ajax({
type: 'POST',
url: '/add_reaction/' + statusId + '/' + emoji + '/',
beforeSend: function(xhr, settings) {
xhr.setRequestHeader("X-CSRFToken", csrftoken); // Set CSRF token in request headers
},
success: function(response) {
location.reload();
},
error: function(xhr, errmsg, err) {
console.log(xhr.status + ": " + xhr.responseText);
}
});
});
});
</script>
<!-- EMOJIS CONTAINER -->
<div class="mt-5 emoji-container">
@ -152,7 +177,7 @@
</div>
<div class="relative">
<div class="cursor-pointer hover:scale-105 duration-500 transition-transform" id="emojiPicker">
<div class="cursor-pointer hover:scale-105 duration-500 transition-transform" id="emojiPicker" data-status-id="{{latest.status.id}}">
<img src="{% static 'images/icons/reactionicon.png' %}" class="w-[30px]">
</div>
</div>
@ -177,11 +202,13 @@
</button>
</div>
{% if latest.status.reaction_set.all %}
<div class="w-fit h-[30px] text-[16px] rounded-full bg-white p-2 shadow-md absolute -bottom-4 right-2 flex justify-center items-center border gap-1 border-gray-100">
<p class="mt-1">&#x1F604;</p>
<p class="mt-1">&#x1F605;</p>
<p class="mt-1">&#x1F340;</p>
{% for reaction in latest.status.reaction_set.all %}
<p class="mt-1">{{reaction.emoji}}</p>
{% endfor %}
</div>
{% endif %}
</div>
</div>
{% endfor %}

@ -68,7 +68,7 @@ urlpatterns = [
path('fetch_epics/', views.fetch_epics, name='fetch_epics'),
path('add_reaction/<int:status_id>/<str:emoji>/', views.add_reaction, name='add_reaction'),
#CUSTOMER DASHBOARD
path('customerdashboard/', views.customer_index, name='customerdashboard'),

@ -456,6 +456,18 @@ def get_updated_last_status(request):
# TO GET USER ACTIVITIES
def get_latest_activities(request):
latest_connections = Connection.objects.filter(
user__staffprofile__isnull=False
).values('user').annotate(
latest_connection=Max('date')
)
online_staff_profiles = []
for connection in latest_connections:
user_id = connection['user']
latest_connection = connection['latest_connection']
last_connection = Connection.objects.filter(user_id=user_id, date=latest_connection).first()
if last_connection.status == 'Online':
online_staff_profiles.append(last_connection.user.staffprofile)
if request.user.is_authenticated and request.user.is_superuser:
open_task_count = Task.objects.filter(status='Open').count()
working_on_task_count = Task.objects.filter(status='Working On').count()
@ -482,7 +494,8 @@ def get_latest_activities(request):
response_data = {
'total_tasks': total_tasks,
'latest_statuses_time_ago': latest_statuses_time_ago, # Include latest_statuses_time_ago in the context
'latest_statuses_time_ago': latest_statuses_time_ago,
'online_staff_profiles' : online_staff_profiles,
}
recent_activities = render_to_string('recent-activities.html', response_data)
@ -520,3 +533,17 @@ def customer_invoices(request, *args, **kwargs):
return render(request, 'customer_dashboard/listing_pages/customer-invoices.html', context)
def add_reaction(request, status_id, emoji):
status = get_object_or_404(Status, pk=status_id)
user = request.user
existing_reaction = Reaction.objects.filter(status=status, user=user).first()
if existing_reaction:
# If the user has already reacted, update the reaction
existing_reaction.emoji = emoji
existing_reaction.save()
return JsonResponse({'message': 'Reaction updated successfully.'})
else:
# If the user hasn't reacted yet, create a new reaction
new_reaction = Reaction.objects.create(status=status, emoji=emoji, user=user)
return JsonResponse({'message': 'Reaction added successfully.'})

@ -4,16 +4,18 @@ document.addEventListener('DOMContentLoaded', function () {
const emojiPicker = document.getElementById('emojiPicker');
const closeEmojiPicker = document.getElementById('closeEmojiPicker');
const emojiPickerContainer = document.getElementById('emojiPickerContainer');
let statusId;
emojiPicker.addEventListener('click', function () {
statusId = emojiPicker.dataset.statusId;
emojiPickerContainer.classList.remove('hidden');
console.log(statusId);
});
closeEmojiPicker.addEventListener('click', function () {
emojiPickerContainer.classList.add('hidden');
});
// To navigate between categories
const categories = document.querySelectorAll('.emoji-category');
const categoryContainers = document.querySelectorAll('.emoji-category-container');

Loading…
Cancel
Save