2023-11-02 16:28:33 +01:00
|
|
|
<!DOCTYPE html>
|
|
|
|
<html>
|
|
|
|
|
|
|
|
<head>
|
|
|
|
<title>Chats Protocols - AIL</title>
|
|
|
|
<link rel="icon" href="{{ url_for('static', filename='image/ail-icon.png') }}">
|
|
|
|
|
|
|
|
<!-- Core CSS -->
|
|
|
|
<link href="{{ url_for('static', filename='css/bootstrap4.min.css') }}" rel="stylesheet">
|
|
|
|
<link href="{{ url_for('static', filename='css/font-awesome.min.css') }}" rel="stylesheet">
|
|
|
|
<link href="{{ url_for('static', filename='css/dataTables.bootstrap.min.css') }}" rel="stylesheet">
|
|
|
|
|
|
|
|
<!-- JS -->
|
|
|
|
<script src="{{ url_for('static', filename='js/jquery.js')}}"></script>
|
|
|
|
<script src="{{ url_for('static', filename='js/popper.min.js')}}"></script>
|
|
|
|
<script src="{{ url_for('static', filename='js/bootstrap4.min.js')}}"></script>
|
|
|
|
<script src="{{ url_for('static', filename='js/jquery.dataTables.min.js')}}"></script>
|
|
|
|
<script src="{{ url_for('static', filename='js/dataTables.bootstrap.min.js')}}"></script>
|
2023-11-13 14:10:24 +01:00
|
|
|
<script src="{{ url_for('static', filename='js/d3.min.js')}}"></script>
|
2023-11-24 15:05:19 +01:00
|
|
|
<script src="{{ url_for('static', filename='js/d3/heatmap_week_hour.js')}}"></script>
|
2023-11-02 16:28:33 +01:00
|
|
|
|
2023-11-06 14:08:23 +01:00
|
|
|
<style>
|
|
|
|
.chat-message-left,
|
|
|
|
.chat-message-right {
|
|
|
|
display: flex;
|
|
|
|
flex-shrink: 0;
|
|
|
|
}
|
|
|
|
.chat-message-right {
|
|
|
|
flex-direction: row-reverse;
|
|
|
|
margin-left: auto
|
|
|
|
}
|
|
|
|
.divider:after,
|
|
|
|
.divider:before {
|
|
|
|
content: "";
|
|
|
|
flex: 1;
|
|
|
|
height: 2px;
|
|
|
|
background: #eee;
|
|
|
|
}
|
2023-11-15 14:12:50 +01:00
|
|
|
.message_image {
|
|
|
|
max-width: 50%;
|
|
|
|
filter: blur(5px);
|
|
|
|
}
|
2023-11-06 14:08:23 +01:00
|
|
|
</style>
|
|
|
|
|
2023-11-02 16:28:33 +01:00
|
|
|
</head>
|
|
|
|
<body>
|
|
|
|
|
|
|
|
{% include 'nav_bar.html' %}
|
|
|
|
|
|
|
|
<div class="container-fluid">
|
|
|
|
<div class="row">
|
|
|
|
|
|
|
|
{% include 'sidebars/sidebar_objects.html' %}
|
|
|
|
|
|
|
|
<div class="col-12 col-lg-10" id="core_content">
|
|
|
|
|
|
|
|
<div class="card my-3">
|
|
|
|
|
|
|
|
<div class="card-header" style="background-color:#d9edf7;font-size: 15px">
|
2023-11-24 15:05:19 +01:00
|
|
|
<h4 class="text-secondary">{% if chat['username'] %}{{ chat["username"]["id"] }} {% else %} {{ chat['name'] }}{% endif %} :</h4>
|
|
|
|
{% if chat['icon'] %}
|
|
|
|
<div><img src="{{ url_for('objects_image.image', filename=chat['icon'])}}" class="mb-2" alt="{{ chat['id'] }}" width="200" height="200"></div>
|
|
|
|
{% endif %}
|
2023-11-02 16:28:33 +01:00
|
|
|
<ul class="list-group mb-2">
|
|
|
|
<li class="list-group-item py-0">
|
|
|
|
<table class="table">
|
2023-11-06 14:08:23 +01:00
|
|
|
<thead class="">
|
2023-11-02 16:28:33 +01:00
|
|
|
<tr>
|
|
|
|
<th>Name</th>
|
|
|
|
<th>ID</th>
|
2023-11-07 15:24:40 +01:00
|
|
|
<th>Created at</th>
|
2023-11-02 16:28:33 +01:00
|
|
|
<th>First Seen</th>
|
|
|
|
<th>Last Seen</th>
|
|
|
|
<th>NB Sub-Channels</th>
|
2023-12-06 16:26:26 +01:00
|
|
|
<th>Participants</th>
|
2023-11-02 16:28:33 +01:00
|
|
|
</tr>
|
|
|
|
</thead>
|
|
|
|
<tbody style="font-size: 15px;">
|
|
|
|
<tr>
|
|
|
|
<td>{{ chat['name'] }}</td>
|
|
|
|
<td>{{ chat['id'] }}</td>
|
2023-11-07 15:24:40 +01:00
|
|
|
<td>{{ chat['created_at'] }}</td>
|
2023-11-06 14:08:23 +01:00
|
|
|
<td>
|
|
|
|
{% if chat['first_seen'] %}
|
|
|
|
{{ chat['first_seen'][0:4] }}-{{ chat['first_seen'][4:6] }}-{{ chat['first_seen'][6:8] }}
|
|
|
|
{% endif %}
|
|
|
|
</td>
|
|
|
|
<td>
|
|
|
|
{% if chat['last_seen'] %}
|
|
|
|
{{ chat['last_seen'][0:4] }}-{{ chat['last_seen'][4:6] }}-{{ chat['last_seen'][6:8] }}
|
|
|
|
{% endif %}
|
|
|
|
</td>
|
2023-11-02 16:28:33 +01:00
|
|
|
<td>{{ chat['nb_subchannels'] }}</td>
|
2023-12-06 16:26:26 +01:00
|
|
|
<td>
|
|
|
|
<a href="{{ url_for('chats_explorer.chats_explorer_chat_participants')}}?type=chat&subtype={{ chat['subtype'] }}&id={{ chat['id'] }}"><i class="far fa-user-circle"></i> {{ chat['nb_participants']}}</a>
|
|
|
|
</td>
|
2023-11-02 16:28:33 +01:00
|
|
|
</tr>
|
|
|
|
</tbody>
|
|
|
|
</table>
|
2023-11-06 16:38:31 +01:00
|
|
|
{% if chat['info'] %}
|
|
|
|
<li class="list-group-item py-0">
|
|
|
|
<pre class="my-0">{{ chat['info'] }}</pre>
|
2024-01-29 14:36:53 +01:00
|
|
|
{% if chat['translation_info'] %}
|
|
|
|
<hr class="m-1">
|
|
|
|
<pre class="my-0 text-secondary">{{ chat['translation_info'] }}</pre>
|
|
|
|
{% endif %}
|
2023-11-06 16:38:31 +01:00
|
|
|
</li>
|
|
|
|
{% endif %}
|
2023-11-02 16:28:33 +01:00
|
|
|
</li>
|
|
|
|
</ul>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
|
2023-11-06 14:08:23 +01:00
|
|
|
{% for tag in chat['tags_messages'] %}
|
|
|
|
<span class="badge badge-{{ bootstrap_label[loop.index0 % 5] }}">{{ tag }} <span class="badge badge-light">{{ chat['tags_messages'][tag] }}</span></span>
|
|
|
|
{% endfor %}
|
|
|
|
|
2023-11-02 16:28:33 +01:00
|
|
|
{% if chat['subchannels'] %}
|
2024-01-29 14:36:53 +01:00
|
|
|
<h4 class="mt-2">Sub-Channels:</h4>
|
2023-11-02 16:28:33 +01:00
|
|
|
<table id="tablesubchannels" class="table">
|
|
|
|
<thead class="bg-dark text-white">
|
|
|
|
<tr>
|
|
|
|
<th>Icon</th>
|
|
|
|
<th>Name</th>
|
|
|
|
<th>ID</th>
|
2023-11-07 15:24:40 +01:00
|
|
|
<th>Created at</th>
|
2023-11-02 16:28:33 +01:00
|
|
|
<th>First Seen</th>
|
|
|
|
<th>Last Seen</th>
|
2024-01-29 14:36:53 +01:00
|
|
|
<th><i class="fas fa-comment-dots"></i></th>
|
2023-11-02 16:28:33 +01:00
|
|
|
</tr>
|
|
|
|
</thead>
|
|
|
|
<tbody style="font-size: 15px;">
|
|
|
|
{% for meta in chat["subchannels"] %}
|
|
|
|
<tr>
|
|
|
|
<td>
|
|
|
|
<img src="{{ url_for('static', filename='image/ail-icon.png') }}" class="rounded-circle mr-1" alt="{{ meta['id'] }}" width="40" height="40">
|
|
|
|
</td>
|
2024-01-29 14:36:53 +01:00
|
|
|
<td>
|
|
|
|
<b>{{ meta['name'] }}</b>
|
|
|
|
{% if meta['translation_name'] %}
|
|
|
|
<div class="text-secondary">{{ meta['translation_name'] }}</div>
|
|
|
|
{% endif %}
|
|
|
|
</td>
|
2024-03-05 14:14:04 +01:00
|
|
|
<td><a href="{{ url_for('chats_explorer.objects_subchannel_messages') }}?subtype={{ meta['subtype'] }}&id={{ meta['id'] }}">{{ meta['id'] }}</a></td>
|
2023-11-07 15:24:40 +01:00
|
|
|
<td>{{ meta['created_at'] }}</td>
|
2023-11-06 14:08:23 +01:00
|
|
|
<td>
|
|
|
|
{% if meta['first_seen'] %}
|
|
|
|
{{ meta['first_seen'][0:4] }}-{{ meta['first_seen'][4:6] }}-{{ meta['first_seen'][6:8] }}
|
|
|
|
{% endif %}
|
|
|
|
</td>
|
|
|
|
<td>
|
|
|
|
{% if meta['last_seen'] %}
|
|
|
|
{{ meta['last_seen'][0:4] }}-{{ meta['last_seen'][4:6] }}-{{ meta['last_seen'][6:8] }}
|
|
|
|
{% endif %}
|
|
|
|
</td>
|
2023-11-02 16:28:33 +01:00
|
|
|
<td>{{ meta['nb_messages'] }}</td>
|
|
|
|
</tr>
|
|
|
|
{% endfor %}
|
|
|
|
</tbody>
|
|
|
|
</table>
|
|
|
|
|
|
|
|
{% endif %}
|
|
|
|
|
2024-03-05 10:56:36 +01:00
|
|
|
<h5 class="mx-5 mt-2 text-secondary">All Messages:</h5>
|
|
|
|
<div id="heatmapweekhourall"></div>
|
|
|
|
|
|
|
|
{% if not chat['subchannels'] %}
|
|
|
|
<h5 class="mx-5 text-secondary">This week:</h5>
|
|
|
|
<div id="heatmapweekhour"></div>
|
|
|
|
{% endif %}
|
2023-11-13 14:10:24 +01:00
|
|
|
|
2024-03-05 14:14:04 +01:00
|
|
|
{% with translate_url=url_for('chats_explorer.chats_explorer_chat', subtype=chat['subtype']), obj_id=chat['id'], pagination=chat['pagination'] %}
|
|
|
|
{% include 'chats_explorer/block_translation.html' %}
|
|
|
|
{% endwith %}
|
|
|
|
|
2023-11-06 14:08:23 +01:00
|
|
|
{% if chat['messages'] %}
|
|
|
|
|
2023-11-15 14:12:50 +01:00
|
|
|
<span class="mt-3">
|
2023-11-16 14:50:03 +01:00
|
|
|
{% include 'objects/image/block_blur_img_slider.html' %}
|
2023-11-15 14:12:50 +01:00
|
|
|
</span>
|
|
|
|
|
2023-12-11 00:46:15 +01:00
|
|
|
{% with obj_subtype=chat['subtype'], obj_id=chat['id'], url_endpoint=url_for("chats_explorer.chats_explorer_chat"), nb=chat['pagination']['nb'] %}
|
|
|
|
{% set date_from=chat['first_seen'] %}
|
|
|
|
{% set date_to=chat['last_seen'] %}
|
|
|
|
{% include 'block_obj_time_search.html' %}
|
|
|
|
{% endwith %}
|
2024-03-05 14:14:04 +01:00
|
|
|
{% with endpoint_url=url_for('chats_explorer.chats_explorer_chat', subtype=chat['subtype']), pagination=chat['pagination'] %}
|
2023-12-11 00:46:15 +01:00
|
|
|
{% set endpoint_url = endpoint_url + "&id=" + chat['id'] + "&nb=" + chat['pagination']['nb'] | string %}
|
|
|
|
{% if translation_target %}
|
|
|
|
{% set endpoint_url = endpoint_url + "&target=" + translation_target %}
|
|
|
|
{% endif %}
|
|
|
|
{% include 'chats_explorer/pagination.html' %}
|
|
|
|
{% endwith %}
|
2023-12-04 15:47:58 +01:00
|
|
|
|
2023-11-06 14:08:23 +01:00
|
|
|
<div class="position-relative">
|
|
|
|
<div class="chat-messages p-2">
|
|
|
|
|
|
|
|
{% for date in chat['messages'] %}
|
|
|
|
|
|
|
|
<div class="divider d-flex align-items-center mb-4">
|
|
|
|
<p class="text-center h2 mx-3 mb-0" style="color: #a2aab7;">
|
|
|
|
<span class="badge badge-secondary mb-2" id="date_section_{{ date }}">{{ date }}</span>
|
|
|
|
</p>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
{% for mess in chat['messages'][date] %}
|
|
|
|
|
2023-11-16 14:50:03 +01:00
|
|
|
{% with message=mess %}
|
|
|
|
{% include 'chats_explorer/block_message.html' %}
|
|
|
|
{% endwith %}
|
2023-11-06 14:08:23 +01:00
|
|
|
|
|
|
|
{% endfor %}
|
|
|
|
<br>
|
|
|
|
{% endfor %}
|
|
|
|
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
|
2024-03-05 14:14:04 +01:00
|
|
|
{% with endpoint_url=url_for('chats_explorer.chats_explorer_chat', subtype=chat['subtype']), pagination=chat['pagination'] %}
|
2023-12-11 00:46:15 +01:00
|
|
|
{% set endpoint_url = endpoint_url + "&id=" + chat['id'] + "&nb=" + chat['pagination']['nb'] | string %}
|
|
|
|
{% if translation_target %}
|
|
|
|
{% set endpoint_url = endpoint_url + "&target=" + translation_target %}
|
|
|
|
{% endif %}
|
|
|
|
{% include 'chats_explorer/pagination.html' %}
|
|
|
|
{% endwith %}
|
|
|
|
|
2023-11-06 14:08:23 +01:00
|
|
|
{% endif %}
|
|
|
|
|
2023-11-02 16:28:33 +01:00
|
|
|
</div>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<script>
|
|
|
|
$(document).ready(function(){
|
|
|
|
$("#page-Decoded").addClass("active");
|
2023-11-16 14:50:03 +01:00
|
|
|
$("#nav_chat").addClass("active");
|
2023-11-02 16:28:33 +01:00
|
|
|
|
|
|
|
{% if chat['subchannels'] %}
|
|
|
|
$('#tablesubchannels').DataTable({
|
|
|
|
"aLengthMenu": [[5, 10, 15, -1], [5, 10, 15, "All"]],
|
|
|
|
"iDisplayLength": 10,
|
2023-11-07 15:24:40 +01:00
|
|
|
"order": [[ 5, "desc" ]]
|
2023-11-02 16:28:33 +01:00
|
|
|
});
|
|
|
|
{% endif %}
|
|
|
|
});
|
|
|
|
|
|
|
|
function toggle_sidebar(){
|
|
|
|
if($('#nav_menu').is(':visible')){
|
|
|
|
$('#nav_menu').hide();
|
|
|
|
$('#side_menu').removeClass('border-right')
|
|
|
|
$('#side_menu').removeClass('col-lg-2')
|
|
|
|
$('#core_content').removeClass('col-lg-10')
|
|
|
|
}else{
|
|
|
|
$('#nav_menu').show();
|
|
|
|
$('#side_menu').addClass('border-right')
|
|
|
|
$('#side_menu').addClass('col-lg-2')
|
|
|
|
$('#core_content').addClass('col-lg-10')
|
|
|
|
}
|
|
|
|
}
|
2023-11-15 14:12:50 +01:00
|
|
|
|
2023-11-02 16:28:33 +01:00
|
|
|
</script>
|
|
|
|
|
2023-11-13 14:10:24 +01:00
|
|
|
|
|
|
|
<script>
|
2024-03-05 10:56:36 +01:00
|
|
|
d3.json("{{ url_for('chats_explorer.chats_explorer_messages_stats_week_all') }}?type=chat&subtype={{ chat['subtype'] }}&id={{ chat['id'] }}")
|
|
|
|
.then(function(data) {
|
|
|
|
create_heatmap_week_hour('#heatmapweekhourall', data);
|
|
|
|
})
|
2023-11-24 15:05:19 +01:00
|
|
|
|
2024-03-05 10:56:36 +01:00
|
|
|
{% if not chat['subchannels'] %}
|
|
|
|
d3.json("{{ url_for('chats_explorer.chats_explorer_messages_stats_week') }}?type=chat&subtype={{ chat['subtype'] }}&id={{ chat['id'] }}")
|
2023-11-24 15:05:19 +01:00
|
|
|
.then(function(data) {
|
|
|
|
create_heatmap_week_hour('#heatmapweekhour', data);
|
|
|
|
})
|
2024-03-05 10:56:36 +01:00
|
|
|
{% endif %}
|
2023-11-24 15:05:19 +01:00
|
|
|
|
2023-11-13 14:10:24 +01:00
|
|
|
/*
|
|
|
|
|
|
|
|
// set the dimensions and margins of the graph
|
|
|
|
const margin = {top: 30, right: 30, bottom: 30, left: 30},
|
|
|
|
width = 450 - margin.left - margin.right,
|
|
|
|
height = 450 - margin.top - margin.bottom;
|
|
|
|
|
|
|
|
// append the svg object to the body of the page
|
|
|
|
const svg = d3.select("#my_dataviz")
|
|
|
|
.append("svg")
|
|
|
|
.attr("width", width + margin.left + margin.right)
|
|
|
|
.attr("height", height + margin.top + margin.bottom)
|
|
|
|
.append("g")
|
|
|
|
.attr("transform", `translate(${margin.left},${margin.top})`);
|
|
|
|
|
|
|
|
// Labels of row and columns
|
|
|
|
const myGroups = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J"]
|
|
|
|
const myVars = ["v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10"]
|
|
|
|
|
|
|
|
//Read the data
|
|
|
|
d3.csv("").then( function(data) {
|
|
|
|
|
|
|
|
// Labels of row and columns -> unique identifier of the column called 'group' and 'variable'
|
|
|
|
const myGroups = Array.from(new Set(data.map(d => d.group)))
|
|
|
|
const myVars = Array.from(new Set(data.map(d => d.variable)))
|
|
|
|
|
|
|
|
// Build X scales and axis:
|
|
|
|
const x = d3.scaleBand()
|
|
|
|
.range([ 0, width ])
|
|
|
|
.domain(myGroups)
|
|
|
|
.padding(0.05);
|
|
|
|
svg.append("g")
|
|
|
|
.style("font-size", 15)
|
|
|
|
.attr("transform", `translate(0, ${height})`)
|
|
|
|
.call(d3.axisBottom(x).tickSize(0))
|
|
|
|
.select(".domain").remove()
|
|
|
|
|
|
|
|
// Build Y scales and axis:
|
|
|
|
const y = d3.scaleBand()
|
|
|
|
.range([ height, 0 ])
|
|
|
|
.domain(myVars)
|
|
|
|
.padding(0.01);
|
|
|
|
svg.append("g")
|
|
|
|
.style("font-size", 15)
|
|
|
|
.call(d3.axisLeft(y).tickSize(0))
|
|
|
|
.select(".domain").remove()
|
|
|
|
|
|
|
|
// Build color scale
|
|
|
|
const myColor = d3.scaleSequential()
|
|
|
|
.interpolator(d3.interpolateInferno)
|
|
|
|
.domain([1,100])
|
|
|
|
|
|
|
|
// create a tooltip
|
|
|
|
const tooltip = d3.select("#my_dataviz")
|
|
|
|
.append("div")
|
|
|
|
.style("opacity", 0)
|
|
|
|
.attr("class", "tooltip")
|
|
|
|
.style("background-color", "white")
|
|
|
|
.style("border", "solid")
|
|
|
|
.style("border-width", "2px")
|
|
|
|
.style("border-radius", "5px")
|
|
|
|
.style("padding", "5px")
|
|
|
|
|
|
|
|
// Three function that change the tooltip when user hover / move / leave a cell
|
|
|
|
const mouseover = function(event,d) {
|
|
|
|
tooltip.style("opacity", 1)
|
|
|
|
d3.select(this)
|
|
|
|
.style("stroke", "black")
|
|
|
|
.style("opacity", 1)
|
|
|
|
}
|
|
|
|
const mousemove = function(event,d) {
|
|
|
|
tooltip.html("The exact value of<br>this cell is: " + d)
|
|
|
|
.style("left", (event.x)/2 + "px")
|
|
|
|
.style("top", (event.y)/2 + "px")
|
|
|
|
}
|
|
|
|
const mouseleave = function(d) {
|
|
|
|
tooltip.style("opacity", 0)
|
|
|
|
d3.select(this)
|
|
|
|
.style("stroke", "none")
|
|
|
|
.style("opacity", 0.8)
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
svg.selectAll()
|
|
|
|
.data(data, function(d) {return d.group+':'+d.variable;})
|
|
|
|
.join("rect")
|
|
|
|
.attr("x", function(d) { return x(d.group) })
|
|
|
|
.attr("y", function(d) { return y(d.variable) })
|
|
|
|
.attr("rx", 4)
|
|
|
|
.attr("ry", 4)
|
|
|
|
.attr("width", x.bandwidth() )
|
|
|
|
.attr("height", y.bandwidth() )
|
|
|
|
.style("fill", function(d) { return myColor(d.value)} )
|
|
|
|
.style("stroke-width", 4)
|
|
|
|
.style("stroke", "none")
|
|
|
|
.style("opacity", 0.8)
|
|
|
|
.on("mouseover", mouseover)
|
|
|
|
.on("mousemove", mousemove)
|
|
|
|
.on("mouseleave", mouseleave)
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
*/
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
2023-11-02 16:28:33 +01:00
|
|
|
</body>
|
|
|
|
|
|
|
|
</html>
|