496 lines
23 KiB
HTML
496 lines
23 KiB
HTML
{%- macro plural(value, suffix='s') -%}
|
|
{%- if value != 1 -%}
|
|
{{suffix}}
|
|
{%- endif -%}
|
|
{%- endmacro -%}
|
|
|
|
{%- macro random_image(path) -%}
|
|
{{- SITE_FULL_IMAGES ~ "/" ~ path ~ "/" ~ listdir('files/' ~ path)|seeded_random(p) ~ '?x=8' -}}
|
|
{%- endmacro -%}
|
|
|
|
{% macro post_meta(p) %}
|
|
{% if p.hole %}
|
|
{% if SITE_NAME == 'WPD' -%}
|
|
<a href='/h/{{p.hole}}' class="hole-flair font-weight-bold">{{p.hole|capitalize}}</a>
|
|
{%- else -%}
|
|
<a class="mr-2 font-weight-bold" href='/h/{{p.hole}}'>/h/{{p.hole}}</a>
|
|
{%- endif %}
|
|
{% endif %}
|
|
|
|
{% if p.hole and p.author.switched.exiler_username(p.hole) %}
|
|
<a><i class="fas fa-campfire text-danger" data-bs-toggle="tooltip" data-bs-placement="bottom" title="User has been exiled from /h/{{p.hole}} by @{{p.author.switched.exiler_username(p.hole)}}"></i></a>
|
|
{% endif %}
|
|
|
|
{% if p.bannedfor %}
|
|
<i class="fas fa-hammer-crash text-danger" data-bs-toggle="tooltip" data-bs-placement="bottom" title="User was banned for this post {{p.bannedfor}}"></i>
|
|
{% endif %}
|
|
|
|
{% if p.chuddedfor %}
|
|
<i class="fas fa-face-sleeping text-danger mr-1" data-bs-toggle="tooltip" data-bs-placement="bottom" title="User was chudded for this post {{p.chuddedfor}}"></i>
|
|
{% endif %}
|
|
|
|
{% for a in p.awards %}
|
|
<span class="mr-1">
|
|
{% if a.kind in ["emoji","emoji-hz"] %}
|
|
<img class="emoji-award-icon" alt='{{a.title}} Award given by @{{a.user.username}}: "{{a.note}}"' data-bs-toggle="tooltip" loading="lazy" src="{{SITE_FULL_IMAGES}}/e/{{a.note}}.webp" data-bs-toggle="tooltip" data-bs-placement="bottom" title='{{a.title}} Award given by @{{a.user.username}}: "{{a.note}}"'>
|
|
{% else %}
|
|
<i class="{{a.class_list}} px-1" data-bs-toggle="tooltip" data-bs-placement="bottom" title='{{a.title}} Award given by @{{a.user.username}}{% if a.kind in ["chud","namelock","flairlock"] %}: "{{a.note}}"{% endif %}'></i>
|
|
{% endif %}
|
|
</span>
|
|
{% endfor %}
|
|
|
|
{% with user = p.author %}
|
|
{%- include 'admin/shadowbanned_tooltip.html' -%}
|
|
{% endwith %}
|
|
|
|
{% if p.pinned %}
|
|
<i id='pinned-{{p.id}}' class="fas fa-thumbtack fa-rotate--45 pr-1 ml-1 mt-3 text-admin" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Pinned by @{{p.pinned}}" {% if p.pinned_utc %}data-onmouseover="pinned_timestamp('pinned-{{p.id}}')" data-timestamp={{p.pinned_utc}} data-nonce="{{g.nonce}}"{% endif %}></i>
|
|
{% endif %}
|
|
|
|
{% if p.hole_pinned %}
|
|
<i id='hole-pinned-{{p.id}}' class="fas fa-thumbtack fa-rotate--45 pr-1 ml-1 mt-3 text-blue" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Pinned to /h/{{p.hole}} by @{{p.hole_pinned}}"></i>
|
|
{% endif %}
|
|
|
|
{% if p.distinguished %}
|
|
<i class="fas fa-broom text-admin" data-bs-toggle="tooltip" data-bs-placement="bottom" title="
|
|
{%- if p.author.switched.mods_hole(p.hole) -%}
|
|
/h/{{p.hole}} mod
|
|
{%- else -%}
|
|
{{SITE_NAME}} admin
|
|
{%- endif -%}
|
|
, speaking officially"></i>
|
|
{% endif %}
|
|
|
|
{% if p.profile_pinned and request.path != '/' %}
|
|
<i class="fas fa-thumbtack fa-rotate--45 pr-1 ml-1 mt-3 text-admin" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Pinned to profile"></i>
|
|
{% endif %}
|
|
|
|
{% if p.nsfw %}
|
|
<span class="badge badge-danger text-small-extra mr-1">NSFW</span>
|
|
{% endif %}
|
|
|
|
{% if p.is_bot %}
|
|
<i class="fas fa-robot text-info" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Bot"></i>
|
|
{% endif %}
|
|
|
|
{% if p.is_blocking and not p.ghost %}
|
|
<i class="fas fa-user-minus text-warning" data-bs-toggle="tooltip" data-bs-placement="bottom" title="You're blocking this user."></i>
|
|
{% endif %}
|
|
|
|
{% if p.is_blocked and not p.ghost %}
|
|
<i class="fas fa-user-minus text-danger" data-bs-toggle="tooltip" data-bs-placement="bottom" title="This user is blocking you."></i>
|
|
{% endif %}
|
|
|
|
{% if p.draft %}
|
|
<span class="mr-2 badge border-warning border-1 text-small-extra">Draft</span>
|
|
{% endif %}
|
|
|
|
{% if p.active_reports(v) %}
|
|
<button type="button" class="btn btn-primary mx-1" style="padding:1px 5px; font-size:10px" data-nonce="{{g.nonce}}" data-toggleelement="#reports-{{p.id}}" data-toggleattr="d-none">{{p.active_reports(v)}} Report{{plural(p.active_reports(v))}}</button>
|
|
{% endif %}
|
|
|
|
{% if p.ghost %}
|
|
<span {% if p.distinguished %}class="mod {% if SITE_NAME == 'rDrama' %}mod-rdrama{% endif %}"{% endif %}>👻</span>
|
|
{% else %}
|
|
{% if FEATURES['PATRON_ICONS'] and p.author.switched.patron > 1 and p.author.switched.lifetimedonated_visible %}
|
|
<img loading="lazy" src="{{SITE_FULL_IMAGES}}/i/{{SITE_NAME}}/badges/2{{p.author.switched.patron}}.webp?b=13" class="patron-img" data-bs-toggle="tooltip" data-bs-placement="bottom" title="{{p.author.switched.patron_tooltip}}" alt="{{p.author.switched.patron_tooltip}}">
|
|
{% endif %}
|
|
|
|
{% if FEATURES['HOUSES'] and p.author.switched.house %}
|
|
<img loading="lazy" src="{{SITE_FULL_IMAGES}}/i/houses/{{p.author.switched.house}}.webp?x=8" class="house-img" data-bs-toggle="tooltip" data-bs-placement="bottom" title="House {{p.author.switched.house}}" alt="House {{p.author.switched.house}}">
|
|
{% endif %}
|
|
|
|
{% if p.author.switched.verified %}<i class="fas fa-badge-check align-middle ml-1 {% if p.author.switched.verified=='Glowiefied' %}glow{% endif %}" style="color:{% if p.author.switched.verifiedcolor %}#{{p.author.switched.verifiedcolor}}{% else %}#1DA1F2{% endif %}" data-bs-toggle="tooltip" data-bs-placement="bottom" title="{{p.author.switched.verified}}"></i>
|
|
{% endif %}
|
|
<a class="user-name text-decoration-none {% if not p.author.switched.earlylife %}unbreakable{% endif %}" href="{{p.author.switched.url}}" data-pop-info='{{p.author.switched.json_popover(v) | tojson}}' data-bs-placement="bottom" data-bs-toggle="popover" data-bs-trigger="manual" data-content-id="popover" tabindex="0" style="color: #{{p.author.switched.name_color}}; font-weight: bold">
|
|
<div class="profile-pic-30-wrapper" style="margin-top:9px;margin-bottom:9px">
|
|
<img loading="lazy" alt="@{{p.author.switched.username}}'s profile picture" src="{{p.author.switched.profile_url}}" class="profile-pic-30 mr-2">
|
|
{% if p.author.switched.hat_active(v)[0] -%}
|
|
<img class="profile-pic-30-hat hat" loading="lazy" src="{{p.author.switched.hat_active(v)[0]}}?x=8" data-bs-toggle="tooltip" data-bs-placement="bottom" title="{{p.author.switched.hat_active(v)[1]}}" alt="@{{p.author.switched.username}}'s hat">
|
|
{%- endif %}
|
|
</div>
|
|
<span {% if p.author.switched.patron and not p.distinguished %}class="patron" style="background-color:#{{p.author.switched.name_color}}"{% elif p.distinguished %}class="mod {% if SITE_NAME == 'rDrama' %}mod-rdrama{% endif %}"{% endif %} {% if p.author.switched.pride_username(v) %}pride_username{% endif %}>{{p.author_name}}</span>
|
|
</a>
|
|
{% if FEATURES['PRONOUNS'] %}
|
|
<span class="pronouns" style="color:#{{p.author.switched.flaircolor}} !important;border-color:#{{p.author.switched.flaircolor}} !important">{{p.author.switched.pronouns_display}}</span>
|
|
{% endif %}
|
|
{% if p.author.switched.flair_html %}
|
|
<bdi class="ml-2" style="color: #{{p.author.switched.flaircolor}}">{{p.author.switched.flair_html | safe}}</bdi>
|
|
{% endif %}
|
|
{% endif %}
|
|
<span class="ml-2 d-inline-block" data-bs-toggle="tooltip" data-bs-placement="bottom" data-nonce="{{g.nonce}}" data-onmouseover="timestamp(this, '{{p.created_utc}}')" id="timestamp-{{p.id}}"> {{p.age_string}}</span>
|
|
|
|
{% if not p.deleted_utc %}
|
|
<span class="ml-2 d-inline-block">({% if p.is_image %}image post{% elif p.is_video %}video post{% elif p.is_audio %}audio post{% elif p.domain %}<a href="/search/posts/?q=domain%3A{{p.domain}}" class="post-meta-domain" {% if v and v.newtab %}data-target="t" target="_blank"{% endif %}>{{p.domain|truncate(50, True)}}</a>{% else %}text post{% endif %})</span>
|
|
{% endif %}
|
|
|
|
{% if p.edited_utc %}
|
|
{% if v and (v.id == p.author_id or v.admin_level >= PERMS['VIEW_VERSIONS']) %}
|
|
<a href="/versions/{{p.fullname}}" class="ml-2 d-inline-block">Edited <span data-bs-toggle="tooltip" data-bs-placement="bottom" id="edited_timestamp-{{p.id}}" data-nonce="{{g.nonce}}" data-onmouseover="timestamp(this, '{{p.edited_utc}}')" class="linked_timestamp">{{p.edited_string}}</span></a>
|
|
{% else %}
|
|
<span class="ml-2 d-inline-block">Edited <span data-bs-toggle="tooltip" data-bs-placement="bottom" id="edited_timestamp-{{p.id}}" data-nonce="{{g.nonce}}" data-onmouseover="timestamp(this, '{{p.edited_utc}}')">{{p.edited_string}}</span></span>
|
|
{% endif %}
|
|
{% endif %}
|
|
<span class="ml-2 d-inline-block">{{p.views|commas}} thread views</span>
|
|
|
|
<a class="vertical-align ml-2" href="{{p.permalink}}">#{{p.id}}</a>
|
|
|
|
{% if p.ping_cost %}
|
|
<em class="ml-2">spent {{p.ping_cost|commas}} currency on pings</em>
|
|
{% endif %}
|
|
{% endmacro %}
|
|
|
|
|
|
|
|
{% macro emoji_btn(textarea_id, previous_modal) %}
|
|
<button type="button" class="btn btn-secondary format m-0 mr-1" data-nonce="{{g.nonce}}" data-onclick="openEmojiModal(this, '{{textarea_id}}')" data-bs-toggle="modal" data-bs-target="#emojiModal" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Add Emoji" {% if previous_modal %}data-previous-modal="{{previous_modal}}"{% endif %}>
|
|
<i class="fas fa-smile-beam"></i>
|
|
</button>
|
|
{% endmacro %}
|
|
|
|
{% macro gif_btn(textarea_id, previous_modal) %}
|
|
<button type="button" class="btn btn-secondary format m-0 mr-1 font-weight-bolder text-uppercase" data-nonce="{{g.nonce}}" data-onclick="show_gif_categories(this, '{{textarea_id}}')" data-bs-toggle="modal" data-bs-target="#gifModal" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Add GIF" {% if previous_modal %}data-previous-modal="{{previous_modal}}"{% endif %}>GIF</button>
|
|
{% endmacro %}
|
|
|
|
{% macro file_btn(input_id, disabled, image_only) %}
|
|
<label class="btn btn-secondary format m-0 {% if g.is_tor %}tor-disabled{% endif %}" for="{{input_id}}" {% if disabled %}disabled{% endif %}>
|
|
<span class="fas fa-{% if image_only %}image{% else %}file{% endif %}"></span>
|
|
<input autocomplete="off" id="{{input_id}}" accept="image/*{% if not image_only %}, video/*, audio/*{% endif %}" type="file" multiple="multiple" name="file" {% if g.is_tor or disabled %}disabled{% endif %} hidden>
|
|
</label>
|
|
{% endmacro %}
|
|
|
|
{% macro comment_reply_box(target_fullname, html_id, wrapper_css_classes="", subwrapper_css_classes="", hide="", enable_cancel_button=true) %}
|
|
<div class="comment-box-wrapper{% if wrapper_css_classes %} {{wrapper_css_classes}}{% endif %}" id="{{html_id}}">
|
|
{% if v %}
|
|
<div id="comment-form-space-{{target_fullname}}" class="comment-write {{subwrapper_css_classes}}">
|
|
<input hidden name="formkey" value="{{v|formkey}}" class="notranslate" translate="no">
|
|
<input hidden name="parent_fullname" value="{target_fullname}}">
|
|
<textarea required autocomplete="off" {% if not (p and p.id in ADMIGGER_THREADS) %}{% if v.longpost %}minlength="280"{% elif v.bird %}maxlength="140"{% endif %}{% endif %} minlength="1" maxlength="10000" data-preview="form-preview-{{target_fullname}}" data-nonce="{{g.nonce}}" data-oninput="markdown(this);charLimit('reply-form-body-{{target_fullname}}','charcount-{{target_fullname}}');handle_disabled(this)" id="reply-form-body-{{target_fullname}}" data-fullname="{{target_fullname}}" class="file-ta comment-box form-control rounded" name="body" placeholder="Add your comment..." rows="3"></textarea>
|
|
|
|
<div class="text-small font-weight-bold mt-1" id="charcount-{{target_fullname}}" style="right: 1rem; bottom: 0.5rem; z-index: 3"></div>
|
|
|
|
<div class="format-btns">
|
|
{{emoji_btn('reply-form-body-' ~ target_fullname)}}
|
|
{{gif_btn('reply-form-body-' ~ target_fullname)}}
|
|
{{file_btn('file-upload-reply-' ~ target_fullname)}}
|
|
</div>
|
|
|
|
{% if v.admin_level >= PERMS['ADMIN_NOTES'] and target_fullname.startswith('u_') %}
|
|
<div class="custom-control custom-checkbox mt-3 d-inline-block">
|
|
<input data-nonce="{{g.nonce}}" autocomplete="off" type="checkbox" class="custom-control-input" id="admin-note-{{target_fullname}}">
|
|
<label class="custom-control-label" for="admin-note-{{target_fullname}}">Admin Note</label>
|
|
</div>
|
|
{% endif %}
|
|
|
|
<button type="button" id="save-reply-to-{{target_fullname}}" class="btn btn-primary text-whitebtn ml-auto fl-r handle_disabled disabled" disabled data-nonce="{{g.nonce}}" data-onclick="post_comment('{{target_fullname}}', '{{hide}}')">Comment</button>
|
|
|
|
{% if enable_cancel_button %}
|
|
<button type="button" data-nonce="{{g.nonce}}" data-onclick="cancel('{{target_fullname}}')" class="btn btn-link text-muted ml-auto fl-r mr-3">Cancel</button>
|
|
{% endif %}
|
|
|
|
<span id="upload-prog-{{target_fullname}}" class="d-none mt-1 mr-2 fl-r">
|
|
<progress max="100"></progress>
|
|
<span></span>
|
|
</span>
|
|
|
|
<div id="form-preview-{{target_fullname}}" class="preview mb-3 mt-5"></div>
|
|
<div class="form-text text-small p-0 m-0"><a href="/formatting" data-target="t" target="_blank">Formatting help</a></div>
|
|
</div>
|
|
{% else %}
|
|
<div class="comment-write mt-4 mb-3 mx-3">
|
|
<textarea autocomplete="off" maxlength="10000" class="comment-box form-control rounded" name="body" placeholder="Add your comment..." rows="3" data-href="/login?redirect={{request.full_path | urlencode}}"></textarea>
|
|
</div>
|
|
|
|
<div class="card border-0 mt-4">
|
|
<div class="card-body">
|
|
<h5 class="card-title">Jump in the discussion.</h5>
|
|
<p class="card-text">No email address required.</p>
|
|
<div>
|
|
<a href="/signup?redirect={{request.full_path | urlencode}}" class="btn btn-primary">Sign up</a>
|
|
<a href="/login?redirect={{request.full_path | urlencode}}" class="btn btn-link text-muted">Sign in</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
{% endmacro %}
|
|
|
|
{% macro ghost_box(text1, text2, mode, extra_css) %}
|
|
{% if mode == 1 %}
|
|
<div id="ghost-town-box" class="text-center p-6"{% if extra_css %} style="{{extra_css}}"{% endif %}>
|
|
<span class="fa-stack fa-2x text-muted mb-4">
|
|
<i class="fas fa-square text-gray-500 opacity-25 fa-stack-2x"></i>
|
|
<i class="fas text-gray-500 fa-ghost fa-stack-1x text-lg"></i>
|
|
</span>
|
|
{% if text1 %}
|
|
<h5>{{text1|safe}}</h5>
|
|
<p></p>
|
|
{% endif %}
|
|
{% if text2 %}
|
|
<p class="text-muted">{{text2|safe}}</p>
|
|
{% endif %}
|
|
</div>
|
|
{% elif mode == 2 %}
|
|
<div id="ghost-town-box" class="text-center border-md rounded p-6"{% if extra_css %} style="{{extra_css}}"{% endif %}>
|
|
<i class="fas fa-ghost text-gray-500 mb-3" style="font-size: 3.5rem"></i>
|
|
<p class="font-weight-bold text-gray-500 mb-0">{{text1|safe}}</p>
|
|
</div>
|
|
{% endif %}
|
|
{% endmacro %}
|
|
|
|
{% macro alert(msg, error=false) %}
|
|
<div class="alert {% if error %}alert-danger{% else %}alert-success{% endif %} alert-dismissible fade show mb-3 mt-4">
|
|
<i class="fas {% if error %}fa-exclamation-circle{% else %}fa-check-circle{% endif %} my-auto"></i>
|
|
<span>{{msg}}</span>
|
|
<button type="button" class="close" data-bs-dismiss="alert">
|
|
<span><i class="fas fa-times"></i></span>
|
|
</button>
|
|
</div>
|
|
{% endmacro %}
|
|
|
|
{% macro reports(i, kind) %}
|
|
{% if i.active_reports(v) %}
|
|
<div id="reports-{{i.id}}" class="reports d-none">
|
|
<strong><i class="far fa-fw fa-flag"></i> Reported by:</strong>
|
|
<ul class="mt-1 mb-0" style="padding-left:20px;word-wrap:break-word">
|
|
{% for r in i.filtered_reports(v) %}
|
|
<li>
|
|
{% with user = r.user %}
|
|
{%- include 'admin/shadowbanned_tooltip.html' -%}
|
|
{% endwith %}
|
|
<a style="font-weight:bold" href="{{r.user.url}}">{{r.user.username}}</a>
|
|
{% if r.reason %}: {{r.realreason(v) | safe}}{% endif %}
|
|
{% if v and (v.id == r.user_id or v.admin_level >= PERMS['REPORTS_REMOVE']) %}
|
|
<button type="button" data-nonce="{{g.nonce}}" data-onclick="delReport(this,'/del_report/{{kind}}/{{r.parent_id}}/{{r.user_id}}')">[remove]</button>
|
|
{% endif %}
|
|
</li>
|
|
{% endfor %}
|
|
</ul>
|
|
</div>
|
|
{% endif %}
|
|
{% endmacro %}
|
|
|
|
{% macro chat_group_template(id, m) %}
|
|
<div class="chat-group">
|
|
<a class="font-weight-bold userlink" target="_blank" {% if m %}style="color:#{{m.namecolor}}" href="/@{{m.username}}" {% endif %}>
|
|
<div class="avatar profile-pic-20-wrapper">
|
|
<img loading="lazy" class="avatar-pic pp20 mr-1" {% if m %}src="/pp/{{m.user_id}}"{% endif %}>
|
|
<img class="avatar-hat profile-pic-20-hat hat" loading="lazy" {% if m %}src="{{m.hat}}"{% endif %}>
|
|
</div>
|
|
<span {% if m and m.patron %}class="username patron" style="background-color:#{{m.namecolor}}"{% else %}class="username"{% endif %} {% if m and m.pride_username %}pride_username{% endif %}>{% if m %}{{m.username}}{% endif %}</span>
|
|
</a>
|
|
<span class="text-black time ml-1 mb-3 text-center" {% if m %}data-time="{{m.created_utc}}"{% endif %}></span>
|
|
<input hidden class="user_id" {% if m %}value="{{m.user_id}}"{% endif %}>
|
|
{% endmacro %}
|
|
|
|
{% macro chat_line_template(id, m, vlink) %}
|
|
{% set mentioned = m and vlink in m.text_html or (m and m.quoted_message and m.quoted_message.user_id == v.id) %}
|
|
<div class="chat-line {% if mentioned %}chat-mention{% endif %}" {% if m %}id="{{id}}"{% endif %}>
|
|
<div class="d-flex align-items-center">
|
|
<div class="text-muted chat-line-content">
|
|
<div class="{% if not (m and m.quotes) %}d-none{% endif %} quotes" style="font-size:12px">
|
|
<a class="QuotedMessageLink" {% if m and m.quotes %}href="#{{m.quotes}}"{% endif %}>
|
|
<i class="fas fa-reply"></i>
|
|
<span class="text-primary">@<span class="QuotedUser">
|
|
{%- if m and m.quoted_message -%}
|
|
{{m.quoted_message.username}}
|
|
{%- endif -%}
|
|
</span></span>:
|
|
<em class="QuotedMessage">
|
|
{%- if m and m.quoted_message -%}
|
|
{%- if v.slurreplacer -%}
|
|
{{m.quoted_message.text_censored}}
|
|
{%- else -%}
|
|
{{m.quoted_message.text}}
|
|
{%- endif -%}
|
|
{%- endif -%}
|
|
</em>
|
|
</a>
|
|
</div>
|
|
|
|
<div class="d-flex">
|
|
<span class="chat-message text-black">
|
|
{% if m %}
|
|
{% if v.slurreplacer %}
|
|
{{m.text_html_censored | safe}}
|
|
{% else %}
|
|
{{m.text_html | safe}}
|
|
{% endif %}
|
|
{% endif %}
|
|
</span>
|
|
<span class="text d-none">
|
|
{%- if m -%}
|
|
{%- if v.slurreplacer -%}
|
|
{{m.text_censored}}
|
|
{%- else -%}
|
|
{{m.text}}
|
|
{%- endif -%}
|
|
{%- endif -%}
|
|
</span>
|
|
<i class="quote btn fas fa-reply ml-auto" data-nonce="{{g.nonce}}" data-onclick="quote(this)"></i>
|
|
{% if chat.id == 1 and v.admin_level >= PERMS.POST_COMMENT_MODERATION %}
|
|
<i class="btn del delconfirm fas fa-trash-alt"></i>
|
|
<i class="btn d-none del delmsg fas fa-trash-alt text-danger" data-nonce="{{g.nonce}}" data-onclick="del(this)"></i>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% endmacro %}
|
|
|
|
{% macro chat_window(vlink)%}
|
|
<div id="shrink">
|
|
<div id="chat-window" class="chat-window-{{chat.id}} container p-0">
|
|
{% set messages_list = messages.items()|list %}
|
|
{% for id, m in messages_list %}
|
|
{% set same = loop.index > 1 and m.user_id == messages_list[loop.index-2][1].user_id %}
|
|
{% if not same %}
|
|
{% if loop.index > 1 %}
|
|
</div>
|
|
{% endif %}
|
|
{{chat_group_template(id, m)}}
|
|
{% endif %}
|
|
{{chat_line_template(id, m, vlink)}}
|
|
{% endfor %}
|
|
</div>
|
|
</div>
|
|
|
|
<div class="mt-3"></div>
|
|
<div id="quotes" class="mt-3 ml-3 mb-2 d-none" style="font-size:12px">
|
|
<a id="QuotedMessageLink">
|
|
<i class="fas fa-reply"></i> <span class="text-primary">@<span id="QuotedUser"></span></span>: <em id="QuotedMessage"></em>
|
|
</a>
|
|
<button type="button" id="cancel" class="btn btn-secondary">Cancel</button>
|
|
<input hidden id="quotes_id">
|
|
</div>
|
|
|
|
<div id='message' class="position-relative form-group d-flex">
|
|
<div class="position-absolute text-muted text-small ml-1" style="bottom: -1.5rem; line-height: 1">
|
|
<span id="typing-indicator"></span>
|
|
</div>
|
|
|
|
{{emoji_btn('input-text-chat')}}
|
|
{{gif_btn('input-text-chat')}}
|
|
{{file_btn('file', False, True)}}
|
|
|
|
<textarea id="input-text-chat" minlength="1" maxlength="1000" {% if g.browser in ("iphone","mac") %}style="font-size:16px!important"{% endif %} class="file-ta form-control ml-2" placeholder="Message" autocomplete="off" autofocus rows="1"></textarea>
|
|
|
|
<i id="chatsend" data-nonce="{{g.nonce}}" data-onclick="send()" class="btn btn-secondary fas fa-reply ml-1 my-auto" style="transform:rotateY(180deg)"></i>
|
|
</div>
|
|
<div id="ghostdiv-chat" class="ghostdiv" style="display: none"><span></span></div>
|
|
</div>
|
|
{% endmacro %}
|
|
|
|
{% macro time_filter_buttons() %}
|
|
<div class="dropdown dropdown-actions mr-2">
|
|
<button type="button" class="btn btn-secondary dropdown-toggle" id="dropdownMenuButton" data-bs-toggle="dropdown">
|
|
<i class="fas fa-{{TIME_FILTERS[t]}} mr-2"></i>
|
|
{{t | capitalize}}
|
|
</button>
|
|
<div class="dropdown-menu" x-placement="bottom-start" style="position: absolute; will-change: transform; top: 0px; left: 0px">
|
|
{% for new_time, icon in TIME_FILTERS.items() %}
|
|
{% if t != new_time %}
|
|
<a class="dropdown-item" href="{{'t'|change_arg(new_time, request.full_path)|safe}}">
|
|
<i class="fas fa-{{icon}} mr-2"></i>
|
|
{{new_time | capitalize}}
|
|
</a>
|
|
{% endif %}
|
|
{% endfor %}
|
|
</div>
|
|
</div>
|
|
{% endmacro %}
|
|
|
|
{% macro sorting_buttons(sorts, saves_allowed, hot_allowed) %}
|
|
<div class="dropdown dropdown-actions">
|
|
<button type="button" class="btn btn-secondary dropdown-toggle" id="dropdownMenuButton2" data-bs-toggle="dropdown">
|
|
<i class="fas fa-{{sorts[sort]}} mr-1"></i>
|
|
{{sort | capitalize}}
|
|
</button>
|
|
<div class="dropdown-menu" x-placement="bottom-start" style="position: absolute; will-change: transform; top: 0px; left: 0px">
|
|
{% set sorts = sorts.items()|list %}
|
|
|
|
{% if not saves_allowed %}
|
|
{% set sorts = sorts[:-1] %}
|
|
{% endif %}
|
|
|
|
{% if not hot_allowed %}
|
|
{% set sorts = sorts[1:] %}
|
|
{% endif %}
|
|
|
|
{% for new_sort, icon in sorts %}
|
|
{% if sort != new_sort %}
|
|
<a class="dropdown-item" href="{{'sort'|change_arg(new_sort, request.full_path)|safe}}">
|
|
<i class="fas fa-{{icon}} mr-2"></i>
|
|
{{new_sort | capitalize}}
|
|
</a>
|
|
{% endif %}
|
|
{% endfor %}
|
|
</div>
|
|
</div>
|
|
{% endmacro %}
|
|
|
|
|
|
{% macro pagination(classes="pl-1 mt-4") %}
|
|
<ul class="pagination pagination-sm mb-0 {{classes}}">
|
|
{% if not size %}
|
|
{% set size = PAGE_SIZE %}
|
|
{% endif %}
|
|
{% set num_pages = (total / size) | round(0, 'ceil') | int %}
|
|
|
|
{% set start_point = page - 2 %}
|
|
{% if start_point < 1 %}
|
|
{% set start_point = 1 %}
|
|
{% endif %}
|
|
|
|
{% set end_point = start_point+4 %}
|
|
{% if end_point > num_pages %}
|
|
{% set start_point = start_point-(end_point-num_pages) %}
|
|
{% set end_point = num_pages %}
|
|
{% endif %}
|
|
|
|
{% if start_point < 1 %}
|
|
{% set start_point = 1 %}
|
|
{% endif %}
|
|
|
|
|
|
{% if start_point > 1 %}
|
|
<li class="page-item">
|
|
<small><a class="page-link" href="{{'page'|change_arg(1, request.full_path)|safe}}">1</a></small>
|
|
</li>
|
|
|
|
{% if start_point == 3 %}
|
|
<li class="page-item">
|
|
<small><a class="page-link" href="{{'page'|change_arg(2, request.full_path)|safe}}">2</a></small>
|
|
</li>
|
|
{% elif start_point != 2 %}
|
|
<li class="page-item">
|
|
<small class="page-link dots">...</small>
|
|
</li>
|
|
{% set start_point = start_point + 1 %}
|
|
{% endif %}
|
|
{% endif %}
|
|
|
|
{% for x in range(start_point, end_point+1) %}
|
|
<li class="page-item">
|
|
<small><a class="page-link {% if x == page %}active disabled{% endif %}" href="{{'page'|change_arg(x, request.full_path)|safe}}">{{x}}</a></small>
|
|
</li>
|
|
{% endfor %}
|
|
|
|
{% if end_point < num_pages %}
|
|
{% if end_point == num_pages-2 %}
|
|
<li class="page-item">
|
|
<small><a class="page-link" href="{{'page'|change_arg(num_pages-1, request.full_path)|safe}}">{{num_pages-1}}</a></small>
|
|
</li>
|
|
{% elif end_point != num_pages-1 %}
|
|
<li class="page-item">
|
|
<small class="page-link dots">...</small>
|
|
</li>
|
|
{% endif %}
|
|
|
|
<li class="page-item">
|
|
<small><a class="page-link" href="{{'page'|change_arg(num_pages, request.full_path)|safe}}">{{num_pages}}</a></small>
|
|
</li>
|
|
{% endif %}
|
|
</ul>
|
|
{% endmacro %}
|