add: profile and full search

This commit is contained in:
trisua 2025-05-18 16:43:56 -04:00
parent b8b0ef7f21
commit 3e4ee8126a
52 changed files with 897 additions and 484 deletions

View file

@ -50,23 +50,23 @@
<h3 id="username" class="username flex items-center gap-2 flex-wrap w-full">
<span class="name shorter">{{ components::username(user=profile) }}</span>
{% if profile.is_verified %}
{% if profile.is_verified -%}
<span title="Verified" style="color: var(--color-primary);" class="flex items-center">
{{ icon "badge-check" }}
</span>
{% endif %}
{%- endif %}
{% if profile.permissions|has_supporter %}
{% if profile.permissions|has_supporter -%}
<span title="Supporter" style="color: var(--color-primary);" class="flex items-center">
{{ icon "star" }}
</span>
{% endif %}
{%- endif %}
{% if profile.permissions|has_staff_badge %}
{% if profile.permissions|has_staff_badge -%}
<span title="Staff" style="color: var(--color-primary);" class="flex items-center">
{{ icon "shield-user" }}
</span>
{% endif %}
{%- endif %}
</h3>
<span class="fade">{{ profile.username }}</span>
@ -77,9 +77,9 @@
class="card flex flex-col items-center gap-2"
id="social"
>
{% if profile.settings.status %}
{% if profile.settings.status -%}
<p>{{ profile.settings.status }}</p>
{% endif %}
{%- endif %}
<div class="w-full flex">
<a
@ -98,14 +98,14 @@
</a>
</div>
{% if is_following_you %}
{% if is_following_you -%}
<b
class="notification chip w-content flex items-center gap-2"
>
{{ icon "heart" }}
<span>Follows you</span>
</b>
{% endif %}
{%- endif %}
</div>
</div>
@ -117,11 +117,11 @@
<div class="card flex flex-col gap-2">
<!-- prettier-ignore -->
<div style="display: contents;">
{% if profile.connections.Spotify and profile.connections.Spotify[0].data.name %}
{% if profile.connections.Spotify and profile.connections.Spotify[0].data.name -%}
{{ components::spotify_playing(state=profile.connections.Spotify[1]) }}
{% elif profile.connections.LastFm and profile.connections.LastFm[0].data.name %}
{{ components::last_fm_playing(state=profile.connections.LastFm[1]) }}
{% endif %}
{%- endif %}
</div>
<div class="w-full flex justify-between items-center">
@ -157,21 +157,21 @@
</span>
</div>
</div>
{% endif %}
{%- endif %}
</div>
</div>
{% if not is_self and user %}
{% if not is_self and user -%}
<div class="card-nest">
<div class="card small">
<b>{{ text "auth:label.relationship" }}</b>
</div>
<div class="card flex gap-2 flex-wrap">
{% if not is_blocking %}
{% if not is_blocking -%}
<button
onclick="toggle_follow_user(event)"
class="{% if is_following %} hidden{% endif %}"
class="{% if is_following -%} hidden{%- endif %}"
atto_tag="user.follow"
>
{{ icon "user-plus" }}
@ -180,7 +180,7 @@
<button
onclick="toggle_follow_user(event)"
class="quaternary red{% if not is_following %} hidden{% endif %}"
class="quaternary red{% if not is_following -%} hidden{%- endif %}"
atto_tag="user.unfollow"
>
{{ icon "user-minus" }}
@ -202,7 +202,7 @@
{{ icon "shield-off" }}
<span>{{ text "auth:action.unblock" }}</span>
</button>
{% endif %} {% if not user.settings.private_chats or
{%- endif %} {% if not user.settings.private_chats or
is_following_you %}
<button
onclick="create_group_chat()"
@ -211,7 +211,7 @@
{{ icon "message-circle" }}
<span>{{ text "auth:action.message" }}</span>
</button>
{% endif %} {% if is_helper %}
{%- endif %} {% if is_helper -%}
<a
href="/mod_panel/profile/{{ profile.id }}"
class="button quaternary"
@ -219,7 +219,7 @@
{{ icon "shield" }}
<span>{{ text "general:action.manage" }}</span>
</a>
{% endif %}
{%- endif %}
<script>
globalThis.create_group_chat = async () => {
@ -320,7 +320,7 @@
</script>
</div>
</div>
{% endif %} {% if not profile.settings.private_communities or
{%- endif %} {% if not profile.settings.private_communities or
is_self or is_helper %}
<div class="card-nest">
<div class="card small flex gap-2 items-center">
@ -337,7 +337,7 @@
{% endfor %}
</div>
</div>
{% endif %}
{%- endif %}
<div class="flex flex-col gap-2" id="connections">
{% for key, value in profile.connections %} {% if
@ -355,7 +355,7 @@
{{ icon "external-link" }}
</button>
</a>
{% endif %} {% endfor %}
{%- endif %} {% endfor %}
</div>
</div>
@ -365,7 +365,7 @@
</div>
</div>
</article>
{% if not is_self and profile.settings.warning %}
{% if not is_self and profile.settings.warning -%}
<script>
setTimeout(() => {
// check for warning
@ -376,5 +376,5 @@
]);
}, 150);
</script>
{% endif %} {% if not use_user_theme %} {{ components::theme(user=profile,
theme_preference=profile.settings.profile_theme) }} {% endif %} {% endblock %}
{%- endif %} {% if not use_user_theme -%} {{ components::theme(user=profile,
theme_preference=profile.settings.profile_theme) }} {%- endif %} {% endblock %}

View file

@ -18,7 +18,7 @@
<span>{{ text "auth:label.blocked_profile_message" }}</span>
<div class="card w-full secondary flex gap-2">
{% if user %} {% if not is_blocking %}
{% if user -%} {% if not is_blocking -%}
<button onclick="toggle_block_user()" class="quaternary red">
{{ icon "shield" }}
<span>{{ text "auth:action.block" }}</span>
@ -28,7 +28,7 @@
{{ icon "shield-off" }}
<span>{{ text "auth:action.unblock" }}</span>
</button>
{% endif %}
{%- endif %}
<script>
globalThis.toggle_block_user = async () => {
@ -52,7 +52,7 @@
});
};
</script>
{% endif %}
{%- endif %}
<a href="/" class="button red quaternary">
{{ icon "x" }}

View file

@ -5,7 +5,7 @@ profile.settings.allow_anonymous_questions) %}
{{ components::create_question_form(receiver=profile.id,
header=profile.settings.motivational_header) }}
</div>
{% endif %} {% if not tag and pinned|length != 0 %}
{%- endif %} {% if not tag and pinned|length != 0 -%}
<div class="card-nest">
<div class="card small flex gap-2 items-center">
{{ icon "pin" }}
@ -15,37 +15,51 @@ profile.settings.allow_anonymous_questions) %}
<div class="card flex flex-col gap-4">
<!-- prettier-ignore -->
{% for post in pinned %}
{% if post[2].read_access == "Everybody" %}
{% if post[0].context.repost and post[0].context.repost.reposting %}
{% if post[2].read_access == "Everybody" -%}
{% if post[0].context.repost and post[0].context.repost.reposting -%}
{{ components::repost(repost=post[3], post=post[0], owner=post[1], secondary=true, community=post[2], show_community=true, can_manage_post=is_self) }}
{% else %}
{{ components::post(post=post[0], owner=post[1], question=post[4], secondary=true, community=post[2], can_manage_post=is_self) }}
{% endif %}
{% endif %}
{%- endif %}
{%- endif %}
{% endfor %}
</div>
</div>
{% endif %}
{%- endif %}
<div class="card-nest">
<div class="card small flex gap-2 items-center">
{% if not tag %} {{ icon "clock" }}
<span>{{ text "auth:label.recent_posts" }}</span>
{% else %} {{ icon "tag" }}
<span>{{ text "auth:label.recent_with_tag" }}: <b>{{ tag }}</b></span>
{% endif %}
<div class="card small flex gap-2 justify-between items-center">
<div class="flex gap-2 items-center">
{% if not tag -%} {{ icon "clock" }}
<span>{{ text "auth:label.recent_posts" }}</span>
{% else %} {{ icon "tag" }}
<span
>{{ text "auth:label.recent_with_tag" }}: <b>{{ tag }}</b></span
>
{%- endif %}
</div>
{% if user -%}
<a
href="/search?profile={{ profile.id }}"
class="button quaternary small"
>
{{ icon "search" }}
<span>{{ text "general:link.search" }}</span>
</a>
{%- endif %}
</div>
<div class="card flex flex-col gap-4">
<!-- prettier-ignore -->
{% for post in posts %}
{% if post[2].read_access == "Everybody" %}
{% if post[0].context.repost and post[0].context.repost.reposting %}
{% if post[2].read_access == "Everybody" -%}
{% if post[0].context.repost and post[0].context.repost.reposting -%}
{{ components::repost(repost=post[3], post=post[0], owner=post[1], secondary=true, community=post[2], show_community=true, can_manage_post=is_self) }}
{% else %}
{{ components::post(post=post[0], owner=post[1], question=post[4], secondary=true, community=post[2], can_manage_post=is_self) }}
{% endif %}
{% endif %}
{%- endif %}
{%- endif %}
{% endfor %}
{{ components::pagination(page=page, items=posts|length, key="&tag=", value=tag) }}

View file

@ -18,10 +18,10 @@
<span>{{ text "auth:label.private_profile_message" }}</span>
<div class="card w-full secondary flex gap-2">
{% if user %} {% if not is_following %}
{% if user -%} {% if not is_following -%}
<button
onclick="toggle_follow_user(event)"
class="{% if follow_requested %} hidden{% endif %}"
class="{% if follow_requested -%} hidden{%- endif %}"
atto_tag="user.follow_request"
>
{{ icon "user-plus" }}
@ -30,7 +30,7 @@
<button
onclick="cancel_follow_user(event)"
class="quaternary red{% if not follow_requested %} hidden{% endif %}"
class="quaternary red{% if not follow_requested -%} hidden{%- endif %}"
atto_tag="user.cancel_request"
>
{{ icon "user-minus" }}
@ -45,7 +45,7 @@
{{ icon "user-minus" }}
<span>{{ text "auth:action.unfollow" }}</span>
</button>
{% endif %} {% if not is_blocking %}
{%- endif %} {% if not is_blocking -%}
<button onclick="toggle_block_user()" class="quaternary red">
{{ icon "shield" }}
<span>{{ text "auth:action.block" }}</span>
@ -55,7 +55,7 @@
{{ icon "shield-off" }}
<span>{{ text "auth:action.unblock" }}</span>
</button>
{% endif %}
{%- endif %}
<script>
globalThis.toggle_follow_user = async (e) => {
@ -149,7 +149,7 @@
});
};
</script>
{% endif %}
{%- endif %}
<a href="/" class="button red quaternary">
{{ icon "x" }}

View file

@ -2,12 +2,12 @@
<title>Settings - {{ config.name }}</title>
{% endblock %} {% block body %} {{ macros::nav() }}
<main class="flex flex-col gap-2">
{% if profile.id != user.id %}
{% if profile.id != user.id -%}
<div class="card w-full red flex gap-2 items-center">
{{ icon "skull" }}
<b>Editing other user's settings! Please be careful.</b>
</div>
{% endif %}
{%- endif %}
<div class="pillmenu">
<a data-tab-button="account" class="active" href="#/account">
@ -65,12 +65,12 @@
<span>{{ text "settings:tab.uploads" }}</span>
</a>
{% if config.stripe %}
{% if config.stripe -%}
<a data-tab-button="account/billing" href="#/account/billing">
{{ icon "credit-card" }}
<span>{{ text "settings:tab.billing" }}</span>
</a>
{% endif %}
{%- endif %}
</div>
<div class="card-nest" ui_ident="home_timeline">
@ -84,59 +84,59 @@
>
<option
value="MyCommunities"
selected="{% if home == '/' %}true{% else %}false{% endif %}"
selected="{% if home == '/' -%}true{% else %}false{%- endif %}"
>
My communities
</option>
<option
value="MyCommunitiesQuestions"
selected="{% if home == '/questions' %}true{% else %}false{% endif %}"
selected="{% if home == '/questions' -%}true{% else %}false{%- endif %}"
>
My communities (questions)
</option>
<option
value="PopularPosts"
selected="{% if home == '/popular' %}true{% else %}false{% endif %}"
selected="{% if home == '/popular' -%}true{% else %}false{%- endif %}"
>
Popular
</option>
<option
value="PopularQuestions"
selected="{% if home == '/popular/questions' %}true{% else %}false{% endif %}"
selected="{% if home == '/popular/questions' -%}true{% else %}false{%- endif %}"
>
Popular (questions)
</option>
<option
value="FollowingPosts"
selected="{% if home == '/following' %}true{% else %}false{% endif %}"
selected="{% if home == '/following' -%}true{% else %}false{%- endif %}"
>
Following
</option>
<option
value="FollowingQuestions"
selected="{% if home == '/following/questions' %}true{% else %}false{% endif %}"
selected="{% if home == '/following/questions' -%}true{% else %}false{%- endif %}"
>
Following (questions)
</option>
<option
value="AllPosts"
selected="{% if home == '/all' %}true{% else %}false{% endif %}"
selected="{% if home == '/all' -%}true{% else %}false{%- endif %}"
>
All
</option>
<option
value="AllQuestions"
selected="{% if home == '/all/questions' %}true{% else %}false{% endif %}"
selected="{% if home == '/all/questions' -%}true{% else %}false{%- endif %}"
>
All (questions)
</option>
{% for stack in stacks %}
<option
value='{"Stack":"{{ stack.id }}"}'
selected="{% if home is ending_with(stack.id|as_str) %}true{% else %}false{% endif %}"
selected="{% if home is ending_with(stack.id|as_str) -%}true{% else %}false{%- endif %}"
>
{{ stack.name }} (stack)
</option>
@ -265,7 +265,7 @@
</div>
<div class="card flex flex-col gap-2">
{% if profile.totp|length == 0 %}
{% if profile.totp|length == 0 -%}
<div id="totp_stuff" style="display: none">
<span
>Scan this QR code in a TOTP authenticator
@ -312,7 +312,7 @@
Disable TOTP 2FA
</button>
</div>
{% endif %}
{%- endif %}
</div>
</div>
@ -569,7 +569,7 @@
</div>
<div class="card flex flex-col gap-2 secondary">
{% if config.stripe %}
{% if config.stripe -%}
<div class="card-nest" ui_ident="supporter_card">
<div class="card small flex items-center gap-2">
{{ icon "star" }}
@ -577,7 +577,7 @@
</div>
<div class="card flex flex-col gap-2">
{% if is_supporter %}
{% if is_supporter -%}
<p>
You <b>are</b> a supporter! Thank you for all
that you do. You can manage your billing
@ -617,6 +617,7 @@
<li>Create infinite stack timelines</li>
<li>Ability to upload images to posts</li>
<li>Save infinite post drafts</li>
<li>Ability to search through all posts</li>
</ul>
<a
@ -631,10 +632,10 @@
completing payment. It is required to manage
your billing settings.</span
>
{% endif %}
{%- endif %}
</div>
</div>
{% endif %}
{%- endif %}
</div>
</div>
</div>
@ -727,7 +728,7 @@
"
>{{ token[1] }}</b
>
{% if is_helper %}
{% if is_helper -%}
<span class="flex gap-2 items-center">
<span class="fade"
><a href="/api/v1/auth/user/find_by_ip/{{ token[0] }}"
@ -737,7 +738,7 @@
</span>
{% else %}
<span class="fade"><code>{{ token[0] }}</code></span>
{% endif %}
{%- endif %}
<span class="fade date">{{ token[2] }}</span>
</div>
@ -754,7 +755,7 @@
<div class="w-full hidden flex flex-col gap-2" data-tab="theme">
<div class="card tertiary flex flex-col gap-2" id="theme_settings">
{% if failing_color_keys|length > 0 %}
{% if failing_color_keys|length > 0 -%}
<div
class="card flex flex-col gap-2"
style="background: white; color: black"
@ -773,7 +774,7 @@
{% endfor %}
</ul>
</div>
{% endif %}
{%- endif %}
<div
class="card w-full flex flex-wrap gap-2"
@ -804,19 +805,19 @@
>
<option
value="Auto"
selected="{% if user.settings.theme_preference == 'Auto' %}true{% else %}false{% endif %}"
selected="{% if user.settings.theme_preference == 'Auto' -%}true{% else %}false{%- endif %}"
>
Auto
</option>
<option
value="Light"
selected="{% if user.settings.theme_preference == 'Light' %}true{% else %}false{% endif %}"
selected="{% if user.settings.theme_preference == 'Light' -%}true{% else %}false{%- endif %}"
>
Light
</option>
<option
value="Dark"
selected="{% if user.settings.theme_preference == 'Dark' %}true{% else %}false{% endif %}"
selected="{% if user.settings.theme_preference == 'Dark' -%}true{% else %}false{%- endif %}"
>
Dark
</option>
@ -839,19 +840,19 @@
>
<option
value="Auto"
selected="{% if user.settings.profile_theme == 'Auto' %}true{% else %}false{% endif %}"
selected="{% if user.settings.profile_theme == 'Auto' -%}true{% else %}false{%- endif %}"
>
Auto
</option>
<option
value="Light"
selected="{% if user.settings.profile_theme == 'Light' %}true{% else %}false{% endif %}"
selected="{% if user.settings.profile_theme == 'Light' -%}true{% else %}false{%- endif %}"
>
Light
</option>
<option
value="Dark"
selected="{% if user.settings.profile_theme == 'Dark' %}true{% else %}false{% endif %}"
selected="{% if user.settings.profile_theme == 'Dark' -%}true{% else %}false{%- endif %}"
>
Dark
</option>
@ -885,7 +886,7 @@
{{ icon "spotify" }}
<span>Spotify</span>
</button>
{% endif %} {% if config.connections.last_fm_key and not
{%- endif %} {% if config.connections.last_fm_key and not
profile.connections.LastFm %}
<button
class="quaternary"
@ -894,7 +895,7 @@
{{ icon "last_fm" }}
<span>Last.fm</span>
</button>
{% endif %}
{%- endif %}
</div>
{% for key, value in profile.connections %}
@ -904,13 +905,13 @@
<!-- prettier-ignore -->
<b class="flex items-center gap-2">
{% if value[0].data.name %}
{% if value[0].data.name -%}
<span>{{ value[0].data.name }}</span>
<span style="display: contents;" title="Verified connection">{{ icon "badge-check" }}</span>
{% else %}
<span>{{ key }}</span>
<span style="display: contents;">{{ icon "badge-alert" }}</span>
{% endif %}
{%- endif %}
</b>
</div>
@ -926,7 +927,7 @@
<!-- prettier-ignore -->
<input
type="checkbox"
{% if value[0].show_on_profile %}checked{% endif %}
{% if value[0].show_on_profile -%}checked{%- endif %}
id="{{ key }}-shown"
onchange="trigger('connections::push_con_shown', ['{{ key }}', event.target.checked])"
class="w-content"