Deimplement OSINT+ search
This commit is contained in:
@@ -312,9 +312,6 @@
|
||||
<a class="navbar-item" href="{% url 'ai_workspace' %}">
|
||||
AI
|
||||
</a>
|
||||
<a class="navbar-item" href="{% url 'osint_search' type='page' %}">
|
||||
Search
|
||||
</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
|
||||
@@ -5,8 +5,8 @@
|
||||
{% if widget_script_srcs %}data-gia-script-srcs="{{ widget_script_srcs|join:'|' }}"{% endif %}>
|
||||
<div id="widget-{{ unique }}" class="grid-stack-item" {% block widget_options %}{% if widget_options is None %}gs-w="6" gs-h="1" gs-y="20" gs-x="0"{% else %}{% autoescape off %}{{ widget_options }}{% endautoescape %}{% endif %}{% endblock %}>
|
||||
<div class="grid-stack-item-content">
|
||||
<nav class="panel gia-widget-panel">
|
||||
<p class="panel-heading gia-widget-heading">
|
||||
<section class="gia-widget-panel">
|
||||
<header class="gia-widget-heading">
|
||||
<span class="gia-widget-heading-main">
|
||||
<span class="icon is-small gia-widget-heading-icon">
|
||||
<i class="{{ widget_icon|default:'fa-solid fa-window-maximize' }}"></i>
|
||||
@@ -54,15 +54,15 @@
|
||||
{% include "mixins/partials/close-widget.html" %}
|
||||
{% endblock %}
|
||||
</span>
|
||||
</p>
|
||||
<article class="panel-block is-active gia-widget-body">
|
||||
</header>
|
||||
<div class="gia-widget-body">
|
||||
<div class="control gia-widget-control{% if widget_control_class %} {{ widget_control_class }}{% endif %}">
|
||||
{% block panel_content %}
|
||||
{% include window_content %}
|
||||
{% endblock %}
|
||||
</div>
|
||||
</article>
|
||||
</nav>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,20 +0,0 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block content %}
|
||||
<section class="section">
|
||||
<div class="container is-max-desktop">
|
||||
<div class="mb-4">
|
||||
<h1 class="title is-4 mb-2">Search</h1>
|
||||
<p class="subtitle is-6 mb-3">
|
||||
Unified lookup across contacts, identifiers, and messages, with advanced filters for source, date range, sentiment, sort, dedup, and reverse.
|
||||
</p>
|
||||
<div class="tags">
|
||||
<span class="tag is-light">Default Scope: All</span>
|
||||
<span class="tag is-light">Contacts + Messages</span>
|
||||
<span class="tag is-light">SIQTSRSS/ADR Controls</span>
|
||||
</div>
|
||||
</div>
|
||||
{% include "partials/osint/search-panel.html" %}
|
||||
</div>
|
||||
</section>
|
||||
{% endblock %}
|
||||
@@ -1,4 +1,4 @@
|
||||
<div class="box is-shadowless gia-send-composer{% if composer_class %} {{ composer_class }}{% endif %}">
|
||||
<div class="box is-shadowless gia-send-composer p-2 m-0{% if composer_class %} {{ composer_class }}{% endif %}">
|
||||
<div class="field has-addons gia-send-composer-row">
|
||||
<div class="control is-expanded gia-send-composer-input-wrap">
|
||||
<textarea
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<div
|
||||
id="{{ panel_id }}"
|
||||
class="compose-shell box"
|
||||
class="compose-shell box p-3 m-0"
|
||||
data-compose-panel="1"
|
||||
data-render-mode="{{ render_mode }}"
|
||||
data-csrf-token="{{ csrf_token }}"
|
||||
@@ -8,7 +8,7 @@
|
||||
data-initial-typing="{{ typing_state_json|default:'{}'|escape }}"
|
||||
data-cancel-send-url="{% url 'compose_cancel_send' %}"
|
||||
data-command-result-url="{% url 'compose_command_result' %}">
|
||||
<div class="compose-shell-head is-flex is-justify-content-space-between is-align-items-flex-start is-flex-wrap-wrap is-gap-2 mb-2">
|
||||
<div class="compose-shell-head is-flex is-justify-content-space-between is-align-items-flex-start is-flex-wrap-wrap is-gap-2 mb-1">
|
||||
<div>
|
||||
<p class="compose-shell-eyebrow is-size-7 has-text-weight-semibold mb-1">Manual Text Mode</p>
|
||||
<div class="compose-context-row">
|
||||
@@ -82,7 +82,7 @@
|
||||
|
||||
<div
|
||||
id="{{ panel_id }}-thread"
|
||||
class="compose-thread box is-shadowless"
|
||||
class="compose-thread box is-shadowless p-3 m-0"
|
||||
data-poll-url="{% url 'compose_thread' %}"
|
||||
data-service="{{ service }}"
|
||||
data-identifier="{{ identifier }}"
|
||||
@@ -112,26 +112,28 @@
|
||||
<input type="hidden" name="reply_to_message_id" value="">
|
||||
<input type="hidden" name="failsafe_arm" value="0">
|
||||
<input type="hidden" name="failsafe_confirm" value="0">
|
||||
<div class="compose-send-safety">
|
||||
<label class="checkbox is-size-7" for="{{ panel_id }}-manual-confirm">
|
||||
<input
|
||||
id="{{ panel_id }}-manual-confirm"
|
||||
type="checkbox"
|
||||
class="manual-confirm"
|
||||
name="manual_confirm"
|
||||
value="1"
|
||||
{% if not capability_send %}disabled{% endif %}>
|
||||
Confirm Send
|
||||
</label>
|
||||
{% if not capability_send %}
|
||||
<p class="help is-size-7 has-text-grey">Send disabled: {{ capability_send_reason }}</p>
|
||||
{% endif %}
|
||||
<div class="compose-form-main">
|
||||
<div class="compose-send-safety">
|
||||
<label class="checkbox is-size-7" for="{{ panel_id }}-manual-confirm">
|
||||
<input
|
||||
id="{{ panel_id }}-manual-confirm"
|
||||
type="checkbox"
|
||||
class="manual-confirm"
|
||||
name="manual_confirm"
|
||||
value="1"
|
||||
{% if not capability_send %}disabled{% endif %}>
|
||||
Confirm Send
|
||||
</label>
|
||||
{% if not capability_send %}
|
||||
<p class="help is-size-7 has-text-grey">Send disabled: {{ capability_send_reason }}</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% include "partials/bulma-send-composer.html" with composer_class="compose-composer-capsule" textarea_id=panel_id|add:"-textarea" textarea_class="compose-textarea" textarea_name="text" textarea_rows="1" textarea_placeholder="Type a message. Enter to send, Shift+Enter for newline." button_class="is-link is-light compose-send-btn" button_type="submit" button_disabled=True button_title=capability_send_reason|default_if_none:"" button_label="Send" button_icon_class=manual_icon_class %}
|
||||
</div>
|
||||
<div id="{{ panel_id }}-reply-banner" class="compose-reply-banner is-hidden">
|
||||
<span class="compose-reply-banner-label">Replying to:</span>
|
||||
<span id="{{ panel_id }}-reply-text" class="compose-reply-banner-text"></span>
|
||||
<button type="button" id="{{ panel_id }}-reply-clear" class="button is-white is-small compose-reply-clear-btn">Clear</button>
|
||||
</div>
|
||||
{% include "partials/bulma-send-composer.html" with composer_class="compose-composer-capsule" textarea_id=panel_id|add:"-textarea" textarea_class="compose-textarea" textarea_name="text" textarea_rows="1" textarea_placeholder="Type a message. Enter to send, Shift+Enter for newline." button_class="is-link is-light compose-send-btn" button_type="submit" button_disabled=True button_title=capability_send_reason|default_if_none:"" button_label="Send" button_icon_class=manual_icon_class %}
|
||||
</form>
|
||||
</div>
|
||||
|
||||
@@ -1,176 +0,0 @@
|
||||
<form
|
||||
class="osint-search-form box"
|
||||
method="get"
|
||||
action="{{ osint_search_url }}"
|
||||
hx-get="{{ osint_search_url }}"
|
||||
hx-trigger="change delay:120ms"
|
||||
hx-target="#osint-search-results"
|
||||
hx-swap="innerHTML">
|
||||
<div class="columns is-multiline">
|
||||
<div class="column is-4">
|
||||
<label class="label">Scope</label>
|
||||
<div class="select">
|
||||
<select name="scope">
|
||||
{% for option in scope_options %}
|
||||
<option
|
||||
value="{{ option.value }}"
|
||||
{% if option.value == selected_scope %}selected{% endif %}>
|
||||
{{ option.label }}
|
||||
</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="column is-4">
|
||||
<label class="label">Field</label>
|
||||
<div class="select">
|
||||
<select name="field">
|
||||
<option value="__all__" {% if selected_field == "__all__" %}selected{% endif %}>
|
||||
All Fields
|
||||
</option>
|
||||
{% for option in field_options %}
|
||||
<option
|
||||
value="{{ option.value }}"
|
||||
{% if option.value == selected_field %}selected{% endif %}>
|
||||
{{ option.label }}
|
||||
</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="column is-4">
|
||||
<label class="label">Rows Per Page</label>
|
||||
<div class="select">
|
||||
<select name="per_page">
|
||||
<option value="10" {% if selected_per_page == 10 %}selected{% endif %}>10</option>
|
||||
<option value="20" {% if selected_per_page == 20 %}selected{% endif %}>20</option>
|
||||
<option value="50" {% if selected_per_page == 50 %}selected{% endif %}>50</option>
|
||||
<option value="100" {% if selected_per_page == 100 %}selected{% endif %}>100</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="column is-9">
|
||||
<label class="label">Search Query</label>
|
||||
<input
|
||||
class="input"
|
||||
type="text"
|
||||
name="q"
|
||||
hx-get="{{ osint_search_url }}"
|
||||
hx-trigger="keyup changed delay:220ms"
|
||||
hx-include="closest form"
|
||||
hx-target="#osint-search-results"
|
||||
hx-swap="innerHTML"
|
||||
value="{{ search_query }}"
|
||||
placeholder="Search contacts, identifiers, and messages...">
|
||||
</div>
|
||||
<div class="column is-3">
|
||||
<label class="label"> </label>
|
||||
<div class="buttons">
|
||||
<button class="button is-link is-light is-fullwidth" type="submit">
|
||||
Search
|
||||
</button>
|
||||
<a class="button is-light is-fullwidth" href="{{ osint_search_url }}" style="margin-bottom: 0.55rem;">
|
||||
Reset
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<details style="margin-top: 0.45rem;">
|
||||
<summary class="has-text-weight-semibold">Advanced Filters (SIQTSRSS/ADR)</summary>
|
||||
<p class="help" style="margin: 0.1rem 0 0.2rem 0;">Tip: use inline tags like <code>tag:messages</code> or <code>tag:people</code> in the query to narrow All-scope results quickly.</p>
|
||||
<p class="help" style="margin: 0 0 0.35rem 0;"><strong>Source Service</strong>, <strong>From Date</strong>, <strong>To Date</strong>, and <strong>Sort Mode</strong> shape which results you see and in what order.</p>
|
||||
<div style="margin-top: 0.2rem;">
|
||||
<div class="columns is-multiline" style="margin-top: 0.3rem;">
|
||||
<div class="column is-12-mobile is-6-tablet is-4-desktop">
|
||||
<label class="label">Source Service</label>
|
||||
<div class="select">
|
||||
<select name="source">
|
||||
<option value="all" {% if selected_source == "all" %}selected{% endif %}>All</option>
|
||||
<option value="web" {% if selected_source == "web" %}selected{% endif %}>Web</option>
|
||||
<option value="xmpp" {% if selected_source == "xmpp" %}selected{% endif %}>XMPP</option>
|
||||
<option value="signal" {% if selected_source == "signal" %}selected{% endif %}>Signal</option>
|
||||
<option value="whatsapp" {% if selected_source == "whatsapp" %}selected{% endif %}>WhatsApp</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="column is-12"></div>
|
||||
|
||||
<div class="column is-12-mobile is-6-tablet is-3-desktop">
|
||||
<label class="label">From Date</label>
|
||||
<input
|
||||
class="input{% if selected_date_from %} date-has-value{% endif %}"
|
||||
type="date"
|
||||
name="date_from"
|
||||
value="{{ selected_date_from }}"
|
||||
aria-label="From date">
|
||||
</div>
|
||||
<div class="column is-12-mobile is-6-tablet is-3-desktop">
|
||||
<label class="label">To Date</label>
|
||||
<input
|
||||
class="input{% if selected_date_to %} date-has-value{% endif %}"
|
||||
type="date"
|
||||
name="date_to"
|
||||
value="{{ selected_date_to }}"
|
||||
aria-label="To date">
|
||||
</div>
|
||||
<div class="column is-12-mobile is-6-tablet is-3-desktop">
|
||||
<label class="label">Sort Mode</label>
|
||||
<div class="select">
|
||||
<select name="sort_mode">
|
||||
<option value="relevance" {% if selected_sort_mode == "relevance" %}selected{% endif %}>Relevance</option>
|
||||
<option value="recent" {% if selected_sort_mode == "recent" %}selected{% endif %}>Recent First</option>
|
||||
<option value="oldest" {% if selected_sort_mode == "oldest" %}selected{% endif %}>Oldest First</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="column is-12"></div>
|
||||
|
||||
<div class="column is-12-mobile is-6-tablet is-2-desktop">
|
||||
<label class="label">Min Sent.</label>
|
||||
<input class="input" type="number" step="0.01" min="-1" max="1" name="sentiment_min" value="{{ selected_sentiment_min }}">
|
||||
</div>
|
||||
<div class="column is-12-mobile is-6-tablet is-2-desktop">
|
||||
<label class="label">Max Sent.</label>
|
||||
<input class="input" type="number" step="0.01" min="-1" max="1" name="sentiment_max" value="{{ selected_sentiment_max }}">
|
||||
</div>
|
||||
|
||||
<div class="column is-12"></div>
|
||||
|
||||
<div class="column is-12">
|
||||
<label class="checkbox" style="margin-right: 0.9rem;">
|
||||
<input type="checkbox" name="annotate" value="1" {% if selected_annotate %}checked{% endif %}>
|
||||
Annotate snippets
|
||||
</label>
|
||||
<label class="checkbox" style="margin-right: 0.9rem;">
|
||||
<input type="checkbox" name="dedup" value="1" {% if selected_dedup %}checked{% endif %}>
|
||||
Deduplicate
|
||||
</label>
|
||||
<label class="checkbox">
|
||||
<input type="checkbox" name="reverse" value="1" {% if selected_reverse %}checked{% endif %}>
|
||||
Reverse output
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="content is-size-7" style="margin-top: 0.2rem;">
|
||||
<ul>
|
||||
<li><strong>Min/Max Sent.</strong>: sentiment bounds for people/contact results (-1 to 1).</li>
|
||||
<li><strong>Annotate snippets</strong>: shows contextual snippets around query hits.</li>
|
||||
<li><strong>Deduplicate</strong>: removes near-identical repeated rows.</li>
|
||||
<li><strong>Reverse output</strong>: reverses final result order after sorting.</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</details>
|
||||
</form>
|
||||
|
||||
<div id="osint-search-results">
|
||||
{% include "partials/results_table.html" %}
|
||||
</div>
|
||||
|
||||
<style>
|
||||
.date-has-value::-webkit-calendar-picker-indicator {
|
||||
filter: brightness(0) saturate(100%) invert(38%) sepia(85%) saturate(1820%) hue-rotate(201deg) brightness(96%) contrast(92%);
|
||||
}
|
||||
</style>
|
||||
Reference in New Issue
Block a user