Ethan Dalool
e4f686c86f
I've moved the thumbnails around many times over this project and hopefully it doesn't happen too many more. Once the database has tens of thousands of items, the thumbnails start to become the biggest headache on the disk. Backing up, restoring, and sharding files per directory are slower and more effortful with separate files. In the db means the db is a larger file, but this is disk space that was already getting used anyway. Now it's simpler and has atomic transactions.
230 lines
8.1 KiB
HTML
230 lines
8.1 KiB
HTML
{# ALBUM ######################################################################}
|
|
|
|
{% macro create_album_card(album, view="grid", unlink_parent=none, draggable=false) %}
|
|
{% set id = "album_card_root" if album == "root" else "album_card_" ~ album.id %}
|
|
{% set view = (view if view in ("list", "grid") else "grid") %}
|
|
{% set viewparam = "?view=list" if view == "list" else "" %}
|
|
<div
|
|
id="{{id}}"
|
|
class="album_card album_card_{{view}}"
|
|
data-id="{{'root' if album == 'root' else album.id}}"
|
|
ondragstart="return cards.albums.drag_start(event);"
|
|
ondragend="return cards.albums.drag_end(event);"
|
|
ondragover="return cards.albums.drag_over(event);"
|
|
ondrop="return cards.albums.drag_drop(event);"
|
|
{% if album != "root" and draggable %}
|
|
draggable=true
|
|
{% endif %}
|
|
>
|
|
{% if album == "root" %}
|
|
<a class="album_card_thumbnail" href="/albums{{viewparam}}" draggable="false">
|
|
{% else %}
|
|
<a class="album_card_thumbnail" href="/album/{{album.id}}{{viewparam}}" draggable="false">
|
|
{% endif %}
|
|
{% if album.thumbnail_photo %}
|
|
{% set thumbnail_src = "/photo/" ~ album.thumbnail_photo.id ~ "/thumbnail/" ~ album.thumbnail_photo.id ~ ".jpg" %}
|
|
{% else %}
|
|
{% set thumbnail_src = "/static/basic_thumbnails/album.png" %}
|
|
{% endif %}
|
|
<img src="{{thumbnail_src}}" loading="lazy" draggable="false"/>
|
|
</a>
|
|
|
|
<div class="album_card_title">
|
|
{% if album == "root" %}
|
|
<a href="/albums{{viewparam}}" draggable="false">Albums</a>
|
|
{% else %}
|
|
<a href="/album/{{album.id}}{{viewparam}}" draggable="false">{{album.display_name}}</a>
|
|
{% endif %}
|
|
</div>
|
|
|
|
<div class="album_card_metadata">
|
|
{% if album != "root" %}
|
|
{% set child_count = album.sum_children(recurse=False) %}
|
|
{% set photo_count = album.sum_photos(recurse=False) %}
|
|
<span class="album_card_child_count" title="{{child_count}} child albums">{{child_count}}</span>
|
|
{{-' | '-}}
|
|
<span class="album_card_photo_count" title="{{photo_count}} photos">{{photo_count}}</span>
|
|
{% endif %}
|
|
</div>
|
|
|
|
<div class="album_card_tools">
|
|
{% if unlink_parent is not none %}
|
|
<button
|
|
class="remove_child_button button_with_confirm red_button"
|
|
data-onclick="return api.albums.remove_child('{{unlink_parent.id}}', '{{album.id}}', common.refresh_or_alert);"
|
|
data-prompt="Remove child?"
|
|
data-holder-class="remove_child_button"
|
|
data-confirm-class="red_button"
|
|
data-cancel-class="gray_button"
|
|
>Unlink
|
|
</button>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
{% endmacro %}
|
|
|
|
{# BOOKMARK ###################################################################}
|
|
|
|
{% macro create_bookmark_card(bookmark, add_author=True, add_delete_button=False, add_url_element=False) %}
|
|
<div class="bookmark_card" data-id="{{bookmark.id}}">
|
|
<h2><a href="{{bookmark.url}}" class="bookmark_title" title="{{bookmark.url}}">{{bookmark.display_name}}</a></h2>
|
|
|
|
{# The URL element is always display:none, but its presence is useful in #}
|
|
{# facilitating the Editor object. If this bookmark will not be editable, #}
|
|
{# there is no need for it. #}
|
|
{% if add_url_element %}
|
|
<a href="{{bookmark.url}}" class="bookmark_url">{{bookmark.url}}</a>
|
|
{% endif %}
|
|
|
|
{# if more tools are added, this will become an `or` #}
|
|
{% if add_delete_button %}
|
|
<div class="bookmark_toolbox">
|
|
{% if add_delete_button %}
|
|
<button
|
|
class="red_button button_with_confirm"
|
|
data-onclick="return delete_bookmark_form(event);"
|
|
data-prompt="Delete Bookmark?"
|
|
data-cancel-class="gray_button"
|
|
>
|
|
Delete
|
|
</button>
|
|
{% endif %}
|
|
</div>
|
|
{% endif %}
|
|
|
|
{% if add_author %}
|
|
{% set author = bookmark.author %}
|
|
{% if author is not none %}
|
|
<p>
|
|
Author: <a href="/userid/{{author.id}}">{{author.display_name}}</a>
|
|
</p>
|
|
{% endif %}
|
|
{% endif %}
|
|
</div>
|
|
{% endmacro %}
|
|
|
|
{# PHOTO ######################################################################}
|
|
|
|
{# Priority: specific extensions > specific mimetypes > general mimtypes #}
|
|
{% set thumbnails =
|
|
{
|
|
"svg": "svg",
|
|
|
|
"application/zip": "archive",
|
|
"application/x-tar": "archive",
|
|
|
|
"archive": "archive",
|
|
"audio": "audio",
|
|
"image": "image",
|
|
"video": "video",
|
|
"text": "txt",
|
|
|
|
}
|
|
%}
|
|
{% macro create_photo_card(photo, view="grid") %}
|
|
{% set view = (view if view in ("list", "grid") else "grid") %}
|
|
|
|
{% set metadatas = [] %}
|
|
{% if photo.width %}
|
|
{% do metadatas.append("{w}×{h}".format(w=photo.width, h=photo.height)) %}
|
|
{% endif %}
|
|
{% if photo.duration %}
|
|
{% do metadatas.append("{d}".format(d=photo.duration_string)) %}
|
|
{% endif -%}
|
|
|
|
{% set tag_names_title = [] %}
|
|
{% for tag in photo.get_tags() %}
|
|
{% do tag_names_title.append(tag.name) %}
|
|
{% endfor -%}
|
|
{% set tag_names_title = tag_names_title|comma_join %}
|
|
{% set tag_names_inner = "T" if tag_names_title else "" %}
|
|
|
|
<div
|
|
id="photo_card_{{photo.id}}"
|
|
data-id="{{photo.id}}"
|
|
class="photo_card photo_card_{{view}} photo_card_unselected {%if photo.searchhidden%}photo_card_searchhidden{%endif%}"
|
|
ondragstart="return cards.photos.drag_start(event);"
|
|
ondragend="return cards.photos.drag_end(event);"
|
|
ondragover="return cards.photos.drag_over(event);"
|
|
oncontextmenu="return cards.photos.photo_rightclick(event);"
|
|
ondrop="return cards.photos.drag_drop(event);"
|
|
draggable="true"
|
|
>
|
|
<div class="photo_card_filename">
|
|
<a href="/photo/{{photo.id}}" draggable="false">{{photo.basename}}</a>
|
|
</div>
|
|
|
|
<span class="photo_card_metadata">
|
|
{{- metadatas|join_and_trail(", ")|safe -}}
|
|
<a target="_blank" href="{{photo|file_link}}" draggable="false">{{photo.bytes_string}}</a>
|
|
</span>
|
|
|
|
{% if view == "grid" %}
|
|
{% if photo.has_thumbnail() %}
|
|
{% set thumbnail_src = "/photo/" ~ photo.id ~ "/thumbnail/" ~ photo.id ~ ".jpg" %}
|
|
{% else %}
|
|
{% set thumbnail_src =
|
|
thumbnails.get(photo.extension, "") or
|
|
thumbnails.get(photo.mimetype, "") or
|
|
thumbnails.get(photo.simple_mimetype, "") or
|
|
"other"
|
|
%}
|
|
{% set thumbnail_src = "/static/basic_thumbnails/" ~ thumbnail_src ~ ".png" %}
|
|
{% endif -%}{# if thumbnail #}
|
|
|
|
<a class="photo_card_thumbnail" href="/photo/{{photo.id}}" draggable="false">
|
|
<img loading="lazy" src="{{thumbnail_src}}" draggable="false">
|
|
</a>
|
|
{% endif %}{# if grid #}
|
|
|
|
<span class="photo_card_tags" title="{{tag_names_title}}">{{tag_names_inner}}</span>
|
|
</div>
|
|
|
|
{% endmacro %}
|
|
|
|
{# TAG ########################################################################}
|
|
|
|
<!--
|
|
tag: The Tag object
|
|
extra_classes:
|
|
Space-separated string, if you want more than "tag_card".
|
|
innertext:
|
|
A string to use as the innertext.
|
|
Otherwise, will use the name based on the other parameters.
|
|
link:
|
|
None = no link, just a <span>
|
|
'search' = link to /search?tag_musts=tagname
|
|
'search_musts' = link to /search?tag_musts=tagname
|
|
'search_mays' = link to /search?tag_mays=tagname
|
|
'search_forbids' = link to /search?tag_forbids=tagname
|
|
'info' = link to /tags/tagname
|
|
with_alt_description:
|
|
True: Include the description in the alt text
|
|
-->
|
|
{%- macro create_tag_card(
|
|
tag,
|
|
extra_classes="",
|
|
innertext=None,
|
|
innertext_safe=None,
|
|
link='info',
|
|
onclick=None,
|
|
with_alt_description=False
|
|
) -%}
|
|
|
|
{%- set href = {
|
|
"search": "/search?tag_musts=" ~ (tag.name|urlencode),
|
|
"search_musts": "/search?tag_musts=" ~ (tag.name|urlencode),
|
|
"search_mays": "/search?tag_mays=" ~ (tag.name|urlencode),
|
|
"search_forbids": "/search?tag_forbids=" ~ (tag.name|urlencode),
|
|
"info": "/tag/" ~ tag.name,
|
|
None: None,
|
|
}.get(link, link)
|
|
-%}
|
|
{%- set class = ("tag_card" ~ " " ~ extra_classes).strip() -%}
|
|
{%- set title = (with_alt_description and tag.description) or None -%}
|
|
{%- set innertext = innertext_safe or (innertext or tag.name)|e -%}
|
|
{%- set element = "a" if (link or onclick) else "span" -%}
|
|
|
|
<{{element}} {{make_attributes(class=class, title=title, href=href, onclick=onclick, **kwargs)|safe}}>{{innertext|safe}}</{{element}}>
|
|
{{-''-}}
|
|
{%- endmacro -%}
|