emile 10 months ago
parent a6987e5e40
commit f8a91b5970

Binary file not shown.

@ -498,7 +498,7 @@ def add_note_modal(request, project_id=None):
def add_daily_report(request):
user = request.user
today = date.today()
statuses = Status.objects.filter(staff=user.staffprofile, date=today)
statuses = Status.objects.filter(staff=user.staffprofile, date_time__date=today)
if request.method == 'POST':
text = request.POST.get('text')
current_datetime = datetime.now()

@ -46,7 +46,6 @@ class OnlineUserConsumer(WebsocketConsumer):
offline_connections = connections.filter(online=False, last_seen__isnull=False).order_by('-last_seen')[:5]
sorted_connections = list(online_connections) + list(offline_connections)
online_users_ids = [connection.user.id for connection in online_connections]
online_users_ids = [connection.user.id for connection in online_connections]
customer_connections = []
staff_connections = []
for connection in sorted_connections:
@ -96,11 +95,51 @@ class NewStatusConsumer(WebsocketConsumer):
)
def new_status_event(self, event):
is_online = Connection.objects.all().filter(user=self.user, online=True)
status_id = event['status_id']
status = Status.objects.get(id=status_id)
context = {'status': status, 'new': True}
context = {'status': status, 'new': True, 'is_online': is_online,}
html = render_to_string("details_templates/partials/new-status-activity.html", context)
self.send(text_data=json.dumps({
'event_type': 'new_status',
'html': html,
}))
class UpdateStatusesTimeConsumer(WebsocketConsumer):
def connect(self):
self.user = self.scope['user']
async_to_sync(self.channel_layer.group_add)(
"new_statuses_time_group",
self.channel_name
)
self.accept()
def disconnect(self, close_code):
async_to_sync(self.channel_layer.group_discard)(
"new_statuses_time_group",
self.channel_name
)
def receive(self, text_data):
data = json.loads(text_data)
connections = Connection.objects.filter(online=True)
online_users_ids = [connection.user.id for connection in connections]
if data.get('event_type') == 'update_statuses_time':
event = {
'type': 'modify_status_time_handler',
'online_users_ids': online_users_ids,
}
async_to_sync(self.channel_layer.group_send)(
"new_statuses_time_group", event
)
def modify_status_time_handler(self, event):
today = datetime.now().date()
latest_statuses = Status.objects.filter(date_time__date=today).order_by('-id')
context = {'latest_statuses': latest_statuses}
html = render_to_string("details_templates/partials/recent-activities.html", context)
self.send(text_data=json.dumps({
'event_type': 'update_statuses_time',
'html': html,
'online_users_ids': event.get('online_users_ids', [])
}))

@ -4,6 +4,7 @@ from .consumers import *
websocket_urlpatterns = [
path("ws/online-users/", OnlineUserConsumer.as_asgi()),
path("ws/new-statuses/", NewStatusConsumer.as_asgi()),
path("ws/update-statuses-time/", UpdateStatusesTimeConsumer.as_asgi()),

@ -124,8 +124,19 @@
</div>
<div class="w-full flex flex-col py-3 users-activities fadeInAndUp" data-userId="{{ status.staff.user.id }}">
<div class="w-full flex flex-col justify-center items-start gap-3 bg-gray-50 pt-2 px-2 pb-6 rounded-md relative">
<style>
@keyframes fadeInAndUp {
from { opacity: 0; transform: translateY(12px); }
to { opacity: 1; transform: translateY(0px); }
}
.fade-in-up {
animation: fadeInAndUp 0.6s ease;
}
</style>
<div class="w-full flex flex-col py-3 users-activities fade-in-up" data-userId="{{ status.staff.user.id }}">
<div class="w-full flex flex-col justify-center items-start gap-3 bg-gray-200 pt-2 px-2 pb-6 rounded-md relative">
<div class="w-full flex justify-between items-center gap-2">
<div class="flex justify-start gap-2 cursor-pointer userRecentActivitiesButton"
data-modal-url="{% url 'userrecentativities' status.staff.user.id %}">
@ -136,10 +147,10 @@
</div>
<div id="connected"
class="w-[12px] h-[12px] absolute rounded-full bg-green-600 bottom-0 right-0 border-2 border-white">
class="w-[12px] h-[12px] absolute rounded-full bg-green-600 bottom-0 right-0 border-2 border-white {% if not is_online %} hidden {% endif %}">
</div>
<div id="not-connected"
class="w-[12px] h-[12px] absolute rounded-full bg-red-500 bottom-0 right-0 border-2 border-white">
class="w-[12px] h-[12px] absolute rounded-full bg-red-500 bottom-0 right-0 border-2 border-white {% if is_online %} hidden {% endif %}">
</div>
</div>
@ -192,12 +203,3 @@
</div>
</div>
<style>
@keyframes fadeInAndUp {
from { opacity: 0; transform: translateY(12px); }
to { opacity: 1; transform: translateY(0px); }
}
.fade-in-up {
animation: fadeInAndUp 0.6s ease;
}
</style>

@ -339,7 +339,6 @@
const html = data.html;
const ticketId = data.ticket_id;
console.log(ticketId);
// Remove the existing ticket row if it exists
const existingTicketRows = document.querySelectorAll(`.ticket-${ticketId}`);

@ -1216,6 +1216,7 @@
<!-- NEW STATUS CONSUMER -->
<script type="text/javascript" src='{% static "js/status/new-status-consumer.js" %}'></script>
<script type="text/javascript" src='{% static "js/status/update-status-time-consumer.js" %}'></script>
<!-- SIDE BAR SCRIPT -->
<script type="text/javascript" src='{% static "js/side-bar.js" %}'></script>

@ -733,6 +733,10 @@
<!-- SIDE BAR SCRIPT -->
<script type="text/javascript" src='{% static "js/online/online-consumer.js" %}'></script>
<!-- NEW STATUS CONSUMER -->
<script type="text/javascript" src='{% static "js/status/new-status-consumer.js" %}'></script>
<script type="text/javascript" src='{% static "js/status/update-status-time-consumer.js" %}'></script>
<!-- SIDE BAR SCRIPT -->
<script type="text/javascript" src='{% static "js/side-bar.js" %}'></script>

@ -1221,10 +1221,6 @@ video {
height: 16px;
}
.h-\[180px\] {
height: 180px;
}
.h-\[18px\] {
height: 18px;
}
@ -2912,10 +2908,6 @@ video {
line-height: 2.5rem;
}
.text-\[10px\] {
font-size: 10px;
}
.text-\[12px\] {
font-size: 12px;
}

@ -38,13 +38,11 @@ document.addEventListener("DOMContentLoaded", function () {
});
const onlineUsersIds = data.online_users_ids || [];
console.log(onlineUsersIds);
// Update user activity containers based on online status
const userActivityContainers = document.querySelectorAll(".users-activities");
userActivityContainers.forEach(container => {
const userId = container.getAttribute("data-userId");
console.log(userId);
if (onlineUsersIds.map(id => id.toString()).includes(userId)) {
container.querySelector("#connected").classList.remove("hidden");

@ -10,8 +10,11 @@
const data = JSON.parse(e.data);
if (data.event_type === 'new_status') {
const activityDiv = document.getElementById('activitiesContainer');
console.log(activityDiv);
activityDiv.insertAdjacentHTML('afterbegin', data.html);
const audio = new Audio('/static/notifications/new-status.mp3');
audio.play().catch(error => {
console.log('Error playing notification sound:', error);
});
}
};

@ -0,0 +1,50 @@
// WebSocket connection for new statuses
const ws_protocol = window.location.protocol === "https:" ? "wss" : "ws";
const newStatusesTimeSocketUrl = `${ws_protocol}://${window.location.host}/ws/update-statuses-time/`;
const newStatusesTimeSocket = new WebSocket(newStatusesTimeSocketUrl);
newStatusesTimeSocket.onopen = () => {
console.log('WebSocket connection to new statuses time established');
function sendUpdate() {
newStatusesTimeSocket.send(JSON.stringify({ 'event_type': 'update_statuses_time' }));
}
// Call sendUpdate every 1 minute (60000 milliseconds)
setInterval(sendUpdate, 60000);
// Call it immediately on load
sendUpdate();
};
newStatusesTimeSocket.onmessage = function(e) {
const data = JSON.parse(e.data);
if (data.event_type === 'update_statuses_time') {
const activityDiv = document.getElementById('activitiesContainer');
activityDiv.innerHTML = data.html;
// Update user activity containers based on online status
const onlineUsersIds = data.online_users_ids || [];
const userActivityContainers = document.querySelectorAll(".users-activities");
userActivityContainers.forEach(container => {
const userId = container.getAttribute("data-userId");
if (onlineUsersIds.map(id => id.toString()).includes(userId)) {
container.querySelector("#connected").classList.remove("hidden");
container.querySelector("#not-connected").classList.add("hidden");
} else {
container.querySelector("#connected").classList.add("hidden");
container.querySelector("#not-connected").classList.remove("hidden");
}
});
}
};
newStatusesTimeSocket.onclose = () => {
console.log('WebSocket connection to new statuses time closed');
};
newStatusesTimeSocket.onerror = (error) => {
console.log('WebSocket error:', error);
};
Loading…
Cancel
Save