Begin implementing modern tables
This commit is contained in:
parent
7e010bd9b8
commit
ba51922fe9
|
@ -35,11 +35,15 @@ INSTALLED_APPS = [
|
|||
"django.contrib.sessions",
|
||||
"django.contrib.messages",
|
||||
"django.contrib.staticfiles",
|
||||
"django_htmx",
|
||||
"crispy_forms",
|
||||
"crispy_bulma",
|
||||
"django_tables2",
|
||||
"django_tables2_bulma_template",
|
||||
]
|
||||
CRISPY_TEMPLATE_PACK = "bulma"
|
||||
CRISPY_ALLOWED_TEMPLATE_PACKS = ("bulma",)
|
||||
DJANGO_TABLES2_TEMPLATE = "django-tables2/bulma.html"
|
||||
|
||||
MIDDLEWARE = [
|
||||
"django.middleware.security.SecurityMiddleware",
|
||||
|
@ -49,6 +53,7 @@ MIDDLEWARE = [
|
|||
"django.contrib.auth.middleware.AuthenticationMiddleware",
|
||||
"django.contrib.messages.middleware.MessageMiddleware",
|
||||
"django.middleware.clickjacking.XFrameOptionsMiddleware",
|
||||
"django_htmx.middleware.HtmxMiddleware",
|
||||
]
|
||||
|
||||
ROOT_URLCONF = "app.urls"
|
||||
|
|
|
@ -51,7 +51,12 @@ from core.views.manage.threshold.threshold import (
|
|||
)
|
||||
|
||||
# Main tool pages
|
||||
from core.views.ui.drilldown import Drilldown, DrilldownSearch, ThresholdInfoModal
|
||||
from core.views.ui.drilldown import (
|
||||
Drilldown,
|
||||
DrilldownSearch,
|
||||
DrilldownTableView,
|
||||
ThresholdInfoModal,
|
||||
)
|
||||
from core.views.ui.insights import (
|
||||
Insights,
|
||||
InsightsChannels,
|
||||
|
|
|
@ -0,0 +1,32 @@
|
|||
{% load static %}
|
||||
{% load index %}
|
||||
{% include 'partials/notify.html' %}
|
||||
{% if table %}
|
||||
<div style="display: none" id="jsonData" data-json="{{ data }}">
|
||||
</div>
|
||||
|
||||
<div class="has-text-grey-light nowrap-parent">
|
||||
<div class="nowrap-child block">
|
||||
<i class="fa-solid fa-chart-mixed"></i>
|
||||
</div>
|
||||
<div class="nowrap-child">
|
||||
<p>fetched {{ results|length }} of {{ card }} hits in {{ took }}ms</p>
|
||||
</div>
|
||||
{% if exemption is not None %}
|
||||
<div class="nowrap-child">
|
||||
<i class="fa-solid fa-book-bible"></i>
|
||||
</div>
|
||||
{% else %}
|
||||
{% if redacted != 0 %}
|
||||
<div class="nowrap-child">
|
||||
<p>{{ redacted }} redacted</p>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="box">
|
||||
<div class="table-container">
|
||||
{% include 'ui/drilldown/table_results_partial.html' %}
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
|
@ -0,0 +1,71 @@
|
|||
{% extends 'django-tables2/bulma.html' %}
|
||||
|
||||
{% load django_tables2 %}
|
||||
|
||||
{% load i18n %}
|
||||
|
||||
{% block table.thead %}
|
||||
{% if table.show_header %}
|
||||
<thead {{ table.attrs.thead.as_html }}>
|
||||
<tr>
|
||||
{% for column in table.columns %}
|
||||
<th {{ column.attrs.th.as_html }}
|
||||
hx-post="{% querystring table.prefixed_order_by_field=column.order_by_alias.next %}"
|
||||
hx-headers='{"X-CSRFToken": "{{ csrf_token }}"}'
|
||||
hx-trigger="click"
|
||||
hx-target="div.table-container"
|
||||
hx-swap="outerHTML"
|
||||
hx-indicator=".progress"
|
||||
style="cursor: pointer;">
|
||||
{{ column.header }}
|
||||
</th>
|
||||
{% endfor %}
|
||||
</tr>
|
||||
</thead>
|
||||
{% endif %}
|
||||
{% endblock table.thead %}
|
||||
|
||||
{# Pagination block overrides #}
|
||||
{% block pagination.previous %}
|
||||
<li class="previous page-item">
|
||||
<div hx-post="{% querystring table.prefixed_page_field=table.page.previous_page_number %}"
|
||||
hx-headers='{"X-CSRFToken": "{{ csrf_token }}"}'
|
||||
hx-trigger="click"
|
||||
hx-target="div.table-container"
|
||||
hx-swap="outerHTML"
|
||||
hx-indicator=".progress"
|
||||
class="page-link">
|
||||
<span aria-hidden="true">«</span>
|
||||
{% trans 'previous' %}
|
||||
</div>
|
||||
</li>
|
||||
{% endblock pagination.previous %}
|
||||
{% block pagination.range %}
|
||||
{% for p in table.page|table_page_range:table.paginator %}
|
||||
<li class="page-item{% if table.page.number == p %} active{% endif %}">
|
||||
<div class="page-link"
|
||||
{% if p != '...' %}hx-post="{% querystring table.prefixed_page_field=p %}"{% endif %}
|
||||
hx-headers='{"X-CSRFToken": "{{ csrf_token }}"}'
|
||||
hx-trigger="click"
|
||||
hx-target="div.table-container"
|
||||
hx-swap="outerHTML"
|
||||
hx-indicator=".progress">
|
||||
{{ p }}
|
||||
</div>
|
||||
</li>
|
||||
{% endfor %}
|
||||
{% endblock pagination.range %}
|
||||
{% block pagination.next %}
|
||||
<li class="next page-item">
|
||||
<div hx-post="{% querystring table.prefixed_page_field=table.page.next_page_number %}"
|
||||
hx-headers='{"X-CSRFToken": "{{ csrf_token }}"}'
|
||||
hx-trigger="click"
|
||||
hx-target="div.table-container"
|
||||
hx-swap="outerHTML"
|
||||
hx-indicator=".progress"
|
||||
class="page-link">
|
||||
{% trans 'next' %}
|
||||
<span aria-hidden="true">»</span>
|
||||
</div>
|
||||
</li>
|
||||
{% endblock pagination.next %}
|
|
@ -3,7 +3,9 @@ import json
|
|||
from django.conf import settings
|
||||
from django.http import HttpResponse, JsonResponse
|
||||
from django.shortcuts import render
|
||||
from django.utils.html import format_html
|
||||
from django.views import View
|
||||
from django_tables2 import SingleTableMixin
|
||||
from rest_framework.parsers import FormParser
|
||||
from rest_framework.views import APIView
|
||||
|
||||
|
@ -14,6 +16,33 @@ from core.lib.threshold import (
|
|||
get_chans,
|
||||
get_users,
|
||||
)
|
||||
from core.views.ui.tables import DrilldownTable
|
||||
|
||||
|
||||
class DrilldownTableView(View, SingleTableMixin):
|
||||
table_class = DrilldownTable
|
||||
template_name = "ui/drilldown/table_results.html"
|
||||
paginate_by = 5
|
||||
|
||||
def post(self, request):
|
||||
context = query_results(request)
|
||||
table = DrilldownTable(context["results"])
|
||||
context["table"] = table
|
||||
del context["results"]
|
||||
if "message" in context:
|
||||
return render(request, self.template_name, context)
|
||||
|
||||
if self.request.htmx:
|
||||
print("IS HTMX")
|
||||
template_name = "ui/drilldown/table_results.html"
|
||||
else:
|
||||
print("IS NOT HTMX")
|
||||
template_name = "ui/drilldown/table_results_partial.html"
|
||||
|
||||
if context:
|
||||
return render(request, self.template_name, context)
|
||||
else:
|
||||
return HttpResponse("No results")
|
||||
|
||||
|
||||
class Drilldown(View):
|
||||
|
|
|
@ -0,0 +1,33 @@
|
|||
from django_tables2 import Table, Column
|
||||
|
||||
class DrilldownTable(Table):
|
||||
id = Column()
|
||||
host = Column()
|
||||
ident = Column()
|
||||
nick = Column()
|
||||
nick_id = Column()
|
||||
user_id = Column()
|
||||
msg = Column()
|
||||
msg_id = Column()
|
||||
net = Column()
|
||||
net_id = Column()
|
||||
num = Column()
|
||||
src = Column()
|
||||
ts = Column()
|
||||
type = Column()
|
||||
bot = Column()
|
||||
channel = Column()
|
||||
channel_category = Column()
|
||||
channel_category_id = Column()
|
||||
channel_category_nsfw = Column()
|
||||
channel_id = Column()
|
||||
channel_nsfw = Column()
|
||||
guild_member_count = Column()
|
||||
guild = Column()
|
||||
guild_id = Column()
|
||||
mode = Column()
|
||||
modearg = Column()
|
||||
sentiment = Column()
|
||||
status = Column()
|
||||
user = Column()
|
||||
version_sentiment = Column()
|
|
@ -7,4 +7,5 @@ stripe
|
|||
django-rest-framework
|
||||
numpy
|
||||
uwsgi
|
||||
pyroscope-io
|
||||
django-tables2
|
||||
django-tables2-bulma-template
|
||||
|
|
|
@ -6,3 +6,6 @@ opensearch-py
|
|||
stripe
|
||||
django-rest-framework
|
||||
numpy
|
||||
django-tables2
|
||||
django-tables2-bulma-template
|
||||
django-htmx
|
||||
|
|
|
@ -7,3 +7,5 @@ opensearch-py
|
|||
stripe
|
||||
django-rest-framework
|
||||
numpy
|
||||
django-tables2
|
||||
django-tables2-bulma-template
|
||||
|
|
Loading…
Reference in New Issue